Prolog: materiale didattico

Documenti analoghi
PROLOG: PROgramming in LOGic Linguaggio usato per risolvere problemi che coinvolgono oggetti e relazioni tra oggetti.

Richiami di Prolog. Marco Pennacchiotti. Tel Ing.dell Informazione, stanza 1035 (primo piano)

Introduzione alla Programmazione Logica ed al linguaggio PROLOG

Programmazione logica e PROLOG. Esercitazione 1. Sommario. Programmazione logica. Applicazioni della Programmazione Logica

Programmazione Dichiarativa. Programmazione Logica. SICStus PROLOG PROLOG. Bob Kowalski: "Algoritmo = Logica + Controllo"

Introduzione alla Programmazione Logica ed al linguaggio PROLOG

Programmazione logica e PROLOG. Esercitazione 1. AI - Carlucci Aiello & Nardi, 2007 Esercitazione 1 0

Linguaggi di Programmazione Prolog (1) Prolog. Processo di dimostrazione (limiti) Linguaggio: Utile per:

Corso di Linguaggi di Programmazione

Classificazione dei termini

Prolog. Processo di dimostrazione (limiti) Dott. Fabio Massimo Zanzotto. Linguaggio: Utile per:

Prolog Prodromi. Sistemi distribuiti LS 2003/2004 Prof. Andrea Omicini

UNIFICAZIONE E PATTERN MATCHING

t(a,t(b,t(c,t(d,empty,empty),t(e,empty,empty)),empty), t(f,t(g,t(h,empty,empty),empty),t(i,empty,empty)))

Raffinamenti della risoluzione

