Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
1
LINGUAGGIO PROLOG
• PROLOG: PROgramming in LOGic, nato nel 1973
• E’ il più noto linguaggio di Programmazione Logica
ALGORITMO = LOGICA + CONTROLLO
• Si fonda sulle idee di Programmazione Logica avanzate da R. Kowalski
• Basato sulla logica dei Predicati del Primo Ordine (prova automatica di teoremi - risoluzione)
• Manipolatore di SIMBOLI e non di NUMERI
• Linguaggio ad ALTISSIMO LIVELLO: utilizzabile anche da non programmatori
• APPLICAZIONI DI AI
2
LINGUAGGIO 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
• Svantaggi:
– linguaggio relativamente giovane
– efficienza paragonabile a quella del LISP
– non adatto ad applicazioni numeriche o in tempo reale
– mancanza di ambienti di programmazione evoluti
3
ALGORITMO = LOGICA + CONTROLLO
• Conoscenza sul problema indipendente dal suo utilizzo
– Esprimo COSA e non COME
– Alta modularità e flessibilità
– Schema progettuale alla base di gran parte dei SISTEMI BASATI SULLA CONOSCENZA (Sistemi Esperti)
• LOGICA: conoscenza sul problema
– correttezza ed efficienza
• CONTROLLO: strategia risolutiva
– efficienza
• Algoritmi equivalenti:
– A1 = L + C1
– A2 = L + C2
4
PROGRAMMA PROLOG• 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
• ESEMPIO: due individui sono colleghi se lavorano per la stessa ditta
collega(X,Y):- lavora(X,Z), lavora(Y,Z), diverso(X,Y).
FATTI
GOAL
lavora(emp1,ibm).
lavora(emp2,ibm).
lavora(emp3,txt).
lavora(emp4,olivetti).
lavora(emp5,txt).
:- collega(X,Y).
REGOLA
Testa Body
5
PROLOG: ELABORATORE DI SIMBOLI
• ESEMPIO: somma di due numeri interi
sum(0,X,X).
sum(s(X),Y,s(Z)):- sum(X,Y,Z).
• Simbolo sum non interpretato.
• Numeri interi interpretati dalla struttura “successore” s(X)
• Si utilizza la ricorsione
• Esistono molte possibili interrogazioni
FATTO
REGOLA
:- sum(s(0),s(s(0)),Y).
:- sum(s(0),Y,s(s(s(0)))).
:- sum(X,Y,s(s(s(0)))).
:- sum(X,Y,Z).
:- sum(X,Y,s(s(s(0)))), sum(X,s(0),Y).
6
PROVA DI UN GOAL
• Un goal viene provato provando i singoli letterali da sinistra a destra
:- collega(X,Y), persona(X), persona(Y).
• Un goal atomico (ossia formato da un singolo letterale) viene provato confrontandolo e unificandolo con le teste delle clausole contenute nel programma
• Se esiste una sostituzione per cui il confronto ha successo
– se la clausola con cui unifica e’ un fatto, la prova termina;
– se la clausola con cui unifica e’ una regola, ne viene provato il Body
• Se non esiste una sostituzione il goal fallisce
7
PROVA DI UN GOAL: esempio
append([],X,X).
append([X|Z],Y,[X|T]):- append(Z,Y,T).
:- append([a,b],[c,d],[a,b,c,d]).
• Questo goal atomico viene provato unificandolo con la testa della seconda regola: intuitivamente X unifica con a, Z con la lista [b], Ycon la lista [c,d] T con la lista [b,c,d]
• Viene quindi provato il body dopo aver effettuato le sostituzioni
:- append([b],[c,d],[b,c,d]).
• Questo goal atomico viene provato unificandolo con la testa della seconda regola: X unifica con b, Z con la lista [], Y con la lista [c,d] T con la lista [c,d]
8
PROVA DI UN GOAL: esempio
append([],X,X).
append([X|Z],Y,[X|T]):- append(X,Y,T).
:- append([a,b],[c,d],[a,b,c,d]).
• Viene quindi provato il body dopo aver effettuato le sostituzioni
:- append([],[c,d],[c,d]).
• Questo goal atomico viene provato unificandolo con la testa della
prima regola che e’ un fatto e quindi la prova termina con successo
9
PROVA DI UN GOAL: esempio
append([],X,X).
append([X|Z],Y,[X|T]):- append(X,Y,T).
Come vengono dimostrati i successivi goal ?
:- append([a,b],Y,[a,b,c,d]).
:- append(X,[c,d],[a,b,c,d]).
:- append(X,Y,[a,b,c,d]).
:- append(X,Y,Z).
10
PIU’ FORMALMENTE
• Linguaggio Prolog: caso particolare del paradigma di Programmazione Logica
• SINTASSI: un programma Prolog e’ costituito da un insieme di clausole definite della forma
(cl1) A.
(cl2) A :- B1, B2,…, Bn.
(cl3) :- B1, B2,…, Bn.
• In cui A e Bi sono formule atomiche
• A : testa della clausola
• B1,B2,…,Bn : body della clausola
• Il simbolo “,” indica la congiunzione; il simbolo “:-” l’implicazione logica in cui A e’ il conseguente e B1,B2,…,Bn l’antecedente
FATTO o ASSERZIONE
REGOLA
GOAL
11
PIU’ FORMALMENTE
• Una formula atomica e’ una formula del tipo
p(t1,t2,…,tn)
in cui p e’ un simbolo predicativo e t1,t2,…,tn sono termini
• Un termine e’ definito ricorsivamente come segue:
– le costanti (numeri interi/floating point, stringhe alfanumeriche aventi
come primo carattere una lettera minuscola) sono termini
– le variabili (stringhe alfanumeriche aventi come primo carattere una lettera
maiuscola oppure il carattere “_” ) sono termini.
– f(t1,t2,…,tk) e’ un termine se “f” e’ un simbolo di funzione (operatore) a k argomenti e t1,t2,…,tk sono termini. f(t1,t2,…,tk)
viene detta struttura
NOTA: le costanti possono essere viste come simboli funzionali a zero argomenti.
12
ESEMPI
• COSTANTI: a, pippo, aB, 9,135,a92
• VARIABILI: X, X1, Pippo, _pippo, _x, _
– la variabile _ prende il nome di variabile anonima
• TERMINI COMPOSTI: f(a), f(g(1)), f(g(1),b(a),27)
• FORMULE ATOMICHE: p, p(a,f(X)), p(Y), q(1)
• CLAUSOLE DEFINITE:
q.
p:-q,r.
r(Z).
p(X):- q(X,g(a)).
• GOAL:
:-q,r.
• Non c’e’ distinzione tra costanti, simboli funzionali e predicativi.
13
INTERPRETAZIONE DICHIARATIVA
• Le variabili all’interno di una clausola sono quantificate universalmente
• per ogni asserzione (fatto)
p(t1,t2,…,tm).
se X1,X2,…,Xn sono le variabili che compaiono in t1,t2,…,tm il
significato e’: ∀X1,∀X2,…,∀Xn (p(t1,t2,…,tm))
• per ogni regola del tipo
A:- B1,B2,…,Bk.
se Y1,Y2,…,Yn sono le variabili che compaiono solo nel body della regola e X1,X2,…,Xn sono le variabili che compaiono nella testa e nel
corpo, il significato e’:
∀X1,∀X2,…,∀Xn,∀Y1,∀Y2,…,∀Yn ((B1,B2,…,Bk) →→→→ A)
∀X1,∀X2,…,∀Xn ( (∃∃∃∃Y1,∃∃∃∃Y2,…,∃∃∃∃Yn(B1,B2,…,Bk)) →→→→ A)
14
INTERPRETAZIONE DICHIARATIVA
• ESEMPI
padre(X,Y) “X e’ il padre di Y”
madre(X,Y) “X e’ la madre di Y”
nonno(X,Y):- padre(X,Z), padre(Z,Y).
“per ogni X e Y, X e’ il nonno di Y se esiste Z tale che X e’ padre di Ze Z e’ il padre di Y”
nonno(X,Y):- padre(X,Z), madre(Z,Y).
“per ogni X e Y, X e’ il nonno di Y se esiste Z tale che X e’ padre di Ze Z e’ la madre di Y”
15
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
σσσσ = {X1/s1,X2/s2,…,Xn/sn}
dove si sono termini tale per cui P |= [p(t1,t2,…,tm)]σσσσ
16
SCHEMA RIASSUNTIVO
Logica dei predicati del primo ordine
Sintassi Semantica
Dimostrazione di teoremi
Concetto di conseguenza logica
Risoluzione (clausole generali)
Programmazione Logica (clausole di Horn)
InterpretazioneSimboli non interpretati
Teorie assiomatico deduttive
Prova automatica di teoremi
Correttezza
Completezza
17
PROGRAMMAZIONE LOGICA
• Dalla Logica dei predicati del primo ordine verso un linguaggio di programmazione;
– requisito efficienza
• Si considerano solo clausole di Horn (al più un letterale positivo)
– il letterale positivo corrisponde alla testa della clausola
• Si adotta una strategia risolutiva particolarmente efficiente
– RISOLUZIONE SLD (corrisponde al Backward chianing per clausole di
Horn).
– Non completa per la logica a clausole, ma completa per il sottoinsieme
delle clausole di Horn.
18
RISOLUZIONE SLD
• Risoluzione Lineare per Clausole Definite con funzione di Selezione (backward chaining)
– completa per le clausole di Horn
• 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)).
19
RISOLUZIONE SLD –backward chaining
(continua)
• La Risoluzione SLD seleziona un atomo Am dal goal Gi secondo un
determinato criterio, e lo unifica se possibile con la testa della clausola Ci attraverso la sostituzione più generale: MOST GENERAL UNIFIER
(MGU) θi
• Il nuovo risolvente e’ ottenuto da Gi riscrivendo l’atomo selezionato
con la parte destra della clausola Ci ed applicando la sostituzione θi.
• Più in dettaglio:
:- A1,…,Am-1,Am,Am+1,…,Ak. Risolvente
A:- B1,…,Bq. Clausola del programma P
e [Am]θi= [A] θ
i allora la risoluzione SLD deriva il nuovo risolvente
:- [A1,…,Am-1,B1,…,Bq,Am+1,…,Ak ]θi.
20
UNIFICAZIONE
• 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: θ = [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]θ 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]
21
UNIFICAZIONE
• COMPOSIZIONE DI SOSTITUZIONI: θ1θ2 θ1 = [X1/T1, X2/T2,…, Xn/Tn] θ2 = [Y1/Q1, Y2/Q2,…, Yn/Qn]
θ1θ2 = [X1/[T1]θ2,…, Xn/[Tn]θ2,Y1/Q1,Y2/Q2,…,Yn/Qn]
equivale quindi ad applicare prima θ1 e poi θ2.
• Esempio: θ1 = [X/f(Z),W/R,S/c] θ2 = [Y/X,R/W,Z/b]
θ1θ2 = [X/f(b),S/c,Y/X,R/W,Z/b]
• Due atomi : A1 e A2 sono unificabili se esiste una sostituzione θ tale
che [A1]θ =[A2]θ
22
UNIFICAZIONE
• Una sostituzione θ1 è più generale di un’altra θ2 se esiste una terza
sostituzione θ3 tale che θ2 = θ1θ3
• Esistono in generale più sostituzioni unificatrici. Noi siamo interessati
nell’unificazione più generale: MOST GENERAL UNIFIER
• Esiste un algoritmo che calcola l’unificazione più generale se dueatomi sono unificabili, altrimenti termina in tempo finito nel caso in cui idue atomi non sono unificabili.
23
UNIFICAZIONE
T1T2 costante
c2
variabile
X2
termine
composto
S2
termine
composto
S1
variabile
X1
costante
c1
unificano
se c1=c2
unificano
X2=c1
unificano
X1=c2
unificano
X1=X2
non
unificano
non
unificano
unificano
X1=S2
unificano
X2=S1
Unificano se
uguale funtore
e parametri
unificabili
24
OCCUR CHECK
• L’unificazione tra una variabile X e un termine composto S è moltodelicata: infatti è importante controllare che il termine composto S noncontenga la variabile da unificare X.
• Questo inficerebbe sia la terminazione, sia la correttezza dell’algoritmodi unificazione.
• Esempio: si consideri l’unificazione tra p(X,X) e p(Y,f(Y)).
La sostituzione è [X/Y,X/f(X)]
Chiaramente, due termini unificati con lo stesso termine, sono uguali traloro. Quindi, Y/f(Y) ma questo implica Y=f(f(f(f(…)))) e il
procedimento non termina
25
RISOLUZIONE SLD: ESEMPIO
sum(0,X,X). (C1)
sum(s(X),Y,s(Z)):- sum(X,Y,Z). (C2)
• Goal sum(s(0),0,W).
• Al primo passo genero una variante della clausola (C2)
sum(s(X1),Y1,s(Z1)):- sum(X1,Y1,Z1).
Unificando la testa con il goal ottengo la sostituzione MGU
θ1
= [X1/0,Y1/0,W/s(Z1)]
Ottengo il nuovo risolvente G1: :- [sum(X1,Y1,Z1)] θ1
ossia
:-sum(0,0,Z1).
26
DERIVAZIONE SLD (backward chaining)
• 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 MGU
θ1
,…, θn
tali che Gi+1 è derivato da Gi e da Ci+1 attraverso la
sostituzione θn . 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.
27
DERIVAZIONE DI SUCCESSO
sum(0,X,X). (CL1)
sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2)
• Goal G0 :-sum(s(0),0,W) ha una derivazione di successo
C1: variante di CL2 sum(s(X1),Y1,s(Z1)):- sum(X1,Y1,Z1).
θ1
= [X1/0,Y1/0,W/s(Z1)]
G1: :-sum(0,0,Z1).
C2: variante di CL1 sum(0,X2,X2).
θ2
= [Z1/0,X2/0]
G2: :-
28
DERIVAZIONE DI FALLIMENTO FINITA
sum(0,X,X). (CL1)
sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2)
• Goal G0 :-sum(s(0),0,0) ha una derivazione di fallimento finito
perché l’unico atomo del goal non e’ unificabile con alcuna clausola del programma
29
DERIVAZIONE DI FALLIMENTO INFINITA
sum(0,X,X). (CL1)
sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2)
• Goal G0 :-sum(A,B,C) ha una derivazione SLD infinita, ottenuta
applicando ripetutamente varianti della seconda clausola di P
C1: variante di CL2 sum(s(X1),Y1,s(Z1)):- sum(X1,Y1,Z1).
θ1
= [ A/s(X1),B/Y1,C/s(Z1)]
G1: :-sum(X1,Y1,Z1).
C2: variante di CL2 sum(s(X2),Y2,s(Z2)):- sum(X2,Y2,Z2).
θ2
= [ X1/s(X2),Y1/Y2,Z1/s(Z2)]
G2: :-sum(X2,Y2,Z2).
...
30
LEGAMI PER LE VARIABILI IN USCITA
• Risultato della computazione:
– eventuale successo
– legami per le variabili del goal G0, ottenuti componendo le sostituzioni
MGU applicate
Se il goal G0 è del tipo:
– ¬ A1(t1,...,tk), A2(tk+1,...,th), ..., An(tj+1,...,tm)
– i termini ti“ground” rappresentano i valori di ingresso al programma,
mentre i termini variabili sono i destinatari dei valori di uscita del
programma.
• Dato un programma logico P e un goal G0, una risposta per P∪{G0} èuna sostituzione per le variabili di G0.
31
LEGAMI PER LE VARIABILI IN USCITA
• Si consideri una refutazione SLD per P ∪ {G0}. Una risposta calcolata qper P ∪ {G0} è la sostituzione ottenuta restringendo la composizionedelle sostituzioni mgu q1,...,qn utilizzate nella refutazione SLD di P ∪ {G0}alle variabili di G0.
• La risposta calcolata o sostituzione di risposta calcolata è il “testimone”del fatto che esiste una dimostrazione costruttiva di una formulaquantificata esistenzialmente (la formula goal iniziale).
sum(0,X,X). (CL1)
sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2)
G= :-sum(s(0),0,W) la sostituzione θ ={W/s(0)} è la risposta calcolata,
ottenuta componendo θ 1 con θ 2 e considerando solo la sostituzione per la variabile W di G.
32
NON DETERMINISMO
• Nella risoluzione SLD così come è stata enunciata si hanno due formedi non determinismo
• La prima forma di non determinismo è legata alla selezione di un atomoAm del goal da unificare con la testa di una clausola, e viene risoltadefinendo una particolare regola di calcolo.
• La seconda forma di non determinismo è legata alla scelta di qualeclausola del programma P utilizzare in un passo di risoluzione, e vienerisolta definendo una strategia di ricerca.
33
REGOLA DI CALCOLO
• Una regola di calcolo è una funzione che ha come dominio l'insieme deigoal e che seleziona un suo atomo Am dal goal
:-A1,...,Am-1,Am,Am+1,...,Ak, (Am :atomo selezionato).
sum(0,X,X). (CL1)
sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2)
G0 = :-sum(0,s(0),s(0)),sum(s(0),0,s(0)).
– Se si seleziona l’atomo più a sinistra al primo passo, unificando l’atomosum(0,s(0),s(0)) con la testa di CL1, si otterrà:
G1 = :- sum(s(0),0,s(0)).
– Se si seleziona l’atomo più a destra al primo passo, unificando l’atomosum(s(0),0,s(0)) con la testa di CL2, si avrà:
G1 = :- sum(0,s(0),s(0)),sum(0,0,0).
34
INDIPENDENZA DALLA REGOLA DI CALCOLO
• La regola di calcolo influenza solo l'efficienza
• Non influenza né la correttezza né la completezza del dimostratore.
• Proprietà (Indipendenza dalla regola di calcolo)
– Dato un programma logico P, l'insieme di successo di P non dipende
dalla regola di calcolo utilizzata dalla risoluzione SLD.
35
STRATEGIA DI RICERCA
• Definita una regola di calcolo, nella risoluzione SLD resta un ulterioregrado di non determinismo poiché possono esistere più teste diclausole unificabili con l'atomo selezionato.
sum(0,X,X). (CL1)
sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2)
G0 = :-sum(W,0,K).
– Se si sceglie la clausola CL1 si ottiene il risolvente
G1 = :-
– Se si sceglie la clausola CL2 si ottiene il risolvente
G1 = :- sum(X1,0,Z1)
36
STRATEGIA DI RICERCA
• Questa forma di non determinismo implica che possano esistere più soluzioni alternative per uno stesso goal.
• La risoluzione SLD (completezza), deve essere in grado di generare tutte le possibili soluzioni e quindi deve considerare ad ogni passo di risoluzione tutte le possibili alternative.
• La strategia di ricerca deve garantire questa completezza
• Una forma grafica utile per rappresentare la risoluzione SLD e questa forma di non determinismo sono gli alberi SLD.
37
ALBERI SLD
• Dato un programma logico P, un goal G0 e una regola di calcolo R, unalbero 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 figlioper ciascuna clausola Ci = A:-B1,...,Bq di P tale che A e Am sono
unificabili attraverso una sostituzione unificatrice più generale θ. Il nodo
figlio è etichettato con la clausola goal:
:-[A1,...,Am-1,B1,...,Bq,Am+1,...,Ak]θ e il ramo dal nodo padre al
figlio è etichettato dalla sostituzione θ e dalla clausola selezionata Ci;
– il nodo vuoto (indicato con “:-”) non ha figli.
38
ALBERI SLD
• A ciascun nodo dell'albero può essere associata una profondità.
– La radice dell'albero ha profondità 0, mentre la profondità di ogni altro
nodo è quella del suo genitore più 1.
• 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 quantoriguarda sia l’ampiezza sia la profondità. Tuttavia non influisce sucorrettezza e completezza. Quindi, qualunque sia R, il numero dicammini di successo (se in numero finito) è lo stesso in tutti gli alberiSLD costruibili per P ∪ {G0} .
• R influenza solo il numero di cammini di fallimento (finiti ed infiniti).
39
ALBERI SLD: ESEMPIO
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”
:-sum(W,0,0),sum(W,0,K)
CL1 s1= {W/0}
:-sum(0,0,K)
CL1 s1= {K/0}
:-
40
ALBERI SLD: ESEMPIO
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”
:-sum(W,0,0),sum(W,0,K)
CL1s1= {W/0,K/0}
CL1s2= {X1/0}
:-
CL1 CL2s4={X1/0,Z1/0} s5={X1/s(X2),K1/s(Z2)}
:-sum(s(0),0,0) :-sum(s(s(X2)),0,0),sum(X2,0,Z2)
fail
.....
:-sum(0,0,0)
CL2 s3={W/s(X1),K/s(Z1)}
:-sum(s(X1),0,0),sum(X1,0,Z1)
41
ALBERI SLD: ESEMPIO
• Confronto albero SLD con regola di calcolo left most e right most:
– In entrambi gli alberi esiste una refutazione SLD, cioè un cammino (ramo) di successo il cui nodo finale è etichettato con ”:-".
• La composizione delle sostituzioni applicate lungo tale camminogenera la sostituzione di risposta calcolata {W/0,K/0}.
• SI noti la differenza di struttura dei due alberi. In particolare cambianoi rami di fallimento (finito e infinito).
42
ALBERI SLD LEFT MOST: ESEMPIO (2)
genitore(a,b). (R1)
genitore(b,c). (R2)
antenato(X,Z):-genitore(X,Z) (R3)
antenato(X,Z):-genitore(X,Y),antenato(Y,Z) (R4)
G0 :- antenato(a,c)
:- antenato(a,c)
R3 s={X2/a,Z2/c}R4 s1={X1/a,Z1/c}
:-genitore(a,c) :-genitore(a,Y1),antenato(Y1,c)
failR1 s2={Y1/b}
:-antenato(b,c)
R3 R4 s3={X3/b,Z3/c}
:-genitore(b,c) :-genitore(b,Y3),antenato(Y3,c)
R2 R2 s4={Y3/c}
:- :-antenato(c,c)
fail
43
ALBERI SLD LEFT MOST: ESEMPIO (2)sum(0,X,X). (CL1)
sum(s(X),Y,s(Z)):- sum(X,Y,Z). (CL2)
G0= :- sum(A,B,s(0)),sum(A,s(0),B).
– La query rappresenta il sistema di equazioni
– Per l’unica derivazione di successo, la composizione delle sostituzioniapplicate (cioè {A/0,B/s(0),X1/s(0)}{X2/s(0)}), ristretta alle
variabili del goal G0, produce la risposta calcolata: {A/0,B/s(0)}
A+B=1
B-A=1
:- sum(A,B,s(0)),sum(A,s(0),B)
CL1 CL2
{X2/s(0)}
{A/0,B/s(0),X1/s(0)} {A/s(X3),B/Y3,Z3/0}
:- sum(0,s(0),s(0)) :-sum(X3,Y3,0),sum(s(X3),s(0),Y3)
CL1 CL1 {X3/0,Y3/0,X4/0}
:-
:-sum(s(0),s(0),0)successo
fail
44
STRATEGIA DI RICERCA
• La realizzazione effettiva di un dimostratore basato sulla risoluzioneSLD richiede la definizione non solo di una regola di calcolo, ma anchedi una strategia di ricerca che stabilisce una particolare modalità diesplorazione dell'albero SLD alla ricerca dei rami di successo.
• Le modalità di esplorazione dell’albero piu’ comuni sono:
– depth first
– breadth first
• Entrambe le modalità implicano l’esistenza di un meccanismo dibacktracking per esplorare tutte le strade alternative che corrispondono
ai diversi nodi dell’albero.
45
STRATEGIA DEPTH-FIRST
– Ricerca in profondità: vengono prima esplorati i nodi a profonditàmaggiore. NON COMPLETA
N1
N2 N5
N3 N4 N6 N7
N9 N8
1
2
3
4
5
6
7 8
9
Profondità 0
Profondità 1
Profondità 2
Profondità 3
46
STRATEGIA BREADTH-FIRST
– Ricerca in ampiezza: vengono prima esplorati i nodi a profonditàminore. COMPLETA
N1
N2 N5
N3 N4 N6 N7
N9 N8
1
2 3
4 5 6 7
8 9
Profondità 0
Profondità 1
Profondità 2
Profondità 3
47
STRATEGIE DI RICERCA E ALBERI SLD
• Nel caso degli alberi SLD, lo spazio di ricerca non è esplicito, maresta definito implicitamente dal programma P e dal goal G0.
– I nodi corrispondono ai risolventi generati durante i passi di risoluzione.
– I figli di un risolvente Gi sono tutti i possibili risolventi ottenuti unificando
un atomo A di Gi, selezionato secondo una opportuna regola di calcolo,
con le clausole del programma P.
– Il numero di figli generati corrisponde al numero di clausole alternative
del programma P che possono unificare con A.
• Agli alberi SLD possono essere applicate entrambe le strategiediscusse in precedenza.
– Nel caso di alberi SLD, attivare il “backtracking” implica che tutti i legami
per le variabili determinati dal punto di “backtracking” in poi non devonoessere più considerati.
48
PROLOG E STRATEGIE DI RICERCA
• Il linguaggio Prolog, adotta la strategia in profondità con"backtracking" perché può essere realizzata in modo efficienteattraverso un unico stack di goal.
– tale stack rappresenta il ramo che si sta esplorando e contiene opportuni
riferimenti a rami alternativi da esplorare in caso di fallimento.
• Per quello che riguarda la scelta fra nodi fratelli, la strategia Prolog liordina seguendo l'ordine testuale delle clausole che li hannogenerati.
• La strategia di ricerca adottata in Prolog è dunque non completa.
49
PROLOG E STRATEGIE DI RICERCA
collega(a,b). (R1)
collega(c,b). (R2)
collega(X,Z):-collega(X,Y),collega(Y,Z).(R3)
collega(X,Y):-collega(Y,X). (R4)
Goal: :-collega(a,c) (G0)
• La formula collega(a,c) segue logicamente dagli assiomi, ma la
procedura di dimostrazione non completa come quella che adotta la
strategia in profondità non è in grado di dimostrarlo.
50
ALBERO SLD CON RAMO INFINITO:-collega(a,c)
R3 R4
:-collega(a,Y1),collega(Y1,c) :-collega(a,c)
R1 {Y1/b}R2 R3 R3 R4
:-collega(b,c)
R3R4
:-collega(b,Y2),collega(Y2,c) :-collega(c,b)
R3 R1R2 R3
:-collega(b,Y3),collega(Y3,Y2),collega(Y2,c)
:-
R4
Ramo infinito
R3
51
RIASSUMENDO…
• La forma di risoluzione utilizzata dai linguaggi di programmazionelogica è la risoluzione SLD, che in generale, presenta due forme dinon determinismo:
– la regola di computazione
– la strategia di ricerca
• Il linguaggio Prolog utilizza la risoluzione SLD con le seguenti scelte
– Regola di computazione
• Regola "left-most"; data una "query":
?- G1, G2, ..., Gn.
viene sempre selezionato il letterale più a sinistra G1.
– Strategia di ricerca
• In profondità (depth-first) con backtracking cronologico.
52
RISOLUZIONE IN PROLOG
• Dato un letterale G1 da risolvere, viene selezionata la prima clausola
(secondo l’ordine delle clausole nel programma P) la cui testa èunificabile con G1.
• Nel caso vi siano più clausole la cui testa è unificabile con G1, larisoluzione di G1 viene considerata come un punto di scelta (choicepoint) nella dimostrazione.
• In caso di fallimento in un passo di dimostrazione, Prolog ritorna in
backtracking all’ultimo punto di scelta in senso cronologico (il piùrecente), e seleziona la clausola successiva utilizzabile in quel puntoper la dimostrazione.
Ricerca in profondità con backtracking cronologico dell'albero di dimostrazione SLD.
53
RISOLUZIONE IN PROLOG: ESEMPIO
P1 (cl1) p :- q,r.
(cl2) p :- s,t
(cl3) q.
(cl4) s :- u.
(cl5) s :- v.
(cl6) t.
(cl7) v.
:- p.
fail
:- p (1)
:- q,r (2) :- s,t (4)
:- r (3)
(cl1) (cl2)
(cl3)
:- u,t (5)
(cl4) (cl5)
:- v,t
:- t (7)
(6)
(cl6)
(cl7)
fail
54
RISOLUZIONE IN PROLOG: INCOMPLETEZZA
• Un problema della strategia in profondità utilizzata da Prolog e’ la sua incompletezza.
P2 (cl1) p :- q,r.
(cl2) p.
(cl3) q :- q,t.
:- p.
:- p (1)
:- q,r (2)
:- q,t,r (3)
(cl1)
(cl3)
:- q,t,t,r
………ramo
infinito
(4)
(cl3)
(cl2)
Cammino
esplorato da Prolog
55
ORDINE DELLE CLAUSOLE • L’ordine delle clausole in un programma Prolog è rilevante.
P2 P3
(cl1) p :- q,r. (cl1’’’’) p.
(cl2) p. (cl2’’’’) p :- q,r.
(cl3) q :- q,t. (cl3’’’’) q :- q,t.
• I due programmi P2 e P3 non sono due programmi Prolog equivalenti.Infatti, data la "query": :-p. si ha che
– la dimostrazione con il programma P2 non termina;
– la dimostrazione con il programma P3 ha immediatamente successo.
• Una strategia di ricerca in profondità può essere realizzata in modoefficiente utilizzando tecniche non troppo differenti da quelle utilizzatenella realizzazione dei linguaggi imperativi tradizionali.
56
ORDINE DELLE CLAUSOLE: ESEMPIO P4 (cl1) femmina(carla).
(cl2) femmina(maria).
(cl3) femmina(anna).
(cl4) madre(carla,maria).
(cl5) madre(carla,giovanni).
(cl6) madre(carla,anna).
(cl7) padre(luigi,maria).
(cl8) sorella(X,Y):- femmina(X),
padre(Z,X),
padre(Z,Y),
div(X,Y).
(cl9) sorella(X,Y):- femmina(X),
madre(Z,X),
madre(Z,Y),
div(X,Y).
(cl10) div(carla,maria).
(cl11) div(maria,carla).
..... div(A,B). per tutte le coppie (A,B) con A≠≠≠≠B
E la “query”: :- sorella(maria,W).
57
ORDINE DELLE CLAUSOLE: ESEMPIO
(1) :- sorella(maria,W)
:- femmina(maria),padre(Z,maria),
padre(Z,W), div(maria,W) (2)
{X/maria,Y/W}(cl8)
:- padre(Z,maria),padre(Z,W),div(maria,W)
(cl2)
{Z/luigi} (cl7)
:- padre(luigi,W),div(maria,W)
:- div(maria,maria)
(4)
:- femmina(maria),madre(Z,maria),
madre(Z,W),div(maria,W)
(cl2)
(6)
(cl9) {X/maria,Y/W}
{W/maria} (cl7)
fail
?- madre(Z,maria),madre(Z,W),
div(maria,W)
{Z/carla} (cl4)
:- madre(carla,W),div(maria,W)
:- div(maria,maria)
fail
:-div(maria,giovanni) :-div(maria,anna)
{W/giovanni}
{W/maria}{W/anna}
(cl6)
(5)
(3)(7)
(cl5)
(cl4)
(8)
(9) (10) (11)Successo con
risposta
calcolata
W/giovanni
Successo con
risposta
calcolata
W/anna
58
SOLUZIONI MULTIPLE E DISGIUNZIONE
• Possono esistere più sostituzioni di risposta per una “query”.
– Per richiedere ulteriori soluzioni è sufficiente forzare un fallimento nel
punto in cui si è determinata la soluzione che innesca il backtracking.
– Tale meccanismo porta ad espandere ulteriormente l ’ albero didimostrazione SLD alla ricerca del prossimo cammino di successo.
• In Prolog standard tali soluzioni possono essere richieste mediantel'operatore “; “.:- sorella(maria,W).
yes W=giovanni;
W=anna;
no
• Il carattere ";" può essere interpretato come
– un operatore di disgiunzione che separa soluzioni alternative.
– all'interno di un programma Prolog per esprimere la disgiunzione.
59
INTERPRETAZIONE PROCEDURALE
• Prolog può avere un’interpretazione procedurale. Una procedura èun insieme di clausole di P le cui teste hanno lo stesso simbolopredicativo e lo stesso numero di argomenti (arità).
– Gli argomenti che compaiono nella testa della procedura possono essere
visti come i parametri formali.
Una “query” del tipo: :- p(t1,t2,...,tn).
è la chiamata della procedura p. Gli argomenti di p (ossia i termini
t1,t2,...,tn) sono i parametri attuali.
– L’unificazione è il meccanismo di passaggio dei parametri.
• Non vi è alcuna distinzione a priori tra i parametri di ingresso e iparametri di uscita (reversibilità).
60
INTERPRETAZIONE PROCEDURALE (2)
• Il corpo di una clausola può a sua volta essere visto come una sequenza di chiamate di procedure.
• Due clausole con le stesse teste corrispondono a due definizioni alternative del corpo di una procedura.
• Tutte le variabili sono a singolo assegnamento. Il loro valore è unico durante tutta la computazione e slegato solo quando si cerca una
soluzione alternativa (“backtracking”).
61
ESEMPIO
pratica_sport(mario,calcio).
pratica_sport(giovanni,calcio).
pratica_sport(alberto,calcio).
pratica_sport(marco,basket).
abita(mario,torino).
abita(giovanni,genova).
abita(alberto,genova).
abita(marco,torino).
:- pratica_sport(X,calcio).
"esiste X tale per cui X pratica il calcio?"
yes X=mario;
X=giovanni;
X=alberto;
no
:- pratica_sport(giovanni,Y).
"esiste uno sport Y praticato da giovanni?"
yes Y=calcio;
no
62
ESEMPIO (2)
:- pratica_sport(X,Y).
"esistono X e Y tali per cui X pratica lo sport Y"
yes X=mario Y=calcio;
X=giovanni Y=calcio;
X=alberto Y=calcio;
X=marco Y=basket;
no
:- pratica_sport(X,calcio), abita(X,genova).
"esiste una persona X che pratica il calcio e abita a Genova?””””
yes X=giovanni;
X=alberto;
no
63
ESEMPIO (3)
• A partire da tali relazioni, si potrebbe definire una relazioneamico(X,Y) “X è amico di Y” a partire dalla seguente specifica: “X èamico di Y se X e Y praticano lo stesso sport e abitano nella stessa
città”.amico(X,Y):- abita(X,Z)
abita(Y,Z),
pratica_sport(X,S),
pratica_sport(Y,S).
:- amico(giovanni,Y).
““““esiste Y tale per cui Giovanni e amico di Y?””””
yes Y = giovanni;
Y=alberto;
no
• si noti che secondo tale relazione ogni persona è amica di se stessa.
64
ESEMPIO (4)
padre(X,Y) "X è il padre di Y"
madre(X,Y) "X è la madre di Y"
zia(X,Y) "X è la zia di Y"
zia(X,Y) :-sorella(X,Z),padre(Z,Y).
zia(X,Y) :-sorella(X,Z),madre(Z,Y).
(la relazione "sorella" è stata definita in precedenza).
• Definizione della relazione "antenato" in modo ricorsivo:
"X è un antenato di Y se X è il padre (madre) di Y"
"X è un antenato di Y se X è un antenato del padre (o
della madre) di Y"
antenato(X,Y) "X è un antenato di Y"
antenato(X,Y) :- padre(X,Y).
antenato(X,Y) :- madre(X,Y).
antenato(X,Y) :- padre(Z,Y),antenato(X,Z).
antenato(X,Y) :- madre(Z,Y),antenato(X,Z).
65
VERSO UN VERO LINGUAGGIO DI
PROGRAMMAZIONE
• Al Prolog puro devono, tuttavia, essere aggiunte alcunecaratteristiche per poter ottenere un linguaggio di programmazioneutilizzabile nella pratica.
• In particolare:
– Strutture dati e operazioni per la loro manipolazione.
– Meccanismi per la definizione e valutazione di espressioni e funzioni.
– Meccanismi di input/output.
– Meccanismi di controllo della ricorsione e del backtracking.
– Negazione
• Tali caratteristiche sono state aggiunte al Prolog puro attraverso ladefinizione di alcuni predicati speciali (predicati built-in) predefiniti
nel linguaggio e trattati in modo speciale dall’interprete.
66
Per utilizzare Prolog: software
SWI Prolog: un Prolog molto usato e
particolarmente ben integrato per il Semantic
Web
tuProlog: un Prolog basato su Java usato
anche per applicazioni internet.
Liberamente scaricabili da:
http://www.swi-prolog.org
http://apice.unibo.it/xwiki/bin/view/Tuprolog/