1 / 26

Esecuzione dei programmi Prolog Liste ed operatori aritmetici

Esecuzione dei programmi Prolog Liste ed operatori aritmetici. Fabio Massimo Zanzotto. Algoritmo di Risoluzione. ?-. path ( a,d ). … by examples edge ( a,b ). edge ( b,c ). edge ( a,e ). edge ( c,d ). edge ( d,e ). edge ( f,e ). path (X,Y):- edge (X,Y).

Download Presentation

Esecuzione dei programmi Prolog Liste ed operatori aritmetici

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Esecuzione dei programmi PrologListe ed operatori aritmetici Fabio Massimo Zanzotto

  2. Algoritmo di Risoluzione ?- path(a,d). … by examples edge(a,b). edge(b,c). edge(a,e). edge(c,d). edge(d,e). edge(f,e). path(X,Y):- edge(X,Y). path(X,Y):- path(X,Z),path(Z,Y). edge(a,d). path(a,Z),path(Z,d). edge(a,Z),path(Z,d). fail edge(a,b),path(b,d). edge(a,b),path(b,Z),path(Z,d). edge(a,b),edge(b,c),path(c,d). edge(a,b),edge(b,c),edge(c,d). Success! X=a,Y=d X=a,Y=d

  3. 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 ;

  4. «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

  5. «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

  6. «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?

  7. «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

  8. «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?

  9. 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!!!

  10. 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)

  11. 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, []))))

  12. 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)

  13. Operatori su liste • member(?Elem, ?List) • Restituisce true se Elem si trova nella lista, può essere usato in vari modi: • 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

  14. Operatori su liste • member(?Elem, ?List) • possibile implementazione: member2(X, [X|_]). member2(X,[_|T]):- member2(X,T).

  15. Operatori su liste • append(?List1, ?List2, ?List1AndList2) • List1AndList2 è la concatenazione di List1 e List2. Vari utilizzi • 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]).

  16. Segno 06/03/2014

  17. 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]

  18. 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)) + * * 4 1 2 3

  19. 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 * * + + c a * a b c b

  20. 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

  21. 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

  22. Aritmetica • A = 3 , B is A + 4. • A = 3 e B = 7 • A = 3, B = A + C. • A = 3 e B = 3+C • A = 3, B isA+C, C=4. • ERROR: is/2: Arguments are not sufficiently instantiated

  23. 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)

  24. 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. • calcola(5+8,Y). • Y = 13 • calcola(5+8+2,X). • X = 15

  25. 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.

  26. Esercizio /*max(L,M). max è vera se L è una lista e M è il massimo di questa lista */

More Related