Upload
vunhi
View
280
Download
3
Embed Size (px)
Citation preview
Curs nr 14 – PrologCartea de baza
Ivan Bratko, Programming for Artificial Intelligence, Three edition 2001, Addision Wesley
1
Programare logică
Se bazează pe faptul că, rezolvarea uneiprobleme constă dintr-o reprezentarecorespunzătoare a cunoştinţelor.
Limbajele de programare logică se mainumesc şi limbaje declarative.
2
Programare logică
Teoria matematică care stă la baza acesteiparadigme este logica predicatelor de ordinunu, care lucrează cu entităţi logice (nu cu numere).
Logica predicatelor este o logică simbolică al cărui scop este de a reprezenta tipuri de raţionament.
3
Programare logică
Programarea cunoştinţelor face parte din metoda soluţiei generale, care implică propagarea constrângerilor.
Valorile de adevăr pot fi binare (T, F) saumulti-valoare (T, probabil T, posibil T, F).
4
logica predicatelor
Limbajul predicatelor de ordin unu dispune de instrumente pentru a defini diverse tipuri de obiecte matematice, cum ar fi:
numere,
variabile numerice,
Funcţii şi operaţii matematice
relaţii,
propoziţii,
teoreme matematice.
5
Calcul Predicativ
Simbolurile folosite in calculul predicativ folosescurmatorul alfabet:
1. Setul de litere mari/mici al alfabetului englez
2. Setul de numere 0,1,…,9
3. underscore, _
P: “a plouat miercuri”P:”vremea (miercuri, ploaie)
Variabila: Xvremea(X, ploaie)
Calcul PredicativSimbolurile utimimiate pot fi:1. logice: true sau false2. constante : expresii care incep cu litera mica3. Variabile: expresii care incep cu litera mare4. Functii: expresii care incep cu litera mica
Operatorii pot fi: ^, , ¬, ,
Fraze tipice:Orice simbol inclusiv cele logice: true, P, Q, …Negarea unei propozitii: ¬P, ¬falseConjunctie or and doua propozitii: P^ ¬PDisjungerea or and doua propozitii: P ¬PImplicarea unei propozitii de catre alta: P QEchivalenta a doua propozitii: PQR
Tabele de adevarLegi si reguli:
¬(¬P) = P
(P Q) = (¬P Q)
Legea “contra positive” : (P Q) = (¬Q ¬P)
Legea De Morgan : ¬(P Q) = (¬P^¬Q)
Legea Comutativitatii: (P^Q) = (Q^ P)
Legea Distributivitatii: P^(Q R) = (P^Q) (P^R)
P Q P^Q
T T T
T F F
F T F
F F F
Exemple Vasile nu iubeste pe nimeni in afara de Maria
¬Y (iubeste(Vasile, Maria) ^ iubeste(Vasile,Y) ^(YMaria)
¬Y (iubeste(Vasile, Y)) ^ (¬ Y=Maria)
Y ¬iubeste(Vasile,Y) Y=Maria
Y ¬iubeste(Vasile,Y) Y=Maria
Oriciney iubeste numai o persoana
X Y iubeste(X,Y) ^ (Z iubeste(X,Z) Y=Z)
X Y (Z iubeste(X,Z) Y=Z)
Exista cel putin doua persoane diferit (doua variabile diferite) X astfelincat A(X)
X Y (X Y ^ A(X) ^ A(Y))
Exista numain un singu x astfel incat A(X)
X A(X) ^ (A(Y) Y=X)
X Y (A(Y) Y=X
A(Y) Y=X ^ Y=X A(Y)
Exemple
Oricine intarzie va fi pedepsit
X isLate(X) punished(X)
Baietii care intarzie vor fi pedepsiti
Y (isLate(Y) ^ isBoy(Y) punished(Y)
Oricine de aici este mai batran ca oricine de acolo
X,Y isHere(X) ^ isThere(Y)) olderThan(X,Y)
X isHere(X) ¬ (Y isThere(Y) ^ olderThan(Y,X)
Y ¬ isThere(Y) ¬olderThan(Y,X)
Y isThere(Y) olderThan(Y,X)
Oricine se admira
X human(X) admire(X,X)
Vasile iubeste Maria dar Maria iubeste pe altcineva
love(Vasile,Maria) ^ Y love(Maria,Y) ^ (YVasile)
ExempleRelatiile de familie descrise folosind predicatele:
mother (Ileana,Mihai) = Ileana este mama lui Mihai
mother(Ileana,Stefan) = …
father(Ghita, Mihai) = …
father(Ghita,Stefan) = …
Aici se folosesc predicatele mama(mother) sitata(father) pentru a dedini un set de relatii parinte– copil. Implicatiile vor da conditii generale pentrualte tipuri de relatii regulile de inferenta!
parinte(X,Y) ^ parinte(X,Z) sibling(Y,Z) YZ
parinte(X,Y) father(X,Y) mother(X,Y)
Exemple
Daca Gica invidiaza pe Constantin sau invers dar nu simultan atunciGica invidiaza pe Constantin, daca si numai daca Constantin nu ilinvidiaza pe Gica.
1. ((Gica invidiaza Constantin) (Constantin invidiaza Gica)) ^
2. ¬ ((Gica invidiaza Constantin) ^ (Constantin invidiaza Gica))
3. (Gica invidiaza Constantin)
4. ¬ (Constantin invidiaza Gica)
(AB) ^ (¬ (A^B) (A ¬ B)
(A B) ^ (¬ (A ^ B) (A ¬ B)
T T T F F T T T T T F F
T T F T T T F F T T T T
F T T T T F F T T F T F
F F F F T F F F T F F T
Inferenţă logică Regulile de inferenţă uzuale sunt:
Modus ponens – (F, F -> G G)
Modus tollens – (¬ G, F -> GF)
Regula eliminării cuantificatorului universal –
X: (∀ X F(X) F(t))
O mulţime de premise se numesc inconsistente, dacă orice formulă poate fi obţinută prin inferenţădin mulţimea de formule.
13
Exemplu
Mihai are bani
Masina este alba
Masina este frumoasa
Daca masina este alba sau masina este frumoasa siMihai are bani atunci Mihai pleaca in vacanta
B
A
F
(A F) B C
Cunoştinţe în Prolog Un program Prolog este o listă ordonată de clauze
Horn (prin care se formamimiează enunţurideclarative) care exprimă:
1. Reguli:
2. Fapte:
3. Scopuri:
Unei reguli i se poate asocia:
o interpretare logică –
o interpretare procedurală –
15
Reprezentarea cunoştinţelor în Prolog
Principalele secţiuni
Domeniile
Predicatele
Scopul
Clauzele
Termeni specifici subprogramw&implementari
16
Subrutine .
Predicatele
Argumentele predicatelor
Dacă un argument primeşte o valoare în timpulapelului predicatului, atunci argumentul este de tip intrare, altfel de tip ieşire.
17
Tipuri de date: sunt symbol, integer, real, string, char, list, file, simple, compound. Nu se pot definitablouri.
Constantele sunt true şi fail.
Comentariile dacă sunt pe mai multe linii suntcuprinse între /* şi */, iar dacă sunt pe o singurălinie încep cu %.
Clauzele sunt scrise în Prolog după sintaxa:
cap :- corp
Scopurile sunt trecute într-o listă separate prin , sau ;
18
Rezoluţia în Prolog
Exemplu: se dau
Fapte (a) tata(paul, ion)
(b) tata(marian, paul)
Regula (c) bunic(A,B):- tata(A,P), tata(P,B)
Scop (d) bunic(X,Y).
19
Noile scopuri sunt (e) tata(X,P),tata(P,Y).
Noul scop este : (f) tata(Ion,Y).
Noul scop este : (g) tata(Paul,X).
Noul scop este: (h) clauza vidă.
20
Observaţii Soluţiile nu sunt găsite întotdeauna; ordinea
clauzelor din program este importantă.
Ca regulă generală într-un program se scriu fapteleşi apoi regulile.
De exemplu:
1. a->a a
determină o buclă infinită pentru scopul a, în pofidaunui răspuns evident.
2. a a->a
dă un răspuns adevărat.
21
Controlul rezoluţiei În Prolog există un predicat predefinit „!” (sau „/”)
care permite suprimarea explorării anumitorramuri din arborele de rezoluţie.
Acest predicat este întotdeauna True.
În utiliziarea metodei backtracking, dacăinterpretorul ajunge la un nod la care lista de scopuri începe cu predicatul de întrerupere a explorării arborelui de rezoluţie, atunci se întoarcepână la nodul corespunzător nodului precedent, scop care a declanşat apelul regulii care conţineapredicatul !.
22
23
Definirea relatiilor prin fapte Fie un intreg arbore de familie
Arborele definit de programulProlog va fi:
parinte( Ioana, gigi).
% Ioana este parinte pentru gigi
parinte( Ion, gigi).
parinte( Ion, mimi).
parinte( gigi, fifi).
parinte( gigi, ana).
parinte( ana, ticu).
Ioana
mimigigi
ticu
anafifi
Ion
24
Intrebari posibile:
Este gigi parinte pentru ana?
?- parinte( gigi, ana).
?- parinte( mimi, ana).
?- parinte( Ion, ben).
Cine este parintele lui mimi?
?- parinte( X, mimi).
Care sunt copii lui gigi?
?- parinte( gigi, X).
Ioana
mimigigi
ticu
anafifi
Ion
Definirea relatiilor prin fapte
25
Intrebari:
Cine este parintele si al cui este?
Gaseste X si Y care satisfac faptulca X este parintele lui Y.
?- parinte( X, Y).
Cine este bunicul lui ticu?
?- parinte( Y, ticu),
parinte( X, Y).
Ioana
mimigigi
ticu
anafifi
Ion
ticu
parinte
parinte
X
Y bunic
Definirea relatiilor prin fapte
26
Intrebari:
Care sunt nepotii lui Ion?
?- parinte( Ion, X),
parinte( X, Y).
Au fifi si cu ana un parinte comun?
?- parinte( X, fifi),
parinte( X, ana).
Ioana
mimigigi
ticu
anafifi
Ion
Definirea relatiilor prin fapte
27
In Prolog este usor sa se defineasca o relatie
Utilizatorul poate interoga usor sistemulprolog despre relatiile definite in program.
Un program Prolog este compus din clauze. Fiecare clauza se termina cu oprire completa.
Argumentele unei relatii pot fi:
Atomi:
Variabile:
Definirea relatiilor prin fapte
28
Fapte: female( Ioana). % Ioana este femeie male( Ion). % Ion este barbat male( gigi). female( mimi). female( fifi). female( ana). male( ticu).
Definirea relatiei de “copil al lui/ei” - “offspring()”: Fapt: offspring( mimi, Ion). Regula: offspring( Y, X) :- parinte( X, Y).
Pentru toti X si Y, Y este un copil al lui X dacaX este un parinte al lui Y.
Ioana
mimigigi
ticu
anafifi
Ion
Definirea relatiilor prin reguli
29
Dupa cum am mai spus regulile sunt compusedin: O parte de conditie (corpul)
Plasata in partea dreapta a regulii
O parte de concluzie (capul) Plasata in partea stanga a reguliithe left-hand side of the rule
Exemplu: offspring( Y, X) :- parinte( X, Y).
Regula este in general in sensul ca este aplicabila asupraunor obiecte de tipul X si Y.
Un caz special al reulii generale poate fi: offspring( mimi, Ion) :- parinte( Ion, mimi).
?- offspring( mimi, Ion).
?- offspring( X, Y).
X
Y
parinte copil
Definirea relatiilor prin reguli
30
Definirea realtiei de tip “mama”: mother( X, Y) :- parinte( X, Y), female( X).
Pentru toti X si Y X este mama lui Y daca
X este parinte al lui Y si
X este femeie
Definirea relatiei de tip “bunic”: grandparinte( X, Z) :- parinte( X, Y), parinte( Y, Z).
Pentru toti X si Y X este bunic pentru Z daca
X este parinte pentru Y si
Y este parinte pentru Z
parine
X
Y
mama
femeie
Definirea relatiilor prin reguli
Z
parinte
parinte
X
Y bunic
31
Definirea relatiei “sora”: sister( X, Y) :-parinte( Z, X), parinte( Z, Y), female(X). Pentru orice X si Y
X este o sora a lui Y daca1. Atat X si Y au acelasi parinte si2. X este femeie
Exemplu de intrebari ce pot fi puse sistemului: ?- sister( fifi, ana). ?- sister( X, ana). ?- sister( ana, ana).
ana este sora pentru ea insasi?! Pentru a corecta relatia de tip sora:
sister( X, Y) :-parinte( Z, X), parinte( Z, Y), female(X),
different( X, Y). different (X, Y) este satisfacuta daca si numai daca X si Y nu sunt egale
Y
parinteparinteZ
X
sorafemeie
Definirea relatiilor prin reguli
32
Dupa cum stim clauzele Prolog suntformate din: capCorp
Clauzele prolog sunt de trei tipuri:FapteReguliintrebari
Definirea relatiilor prin reguli
33
O variabila poate fi inlocuita cu orice alt obiect
Variabilele se presupun a fi universal cuantificate sisunt citite “for all”.
De exemplu:hasachild( X) :- parinte( X, Y).
Poate fi citit/interpretat in doua moduri
(a) For all X si Y,
daca X este un parinte al lui Y tatunci X are un copil.
(b) For all X,
X are un copil daca exita cativa Y astfel incat X esteparinte al lui Y.
Definirea relatiilor prin reguli
34
Reguli recursive Definirea relatiei de tip “predecesor()”
predecesor( X, Z):- parinte( X, Z).
predecesor( X, Z):-
parinte( X, Y), predecesor( Y, Z).
For all X si Z,
X este un predecesor al lui Z daxa
exista un Y astfel incat
(1) X este un parinte al lui Y si
(2) Y este un predecesor al lui Z.
?- predecesor( Ioana, X).
parinte
X
Y
predecesor
Z
parinte
parinte
X
Y predecesor
Y2
parinte
parinte
X
Y1
predecesor
Z
parinte
parinte
X
Y1
predecesor
Z
:predecesor
35
parinte( Ioana, gigi). parinte( Ion, gigi).parinte( Ion, mimi).parinte( gigi, fifi).parinte( gigi, ana).parinte( ana, ticu).
female( Ioana). female( mimi).female( fifi).female( ana).male( Ion). male( gigi).male( ticu).
offspring( Y, X) :-parinte( X, Y).
mother( X, Y) :-parinte( X, Y), female( X).
grandparinte( X, Z) :-parinte( X, Y), parinte( Y, Z).
sister( X, Y) :-parinte( Z, X),parinte( Z, Y), female( X),X \= Y.
predecesor( X, Z) :- % regula pr 1parinte( X, Z).
predecesor( X, Z) :- % regula pr 2parinte( X, Y),predecesor( Y, Z).
Programul pentru familie
36
Reguli recursive
Procedure:
In programul anterior, sunt doua clauze privindrelatiile de definire a predecesorului
predecesor( X, Z) :- parinte( X, Z).
predecesor( X, Z) :- parinte( X, Y), predecesor( Y, Z).
Un astfel set de clauze este numit procedura.
Comentariile se pot introduce in codul sursaastfel:
/* This is a comment */
% This is also a comment
37
Trace and Notrace| ?- trace.Compilatorul va prezenta informatii detaileate
privind executia programului (trace)
(15 ms) yes{trace}
| ?- predecesor( X, Z).1 1 Call: predecesor(_16,_17) ? 2 2 Call: parinte(_16,_17) ? 2 2 Exit: parinte(Ioana,gigi) ? 1 1 Exit: predecesor(Ioana,gigi) ?
X = IoanaZ = gigi ? ;
1 1 Redo: predecesor(Ioana,gigi) ? 2 2 Redo: parinte(Ioana,gigi) ? 2 2 Exit: parinte(Ion,gigi) ? 1 1 Exit: predecesor(Ion,gigi) ?
X = IonZ = gigi ? ;
…
X = gigiZ = ticu
1 1 Redo: predecesor(gigi,ticu) ? 3 2 Redo: predecesor(ana,ticu) ? 4 3 Call: parinte(ana,_144) ? 4 3 Exit: parinte(ana,ticu) ?
…4 3 Fail: parinte(ticu,_17) ? 4 3 Call: parinte(ticu,_144) ? 4 3 Fail: parinte(ticu,_132) ? 3 2 Fail: predecesor(ticu,_17) ? 1 1 Fail: predecesor(_16,_17) ?
(266 ms) no{trace}
| ?- notrace.debugger este oprit
yes
38
Cum raspunde Prolog la intrebari Prolog accepta fapte si reguli ca pe un set de axioms,
iar intrebarile puse de utilizator ca o teoremaneverificata (inca)
Exemple:
Axiome: Toti oamenii sunt supusi greselii.
Socrates este un om.
Teorema: Socrate este supus greselii.
Pentru oricare , daca X este omatunci X etse supusgreselii.
fallible( X) :- man( X).
man( socrates). ?- fallible( socrates).
39
?- predecesor( Ion, ana).predecesor( X, Z) :- parinte( X, Z). %regula pr 1
predecesor( X, Z) :- parinte( X, Y), % regula pr2
predecesor( Y, Z).
(1) parinte( gigi, ana) este un fapt/adevar predecesor( gigi, ana)
Pornind de la parinte( gigi, ana) va urma regula pr1 predecesor( gigi, ana).
(2) parinte( Ion, gigi) este un fapt.
(3) parinte( Ion, gigi) si predecesor( gigi, ana)
predecesor( Ion, ana).
Folosind acest fapt si pe cel derivat parinte( gigi, ana) se poate concluziona ca predecesor( Ion, ana).
Ioana
mimigigi
ticu
anafifi
Ion
parinte( Ioana, gigi). parinte( Ion, gigi).parinte( Ion, mimi).parinte( gigi, fifi).parinte( gigi, ana).parinte( ana, ticu).
Cum raspunde Prolog la intrebari
40
?- predecesor( Ion, ana).predecesor( X, Z) :- parinte( X, Z). % regula pr1predecesor( X, Z) :- parinte( X, Y), % regula pr2
predecesor( Y, Z).
Cum lucreaza de fapt Prolog pentru demonstratea uneiafirmatii?
Prolog incearca intai prima clauza care apare in program. (regula pr 1 in cazul nostru)
Now, X= Ion, Z = ana.
Apoi telul predecesor( Ion, ana) este inlocuit cu parinte( Ion, ana).
Ioana
mimigigi
ticu
anafifi
Ion
Cum raspunde Prolog la intrebari
41
?- predecesor( Ion, ana).predecesor( X, Z) :- parinte( X, Z). % Regula pr1
predecesor( X, Z) :- parinte( X, Y), % Regula pr2
predecesor( Y, Z).
Se aplica regula pr2, X = Ion, Z = ana, dar Y nu esteinca instantiat.
Telul/scopul predecesor( Ion, ana) este inlocuit cu doua scopuri: parinte( Ion, Y)
predecesor( Y, ana)
Ioana
mimigigi
ticu
anafifi
Ion
parinte( Ioana, gigi). parinte( Ion, gigi).parinte( Ion, mimi).parinte( gigi, fifi).parinte( gigi, ana).parinte( ana, ticu).
Cum raspunde Prolog la intrebari
42
predecesor( Ion, ana)
predecesor( gigi, ana)
parinte( Ion, Y)predecesor( Y, ana)
parinte( Ion, ana)
parinte( gigi, ana)
no
Folosind regula pr1 Folosind regula pr2
Folosind faptulparinte( Ion, gigi)Y = gigi
Folosind regula pr1
yes
Diagrame de desfasurare
parinte( Ioana, gigi). parinte( Ion, gigi).parinte( Ion, mimi).parinte( gigi, fifi).parinte( gigi, ana).parinte( ana, ticu).
predecesor( X, Z) :- parinte( X, Z). % Rule pr1predecesor( X, Z) :- parinte( X, Y), % Rule pr2
predecesor( Y, Z).
Cum raspunde Prolog la intrebari
43
Urmarirea executiei / Trace| ?- predecesor( Ion, ana).
1 1 Call: predecesor(Ion,ana) ? 2 2 Call: parinte(Ion,ana) ? 2 2 Fail: parinte(Ion,ana) ? 2 2 Call: parinte(Ion,_79) ? 2 2 Exit: parinte(Ion,gigi) ? 3 2 Call: predecesor(gigi,ana) ? 4 3 Call: parinte(gigi,ana) ? 4 3 Exit: parinte(gigi,ana) ? 3 2 Exit: predecesor(gigi,ana) ? 1 1 Exit: predecesor(Ion,ana) ?
true ?
predecesor( X, Z) :- parinte( X, Z). % Rule pr1predecesor( X, Z) :- parinte( X, Y), % Rule pr2
predecesor( Y, Z).
Diagrame de desfasurare
predecesor( Ion, ana)
predecesor( gigi, ana)
parinte( Ion, Y)predecesor( Y, ana)
parinte( Ion, ana)
parinte( gigi, ana)
no
Folosind regula pr1 Folosind regula pr2
Folosind faptulparinte( Ion, gigi)Y = gigi
Folosind regula pr1
yes
45
Atomi si numere Caractere:
Litere mari A, B,…, Z Litere mici, b,…, z Cifre 0,1,2,…,9 Caractere speciale cum ar fi +-*/<>=:.&_~
Atomii (Atoms()) pot fi contruiti in trei moduri :
1) Siruri de litere, cifre si caracterul’_’, incaepand cu o litera mica
Ioana, z45, a_25CZ, a___c, domisoara_Mihaela
2) Siruri de caractere speciale: <--->, ===>, …,::=,.:., (except :- )
3) Siruri de caracter e intre ghilimele ‘Ion’, ‘Nord_est’, ‘Georgica Jorge’
Numere: Numerele folosite in Prolog include intregi si reali
Numere intregi: 6014, 0, -33 Real numbers: 6.28, -0.0044, 300.1
In calculul simbolic sunt folosite des numerele intregiintegers
46
Variabile Variabilele incep cu o litera mare sau un caracter
underscore.
Exemple: S, Vina, _y12, _44
Variabile anonime:
Exemple:
hasachild( X) :- parent( X, Y).
hasachild( X) :- parent( X, _).
somebody_has_child :- parent( _, _).
somebody_has_child :- parent( X, Y).
somebody_has_child :- parent( X, X).
?- parent( X, _) Suntem interesati de oamenii care au copii, dar nu si de numele
copiilor.
47
Scopul lexical al numelor variabilelor este o clauza .
Daca numele Z14 apare in doua clauze, atunciel semnifica doua variabile diferite.
hasachild(X) :- parent( X, Y).
isapoint(X) :- point( X, Y, Z).
Dar fiecare aparitie al lui Z14 cu aceeasi clauzainseamna referire la aceeasi variabila.
hasachild( X) :- parent( X, Y).
Variabile
48
Obiectele structurate sunt obiecte care au mai multecomponente.
Toate obiectele structurate pot fi reprezentate ca arbori.
Radacina arborelui este functor-ul.
Copii radacinii sunt componentele
Componentele pot li la randul lor alte structuri sau simple varoabile
date( Day, may, 2001)
Example: date( 1, may, 2001)
Toate obiectele de date in Prolog reprezinta termeni.
date
1 may 2001
(functor, radacina)
(argumente)
Structuri
Obiecte de date
variabileconstante
structuriObiecte simple
numereatomi
49
Se vor alege urmatorii functori:
point pentru puncte,
seg pentru segmente de dreapta
triangle pentru triunghiuri.
Reprezentare:
P1 = point( 1, 1)
P2 = point( 2, 3)
S = seg( P1, P2)
= seg( point(1,1), point(2,3))
T = triangle( point(4,2), point(6,4), point(7,1))
P1=(1,1)
(4,2)
(7,1)
(6,4)P2=(2,3)
TS
Structuri
50
Reprezentarea structurala a obiectelor:
P1 = point( 1, 1)
S = seg( P1, P2)
= seg( point(1,1), point(2,3))
T = triangle( point(4,2), point(6,4), point(7,1))
P1=point
1 1 point
1 1
point
2 3
S=seg
point
4 2
point
6 4
T=triangle
point
7 1
Functor principal
Structuri
51
point( X1, Y1) and point( X, Y, Z)
sunt diferite.
Sistemul Prolog va recunoaste diferenta dintre numarulergumentelor si va interpreta numele ca doi functori .
Structura arborescenta corespunzatoareexpresieie (a + b)*(c - 5).
Folosind operatorii ‘*’,’+’ si ‘-’ ca functori
*(+( a, b), -( c, 5))?- X = *(+( a, b), -( c, 5)).
?- X is *(+( 3, 4), -( 6, 5)).
De fapt Prolog foloseste notatia infix (aia normala)
Structuri
+
a b
-
c 5
*
+
3 4
-
6 5
*
Notatia infix
52
Tema Propuneti o reprezentare pentru dreptunghi, patrat si cerc ca o structura Prolog
De exemplu un dreptunghi poate fi reprezentat de ptru puncte dar nu e
obligatoriu poate fi reprezentat de trei puncte si altceva .
Incercati sa scrieti niste exemple concrete pentru structurile propuse .
point
4 2
point
6 4
T=triangle
point
7 1
53
Potrivirea / Matching Cea mai importanta operatie aplicata termenilor este cea de
potrivire.
Potrivirea este un proces care primeste la intrare doitermeni si verifica daca acestia se potrivesc. Da eroare: daca termenii nu se potrvesc
Reuseste: daca termenii se potrivesc
Fie doi termeni vom spune ca acestia se potrivesc daca: Eai sunt identici sau
Variabilele din cei doi termeni pot fi instantiate catre obiecte astfelincat prin aceasta substitutie termenii devin identici.
De exemplu:
termenii date( D, M, 2001) si date( D1, may, Y1) se potrivesc
termenii date( D, M, 2001) and date( D1, M1, 1444) NU se potrivesc
54
Potrivirea
| ?- date( D, M, 2001) = date(D1, may, Y1).
D1 = DM = mayY1 = 2001
Yes
| ?- date( D, M, 2001) = date(D1, may, Y1), date( D, M, 2001) = date( 15, M, Y).
D = 15D1 = 15
M = mayY = 2001Y1 = 2001
Yes
Cerere de verificare a potrivirii folosind operatorul ‘=‘:
55
Regulile generale pentru a decide ca doi termeni S si T se postrivesc sunt dupa cum urmeaza:
Daca S si T sunt constante atunci S si T se potrivescnumai daca sunt acelasi obiect.de exemplu: | ?- date( D, M, 2001) = date(D1, may, 2001).
D1 = D M = may yes
Daca S este o variabila si T este orice altceva atunci se potrivesc daca S poate fi instantiat la T.
Daca S si T sunt structuri atunci se potrivesc numai daca
S si T au acelasi functor/comportament principal, and
Toate componentele lor se potrivesc.
Potrivirea
56
Potrivirea| ?- triangle( point(1,1), A, point(2,3))=
triangle( X, point(4,Y), point(2,Z)).
A = point(4,Y)
X = point(1,1)
Z = 3
yes
X point
4 Y
triangle
point
2 Z
point
1 1
A
triangle
point
2 3
57
Potrivirea Segmente de linie verticale si orizontale
‘Vertical’ este o relatie unara.
Un segment este vertical daca coordonaletele de pe x ale punctelor care il definesc sunte egale.
Proprietatea orizontal este definita la fel numai capentru coordonatele de pe y .
vertical( seg( point(X,Y), point(X, Y1))).
horizontal( seg( point(X,Y), point(X1, Y))).
point(X,Y1)
point(X,Y)
point(X1,Y)point(X,Y)
x
y
58
Potrivirea Un exemplu:
point(1,1).point(1,2).point(2,4).seg(point(1,1), point(1,2)).seg(point(1,1), point(2,4)).seg(point(1,2), point(2,4)).vertical( seg( point( X, Y), point( X, Y1))).horizontal( seg( point( X, Y), point( X1, Y))).
| ?- vertical( seg( point(1,1), point( 1,2))).yes
| ?- vertical( seg( point(1,Y), point(2,Y))).no
| ?- horizontal( seg( point(1,1), point(2,Y))).Y = 1yes
59
Potrivirea| ?- horizontal( seg( point(1,1), P)).
P = point(_,1)
Yes
| ?- vertical( seg( point(1,1), P)).
P = point(1,_)
_Yes
| ?- vertical( S), horizontal( S).
S = seg( point( A,B), point( A,B))
yes
60
Intelegerea declaritiva si procedurala a programelor Prolog
Sunt doua niveluri de interpretare a unui program Prolog:
Sensul declarativ
Sensul procedural
61
Intelesul declarativ al programelor de tip Prolog
Fie o clauza :P :- Q, R.
O interpretare declarativa a acestei cauze este:
P este adevarat daca Q si R sunt adevarate.
Din Q si R urmeaza P.
Doua interpretari de tip procedural pentru aceasta clauzasunt:
Pentru a rezolva problema P, intai se rezolvasubproblema Q si apoi subproblema R.
Pentru a satisface P, intai se satisface Q si apoi R.
62
Intelesul/Interpretarea declarativa: Interpretarea declarativa a programelor determina atunci cand un tel este
adevarat si daca da pentru ce valori ale variabilelor este acest lucru adevarat
Instanta versus variant: O instanta a unei clauzze C este clauza C cu fiecare din variabilele sale
inlocuita de un termen.
Un variant al unei clauze C este o instanta a clauzei C unde fiecare variabilaeste sustituita se alta variabila.
De exemplu considera clauza:
hasachild( X) :- parinte( X, Y).
Intelesul declarativ al programelor de tip Prolog
Cele doua variante ale aceste clauze sunt:
hasachild( A) :- parinte( A, B).
hasachild( X1) :- parinte( X1, X2).
Instantele acestei clauze sunt:
hasachild( peter) :- parinte( peter, X).hasachild( barry) :- parinte( barry, small(caroline)).
63
Un tel/scop G este true daca si numaidaca
(1) Exista o clauza C in program astfel incat
(2) Exista o instanta I a clauzei C astfel incat
(a)Capul lui I este identic cu G, si
(b) Toate scopurile din corpul lui I sunttrue.
Intelesul declarativ al programelor de tip Prolog
64
Prolog accepta si disjungerea scopurilor:
Oricare din scopurile prezentate intr-o disjungere trebuiesa sa fie adevarat.
P :- Q; R.
P este true daca Q este true SAU R este true.
Exemplu:
P :- Q, R; S, T, U.
P :- (Q, R); (S, T, U).
P :- Q, R.
P :- S, T, U.
Intelesul declarativ al programelor de tip Prolog
65
executie
program
lista scopuriIndicator de Succes/Nu
Instantiatierea variabilelor
Indicatorul de sucses/nu este‘DA’ daca telurile pot fi
indeplinitesi ‘NU’ in rest.program
Instantierea variabilelor esterealizata numai in caz de
terminare cu succes
Intelesul procedural al programelor de tip Prolog
66
O procedura se executa: Daca lista de teluri G1,…,Gm este goala atunci se termina
cu succes.
Daca lista de scopuri nu este goala atunci se apeleazaSCANNING.
SCANNING : Cauta prin clauzele din program de sus in jos (top to bottom) pana
cand este gasita prima clauza C astfel incat capul lui C se potriveste cu primul tel G din lista. Daca nu se gaseste o astfel de clauza atunci se termina xu eroare.
Daca exista o astfel de clauza C, atunci redenumeste variabilele din C pentru a obtine un variant C’ al lui C, astfel incat C’ si listaG1, …,Gm nu mai au variabile comune.
Incearca o potrivire intre G1 si capul lui C’. In locuieste G1 cu corpullui C (mai putin faptele) pentru a obtine o noua lista de teluri.
Executa aceasta noua lista de teluri.
Intelesul procedural al programelor de tip Prolog
67
Program:
big( bear).
big( elephant).
small( cat).
brown( bear).
black( cat).
gray( elephant).
dark(Z):- black(Z).
dark(Z):- brown(Z).
{trace}
| ?- dark(X), big(X). (goal list: dark(X), big(X))
1 1 Call: dark(_16) ? (dark(Z):- black(Z);
goal list: black(X), big(X))
2 2 Call: black(_16) ?
2 2 Exit: black(cat) ? (yes)
1 1 Exit: dark(cat) ? (X = cat; goal list: big(X))
3 1 Call: big(cat) ? (no)
3 1 Fail: big(cat) ?
1 1 Redo: dark(cat) ? (X != cat, backtrack;
goal list: dark(X), big(X))
2 2 Call: brown(_16) ? (dark(Z):- brown(Z);
goal list: brown(X), big(X))
2 2 Exit: brown(bear) ?
1 1 Exit: dark(bear) ? (yes, X= bear; goal list: big(X))
3 1 Call: big(bear) ? (yes)
3 1 Exit: big(bear) ?
X = bear
yes
{trace}
Intelesul procedural al programelor de tip Prolog
68
De fiecare data cand un apel de executierecursiv da eroare, executia programului se intoarce SCANING, si continua de la clauza C care fusese ultima folosita
Prolog abandoneaza toate rezultateleexecutiei lipsite de succes si se intoarcelapunctul de unde ramura eronata a executieia inceput .
Intelesul procedural al programelor de tip Prolog
69
Temabig( bear).
big( elephant).
small( cat).
brown( bear).
black( cat).
gray( elephant).
dark(Z):- black(Z).
dark(Z):- brown(Z).
In care din cele doua cazuri Prolog trebuie sa munceasca maimult inainte de a gasi raspunsul ?
?- big(X), dark(X).
?- dark(X), big(X).
70
Exemplu: maimutza si banana Problema:
Este o maimuta intr-o camera linga usa
In mijlocul camerei o atarna de tavan o banana.
Maimuta este infometata si vrea sa ajunga la banana darnu se poate intinde/sari suficient de mult/sus ca sapoata ajunge la banana
La fereastra camerei se afla o cutie pe care maimuta o poate folosi .
Maimuta poate efectua urmatoarele actiuni:
Merge pe podea
Se catara pe cutie
Impinge cutia intr-o directie
Apuca banana daca sta pe cutie dedesuptul bananei
Poate maimuta lua banana?
71
Reprezentarea problemei: Starea initiala:
(1) Maimuta este la usa.
(2) Maimuta is on floor.
(3) Cutia este la freastra.
(4) Maimuta does not have banana.
state( atdoor, onfloor, atwindow, hasnot)
Scopul jocului:
state( _, _, _, has)
atdoor onfloor atwindow
state
hasnot
Exemplu: maimutza si banana
72
Exista patru tipuri de miscari:(1) apuca banana,
(2) catara pe cutie,
(3) impinge cutia,
(4) umbla prin camera.
O relatie cu trei parametri:
move( State1, Move, State2)
‘prinde’:
move( state( middle, onbox, middle, hasnot),
grasp,
state( middle, onbox, middle, has)).
State2Misca
State1
Exemplu: maimutza si banana
73
‘merge’:move( state( P1, onfloor, Box, Has),
walk( P1, P2),
state( P2, onfloor, Box, Has)).
‘catara’:move( state( P, onfloor, P, Has),
climb,
state( P, onbox, P, Has)).
‘impinge’:move( state( P1, onfloor, P1, Has),
push( P1, P2),
state( P2, onfloor, P2, Has)).
Exemplu: maimutza si banana
74
Intrebare: Poate maimuta intr-o stare initiala State sa iabanana?
canget( State)
canget( state( _, _, _, has)).
canget( State1) :-
move( State1, Move, State2),
canget( State2).
canget canget has
State1 State2Move
Exemplu: maimutza si banana
75
move( state( middle, onbox, middle, hasnot), grasp,
state( middle, onbox, middle, has) ).
move( state( P, onfloor, P, H),climb, state( P, onbox, P, H) ).
move( state( P1, onfloor, P1, H),push( P1, P2), state( P2, onfloor, P2, H) ).
move( state( P1, onfloor, B, H),walk( P1, P2), state( P2, onfloor, B, H) ).
canget( state( _, _, _, has) ).
canget( State1) :- move( State1, Move, State2), canget( State2).
Programul pentru problema maimutza si banana
76
| ?- canget( state( atdoor, onfloor, atwindow, hasnot)).true ? Yes (maimuta poate lua banana in aceasta stare.)
{trace} | ?- canget( state( atdoor, onfloor, atwindow, hasnot)).
1 1 Call: canget(state(atdoor,onfloor,atwindow,hasnot)) ? 2 2 Call: move(state(atdoor,onfloor,atwindow,hasnot),_45,_85) ? 2 2 Exit: move(state(atdoor,onfloor,atwindow,hasnot),
walk(atdoor,_73),state(_73,onfloor,atwindow,hasnot)) ? 3 2 Call: canget(state(_73,onfloor,atwindow,hasnot)) ? 4 3 Call: move(state(_73,onfloor,atwindow,hasnot),_103,_143) ? 4 3 Exit: move(state(atwindow,onfloor,atwindow,hasnot),
climb,state(atwindow,onbox,atwindow,hasnot)) ? 5 3 Call: canget(state(atwindow,onbox,atwindow,hasnot)) ? 6 4 Call: move(state(atwindow,onbox,atwindow,hasnot),_158,_198) ? 6 4 Fail: move(state(atwindow,onbox,atwindow,hasnot),_158,_186) ? 5 3 Fail: canget(state(atwindow,onbox,atwindow,hasnot)) ? 4 3 Redo: move(state(atwindow,onfloor,atwindow,hasnot),
climb,state(atwindow,onbox,atwindow,hasnot)) ?
Exemplu: maimutza si banana
77
4 3 Exit: move(state(atwindow,onfloor,atwindow,hasnot),
push(atwindow,_131),state(_131,onfloor,_131,hasnot)) ?
5 3 Call: canget(state(_131,onfloor,_131,hasnot)) ?
6 4 Call: move(state(_131,onfloor,_131,hasnot),_161,_201) ?
6 4 Exit: move(state(_131,onfloor,_131,hasnot),
climb,state(_131,onbox,_131,hasnot)) ?
7 4 Call: canget(state(_131,onbox,_131,hasnot)) ?
8 5 Call: move(state(_131,onbox,_131,hasnot),_216,_256) ?
8 5 Exit: move(state(middle,onbox,middle,hasnot),
grasp,state(middle,onbox,middle,has)) ?
9 5 Call: canget(state(middle,onbox,middle,has)) ?
9 5 Exit: canget(state(middle,onbox,middle,has)) ?
7 4 Exit: canget(state(middle,onbox,middle,hasnot)) ?
5 3 Exit: canget(state(middle,onfloor,middle,hasnot)) ?
3 2 Exit: canget(state(atwindow,onfloor,atwindow,hasnot)) ?
1 1 Exit: canget(state(atdoor,onfloor,atwindow,hasnot)) ?
true ?
(62 ms) yes
{trace}
Exemplu: maimutza si banana
78
Simularea unui automat nedeterminist finit De exemplu:
Stari: {s1, s2, s3, s4}.
Stare initiala: s1.
Stare finala: s3.
Simboluri: {a, b}.
null (simbolul null)
Arcele etichetate cu nul corespund
tranzitiilor neconditionate ale automatului
Tranzitiile apar fara o citire a intrarii.
s1 s2
s4 s3
a
ba
b
b
null
null
79
Se spune ca automatul accepta sir la intrare daca este o cale de tranzitii in graf care se ocupa de aceasta astfel incat(1) Porneste din starea initiala
(2) Sfarseste in starea finala si
(3) Etichetele arcelor de-a lungul respectiveicai corespund tuturor elementelor continutein sirul de intrare (deci analiza se face complet).
De exemplu : Automatul va accepta sirulurile ab si aabaab.
Va rejecta sirurile abb si abba.
De fapt se observa ca utomatul accepta oricesir care se termina cu ab, si le respinge perestul.
s1 s2
s4 s3
a
ba
b
b
null
null
Simularea unui automat nedeterminist finit
80
In Prolog, un automat poate fi definit de trei relatii :(1) O relatie unara final care defineste sfarsitul executiei automatului(starea finala).
final(F)
inseamna ca F este stare finala.
(2) O relatie ternara trans care defineste tranitiile intre stari astfel
trans( S1, X, S2)
(3) O relatie binara
silent( S1, S2)
s1 s2
s4 s3
a
ba
b
b
null
null
Simularea unui automat nedeterminist finit
81
De exemplu automatul de mai jos estedescris astfel:
final(s3).
trans(s1, a, s1).
trans(s1, a, s2).
trans(s1, b, s1).
trans(s2, b, s3).
trans(s3, b, s4).
silent(s2, s4).
silent(s3, s1).
s1 s2
s4 s3
a
ba
b
b
null
null
Simularea unui automat nedeterminist finit
82
Reprezentarea sirurilor de intrare: ca liste Prolog.
de exemplu, [a, a, a, b].
Definirea acceptarii unui sir dintr-o stare anume :accepts( State, String)
Relatia binara accepts este adevarata daca automatul incepand din starea State ca stare initiala accepta sirul de simboluri/caractereString.
De exemplu:
| ?- accepts( s1, [a, a, a, b]).true ? yes
s1 s2
s4 s3
a
ba
b
b
null
null
Simularea unui automat nedeterminist finit
83
Relatia accepts poate fi definita de trei clauze:(1) Sir gol, [], este acceptat din starea State daca State este o stare
finala .
accepts( State, []):- final( State).
(2) Un sir nevid este acceptat fin starea State daca citire primuluisimbol din sir poate aduce automatul intr-o stare interna oarecareState1, iar restul sirului este accepta din starea State1.
accepts( State, [ X| Rest]):-
trans( State, X, State1), accepts( State1, Rest).
(3) Un sir este acceptat din starea State daca automatul poate face o tranzitie neconditionata din starea State in starea State1 si apoi saccepte (intregul) sir din starea State1.
accepts( State, String):-
silent( State, State1), accepts( State1, String).
S S1X
S S1null
Simularea unui automat nedeterminist finit
84
For example:| ?- accepts( s1, [a, a, a, b]).true ? yes
| ?- accepts( S, [a, b]).S = s1 ? ;S = s3 ? ;no
| ?- accepts( s1, [X1, X2, X3]).
X1 = aX2 = aX3 = b ? ;X1 = bX2 = aX3 = b ? ;No
| ?- String=[_,_,_,_], accepts( s1, String).
String = [a,a,a,b] ? ;String = [a,b,a,b] ? ;String = [a,b,a,b] ? ;String = [b,a,a,b] ? ;String = [b,b,a,b] ? ;no
s1 s2
s4 s3
a
ba
b
b
null
null
Simularea unui automat nedeterminist finit
85
Comunicarea cu fisiereleComunicarea dintre user si program este
urmatoarea :
Utilizatorul pune intrebari programului
Programul raspunde in termeni de instantiere de variabile
Extensii
86
In orice moment al executiei un program Prolog exista active numai doua fisiere (fluxuri etc) :
Unul pentru intrare (cel curent)
Unul pentru iesire (cel curent)
Fluxul curent de intrare poate fi redirectionat catre un alt fisier cu numele specificat prin Filename daca se folosesteurmatorul tel:
see( Filename)
Fluxul curent de iesire poate fi redirectionat catre un alt fisier cu numele specificat prin Filename daca se folosesteurmatorul tel:
tell( Filename)
Comunicarea cu fisierele
87
De exemplu:
…
see( file1),
read_from_file( Information),
see( user),
…
tell( file3),
write_on_file( Information),
tell( user),
…
Alt exemplu:
readfile( X, Y) :- see('test.txt'), get( X), get( Y), seen.
writefile(X) :- tell('test1.txt'), put( X), told.
| ?- readfile(X, Y).X = 48Y = 49yes
test.txt0123456 …
Comunicarea cu fisierele