Introduzione
Del Prolog, linguaggio di programmazione logica che fino al 1980 era considerato il linguaggio dell'IA creato in Europa e in competizione con il LISP, oggi si parla poco, poco si insegna ed è difficile che chi programma per mestiere lo incontri.
Tuttavia può ancora essere utile per risolvere in poche righe di codice un problema con vincoli, regole o deduzioni, quando con linguaggi di programmazione procedurali sarebbero necessari troppi `if` annidati.
Del Prolog esistono inoltre moderni sviluppi che lo ibridano con altri paradigmi:
- SWI-Prolog, oggi il più usato, con supporto a thread, HTTP e database, ottimo per prototipi di sistemi a regole;
- Visual Prolog, versione object-oriented, usata in ambito commerciale soprattutto in Europa;
- Logtalk, un'estensione che porta la programmazione a oggetti a Prolog;
- Probabilistic Logic Programming, ad esempio ProbLog, che unisce logica e probabilità, usato per il machine learning simbolico, filone che sta tornando di moda con la Neuro-Symbolic AI.
ProbLog nasce in Belgio alla Katholieke Universiteit Leuven nei primi anni 2000 aggiungendo fondamentalmente un fattore di probabilità a ogni fatto o regola della base di conoscenza in un programma Prolog. Come Prolog usa l'unificazione e il backtracking per trovare tutte le dimostrazioni di una query ma ogni dimostrazione ha una probabilità associata che ProbLog combina trattando i fatti come variabili booleane indipendenti e calcolando la probabilità che almeno una dimostrazione sia vera.
Infatti per ogni query, ProbLog trova tutte le possibili spiegazioni (proof trees); ogni spiegazione, ovvero una derivazione che parte dalla query e arriva fino ai fatti probabilistici e ai fatti deterministici, è una “storia” coerente del mondo in cui la query risulta vera, l'insieme di fatti probabilistici che devono essere veri affinché quella derivazione funzioni; la probabilità finale è la probabilità che almeno una di queste spiegazioni sia vera.
Per far girare un programma ProbLog potremmo utilizzare l'editor on line, ad esempio facendo un copia-incolla di quello proposto di seguito e, dopo aver selezionato uno dei modelli forniti, eseguirlo con Solve.
0.5::freddo.
0.3::umido.
neve :- freddo, umido.
query(neve).
Essendo scritto principalmente in Python, ad eccezione della fase di compilazione della conoscenza che è in C, si può importare ProbLog come pacchetto Python, la libreria problog.
Qui proponiamo l'uso di Python in ambiente Google Colab per eseguire codice ProbLog.
!pip install problog
Il semplicissimo esempio introduttivo sarà allora qui proposto nel modo seguente.
from problog import get_evaluatable
prog = """
0.5::freddo.
0.3::umido.
neve :- freddo, umido.
query(neve).
"""
get_evaluatable().create_from(prog).evaluate()
{neve: 0.15}
ProbLog viene dunque usato in problemi dove la conoscenza è incerta o rumorosa ma si vuole mantenere la struttura logica come:
- Diagnosi medica, dove i sintomi hanno certezza parziale e si vuole calcolare la probabilità di una malattia combinando più indicatori deboli;
- Robotica e pianificazione, dove ad esempio un robot sa che "probabilmente la porta è aperta" (0.8), "probabilmente c'è un ostacolo" (0.6) e deve decidere se passare, calcolando il rischio;
- Link Prediction in reti sociali, dove ProbLog è applicato a inferenze transitive con rumore come ad esempio a "Se A è amico di B (0.7) e B è amico di C (0.8), qual è la probabilità che A conosca C?";
- Genetica e bioinformatica, ad esempio in modelli di ereditarietà con mutazioni probabilistiche;
- Natural Language Processing (NLP) con semantica distribuita, per estrarre relazioni da testi dove l'estrazione automatica ha un certo margine di errore.
- Problog, sito ufficiale
- Tutorial, sito ufficiale
- ProbLog 2.2 documentation, sito ufficiale
- Probabilistic (logic) programming concepts, by Luc De Raedt, Angelika Kimmig
- Neural probabilistic logic programming in DeepProbLog, by Robin Manhaeve et alii
- DeepProbLog: Neural Probabilistic Logic Programming, by Robin Manhaeve et alii
- cplint on SWISH, web application for probabilistic logic programming, by the Machine Learning group at the University of Ferrara
- cplint- SWI-Prolog Version, by Riguzzi Fabrizio, Azzolini Damiano