Introduzione alla programmazione logica e Prolog

Transcript

Introduzione alla programmazione logica e Prolog
Introduzione alla Programmazione
Logica ed al linguaggio PROLOG
Esercitazioni per il corso di Logica ed
Intelligenza Artificiale a.a. 2014/15
Paolo Tomeo
http://sisinflab.poliba.it/tomeo
Programmazione logica
Paradigma di programmazione basato su
logica formale
Una logica formale (Es. Clausole di Horn)
definisce le regole sintattiche per descrivere lo
schema di ragionamenti e problemi,
indipendentemente dal loro contenuto.
Nella programmazione logica un problema
viene descritto con un insieme di formule
della logica, dunque in forma dichiarativa
Differenza fra forma
procedurale e dichiarativa

Linguaggi procedurali (o imperativi): sono composti da
una serie di istruzioni (algoritmo) che indicano al calcolatore
come deve essere svolto un certo compito. (Es. C, Java, Python)

Linguaggi dichiarativi: dicono al calcolatore cosa deve fare,
ma non come farlo. Quindi non specificano esplicitamente
l'algoritmo.
Sono inclusi fra questi i linguaggi di query dei database (Es.
SQL), le espressioni regolari, alcuni linguaggi di markup (Es.
HTML), i linguaggi funzionali e i linguaggi logici.
Non tutti i linguaggi logici però sono strettamente dichiarativi
Un comune programma in programmazione logica è
composto da una serie di fatti, che descrivono cose e
situazioni sempre vere, e una serie di regole, che
permettono di dedurre nuove situazioni vere sulla base
dei fatti a disposizione.
logica
= rappresentazione del problema
deduzione = risoluzione del problema
Esempio
Tutti gli uomini sono mortali
Socrate è un uomo
Si deduce che: Socrate è mortale
Prolog
PROLOG sta per PROgramming in LOGic
Nato nel 1973, si fonda sulle idee di programmazione logica di
R. Kowalski.
È il più noto linguaggio di programmazione logica.
È un linguaggio di altissimo livello.
È largamente utilizzato per applicazioni di Intelligenza
Artificiale (Planning, Sistemi Esperti, Natural Language
Processing, ecc.).
Non adatto per applicazioni numeriche o real-time.
Ottima dispensa in inglese: www.boklm.eu/prolog/prolog.ps
Prolog
Il Prolog è un linguaggio di programmazione logica basato
sulle clausole di Horn.
h :- b1, b2, .. bn
h rappresenta la testa della clausola e b1, b2, .. bn sono i letterali
(atomi) che compongono il corpo.
h è vera se è solo se il corpo è vero, ovvero se sono veri tutti i
letterali nel corpo.
Programmare in Prolog equivale a descrivere il dominio del
problema tramite fatti e regole sotto forma di clausole di Horn.
Un programma Prolog è costituito da:

un insieme di fatti, che dichiarano un certo stato di cose

da un insieme di regole, che definiscono relazioni fra stati
di cose

da obiettivi (o domande) a cui rispondere.
Fatti + regole = Base di conoscenza
L'interprete Prolog possiede un meccanismo di inferenza che
tenta di rispondere alle domande ponendole in relazione con
i fatti e le regole della base di conoscenza e tentando di
eseguire delle deduzioni.
Fatti
I fatti Prolog sono clausole di Horn non condizionali, cioè
esprimono un'affermazione (compiuta) che non è
vincolata alla preventiva verifica di un insieme di
condizioni.
Il Prolog assume implicitamente che tutti i fatti presenti
nella base di conoscenza siano veri.
Esempio.
colore(neve, bianco).
colore(sangue, rossa).
colore(cielo, nero).
Regole
Le regole, in Prolog, indicano situazioni di carattere generale
servendosi di oggetti e relazioni tra essi. Sono utili per evitare
ridondanza e spreco di risorse nella base di conoscenza.
Esempio 1
uomo(socrate).
mortale(X) :- uomo(X).
Esempio 2
book(title, author1, author2).
coauthor(X, Y) :- book(_, X, Y).
coauthor(X, Y) :- book(_, Y, X).
L'underscore ('_') è usato per indicare qualsiasi variabile. Nell'esempio
2, sfruttando l'underscore, possiamo verificare se due individui sono
coautori di un qualsiasi libro
Query
Per interrogare un programma in Prolog, che praticamente equivale ad
eseguirlo, vengono utilizzate le query, che in Prolog sono dette goal e
corrispondono a clausole di Horn da dimostrare.
Esempio 1
?- uomo(X).
X = socrate.
?- mortale(X).
X = socrate
?- mortale(socrate).
true
Esempio 2
?- coauthor(author2, Y).
Y=author1.
Query composte
Semplici query possono essere combinate per formare
query composte. Utilizzando la virgola per la
composizione, si definisce un and logico di goal.
Esempio
?- coauthor(author2, Y), coauthor(author3, Y).
In questo caso si verifica se c'è un autore che è stato
coautore sia di author2 che author3.
Variabili
Le variabili sono utilizzate per indicare una entità generica e
consentono di esprimere un'affermazione riguardo una
considerazione generale
Costanti
Le costanti indicano un entità particolare e consentono di
esprimere un'affermazione specifica
Sintassi - 1
I nomi di predicati ed entità devono necessariamente iniziare
con una lettera minuscola
I nomi delle variabili devono necessariamente iniziare con
una lettera Maiuscola
Una variabile anonima è indicata dall'underscore _
Ogni asserzione termina con un punto.
Sintassi - 2
Il nome di un predicato o di un argomento non deve
contenere degli spazi
padre di( Y, Y)
va sostituito con padre_di( Y, Y) o padredi( Y, Y)
I commenti in Prolog iniziano con %
Esempio
% questo è un commento
a(X) :- b(X), c(X). % questo è un altro commento
Disgiunzione
È possibile definire una disgiunzione mediante il simbolo ;
Tuttavia questa pratica è fortemente sconsigliata perché
potrebbe rendere il programma difficile da comprendere.
Quindi per la disgiunzione è consigliato definire un'altra regola
con la stessa testa ma corpo diverso
genitore(X, Y) :- padre(X, Y).
genitore(X, Y) :- madre(X, Y).
In questo caso, se la prima regola dovesse risultare falsa, il Prolog
passerà alla regola successiva.