Esecuzione dei programmi Prolog Liste ed operatori aritmetici Fabio Massimo Zanzotto University of Rome “Tor Vergata” Algoritmo di Risoluzione ?- path(a,d). … by examples edge(a,d). path(a,Z),path(Z,d). edge(a,b). edge(a,Z),path(Z,d). edge(b,c). fail edge(a,b),path(b,d). edge(a,e). edge(a,b),path(b,Z),path(Z,d). edge(c,d). edge(a,b),edge(b,c),path(c,d). edge(d,e). edge(a,b),edge(b,c),edge(c,d). Success! edge(f,e). X=a,Y=d path(X,Y):- edge(X,Y). path(X,Y):- path(X,Z),path(Z,Y). X=a,Y=d © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esecuzione programma • Analizza i fatti/regole dall’alto verso il basso (quindi è importante l’ordine con cui vengono scritti) • Utilizzo del BACKTRACKING per tornare indietro a prima che una variabile fosse unificata o che una certa regola fosse esplorata • Utilizzo della ricorsione per chiamare le altre regole • Per avere altre risposte, e quindi forzare il backtracking anche se il programma ne ha già trovata una che funziona, basta premere ; © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” «Letture» dei programmi Prolog • Il mondo dei se può essere letto in maniera: – Dichiarativa I problemi sono risolubili attraverso la scrittura di un insieme di regole – Procedurale I problemi sono risolubili attraverso la scrittura sequenze di istruzioni © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” «Lettura» Dichiarativa del Prolog È la lettura classica (e più corretta): • Una clausola con variabili come grandparent(X,Y):parent(X,Z), parent(Z,Y). • viene letta: Per ogni X e Y e Z, grandparent(X,Y) è vero se parent(X,Z) è vero e parent(Z,Y) è vero © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” «Lettura» Dichiarativa del Prolog È la lettura classica (e più corretta): Una query come: ?- grandparent(X,mario). viene letta come: esiste un X che tale che grandparent(X,mario) è vero? © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” «Lettura» Procedurale del Prolog È una lettura necessaria: • Una clausola con variabili come grandparent(X,Y):parent(X,Z), parent(Z,Y). • Può essere anche letta: Per qualsiasi valore delle variabili X e Y e Z, per soddisfare il goal grandparent(X,Y) soddisfa prima il goal parent(X,Z) e poi il parent(Z,Y). ATTENZIONE: le variabili NON variano valore durante il soddisfamento del goal © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” «Lettura» Procedurale del Prolog È una lettura necessaria: Una query come: ?- grandparent(X,mario). viene letta come: Soddisfare il goal grandparent(X,mario) trovando il valore della variabile X? © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Osservazioni • Importanza dell’ordine delle clausole e nelle clausole. path(X,Y):- path(X,Z),path(Z,Y). path(X,Y):- edge(X,Y). Genera un loop infinito!!! © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Liste • In Prolog le liste sono molto utilizzate • Lista: sequenza di vari elementi (anche ripetuti), che possono essere a loro volta delle liste • Es: [primo, secondo, [primo2, secondo2]]. – Lista composta da tre elementi – Il terzo elemento è a sa volta una lista • La lista può essere vuota (caso molto importante e utilizzato) © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Liste • Ogni lista è composta da due parti: – Head: è il primo elemento – Tail: è il resto della lista (a sua volta una lista) • Le liste possono essere rappresentati in due modi: – [a,b,c,d] – .(a, .(b, .(c, .(d, [])))) © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Liste • Per estrarre la Testa di una lista si usa la notazione: – [H | T ], dove H è la testa e T è la lista rimanente senza il primo elemento • Si possono estrarre più elementi contemporaneamente: – [H1, H2 | T] – H1 e H2 sono il primo e il secondo elemento – T è la lista rimanente (la lista di partenza meno i primi due elementi) © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Operatori su liste • member(?Elem, ?List) – Restituisce true se Elem si trova nella lista, può essere usato in vari modi: • • • • © F.M.Zanzotto member(b, [a, b, c, d]). -> true member(e, [a, b, c, d]). -> false member(X,[a, b, c, d]). -> X = a ; X=b ; … member(c, [a, b, X, d]). -> X = c Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Operatori su liste • member(?Elem, ?List) • possibile implementazione: member2(X, [X|_]). member2(X,[_|T]):member2(X,T). © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Operatori su liste • append(?List1, ?List2, ?List1AndList2) – List1AndList2 è la concatenazione di List1 e List2. Vari utilizzi • • • • © F.M.Zanzotto append([a,b],[c,d], X). -> X = [a,b,c,d] append([a,b],X, [a,b,c,d]). -> X = [c,d] append([a,b],[X,d], [a,b,c,d]). -> X = c append(X, Y, [a,b,c,d]). Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” • Segno 06/03/2014 © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esercizio • Scrivere una possibile implementazione della append • Scrivere la regola per invertire tutti gli elementi di una lista, in modo da avere: ?- reversed([a,b,c,d,e,f], X). X=[f,e,d,c,b,a] © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Operatori • In Prolog è possibile definire nuovi operatori, ma ne esistono già alcuni definiti (esempio gli operatori aritmetici) • 1*2+3*4 ha i due operatori + e * • la scrittura in Prolog sarebbe: – +(*(1,2), *(3,4)) + * 1 © F.M.Zanzotto * 2 Logica per la Programmazione e la Dimostrazione Automatica 3 4 University of Rome “Tor Vergata” Definire un operatore • Ogni operatore ha una sua priorità • a + b*c come deve essere letto? – +(a, *(b,c) ? – *( +(a,b), c) ? • In matematica * lega di più di +, e quindi + ha priorità più alta di * * + a b © F.M.Zanzotto + * c a c b Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Aritmentica • Prolog può essere usato anche per fare dei calcoli, con alcune limitazioni • Come detto gli operatori aritmetici sono già definiti • A = B + C assegna ad A non il risultato della somma ma assegna proprio B + C • per eseguire l’operazione bisogna usare is © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Aritmetica • A is 5 + 6 fa sì che in A venga messo il valore 11 • B is 8 + 2 * 3 mette in B 14 (rispetta la priorità) • A destra di is non possono esserci variabile non ancora istanziate © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Aritmetica • A = 3 , B is A + 4. – A=3eB=7 • A = 3, B = A + C. – A = 3 e B = 3+C • A = 3, B is A+C, C=4. – ERROR: is/2: Arguments are not sufficiently instantiated © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Operatori per i calcoli • Gli operatori direttamente utilizzabili sono: – – – – – – – – + * / ** (elevamento a potenza) // (divisione intera) mod (modulo, resto della divisione) <, >, >=, =<, =, \= (sono confronti booleani utili come predicati, ma non utilizzabili a sinistra di is) – number(X) (vero se X è un numero, falso negli altri casi) © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esempio • Vedere il file prolog-2.pl per avere un esempio di regole che usano gli operatori per i calcoli • calcola(X + Y, Z):Z is X+Y. – – – – © F.M.Zanzotto calcola(5+8,Y). Y = 13 calcola(5+8+2,X). X = 15 Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esercizio • Implementare l’operatore div in modo tale che – A is 12 div 6 div 2 – A=4 • Definire la regola max(A, B, Max) in modo che in Max ci vada il massimo tra A e B • Pensare anche al caso: – max(A, 5, 9) – A = 9. © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica University of Rome “Tor Vergata” Esercizio /*max(L,M). max è vera se L è una lista e M è il massimo di questa lista */ © F.M.Zanzotto Logica per la Programmazione e la Dimostrazione Automatica