230 likes | 332 Views
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.
E N D
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 • Fatti: 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: ?- parent(anne, bill). • Risposta: true • Query ?- parent(anne, X). • Risposta: X=bill (premo ; ) X = charlie (premo ; ) false
Esempio: Famiglia • Query: ?- parent(X, Y). • Risposta: X=anne, Y=bill (premo ; ) X=anne, Y=charlie (premo ; ) X=bill, Y=donnie (premo ; ) 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). • 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), parent(X,Y). • ?- mother(ann,X).
Esempio • E le regole father(X,Y):- male(X), parent(X,Y). mother(X,Y):- female(X), parent(X,Y).
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. • 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 (HornClauses)
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)