(X (, Y, Y Z ) Z " Z Z

TABELLA OPERATORI ARITMETICI

Rappresentazione della conoscenza. Lezione 4. Rappresentazione della Conoscenza Daniele Nardi, 2008Lezione 4 0

Esempio compito 11 Sett 2008

PRIORITA DEGLI OPERATORI OPERATORI PIU IN DETTAGLIO ASSOCIATIVITA DEGLI OPERATORI OPERATORI + * 2+3*5

IL PROBLEMA DELLA NEGAZIONE IPOTESI DI MONDO CHIUSO IPOTESI DI MONDO CHIUSO IPOTESI DI MONDO CHIUSO

Università di Bergamo Facoltà di Ingegneria. Intelligenza Artificiale. Paolo Salvaneschi B1_1 V1.3. Sistemi a regole

IL PROBLEMA DELLA NEGAZIONE

Introduzione alla logica

Fondamenti di Intelligenza Artificiale

Informatica teorica Lez. n 12 Introduzione al Lisp. Introduzione al Lisp. Prof. Giorgio Ausiello Università di Roma La Sapienza

Linguaggi di programmazione. Paradigmi di programmazione

C1: L C1 C2: L C2 C: C1 C2

Linguaggi di Programmazione

Logica: materiale didattico

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 16 Giugno 2016 Tempo a disposizione: 2 h Risultato: 32/32 punti

Istruzioni Condizionali

FONDAMENTI DI INTELLIGENZA ARTIFICIALE-M

Intelligenza Artificiale. Sistemi a regole Sistemi esperti

Fondamenti di Intelligenza Artificiale

FONDAMENTI DI INTELLIGENZA ARTIFICIALE (8 CFU) 13 Gennaio 2015 Tempo a disposizione: 2 h Risultato: 32/32 punti

Esercitazioni Basi di dati e web Dario Facchinetti

Indice PARTE A. Prefazione Gli Autori Ringraziamenti dell Editore La storia del C. Capitolo 1 Computer 1. Capitolo 2 Sistemi operativi 21 XVII XXIX

FONDAMENTI DI INTELLIGENZA ARTIFICIALE-M

Sommario Linguaggi, messaggi e comunicazione. Introduzione ai Linguaggi di Programmazione. Linguaggio. Messaggio

Logica per la Programmazione

Logica per la Programmazione Corso di Laurea in INFORMATICA a.a. 2016/17

Introduzione alla logica matematica. Logica matematica. Paolo Bison

Domande sugli esercizi di Logica

Istruzioni condizionali di diramazione in Fortran 90

COMPITO DI FONDAMENTI DI INTELLIGENZA ARTIFICIALE INTELLIGENZA ARTIFICIALE (v.o.) PARTE I. 2 Dicembre 2008 (Tempo a disposizione 2h ; su 32 punti)

Manuale pratico per il corso di Logica

FONDAMENTI DI INTELLIGENZA ARTIFICIALE (8 CFU)

FONDAMENTI DI INTELLIGENZA ARTIFICIALE-M

Istruzioni Condizionali

Automi e Linguaggi Formali

Sommario Linguaggi, messaggi e comunicazione. Introduzione ai Linguaggi di Programmazione. Linguaggio (1) Linguaggio (2)

Linguaggi di programmazione e astrazione

Cominciamo ad analizzare la rappresentazione delle informazioni... di Cassino. C. De Stefano Corso di Fondamenti di Informatica Università degli Studi

COMPITO DI INTELLIGENZA ARTIFICIALE (v.o.) PARTE I FONDAMENTI DI INTELLIGENZA ARTIFICIALE. 13 Dicembre 2006 (Tempo a disposizione 2h; su 32 punti)

Domande sugli esercizi di Logica

FONDAMENTI DI INTELLIGENZA ARTIFICIALE-M

CALCOLO PROPOSIZIONALE. Corso di Logica per la Programmazione Andrea Corradini

Rappresentazione della conoscenza. Lezione 5. Rappresentazione della Conoscenza Daniele Nardi, 2008Lezione 5 0

Basi di Dati. prof. Letizia Tanca AA Linguaggi di query basati sulla. programmazione logica. programmazione logica

Logica per la Programmazione Corso di Laurea in INFORMATICA a.a. 2015/16

Paolo Bison. Fondamenti di Informatica Ingegneria Meccanica Università di Padova A.A. 2008/09

Agenti Basati su Logica

Università degli Studi di L Aquila Facoltà di Scienze M.F.N. Corso di Laurea in Informatica. Modulo di Laboratorio di Algoritmi e Strutture Dati

FONDAMENTI DI INTELLIGENZA ARTIFICIALE-M

Interpreti, compilatori e semantica operazionale

Basi di Dati. prof. Letizia Tanca AA Altri linguaggi formali di interrogazione per il Modello Relazionale dei Dati

I predicati cut e not

Logica per la Programmazione

Logica per la Programmazione

INTRODUZIONE ALLA LOGICA DI HOARE. Corso di Logica per la Programmazione

Prof. Pagani Corrado INTRODUZIONE AL LINGUAGGIO C

Algoritmi e Strutture Dati

Introduzione al C. Informatica Generale - Introduzione al C Versione 1.0, aa p.1/17

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Traduzione ed Interpretazione

Fondamenti di Intelligenza Artificiale M

Informatica 3. LEZIONE 9: Introduzione ai linguaggi funzionali. Modulo 1: Introduzione ai linguaggi funzionali Modulo 2: LISP

Traduzione ed Interpretazione. Queste sconosciute

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 8 Settembre 2016 Tempo a disposizione: 2 h Risultato: 32/32 punti

Logica per la Programmazione

Linguaggi, messaggi e comunicazione Traduzione di programmi Interpreti e compilatori Introduzione al processo di compilazione

FONDAMENTI DI INTELLIGENZA ARTIFICIALE PRIMA PARTE (6 CFU) 9 Dicembre 2010 Tempo a disposizione 2h Risultato 32/32 punti

Introduzione al Corso

Logica per la Programmazione

RAPPRESENTAZIONE GLI ALGORITMI NOTAZIONE PER LA RAPPRESENTAZIONE DI UN ALGORITMO

Procedura di Davis Putnam

Linguaggi e Ambienti di Programmazione

CALCOLO PROPOSIZIONALE: CENNI

Linguaggi di Programmazione

Laboratorio di Programmazione

FONDAMENTI DI INTELLIGENZA ARTIFICIALE 2 Aprile 2009 Tempo a disposizione 2h Risultato 32/32 punti

Constraint Satisfaction Problems

Sommario PREFAZIONE...XI CAPITOLO 1: INTRODUZIONE AI COMPUTER, A INTERNET E AL WEB... 1 CAPITOLO 2: INTRODUZIONE ALLA PROGRAMMAZIONE IN C...

DIMOSTRAZIONI DI TAUTOLOGIE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

Programmazione Funzionale

Transcript:

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). Queries amico è un predicato. antonio,bianca,carla,... sono costanti. Chiunque è una variabile.?- 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). Queries amico è un predicato. antonio,bianca,carla,... sono costanti. Chiunque è una variabile.?- 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). Queries amico è un predicato. antonio,bianca,carla,... sono costanti. Chiunque è una variabile.?- 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) amico(x,qualcuno), amico(qualcuno,y) testa della regola 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) amico(x,qualcuno), amico(qualcuno,y) testa della regola 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) amico(x,qualcuno), amico(qualcuno,y) testa della regola 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) amico(x,qualcuno), amico(qualcuno,y) testa della regola 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).?- conosce(bianca,x). X = dario Queries con variabili (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).?- conosce(bianca,x). X = dario ; Queries con variabili (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).?- conosce(bianca,x). X = dario ; X = carla. Queries con variabili (Logica per l Informatica) 01: PROgramming in LOGic 7 / 29

