Linguaggi di Programmazione (AA 2002/2003) Corso di Laurea in Informatica Introduzione al linguaggio Prolog - parte 2
Prolog • Lavora su strutture ad ALBERO – anche i programmi sono strutture dati manipolabili – utilizzo della ricorsione e non assegnamento • Metodologia di programmazione: – concentrarsi sulla specifica del problema rispetto alla strategia di soluzione Un PROGRAMMA PROLOG e’ un insieme di clausole di Horn che rappresentano: – FATTI riguardanti gli oggetti in esame e le relazioni che intercorrono – REGOLE sugli oggetti e sulle relazioni (SE…..ALLORA) – GOAL (clausole senza testa), sulla base della conoscenza definita
Programmazione logica e Prolog Clausole
Programmazione logica e Prolog
Programmazione logica e Prolog clausole definite: - regole A¬ B1, B2,..., Bm. - fatti A. clausole negative: (goal) ¬ B1, B2,..., Bm. clausole negative: domanda $X1...Xn.(B1Ù B2Ù...Ù Bm) negazione per applicare la refutazione ~$X1...Xn.(B1Ù B2Ù...Ù Bm) "X1...Xn.(~B1Ú ~B2Ú...Ú ~Bm) ¬ B1, B2,..., Bm.
Programmazione logica e Prolog Un programma logico: sum(0,X,X). sum(s(X),Y,s(Z)) :- sum(X,Y,Z). Possiamo interpretare s(N) come il successore del numero N allora 0, s(0), s(s(0)), s(s(s(0)))… rappresentano 0,1,2,3… Questo programma definisce la somma fra due numeri naturali.
Programmazione logica e Prolog
Programmazione logica e Prolog ESECUZIONE DI UN PROGRAMMA • Una computazione corrisponde al tentativo di dimostrare, tramite la risoluzione, che una formula segue logicamente da un programma (e’un teorema). • Inoltre, si deve determinare una sostituzione per le variabili del goal (detto anche “query”) per cui la query segue logicamente dal programma. • Dato un programma P e la query: :- p(t1,t2,…,tm). se X1,X2,…,Xn sono le variabili che compaiono in t1,t2,…,tm il significato della query e’: $X1, $X2,…, $Xn p(t1,t2,…,tm)e l’obiettivo e’ quello di trovare una sostituzione s = {X1/s1,X2/s2,…,Xn/sn} dove si sono termini tale per cui P |= p(t1,t2,…,tm)]s
Programmazione logica e Prolog Dato un insieme di clausole di Horn è possibile derivare la clausola vuota solo se c`è una sola clausola senza testa e tutte le altre clausole hanno la testa. Quindi in un programma logico P tutte le clausole debbono avere la testa mentre la clausola goal G0. non avrà testa. Si deve dimostrare che da è possibile derivare la clausola vuota. Come? Se si tentassero ad ogni passo tutte le risoluzioni possibili e si aggiungessero le clausole inferite all’ insieme di partenza si avrebbe una esplosione combinatoria. Si deve adottare una strategia di soluzione opportuna.
Programmazione logica e Prolog Risoluzione ad input lineare La risoluzione avviene sempre fra l’ultimo goal derivato in ciascun passo e una clausola di programma, mai fra due clausole di programma o fra una clausola di programma ed un goal derivato in precedenza. Sia dato un programma logico P e un goal G0. Si deve dimostrare che da è possibile derivare la clausola vuota.
Programmazione logica e Prolog Risoluzione ad input lineare (SLD) La risoluzione avviene sempre fra l’ultimo goal e una clausola di programma. Si puo’ avere: successo (viene generata la clausola vuota) insuccesso finito insuccesso infinito La sostituzione di risposta è la sequenza di unificatori usati. Applicati alle variabili del goal iniziale danno la risposta.
Programmazione logica e Prolog • Risoluzione Lineare per Clausole Definite con funzione di Selezione (RISOLUZIONE SLD) • Dato un programma logico P e una clausola goal G0, ad ogni passo di risoluzione si ricava un nuovo risolvente Gi+1, se esiste, dalla clausola goal ottenuta al passo precedente Gi e da una variante di una clausola appartenente a P • Una variante per una clausola C e’ la clausola C’ ottenuta da C rinominando le sue variabili ( renaming) – Esempio: p(X):- q(X,g(Z)). p(X1):- q(X1,g(Z1)).
Programmazione logica e Prolog • L’unificazione è un meccanismo che permette di calcolare una sostituzione al fine di rendere uguali due espressioni. Per espressione intendiamo un termine, un letterale o una congiunzione o disgiunzione di letterali. • SOSTITUZIONE: q = [X1/T1, X2/T2,…, Xn/Tn] insieme di legami di termini Ti a variabili Xi che rendono uguali due espressioni. L’applicazione di una sostituzione a un’espressione E, [E] q produce una nuova espressione in cui vengono sostituite tutte le variabili di E con i corrispondenti termini. • Esempio: Espressione 1: c(X,Y) Espressione 2: c(a,K) sostituzione unificatrice: = [X/a, Y/K]
Programmazione logica e Prolog Strategia di risoluzione in profondità con backtracking Possono esserci più clausole di programma utilizzabili per applicare la risoluzione con il goal corrente. Si possono adottare diverse strategie di ricerca: in profondità : si sceglie una clausola e si mantiene fissa questa scelta, finchè non si arriva alla clausola vuota o alla impossibilità di fare nuove risoluzioni. In questo ultimo caso si riconsiderano le scelte fatte precedentemente. in ampiezza: si considerano in parallelo tutte le possibili alternative. Il prolog adotta una strategia di risoluzione in profondità con backtracking. Permette di risparmiare memoria. Non è completa per le clausole di Horn.
Programmazione logica e Prolog • Una derivazione SLD per un goal G0 dall’insieme di clausole definite P e’ una sequenza di clausole goal G0,…Gn, una sequenza di varianti di clausole del programma C1, …Cn, e una sequenza di sostituzioni q1 ,…, qn tali che Gi+1 è derivato da Gi e da Ci+1 attraverso la sostituzione qn . La sequenza può essere anche infinita. • Esistono tre tipi di derivazioni; – successo, se per n finito Gn è uguale alla clausola vuota Gn = :- – fallimento finito: se per n finito non è più possibile derivare un nuovo risolvente da Gn e Gn non è uguale a :- – fallimento infinito: se è sempre possibile derivare nuovi risolventi tutti diversi dalla clausola vuota.
Programmazione logica e Prolog ALBERI DI DERIVAZIONE • Dato un programma logico P, un goal G0 e una regola di calcolo R, un albero SLD per P È {G0} via R è definito come segue: – ciascun nodo dell'albero è un goal (eventualmente vuoto); – la radice dell'albero è il goal G0; – dato il nodo :-A1,...,Am-1,Am,Am+1,...,Ak se Am è l’atomo selezionato dalla regola di calcolo R, allora questo nodo ( genitore) ha un nodo figlio per ciascuna clausola Ci = A:-B1,...,Bq di P tale che A e Am sono unificabili attraverso una sostituzione unificatrice più generale q. Il nodo figlio è etichettato con la clausola goal: :-[A1,...,Am-1,B1,...,Bq,Am+1,...,Ak] q e il ramo dal nodo padre al figlio è etichettato dalla sostituzione q e dalla clausola selezionata Ci; – il nodo vuoto (indicato con “:-”) non ha figli.
Programmazione logica e Prolog (cl1) p :- q,r. (cl5) s:- w. (cl2) p :- s,t. (cl6) t. (cl3) q :- u. (cl7) w. (cl4) q :- v. goal :- p. Albero di risoluzione :- p. (1) (cl1) (cl2) :- q,r. (2) :- s,t. (5) Strategia di risoluzione in profondità con backtracking (cl3) (cl4) (cl5) :- u,r. (3) :- v,r. (4) :- w,t. (6) fallimento fallimento (cl7) :- t. (7) (cl6) :- clausola vuota - successo
Programmazione logica e Prolog REGOLA DI CALCOLO • Ad ogni ramo di un albero SLD corrisponde una derivazione SLD. – Ogni ramo che termina con il nodo vuoto (“:-”) rappresenta una derivazione SLD di successo. • La regola di calcolo influisce sulla struttura dell’albero per quanto riguarda sia l’ampiezza sia la profondità. Tuttavia non influisce su correttezza e completezza. Quindi, qualunque sia R, il numero di cammini di successo (se in numero finito) è lo stesso in tutti gli alberi SLD costruibili per P È {G0} . • R influenza solo il numero di cammini di fallimento (finiti ed infiniti).
Programmazione logica e Prolog sum(0,X,X). (CL1) sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2) G0= :- sum(W,0,0),sum(W,0,K). Albero SLD con regola di calcolo “left-most”
Programmazione logica e Prolog sum(0,X,X). (CL1) sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2) G0= :- sum(W,0,0),sum(W,0,K). Albero SLD con regola di calcolo “right-most”
Programmazione logica e Prolog (cl1) p:- q,r. (cl2) p. (cl3) q:- q,t. Strategia di risoluzione in profondità con backtracking Albero di risoluzione per il goal :- p. :- p. (1) (cl1) (cl2) :- q,r. (2) :- (cl3) La clausola vuota può essere generata ma il Prolog non è in grado di trovare questa soluzione :- q,t,r. (3) (cl3) fallimento :- q,t,t,r. (4) (cl3) :- q,t,t,t,r. (5) Ramo di fallimento infinito (cl3)
Programmazione logica e Prolog Dal programma logico: sum(0,X,X). (c1) sum(s(X),Y,s(Z)) :- sum(X,Y,Z). (c2) E dal goal sum(s(s(0)),s(0),W) (g0) risolvendo il goal g0 con c2 con {X/s(0),Y/s(0),W/s(Z1)} :- sum(s(0),s(0),Z1) (g1) risolvendo il goal g1con c2 con {X/0,Y/s(0),Z1/s(Z2)} :- sum(0,s(0),Z2) (g2) risolvendo il goal g1con c1 con {X/0,Y/s(0),Z2/s(0)} :- clausola vuota La risposta si ottiene dalla sequenza di sostituzioni W=s(Z1) Z1=s(Z2) Z2=s(0) quindi W=s(s(s(0))) cioè 2+1=3
Programmazione logica e Prolog 1. p(x,z) ¬ p(y,z), q(x,y) 2. p(x,x) ¬ 3. q(a,b) ¬ La query 4. ¬ p(x,b) Albero di ricerca
Programmazione logica e Prolog
Programmazione logica e Prolog , marco).
Programmazione logica e Prolog fallimento
Programmazione logica e Prolog :- collega(a,c). cl4 cl3 :- collega(a,Y1), collega(Y1,c). :- collega(c,a). cl3 cl4 cl1 cl3 cl4 collega(b,c) :- collega(a,c). cl4 cl3 collega(c,b) cl4 :- collega(b,Y2), collega(Y2,c). cl3 ramo infinito :- collega(b,Y3),collega(Y3,Z3), collega(Z3,c). cl3 ramo infinito (cl1) collega(a,b). (cl2) collega(c,b). (cl3) collega(X,Z):- collega(X,Y),collega(Y,Z). (cl4) collega(X,Y):-collega(Y,X).
Programmazione logica e Prolog P :- Q,R. Interpretazione dichiarativa: P è vero se sono veri Q e R. Interpretazione procedurale: Il problema P può essere scomposto nei sottoproblemi P e Q. Modello di esecuzione: Programma Lista di goal Indicatore successo/fallimento Istanza delle variabili execute Un goal può essere visto come una chiamata ad una procedura. Una regola può essere vista come la definizione di una procedura in cui la testa è l’intestazione mentre la parte destra è il corpo.
Programmazione logica e Prolog Per rendere il Prolog un linguaggio effettivamente utilizzabile vengono aggiunti: Notazione per le liste. Possibilità di manipolare strutture dati. Operazioni aritmetiche. Meccanismi di controllo del backtracking. Trattamento della negazione. Predicati di input/output. Meccanismi per modificare/accedere alla base di conoscenza. Meccanismi per il caricamento del codice prolog.
Programmazione logica e Prolog Predicati di controllo di un programma Predicati predefiniti che consentono di influenzare e controllare il processo di esecuzione (dimostrazione) di un goal. CUT e controllo del backtracking PREDICATO CUT ( ! ) – E’ denotato dal simbolo ! – E’ uno dei più importanti e complessi predicati di controllo forniti da Prolog Per capire come funziona il predicato cut e’ necessario vedere il modello run time di Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog EFFETTO DEL CUT Si consideri la clausola: p :- q1, q2,…, qi, !, qi+1, qi+2,…, qn. l’effetto della valutazione del goal ! (cut) durante la dimostrazione del goal "p" è il seguente: – la valutazione di ! ha successo (come quasi tutti i predicati predefiniti) e ! viene ignorato in fase di backtracking; – tutte le scelte fatte nella valutazione dei goal q1, q2,..., qi e in quella del goal p vengono rese definitive; in altri termini, tutti i punti di scelta per tali goal (per le istanze di tali goal utilizzate) vengono rimossi dallo stack di backtracking. – Le alternative riguardanti i goal seguenti al cut non vengono modificate
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog
Programmazione logica e Prolog Linguaggi imperativi (C , Pascal etc.) Si specifica come risolvere un problema Linguaggi dichiarativi Funzionali (Lisp puro) Usa il concetto di funzione e di composizione di funzioni Logici (Prolog) Si descrivono le relazioni che intercorrono fra i dati. Non ci sono assegnamenti. Non determinismo.