Il primo passo: I basilari del Prolog Fabio Massimo Zanzotto (slides realizzate da Andrea Turbati)
Elementi del Prolog Termini Predicati Clausole (Fatti e Regole) Programma logico
Termini Atomi: nomi che iniziano con lettera MINUSCOLA, sequenze di caratteri tra ‘ ’, numeri preceduti da caratteri andrea ‘Corso di Prolog’ c1p8 Numeri 12345 Variabili: nomi che iniziano con lettera MAIUSCOLA o con _ Tizio _andrea _ Termini composti somma(1, 2, X) 1+2
Predicati Espressi tramite la notazione f(t1, …, tn ) f è un atomo che prende il nome di funtore t1, …, tn sono gli argomenti e sono dei termini (predicato f con n argomenti, ha arità n)
Clausole Le clausole: fatti e regole I fatti sono regole senza corpo parent(ben, jim). friend(luke, daisy). Regole: grandparent(X,Y):- parent(X,Z), parent(Z,Y).
Regole Head :- Body . significa che affinché la Head sia vera deve essere vero il Body (e quindi i predicati che lo compongono) Nel Body ci sono 1 o più predicati separati da , (and) o da ; (or) Ogni regola termina con .
Fatti Un fatto è un predicato seguito da . Un fatto può essere composto da più termini amico(fratello(alice, X), bob).
Programma logico Insieme di regole/fatti Risponde alle query con o true o false e assegna dei valori alle variabili
Esempio: Famiglia parent(anne, bill). parent(anne, charlie). parent(bill, donnie). grandparent(X,Y):- parent(X,Z), parent(Z,Y).
Esempio: Famiglia Query: Risposta: Query ?- parent(anne, X). ?- parent(anne, bill). Risposta: true Query ?- parent(anne, X). X=bill (premo ; ) X = charlie false
Esempio: Famiglia Query: Risposta: ?- parent(X, Y). X=anne, Y=bill (premo ; ) X=anne, Y=charlie X=bill, Y=donnie false
Esecuzione del programma Prolog cerca nel proprio database di regole e fatti, quelli che soddisfano la nostra query, istanziando le variabili Ogni variabile, una volta istanziata (unificata), non può assumere un secondo valore (a differenza dei linguaggi classici di programmazione, come Java, C, C++, ecc)
Esempio Dati i fatti: parent( pam, bob). E le regole father(X,Y):- parent( bob, tom). parent( tom, ann). parent( bob, jerry). female(pam). male(bob). male(tom). female(ann). male(jerry). E le regole father(X,Y):- male(X), parent(X,Y). mother(X,Y):- female(X), ?- mother(ann,X).
Esempio E le regole father(X,Y):- male(X), parent(X,Y). mother(X,Y):- female(X),
Esempio Che risposta ho alle seguenti interrogazioni? ?- mother(X,Y). ?- father(X,Y). ?- mother(X,ann). ?- father(X,ann). ?- mother(ann,X).
L’interprete Prolog SWI-Prolog http://www.swi-prolog.org/ ha la licenza Lesser GNU Public License contiene un basilare editor di sviluppo (poco più che un semplice editor di test) Funziona su windows, linux e mac
Comandi utili edit. consult('nome_file'). reconsult(‘nome_file’) . apre l’editor per modificare/aggiungere fatti e regole al file in esame consult('nome_file'). carica un file con i suoi dati reconsult(‘nome_file’) . ricarica il file con i suoi dati trace / notrace . abilita / disabilita la stampa di tutti i passaggi intermedi (molto utile per seguire lo svolgersi del programma)
Ordine dei predicati nelle regole Vedere l’esempio contenuto in prolog-1.pl Provare le query ( * è 1,2,3 e 4): pred*(pam, ann). pred*(pam, andrea).
Documentazione sul prolog Nel sito http://www.swi-prolog.org/pldoc/ c’è la documentazione sulle varie regole già presenti in prolog Simboli usati: + termine che deve essere già istanziato - termine che viene istanziato dalla regola ? termine che può o meno essere già istanziato
Esempi documentazione member(?Elem, ?List) True if Elem is a member of List. The SWI-Prolog definition differs from the classical one. Our definition avoids unpacking each list element twice and provides determinism on the last element get(+Stream, -Char) Read the next non-blank character from Stream.
Esercizio Scrivere un programma Prolog che rappresenta un grafo tramite il fatto edge(A,B) per indicare che A e B sono connessi Interrogare il programma realizzato per avere tutti i nodi raggiungibili partendo da b: ?- path(b, X). b c a d e f
Prolog È un linguaggio di programmazione logica È un linguaggio dichiarativo Si basa su una restrizione delle logica del primo ordine (Horn Clauses)
Linguaggio dichiarativo Indica “cosa” serve per arrivare alla soluzione desiderata, ma non il “come”, cioè l’implementazione utilizzata Si contrappone ai linguaggi imperativi e procedurali (Java, C, C++, ecc)