Prolog e logica Fatti e regole sono clausole. Prolog Logica Implicazione A :- B B A Congiunzione A, B A B Disgiunzione A ; B A B (Logica per l Informatica) 01: PROgramming in LOGic 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) x 1... x n pred(c 1,..., c n, x 1,..., x n ) (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) x 1... x n pred(c 1,..., c n, x 1,..., x n ) 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). x 1... x n ( y 1... y n B(x 1,..., x n, y 1,..., y n ) A(x 1,..., x n )) (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) x 1... x n pred(c 1,..., c n, x 1,..., x n ) 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). x 1... x n ( y 1... y n B(x 1,..., x n, y 1,..., y n ) A(x 1,..., x n )) x 1... x n y 1... y n (B(x 1,..., x n, y 1,..., y n ) A(x 1,..., x n )) (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) x 1... x n pred(c 1,..., c n, x 1,..., x n ) 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). x 1... x n ( y 1... y n B(x 1,..., x n, y 1,..., y n ) A(x 1,..., x n )) x 1... x n y 1... y n (B(x 1,..., x n, y 1,..., y n ) A(x 1,..., x n )) Variabili in una query?- conosce(bianca,x). esiste X conosciuto da bianca??- goal(x1,...,xn). x 1... x n goal(x 1... x n ) e derivabile dal programma? Se lo e, per quali valori di x 1... x n? (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(termine 1,...,termine n ) 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 Goal nonno(tommaso,bianca) genitore(x,z), genitore(z,y). (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 X=tommaso, Y=bianca, Z=francesca Goal nonno(tommaso,bianca) genitore(x,z), genitore(z,y). 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). Backtrack: Legami X=tommaso, Y=bianca X=tommaso, Y=bianca, Z=francesca X=tommaso, Y=bianca, Z=vittorio Goal nonno(tommaso,bianca) genitore(x,z), genitore(z,y). genitore(z,y): false genitore(z,y) (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: X=tommaso, Y=bianca X=tommaso, Y=bianca, Z=francesca X=tommaso, Y=bianca, Z=vittorio X=tommaso, Y=bianca, Z=vittorio Goal nonno(tommaso,bianca) genitore(x,z), genitore(z,y). genitore(z,y): false genitore(z,y) true (Logica per l Informatica) 01: PROgramming in LOGic 11 / 29

Il motore di inferenza del Prolog?- nonno(tommaso,chi). genitore(tommaso,francesca). genitore(tommaso,vittorio). genitore(francesca,linda). genitore(vittorio,bianca). nonno(x,y) :- genitore(x,z), genitore(z,y). 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 Goal nonno(tommaso,chi) genitore(x,z), genitore(z,y). (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 X=tommaso, Chi=Y, Z=francesca Goal nonno(tommaso,chi) genitore(x,z), genitore(z,y). genitore(z,y) (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). Chi=linda Legami Goal Risposta nonno(tommaso,chi) X=tommaso,Chi=Y genitore(x,z), genitore(z,y). X=tommaso, Chi=Y, Z=francesca genitore(z,y) X=tommaso, Chi=Y=linda, Z=francesca true Chi=linda (Logica per l Informatica) 01: PROgramming in LOGic 12 / 29

Il motore di inferenza del Prolog?- nonno(tommaso,chi). Chi=linda ; = genitore(tommaso,francesca). genitore(tommaso,vittorio). genitore(francesca,linda). genitore(vittorio,bianca). nonno(x,y) :- genitore(x,z), genitore(z,y). Legami Goal Risposta nonno(tommaso,chi) X=tommaso,Chi=Y genitore(x,z), genitore(z,y). X=tommaso, Chi=Y, Z=francesca genitore(z,y) X=tommaso, Chi=Y=linda, Z=francesca true Chi=linda Backtrack: X=tommaso,Chi=Y genitore(x,z), genitore(z,y). (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). Chi=linda ; Legami Goal Risposta nonno(tommaso,chi) X=tommaso,Chi=Y genitore(x,z), genitore(z,y). X=tommaso, Chi=Y, Z=francesca genitore(z,y) X=tommaso, Chi=Y=linda, Z=francesca true Chi=linda Backtrack: X=tommaso,Chi=Y genitore(x,z), genitore(z,y). X=tommaso, Chi=Y, Z=vittorio genitore(z,y) (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). Chi=linda ; Chi=bianca Legami Goal Risposta nonno(tommaso,chi) X=tommaso,Chi=Y genitore(x,z), genitore(z,y). X=tommaso, Chi=Y, Z=francesca genitore(z,y) X=tommaso, Chi=Y=linda, Z=francesca true Chi=linda Backtrack: X=tommaso,Chi=Y genitore(x,z), genitore(z,y). X=tommaso, Chi=Y, Z=vittorio genitore(z,y) X=tommaso, Chi=Y=bianca, Z=vittorio true Chi=bianca (Logica per l Informatica) 01: PROgramming in LOGic 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=francesca X=tommaso,Chi=Y, Z=vittorio X=tommaso, Chi=Y=linda, Z=francesca genitore(z,y) X=tommaso, Chi=Y=leonardo, Z=francesca X=tommaso, Chi=Y=bianca, Z=vittorio genitore(z,y) X=tommaso, Chi=Y=andrea, Z=vittorio true true true true (Logica per l Informatica) 01: PROgramming in LOGic 14 / 29

Il backtracking likes(mary,food). % clausola 1 likes(mary,wine). % clausola 2 likes(john,beer). % clausola 3 likes(john,wine). % clausola 4 likes(john,mary). % clausola 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). % clausola 1 likes(mary,wine). % clausola 2 likes(john,beer). % clausola 3 likes(john,wine). % clausola 4 likes(john,mary). % clausola 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). % clausola 1 likes(mary,wine). % clausola 2 likes(john,beer). % clausola 3 likes(john,wine). % clausola 4 likes(john,mary). % clausola 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). % clausola 1 likes(mary,wine). % clausola 2 likes(john,beer). % clausola 3 likes(john,wine). % clausola 4 likes(john,mary). % clausola 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). % clausola 1 likes(mary,wine). % clausola 2 likes(john,beer). % clausola 3 likes(john,wine). % clausola 4 likes(john,mary). % clausola 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). % clausola 1 likes(mary,wine). % clausola 2 likes(john,beer). % clausola 3 likes(john,wine). % clausola 4 likes(john,mary). % clausola 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). % clausola 1 likes(mary,wine). % clausola 2 likes(john,beer). % clausola 3 likes(john,wine). % clausola 4 likes(john,mary). % clausola 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). % clausola 1 likes(mary,wine). % clausola 2 likes(john,beer). % clausola 3 likes(john,wine). % clausola 4 likes(john,mary). % clausola 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 termini complessi costanti 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(x). true. var, nonvar?- var(padre(x)). false.?- X=Y, Y=23, var(x). false. integer, float, number atom, atomic?- atom(pippo). true.?- atom(3). false.?- atomic(3). true. (Logica per l Informatica) 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(termine 1,...,termine n ) 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(termine 1,...,termine n ) 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(termine 1,...,termine n ) 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(termine 1,...,termine n ) 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 sostituzione tommaso tommaso tommaso X X=tommaso nonno(x,y) nonno(tommaso,z) X=tommaso, Y=Z nonno(tommaso,x) nonno(y,linda) Y=tommaso, X=linda (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 sostituzione tommaso tommaso tommaso X X=tommaso nonno(x,y) nonno(tommaso,z) X=tommaso, Y=Z nonno(tommaso,x) nonno(y,linda) 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) = X=tommaso (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,tommaso) nonno(tommaso,linda)?- X=tommaso, X=vittorio. false. = X=tommaso, NO 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) p(f(y),y,z) = X=f(Y) nuovo problema: p(f(y),f(c),f(y)) p(f(y),y,z) (Logica per l Informatica) 01: PROgramming in LOGic 22 / 29

