Prolog: materiale didattico
Qualunque testo di introduzione al Prolog, ad esempio:
I. Bratko. Programmare in Prolog per l’Intelligenza Artificiale. Masson Addison Wesley, 1988.
W. F. Clocksin and C. S. Mellish. Programmare in Prolog. Franco Angeli,
1993.
L. Console, E. Lamma, P. Mello, M. Milano. Programmazione Logica e
Prolog. UTET Libreria, 1997.
Si può trovare materiale utile anche online.
Compilatore SWI-Prolog: http://www.swi-prolog.org/
(Logica per l’Informatica)
01: PROgramming in LOGic
1 / 29
Prolog: PROgramming in LOGic
Anni 70-80: ideato da Robert Kowalski; primo interprete Prolog (Alain
Colmerauer, 1972); primo compilatore Prolog (Warren, 1983, tramite la
Warren Abstract Machine).
È molto diverso dagli altri linguaggi di programmazione
Dichiarativo (non procedurale)
Ricorsione (niente cicli “for” o “while”)
I costrutti di base sono relazioni (non comandi né funzioni)
Concetti fondamentali: unificazione e backtracking
Un programma logico consiste di formule logiche e il calcolo è il processo di
derivare conseguenze dal programma (costruzione di dimostrazioni)
Idea di base:
Descrivere la situazione di interesse (programma)
Fare una domanda (query)
Il Prolog deduce nuovi fatti dal programma e risponde alla domanda
(Logica per l’Informatica)
01: PROgramming in LOGic
2 / 29
Programmare in Prolog
Un programma logico
ha un significato dichiarativo: un programma consiste di fatti e regole
che definiscono relazioni .
ha un significato operazionale: meccanismo di esecuzione
( motore di inferenza ), basato sull’unificazione e la risoluzione, per
estrarre conseguenze implicite nel programma
Per programmare in Prolog si devono avere presenti entrambi gli aspetti.
Conseguenze
Cambiare modo di pensare: dichiarativamente, non proceduralmente.
Linguaggio di alto livello
Non è efficiente quanto, ad esempio, il C
Ottimo per il “rapid prototyping”
Utile in molte applicazioni di Intelligenza Artificiale (rappresentazione della
conoscenza, deduzione, analisi del linguaggio naturale...)
(Logica per l’Informatica)
01: PROgramming in LOGic
3 / 29
Programma Prolog: Fatti
/* Definizione del predicato amico
(questo e’ un commento) */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico è un predicato.
antonio,bianca,carla,... sono costanti.
(Logica per l’Informatica)
01: PROgramming in LOGic
4 / 29
Programma Prolog: Fatti
/* Definizione del predicato amico
(questo e’ un commento) */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
%%% antonio e‘ amico di tutti (questo e’ un commento)
amico(antonio,Chiunque).
amico è un predicato.
antonio,bianca,carla,... sono costanti.
Chiunque è una variabile.
(Logica per l’Informatica)
01: PROgramming in LOGic
4 / 29
Programma Prolog: Fatti
/* Definizione del predicato amico
(questo e’ un commento) */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
%%% antonio e‘ amico di tutti (questo e’ un commento)
amico(antonio,Chiunque).
amico è un predicato.
antonio,bianca,carla,... sono costanti.
Chiunque è una variabile.
Queries
?- amico(antonio,enrico).
true
(Logica per l’Informatica)
01: PROgramming in LOGic
4 / 29
Programma Prolog: Fatti
/* Definizione del predicato amico
(questo e’ un commento) */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
%%% antonio e‘ amico di tutti (questo e’ un commento)
amico(antonio,Chiunque).
amico è un predicato.
antonio,bianca,carla,... sono costanti.
Chiunque è una variabile.
Queries
?- amico(dario,bianca).
false.
(Logica per l’Informatica)
01: PROgramming in LOGic
4 / 29
Programma Prolog: Fatti
/* Definizione del predicato amico
(questo e’ un commento) */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
%%% antonio e‘ amico di tutti (questo e’ un commento)
amico(antonio,Chiunque).
amico è un predicato.
antonio,bianca,carla,... sono costanti.
Chiunque è una variabile.
Queries
?- amico(antonio,100).
true.
(Logica per l’Informatica)
01: PROgramming in LOGic
4 / 29
Programma Prolog: Regole
/* Definizione del predicato amico */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
/* Definizione del predicato conosce */
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
conosce(X,Y)
testa della regola
amico(X,Qualcuno), amico(Qualcuno,Y) corpo della regola
La virgola in Prolog rappresenta la congiunzione (∧)
(Logica per l’Informatica)
01: PROgramming in LOGic
5 / 29
Programma Prolog: Regole
/* Definizione del predicato amico */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
/* Definizione del predicato conosce */
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
conosce(X,Y)
testa della regola
amico(X,Qualcuno), amico(Qualcuno,Y) corpo della regola
La virgola in Prolog rappresenta la congiunzione (∧)
?- conosce(bianca,dario).
true
(Logica per l’Informatica)
01: PROgramming in LOGic
5 / 29
Programma Prolog: Regole
/* Definizione del predicato amico */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
/* Definizione del predicato conosce */
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
conosce(X,Y)
testa della regola
amico(X,Qualcuno), amico(Qualcuno,Y) corpo della regola
La virgola in Prolog rappresenta la congiunzione (∧)
?- conosce(bianca,carla).
true.
(Logica per l’Informatica)
01: PROgramming in LOGic
5 / 29
Programma Prolog: Regole
/* Definizione del predicato amico */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
/* Definizione del predicato conosce */
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
conosce(X,Y)
testa della regola
amico(X,Qualcuno), amico(Qualcuno,Y) corpo della regola
La virgola in Prolog rappresenta la congiunzione (∧)
?- conosce(bianca,enrico).
false.
(Logica per l’Informatica)
01: PROgramming in LOGic
5 / 29
La disgiunzione in Prolog
/* Definizione del predicato amico */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
/* Definizione del predicato conosce */
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y) ; amico(Y,X).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
Il punto e virgola in Prolog rappresenta la disgiunzione (∨)
(Logica per l’Informatica)
01: PROgramming in LOGic
6 / 29
La disgiunzione in Prolog
/* Definizione del predicato amico */
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
/* Definizione del predicato conosce */
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y) ; amico(Y,X).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
Il punto e virgola in Prolog rappresenta la disgiunzione (∨)
?- conosce(bianca,enrico).
true.
(Logica per l’Informatica)
01: PROgramming in LOGic
6 / 29
Generazione di valori di risposta
Torniamo al programma senza disgiunzione
%% amico
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
%% conosce
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
Queries con variabili
?- conosce(bianca,X).
X = dario
(Logica per l’Informatica)
01: PROgramming in LOGic
7 / 29
Generazione di valori di risposta
Torniamo al programma senza disgiunzione
%% amico
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
%% conosce
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
Queries con variabili
?- conosce(bianca,X).
X = dario ;
(Logica per l’Informatica)
01: PROgramming in LOGic
7 / 29
Generazione di valori di risposta
Torniamo al programma senza disgiunzione
%% amico
amico(antonio,bianca).
amico(antonio,enrico).
amico(bianca,dario).
amico(dario,carla).
amico(enrico,bianca).
amico(antonio,Chiunque).
%% conosce
conosce(dario,enrico).
conosce(X,Y) :- amico(X,Y).
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
Queries con variabili
?- conosce(bianca,X).
X = dario ;
X = carla.
(Logica per l’Informatica)
01: PROgramming in LOGic
7 / 29
Prolog e logica
Fatti e regole sono clausole.
Implicazione
Congiunzione
Disgiunzione
(Logica per l’Informatica)
Prolog
A :- B
A , B
A ; B
01: PROgramming in LOGic
Logica
B→A
A∧B
A∨B
8 / 29
Prolog e logica: le variabili
Variabili in un fatto:
amico(antonio,X): antonio e‘ amico di tutti (per ogni X, antonio e‘
amico di X).
pred(c1,...,cn,X1,...,Xn)
∀x1 . . . ∀xn pred(c1 , . . . , cn , x1 , . . . , xn )
(Logica per l’Informatica)
01: PROgramming in LOGic
9 / 29
Prolog e logica: le variabili
Variabili in un fatto:
amico(antonio,X): antonio e‘ amico di tutti (per ogni X, antonio e‘
amico di X).
pred(c1,...,cn,X1,...,Xn)
∀x1 . . . ∀xn pred(c1 , . . . , cn , x1 , . . . , xn )
Variabili in una regola
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
Per ogni X e per ogni Y,
X conosce Y se esiste Qualcuno conosciuto da X che conosce Y.
A(X1,...,Xn) :- B(X1,...,Xn,Y1,...,Yn).
∀x1 . . . ∀xn (∃y1 . . . ∃yn B(x1 , . . . , xn , y1 , . . . , yn ) → A(x1 , . . . , xn ))
(Logica per l’Informatica)
01: PROgramming in LOGic
9 / 29
Prolog e logica: le variabili
Variabili in un fatto:
amico(antonio,X): antonio e‘ amico di tutti (per ogni X, antonio e‘
amico di X).
pred(c1,...,cn,X1,...,Xn)
∀x1 . . . ∀xn pred(c1 , . . . , cn , x1 , . . . , xn )
Variabili in una regola
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
Per ogni X e per ogni Y,
X conosce Y se esiste Qualcuno conosciuto da X che conosce Y.
A(X1,...,Xn) :- B(X1,...,Xn,Y1,...,Yn).
∀x1 . . . ∀xn (∃y1 . . . ∃yn B(x1 , . . . , xn , y1 , . . . , yn ) → A(x1 , . . . , xn ))
∀x1 . . . ∀xn ∀y1 . . . ∀yn (B(x1 , . . . , xn , y1 , . . . , yn ) → A(x1 , . . . , xn ))
(Logica per l’Informatica)
01: PROgramming in LOGic
9 / 29
Prolog e logica: le variabili
Variabili in un fatto:
amico(antonio,X): antonio e‘ amico di tutti (per ogni X, antonio e‘
amico di X).
pred(c1,...,cn,X1,...,Xn)
∀x1 . . . ∀xn pred(c1 , . . . , cn , x1 , . . . , xn )
Variabili in una regola
conosce(X,Y) :- amico(X,Qualcuno), amico(Qualcuno,Y).
Per ogni X e per ogni Y,
X conosce Y se esiste Qualcuno conosciuto da X che conosce Y.
A(X1,...,Xn) :- B(X1,...,Xn,Y1,...,Yn).
∀x1 . . . ∀xn (∃y1 . . . ∃yn B(x1 , . . . , xn , y1 , . . . , yn ) → A(x1 , . . . , xn ))
∀x1 . . . ∀xn ∀y1 . . . ∀yn (B(x1 , . . . , xn , y1 , . . . , yn ) → A(x1 , . . . , xn ))
Variabili in una query
?- conosce(bianca,X). esiste X conosciuto da bianca?
?- goal(X1,...,Xn).
∃x1 . . . ∃xn goal(x1 . . . xn )
e‘ derivabile dal programma?
Se lo e‘, per quali valori di x1 . . . xn ?
(Logica per l’Informatica)
01: PROgramming in LOGic
9 / 29
Procedure
Premessa: un fatto si può considerare come una regola il cui corpo è true, e
la testa è il fatto stesso:
amico(antonio,bianca).
amico(antonio,bianca) :- true.
Sia pred un predicato a n argomenti e P un programma Prolog.
L’insieme di fatti e regole in P la cui testa ha la forma
pred(termine1 ,. . . ,terminen )
costituisce la procedura pred.
colore(tavolo,bianco).
colore(penna,rosso).
colore(X,Y) :- vicino(X,Z), colore(Z,Y).
Le clausole di una procedura rappresentano modi alternativi di risolvere
problemi della stessa forma (colore(. . . ,. . . )).
(Logica per l’Informatica)
01: PROgramming in LOGic
10 / 29
Il motore di inferenza del Prolog
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,bianca).
Goal
nonno(tommaso,bianca)
(Logica per l’Informatica)
01: PROgramming in LOGic
11 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,bianca).
Legami
X=tommaso, Y=bianca (Logica per l’Informatica)
01: PROgramming in LOGic
Goal
nonno(tommaso,bianca)
genitore(X,Z), genitore(Z,Y).
11 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,bianca).
Legami
Goal
nonno(tommaso,bianca)
X=tommaso, Y=bianca
genitore(X,Z), genitore(Z,Y).
X=tommaso, Y=bianca, Z=francesca
genitore(Z,Y): false
(Logica per l’Informatica)
01: PROgramming in LOGic
11 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,bianca).
Legami
Backtrack:
Goal
nonno(tommaso,bianca)
X=tommaso, Y=bianca
genitore(X,Z), genitore(Z,Y).
X=tommaso, Y=bianca, Z=francesca
genitore(Z,Y): false
genitore(Z,Y)
X=tommaso, Y=bianca, Z=vittorio (Logica per l’Informatica)
01: PROgramming in LOGic
11 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,bianca).
true.
Legami
Backtrack:
Goal
nonno(tommaso,bianca)
X=tommaso, Y=bianca
genitore(X,Z), genitore(Z,Y).
X=tommaso, Y=bianca, Z=francesca
genitore(Z,Y): false
X=tommaso, Y=bianca, Z=vittorio
genitore(Z,Y)
X=tommaso, Y=bianca, Z=vittorio
true
(Logica per l’Informatica)
01: PROgramming in LOGic
11 / 29
Il motore di inferenza del Prolog
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Goal
nonno(tommaso,Chi)
(Logica per l’Informatica)
01: PROgramming in LOGic
12 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Legami
X=tommaso,Chi=Y (Logica per l’Informatica)
Goal
nonno(tommaso,Chi)
genitore(X,Z), genitore(Z,Y).
01: PROgramming in LOGic
12 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Legami
X=tommaso,Chi=Y X=tommaso, Chi=Y, Z=francesca (Logica per l’Informatica)
Goal
nonno(tommaso,Chi)
genitore(X,Z), genitore(Z,Y).
genitore(Z,Y)
01: PROgramming in LOGic
12 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Chi=linda
Legami
Goal
nonno(tommaso,Chi)
genitore(X,Z), genitore(Z,Y).
X=tommaso,Chi=Y X=tommaso, Chi=Y, Z=francesca
genitore(Z,Y)
X=tommaso, Chi=Y=linda, Z=francesca true
(Logica per l’Informatica)
01: PROgramming in LOGic
Risposta
Chi=linda
12 / 29
Il motore di inferenza del Prolog
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Chi=linda ; ⇐=
Legami
Goal
nonno(tommaso,Chi)
genitore(X,Z), genitore(Z,Y).
X=tommaso,Chi=Y X=tommaso, Chi=Y, Z=francesca
genitore(Z,Y)
X=tommaso, Chi=Y=linda, Z=francesca true
Backtrack: X=tommaso,Chi=Y genitore(X,Z), genitore(Z,Y).
(Logica per l’Informatica)
01: PROgramming in LOGic
Risposta
Chi=linda
12 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Chi=linda ;
Legami
Goal
nonno(tommaso,Chi)
genitore(X,Z), genitore(Z,Y).
X=tommaso,Chi=Y X=tommaso, Chi=Y, Z=francesca
genitore(Z,Y)
X=tommaso, Chi=Y=linda, Z=francesca true
Backtrack:
genitore(X,Z), genitore(Z,Y).
X=tommaso,Chi=Y genitore(Z,Y)
X=tommaso, Chi=Y, Z=vittorio (Logica per l’Informatica)
01: PROgramming in LOGic
Risposta
Chi=linda
12 / 29
Il motore di inferenza del Prolog
=⇒
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(vittorio,bianca).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Chi=linda ;
Chi=bianca
Legami
Goal
nonno(tommaso,Chi)
genitore(X,Z), genitore(Z,Y).
X=tommaso,Chi=Y X=tommaso, Chi=Y, Z=francesca
genitore(Z,Y)
X=tommaso, Chi=Y=linda, Z=francesca true
Backtrack:
genitore(X,Z), genitore(Z,Y).
X=tommaso,Chi=Y genitore(Z,Y)
X=tommaso, Chi=Y, Z=vittorio X=tommaso, Chi=Y=bianca, Z=vittorio
true
(Logica per l’Informatica)
01: PROgramming in LOGic
Risposta
Chi=linda
Chi=bianca
12 / 29
Il backtracking
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(francesca,leonardo).
genitore(vittorio,bianca).
genitore(vittorio,andrea).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
(Logica per l’Informatica)
01: PROgramming in LOGic
13 / 29
Il backtracking
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(francesca,leonardo).
genitore(vittorio,bianca).
genitore(vittorio,andrea).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Chi = linda
(Logica per l’Informatica)
01: PROgramming in LOGic
13 / 29
Il backtracking
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(francesca,leonardo).
genitore(vittorio,bianca).
genitore(vittorio,andrea).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Chi = linda ;
Chi = leonardo
(Logica per l’Informatica)
01: PROgramming in LOGic
13 / 29
Il backtracking
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(francesca,leonardo).
genitore(vittorio,bianca).
genitore(vittorio,andrea).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Chi = linda ;
Chi = leonardo ;
Chi = bianca
(Logica per l’Informatica)
01: PROgramming in LOGic
13 / 29
Il backtracking
genitore(tommaso,francesca).
genitore(tommaso,vittorio).
genitore(francesca,linda).
genitore(francesca,leonardo).
genitore(vittorio,bianca).
genitore(vittorio,andrea).
nonno(X,Y) :- genitore(X,Z), genitore(Z,Y).
?- nonno(tommaso,Chi).
Chi = linda ;
Chi = leonardo ;
Chi = bianca ;
Chi = andrea.
(Logica per l’Informatica)
01: PROgramming in LOGic
13 / 29
L’albero di ricerca
nonno(tommaso,Chi)
X=tommaso,Chi=Y genitore(X,Z),genitore(Z,Y)
X=tommaso,Chi=Y,
Z=vittorio
X=tommaso,Chi=Y,
Z=francesca
genitore(Z,Y)
genitore(Z,Y)
X=tommaso,
Chi=Y=linda,
Z=francesca
X=tommaso,
Chi=Y=leonardo,
Z=francesca
true
(Logica per l’Informatica)
true
X=tommaso,
Chi=Y=bianca,
Z=vittorio
true
01: PROgramming in LOGic
X=tommaso,
Chi=Y=andrea,
Z=vittorio
true
14 / 29
Il backtracking
likes(mary,food).
likes(mary,wine).
likes(john,beer).
likes(john,wine).
likes(john,mary).
%
%
%
%
%
clausola
clausola
clausola
clausola
clausola
1
2
3
4
5
?- likes(mary,X), likes(john,X).
Goal: likes(mary,X), likes(john,X).
(Logica per l’Informatica)
01: PROgramming in LOGic
15 / 29
Il backtracking
likes(mary,food).
likes(mary,wine).
likes(john,beer).
likes(john,wine).
likes(john,mary).
%
%
%
%
%
clausola
clausola
clausola
clausola
clausola
1
2
3
4
5
?- likes(mary,X), likes(john,X).
Goal: likes(mary,X), likes(john,X).
Sottogoal 1: likes(mary,X). Clausola usata: 1, legami: X=food Puntatore alla prossima clausola: 2.
(Logica per l’Informatica)
01: PROgramming in LOGic
15 / 29
Il backtracking
likes(mary,food).
likes(mary,wine).
likes(john,beer).
likes(john,wine).
likes(john,mary).
%
%
%
%
%
clausola
clausola
clausola
clausola
clausola
1
2
3
4
5
?- likes(mary,X), likes(john,X).
Goal: likes(mary,X), likes(john,X).
Sottogoal 1: likes(mary,X). Clausola usata: 1, legami: X=food Puntatore alla prossima clausola: 2.
Sottogoal 2: likes(john,food).
(Logica per l’Informatica)
01: PROgramming in LOGic
15 / 29
Il backtracking
likes(mary,food).
likes(mary,wine).
likes(john,beer).
likes(john,wine).
likes(john,mary).
%
%
%
%
%
clausola
clausola
clausola
clausola
clausola
1
2
3
4
5
?- likes(mary,X), likes(john,X).
Goal: likes(mary,X), likes(john,X).
Sottogoal 1: likes(mary,X). Clausola usata: 1, legami: X=food Puntatore alla prossima clausola: 2.
Sottogoal 2: likes(john,food).
(Logica per l’Informatica)
01: PROgramming in LOGic
15 / 29
Il backtracking
likes(mary,food).
likes(mary,wine).
likes(john,beer).
likes(john,wine).
likes(john,mary).
%
%
%
%
%
clausola
clausola
clausola
clausola
clausola
1
2
3
4
5
?- likes(mary,X), likes(john,X).
Goal: likes(mary,X), likes(john,X).
Sottogoal 1: likes(mary,X). Clausola usata: 1, legami: X=food Puntatore alla prossima clausola: 2.
Sottogoal 2: likes(john,food).
false.
Backtrack.
(Logica per l’Informatica)
01: PROgramming in LOGic
15 / 29
Il backtracking
likes(mary,food).
likes(mary,wine).
likes(john,beer).
likes(john,wine).
likes(john,mary).
%
%
%
%
%
clausola
clausola
clausola
clausola
clausola
1
2
3
4
5
?- likes(mary,X), likes(john,X).
Goal: likes(mary,X), likes(john,X).
Sottogoal 1: likes(mary,X). Clausola usata: 1, legami: X=food Puntatore alla prossima clausola: 2.
Backtracking: Clausola usata: 2, legami: X=wine Sottogoal 2: likes(john,food).
false.
Backtrack.
(Logica per l’Informatica)
01: PROgramming in LOGic
15 / 29
Il backtracking
likes(mary,food).
likes(mary,wine).
likes(john,beer).
likes(john,wine).
likes(john,mary).
%
%
%
%
%
clausola
clausola
clausola
clausola
clausola
1
2
3
4
5
?- likes(mary,X), likes(john,X).
Goal: likes(mary,X), likes(john,X).
Sottogoal 1: likes(mary,X). Clausola usata: 1, legami: X=food Puntatore alla prossima clausola: 2.
Backtracking: Clausola usata: 2, legami: X=wine Sottogoal 2: likes(john,food).
false.
Backtrack.
Sottogoal 2: likes(john,wine).
(Logica per l’Informatica)
01: PROgramming in LOGic
15 / 29
Il backtracking
likes(mary,food).
likes(mary,wine).
likes(john,beer).
likes(john,wine).
likes(john,mary).
%
%
%
%
%
clausola
clausola
clausola
clausola
clausola
1
2
3
4
5
?- likes(mary,X), likes(john,X).
Goal: likes(mary,X), likes(john,X).
Sottogoal 1: likes(mary,X). Clausola usata: 1, legami: X=food Puntatore alla prossima clausola: 2.
Backtracking: Clausola usata: 2, legami: X=wine Sottogoal 2: likes(john,food).
false.
Backtrack.
Sottogoal
2: likes(john,wine).
true: X=wine (Logica per l’Informatica)
01: PROgramming in LOGic
15 / 29
I termini Prolog
Fatti, regole e queries sono costruiti sulla base di termini
termini
termini semplici
costanti
termini complessi
variabili
atomi numeri
Atomi: tommaso, toMMaso_27, 'Tommaso d\'Aquino'.
Sequenze di caratteri speciali: : , ; . :Numeri: 12, -34, 345.01, 0.328
Variabili: iniziano con lettera maiuscola o underscore: X, Y, Chi, _variabile
(Logica per l’Informatica)
01: PROgramming in LOGic
16 / 29
Classificazione dei termini
Il Prolog è un linguaggio a tipizzazione dinamica
Predicati predefiniti per riconoscere il tipo di un termine
var, nonvar
?- var(X).
true.
?- var(padre(X)).
false.
?- X=Y, Y=23, var(X).
false.
(Logica per l’Informatica)
integer, float, number
atom, atomic
?- atom(pippo).
true.
?- atom(3).
false.
?- atomic(3).
true.
01: PROgramming in LOGic
17 / 29
Termini complessi (o strutture)
Sono costruiti da un funtore (atomo) applicato a una sequenza di argomenti
(altri termini, semplici o complessi):
funtore(termine1 ,. . . ,terminen )
Esempi:
libro(’Le tigri di Mompracem’,autore(emilio,salgari))
padre(padre(antonio))
3+2
(Logica per l’Informatica)
01: PROgramming in LOGic
18 / 29
Termini complessi (o strutture)
Sono costruiti da un funtore (atomo) applicato a una sequenza di argomenti
(altri termini, semplici o complessi):
funtore(termine1 ,. . . ,terminen )
Esempi:
libro(’Le tigri di Mompracem’,autore(emilio,salgari))
padre(padre(antonio))
3+2
nonno(X,maria)
antenato(padre(padre(antonio)),madre(clara))
anche i fatti sono strutture
(Logica per l’Informatica)
01: PROgramming in LOGic
18 / 29
Termini complessi (o strutture)
Sono costruiti da un funtore (atomo) applicato a una sequenza di argomenti
(altri termini, semplici o complessi):
funtore(termine1 ,. . . ,terminen )
Esempi:
libro(’Le tigri di Mompracem’,autore(emilio,salgari))
padre(padre(antonio))
3+2
nonno(X,maria)
antenato(padre(padre(antonio)),madre(clara))
anche i fatti sono strutture
genitore(X,Y), genitore(Y,Z)
anche una sequenza di goal è una struttura
la virgola è l’operatore funtore principale
(Logica per l’Informatica)
01: PROgramming in LOGic
18 / 29
Termini complessi (o strutture)
Sono costruiti da un funtore (atomo) applicato a una sequenza di argomenti
(altri termini, semplici o complessi):
funtore(termine1 ,. . . ,terminen )
Esempi:
libro(’Le tigri di Mompracem’,autore(emilio,salgari))
padre(padre(antonio))
3+2
nonno(X,maria)
antenato(padre(padre(antonio)),madre(clara))
anche i fatti sono strutture
genitore(X,Y), genitore(Y,Z)
anche una sequenza di goal è una struttura
la virgola è l’operatore funtore principale
figlio(X,Y) :- genitore(Y,X)
anche una clausola è una struttura
l’operatore principale è :Non c’è differenza sintattica tra fatti, regole, goal e strutture che possono
essere argomenti di un funtore.
(Logica per l’Informatica)
01: PROgramming in LOGic
18 / 29
Unificazione
Due termini sono unificabili se:
sono lo stesso termine, oppure
contengono variabili che possono essere istanziate (sostituite) con
termini in modo tale da rendere uguali i due termini
(Logica per l’Informatica)
01: PROgramming in LOGic
19 / 29
Unificazione
Due termini sono unificabili se:
sono lo stesso termine, oppure
contengono variabili che possono essere istanziate (sostituite) con
termini in modo tale da rendere uguali i due termini
Unificabili
termini
tommaso
tommaso
nonno(X,Y)
nonno(tommaso,X)
(Logica per l’Informatica)
sostituzione
tommaso
X
nonno(tommaso,Z)
nonno(Y,linda)
01: PROgramming in LOGic
X=tommaso
X=tommaso, Y=Z
Y=tommaso, X=linda
19 / 29
Unificazione
Due termini sono unificabili se:
sono lo stesso termine, oppure
contengono variabili che possono essere istanziate (sostituite) con
termini in modo tale da rendere uguali i due termini
Unificabili
termini
tommaso
tommaso
nonno(X,Y)
nonno(tommaso,X)
sostituzione
tommaso
X
nonno(tommaso,Z)
nonno(Y,linda)
X=tommaso
X=tommaso, Y=Z
Y=tommaso, X=linda
Non unificabili
tommaso
vittorio
nonno(tommaso,X) nonno(vittorio,linda)
nonno(tommaso,X)
nonno(X,linda)
(Logica per l’Informatica)
01: PROgramming in LOGic
19 / 29
Unificazione e uguaglianza
?- tommaso=tommaso.
true.
(Logica per l’Informatica)
01: PROgramming in LOGic
20 / 29
Unificazione e uguaglianza
?- tommaso=tommaso.
true.
?- tommaso=X.
X = tommaso.
(Logica per l’Informatica)
01: PROgramming in LOGic
20 / 29
Unificazione e uguaglianza
?- tommaso=tommaso.
true.
?- tommaso=X.
X = tommaso.
?- nonno(X,Y), nonno(tommaso,Z).
X = tommaso,
Y = linda,
Z = linda.
(Logica per l’Informatica)
01: PROgramming in LOGic
20 / 29
Unificazione e uguaglianza
?- tommaso=tommaso.
true.
?- tommaso=X.
X = tommaso.
?- nonno(X,Y), nonno(tommaso,Z).
X = tommaso,
Y = linda,
Z = linda.
?- nonno(X,Y) = nonno(tommaso,Z).
X = tommaso,
Y = Z.
(Logica per l’Informatica)
01: PROgramming in LOGic
20 / 29
Unificazione e uguaglianza
?- tommaso=tommaso.
true.
?- tommaso=X.
X = tommaso.
?- nonno(X,Y), nonno(tommaso,Z).
X = tommaso,
Y = linda,
Z = linda.
?- nonno(X,Y) = nonno(tommaso,Z).
X = tommaso,
Y = Z.
?- nonno(tommaso,X) = nonno(Y,linda).
X = linda,
Y = tommaso.
(Logica per l’Informatica)
01: PROgramming in LOGic
20 / 29
Unificazione e uguaglianza
?- nonno(tommaso,X) = nonno(X,linda).
false.
L’algortimo di unificazione sostituisce le variabili via via che trova come
rendere uguali dei sottotermini
(Logica per l’Informatica)
01: PROgramming in LOGic
21 / 29
Unificazione e uguaglianza
?- nonno(tommaso,X) = nonno(X,linda).
false.
L’algortimo di unificazione sostituisce le variabili via via che trova come
rendere uguali dei sottotermini
nonno(tommaso,X)
nonno(X,linda)
(Logica per l’Informatica)
=⇒ X=tommaso
01: PROgramming in LOGic
21 / 29
Unificazione e uguaglianza
?- nonno(tommaso,X) = nonno(X,linda).
false.
L’algortimo di unificazione sostituisce le variabili via via che trova come
rendere uguali dei sottotermini
nonno(tommaso,tommaso)
nonno(tommaso,linda)
=⇒ X=tommaso, NO
?- X=tommaso, X=vittorio.
false.
Quando due termini vengono unificati, il Prolog applica le sostituzioni
dappertutto (fino alla fine del goal).
X=tommaso, X=vittorio
X=tommaso X=vittorio (tommaso=vittorio) ⇒ false
(Logica per l’Informatica)
01: PROgramming in LOGic
21 / 29
Algoritmo di unificazione (intuizione)
p(X,f(c),X)
=⇒ X=f(Y)
p(f(Y),Y,Z)
nuovo problema:
(Logica per l’Informatica)
p(f(Y),f(c),f(Y))
p(f(Y),Y,Z)
01: PROgramming in LOGic
22 / 29
Algoritmo di unificazione (intuizione)
p(X,f(c),X)
=⇒ X=f(Y)
p(f(Y),Y,Z)
nuovo problema:
p(f(Y),f(c),f(Y))
p(f(Y),Y,Z)
p(f(Y),f(c),f(Y))
=⇒ Y=f(c), X=f(f(c))
p(f(Y),Y,Z)
nuovo problema:
(Logica per l’Informatica)
p(f(f(c)),f(c),f(f(c)))
p(f(f(c)),f(c),Z)
01: PROgramming in LOGic
22 / 29
Algoritmo di unificazione (intuizione)
p(X,f(c),X)
=⇒ X=f(Y)
p(f(Y),Y,Z)
nuovo problema:
p(f(Y),f(c),f(Y))
p(f(Y),Y,Z)
p(f(Y),f(c),f(Y))
=⇒ Y=f(c), X=f(f(c))
p(f(Y),Y,Z)
nuovo problema:
p(f(f(c)),f(c),f(f(c)))
p(f(f(c)),f(c),Z)
p(f(f(c)),f(c),f(f(c)))
=⇒ Z=f(f(c)), Y=f(c), X=f(f(c))
p(f(f(c)),f(c),Z)
(Logica per l’Informatica)
01: PROgramming in LOGic
22 / 29
Algoritmo di unificazione (intuizione)
p(X,f(c),X)
=⇒ X=f(Y)
p(f(Y),Y,Z)
nuovo problema:
p(f(Y),f(c),f(Y))
p(f(Y),Y,Z)
p(f(Y),f(c),f(Y))
=⇒ Y=f(c), X=f(f(c))
p(f(Y),Y,Z)
nuovo problema:
p(f(f(c)),f(c),f(f(c)))
p(f(f(c)),f(c),Z)
p(f(f(c)),f(c),f(f(c)))
=⇒ Z=f(f(c)), Y=f(c), X=f(f(c))
p(f(f(c)),f(c),Z)
nuovo problema:
(Logica per l’Informatica)
p(f(f(c)),f(c),f(f(c)))
p(f(f(c)),f(c),f(f(c)))
01: PROgramming in LOGic
22 / 29
Occur check
X e padre(X) sono unificabili?
(Logica per l’Informatica)
01: PROgramming in LOGic
23 / 29
Occur check
X e padre(X) sono unificabili?
X
=⇒ X=padre(X) ?
padre(X)
nuovo problema:
padre(X)
padre(padre(X))
padre(X)
=⇒ X=padre(padre(X)) ?
padre(padre(X))
Occur check: è possibile unificare una variabile X con un termine solo se X
non occorre nel termine.
(Logica per l’Informatica)
01: PROgramming in LOGic
23 / 29
Occur check
X e padre(X) sono unificabili?
X
=⇒ X=padre(X) ?
padre(X)
nuovo problema:
padre(X)
padre(padre(X))
padre(X)
=⇒ X=padre(padre(X)) ?
padre(padre(X))
Occur check: è possibile unificare una variabile X con un termine solo se X
non occorre nel termine.
Ma l’unificazione del Prolog non esegue l’occur check:
?- X = padre(X).
X=padre(padre(padre(...))).
(Logica per l’Informatica)
01: PROgramming in LOGic
23 / 29
Occur check
X e padre(X) sono unificabili?
X
=⇒ X=padre(X) ?
padre(X)
nuovo problema:
padre(X)
padre(padre(X))
padre(X)
=⇒ X=padre(padre(X)) ?
padre(padre(X))
Occur check: è possibile unificare una variabile X con un termine solo se X
non occorre nel termine.
Ma l’unificazione del Prolog non esegue l’occur check:
?- X = padre(X).
X = padre(**).
(Logica per l’Informatica)
01: PROgramming in LOGic
23 / 29
Occur check
X e padre(X) sono unificabili?
X
=⇒ X=padre(X) ?
padre(X)
nuovo problema:
padre(X)
padre(padre(X))
padre(X)
=⇒ X=padre(padre(X)) ?
padre(padre(X))
Occur check: è possibile unificare una variabile X con un termine solo se X
non occorre nel termine.
Ma l’unificazione del Prolog non esegue l’occur check:
?- X = padre(X).
X = padre(**).
?- unify_with_occurs_check(X,padre(X)).
false.
(Logica per l’Informatica)
01: PROgramming in LOGic
23 / 29
Programmare con l’unificazione
vertical(line(point(X,Y),point(X,Z))).
horizontal(line(point(X,Y),point(Z,Y))).
(Logica per l’Informatica)
01: PROgramming in LOGic
24 / 29
Programmare con l’unificazione
vertical(line(point(X,Y),point(X,Z))).
horizontal(line(point(X,Y),point(Z,Y))).
?- vertical(line(point(1,1),point(1,3))).
true.
(Logica per l’Informatica)
01: PROgramming in LOGic
24 / 29
Programmare con l’unificazione
vertical(line(point(X,Y),point(X,Z))).
horizontal(line(point(X,Y),point(Z,Y))).
?- vertical(line(point(1,1),point(1,3))).
true.
?- vertical(line(point(1,1),point(3,2))).
false.
(Logica per l’Informatica)
01: PROgramming in LOGic
24 / 29
Programmare con l’unificazione
vertical(line(point(X,Y),point(X,Z))).
horizontal(line(point(X,Y),point(Z,Y))).
?- vertical(line(point(1,1),point(1,3))).
true.
?- vertical(line(point(1,1),point(3,2))).
false.
?- horizontal(line(point(1,1),point(1,Y))).
Y = 1.
(Logica per l’Informatica)
01: PROgramming in LOGic
24 / 29
Programmare con l’unificazione
vertical(line(point(X,Y),point(X,Z))).
horizontal(line(point(X,Y),point(Z,Y))).
?- vertical(line(point(1,1),point(1,3))).
true.
?- vertical(line(point(1,1),point(3,2))).
false.
?- horizontal(line(point(1,1),point(1,Y))).
Y = 1.
?- horizontal(line(point(2,3),Point)).
Point = point(_G650, 3).
(Logica per l’Informatica)
01: PROgramming in LOGic
24 / 29
L’aritmetica in Prolog
?- 3+2 = X.
X = 3+2.
(Logica per l’Informatica)
?- 3+2 = 5.
false.
01: PROgramming in LOGic
25 / 29
L’aritmetica in Prolog
?- 3+2 = X.
X = 3+2.
?- X is 3+2.
X = 5.
?- 3+2 = 5.
false.
/* is e non = */
?- 5 is 3+2.
true.
?- X is 3.0 + 2.0.
X = 5.0.
?- X is 3.0 + 2.
X = 5.0.
(Logica per l’Informatica)
01: PROgramming in LOGic
25 / 29
L’aritmetica in Prolog
?- 3+2 = X.
X = 3+2.
?- X is 3+2.
X = 5.
?- 3+2 = 5.
false.
/* is e non = */
?- 5 is 3+2.
true.
?- X is 3.0 + 2.0.
X = 5.0.
?- X is 3.0 + 2.
X = 5.0.
?- 5 is 3+X.
ERROR: is/2: Arguments are not sufficiently instantiated
(Logica per l’Informatica)
01: PROgramming in LOGic
25 / 29
Procedure ricorsive
vicino(tavolo,penna).
vicino(penna,pc).
colore(tavolo,bianco).
colore(penna,rosso).
colore(pc,verde).
colore(X,Y) :- vicino(X,Z), colore(Z,Y).
?- colore(tavolo,C).
C = bianco ;
C = rosso ;
C = verde ;
false.
(Logica per l’Informatica)
01: PROgramming in LOGic
26 / 29
L’abero di ricerca
vicino(tavolo,penna).
vicino(penna,pc).
colore(tavolo,bianco). colore(penna,rosso).
colore(X,Y) :- vicino(X,Z), colore(Z,Y).
C=bianco
colore(tavolo,C)
_X1=tavolo, C=_Y1 vicino(_X1,_Z1),
colore(_Z1,_Y1)
_Z1=penna
colore(_Z1,_Y1)
true
C=_Y1=rosso
true
colore(pc,verde).
_X2=_Z1=penna, C=Y_1=_Y2
vicino(_X2,_Z2),
colore(_Z2,_Y2)
_Z2=pc
colore(_Z2,_Y2)
_X3=_Z2=pc
C=Y_1=_Y2=verde
true
vicino(_X3,_Z3),
colore(_Z3,_Y3)
false
(Logica per l’Informatica)
01: PROgramming in LOGic
27 / 29
Reversibilità dei programmi
vicino(tavolo,penna).
vicino(penna,pc).
colore(tavolo,bianco). colore(penna,rosso).
colore(X,Y) :- vicino(X,Z), colore(Z,Y).
colore(pc,verde).
?- colore(X,rosso).
X = penna ;
X = tavolo ;
false.
?- colore(X,Y).
X = tavolo,
Y = bianco ;
X = penna,
Y = rosso ;
X = pc,
Y = verde ;
X = tavolo,
Y = rosso ;
..........
(Logica per l’Informatica)
01: PROgramming in LOGic
28 / 29
La strategia di ricerca del Prolog
La strategia di ricerca del Prolog visita l’albero di ricerca in profondità:
considera le clausole del programma dall’alto in basso
considera il corpo delle clausole da sinistra a destra
torna indietro (backtrack) sulle scelte sbagliate
Il significato dichiarativo e quello procedurale di un programma possono non
coincidere: il Prolog può espandere un cammino infinito e non trovare mai
una soluzione, anche se una soluzione esiste.
È importante:
l’ordine delle clausole nel programma
l’ordine dei sottogoal nel corpo delle regole
Regole di programmazione:
In una procedura: prima i fatti, poi le regole
Nel corpo di una regola: prima i goal più facili da dimostrare o refutare,
poi quelli più difficili
(Logica per l’Informatica)
01: PROgramming in LOGic
29 / 29