Algoritmo di unificazione (intuizione) p(x,f(c),x) p(f(y),y,z) = X=f(Y) nuovo problema: p(f(y),f(c),f(y)) p(f(y),y,z) p(f(y),f(c),f(y)) p(f(y),y,z) = Y=f(c), X=f(f(c)) nuovo problema: p(f(f(c)),f(c),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) p(f(y),y,z) = X=f(Y) nuovo problema: p(f(y),f(c),f(y)) p(f(y),y,z) p(f(y),f(c),f(y)) p(f(y),y,z) = Y=f(c), X=f(f(c)) 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))) p(f(f(c)),f(c),z) = Z=f(f(c)), Y=f(c), X=f(f(c)) (Logica per l Informatica) 01: PROgramming in LOGic 22 / 29

Algoritmo di unificazione (intuizione) p(x,f(c),x) p(f(y),y,z) = X=f(Y) nuovo problema: p(f(y),f(c),f(y)) p(f(y),y,z) p(f(y),f(c),f(y)) p(f(y),y,z) = Y=f(c), X=f(f(c)) 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))) p(f(f(c)),f(c),z) = Z=f(f(c)), Y=f(c), X=f(f(c)) nuovo problema: p(f(f(c)),f(c),f(f(c))) p(f(f(c)),f(c),f(f(c))) (Logica per l Informatica) 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 padre(x) = X=padre(X)? nuovo problema: padre(x) padre(padre(x)) padre(x) padre(padre(x)) = 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 padre(x) = X=padre(X)? nuovo problema: padre(x) padre(padre(x)) padre(x) padre(padre(x)) = 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 padre(x) = X=padre(X)? nuovo problema: padre(x) padre(padre(x)) padre(x) padre(padre(x)) = 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 padre(x) = X=padre(X)? nuovo problema: padre(x) padre(padre(x)) padre(x) padre(padre(x)) = 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.?- 3+2 = 5. X = 3+2. false. (Logica per l Informatica) 01: PROgramming in LOGic 25 / 29

L aritmetica in Prolog?- 3+2 = X.?- 3+2 = 5. X = 3+2. false.?- X is 3+2. /* is e non = */ X = 5.?- 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.?- 3+2 = 5. X = 3+2. false.?- X is 3+2. /* is e non = */ X = 5.?- 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(pc,verde). colore(x,y) :- vicino(x,z), colore(z,y). C=bianco colore(tavolo,c) _X1=tavolo, C=_Y1 true vicino(_x1,_z1), colore(_z1,_y1) _Z1=penna colore(_z1,_y1) C=_Y1=rosso _X2=_Z1=penna, C=Y_1=_Y2 true vicino(_x2,_z2), colore(_z2,_y2) _Z2=pc colore(_z2,_y2) C=Y_1=_Y2=verde _X3=_Z2=pc true vicino(_x3,_z3), colore(_z3,_y3) (Logica per l Informatica) 01: PROgramming in LOGic 27 / 29 false

Reversibilità dei programmi 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(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