Sunteți pe pagina 1din 42

PROLOG

• Prolog reprezintă o prescurtare de la


“Programming în logic”.
• Este un limbaj conceput pentru programarea
logică (deci un limbaj declarativ).
• A fost elaborat în cursul anilor 1970 în
Europa (mai ales în Franţa şi Scoţia).
• Primul compilator de Prolog a fost creat în
1972 de către Philippe Roussel, la
Universitatea din Marsilia.
• Prologul este un limbaj compilat, care
utilizează, în locul relaţiilor matematice,
relaţii logice între mulţimi de date.
• Exista limbaje algoritmice, orientate obiect
si logice.

• Limbajele programării logice (Prolog) sunt


limbaje declarative. Un limbaj de
programare declarativ scuteşte
programatorul de a mai menţiona
procedura exactă pe care trebuie să o
execute calculatorul pentru a realiza o
funcţie. Programatorii folosesc limbajul
pentru a descrie o mulţime de fapte şi de
relaţii astfel încât utilizatorul să poată
interoga apoi sistemul pentru a obţine un
anumit rezultat.
- Programele Prolog opereaza cu obiecte si cu
relatii intre obiecte (fapte si/sau clauze).

- Negatia joaca un rol foarte important in


programarea in acest limbaj, deoarece orice
proprietate care nu se poate deduce din entitatile
programului este considerata falsa, deci negatia ei
este adevarata.

- Prolog foloseste un model de rationament


minimal numit ipoteza lumii inchise. Conform
acestui model, tot ceea ce nu este stiut de program,
deci afirmat explicit ca fiind adevarat in program,
este considerat fals.

- Prologul modeleaza negatia ca esec al satisfacerii


unui scop (negatia ca insucces), aceasta fiind de
fapt o particularizare a ipotezei lumii inchise.
• O clauza Prolog sau regula este de forma:
H :- B1, B2, … , Bn.
unde: H este capul regulii, iar membrul drept
constituie corpul regulii (care este o conjunctie sau o
disjunctie de scopuri).
• Sensul clauzei Prolog anterioare este:
If B1 & B2 & … & Bn then H
• In Prolog constantele se scriu cu litera mica, iar
variabilele cu litera mare.
• Simbol…………………………..Sens
:- daca
, conjunctie
; disjunctie
_ variabila universala
(semnifica orice)
• O fapta Prolog este o clauza fara corp, adica
de forma H. Ea reprezinta o clauza care este
tot timpul adevarata, deoarece nu este
conditionata.
• Structura unui program Prolog:
 definitii constante
 tipuri de obiecte definite de utilizator
 declaratiile predicatelor
 reguli

• Un program Prolog contine urmatoarele


entitati:
 fapte despre obiecte si relatiile existente
intre aceste obiecte;
 reguli despre obiecte si relatiile dintre ele,
care permit deducerea (inferarea) de noi
fapte pe baza celor cunoscute;
 intrebari, numite si scopuri, despre obiecte
si relatiile dintre ele, la care programul
raspunde pe baza faptelor si regulilor
existente.
• Baza de cunostinte Prolog:
Multimea faptelor unui program Prolog formeaza
baza de cunostinte Prolog. In baza de cunostinte a
unui program Prolog sunt incluse si regulile
Prolog.

• Scopuri:
Scopurile sunt predicate pentru care se doreste
aflarea valorii de adevar, in contextul faptelor
existente in baza de cunostinte.

• Rezultatul unui program Prolog:


Obtinerea consecintelor sau a rezultatului unui
program Prolog se face prin fixarea unor scopuri
care pot fi adevarate sau false, in functie de
continutul bazei de cunostinte. Cum scopurile pot
fi vazute ca intrebari, rezultatul unui program
Prolog este raspunsul la o intrebare sau la o
conjunctie de intrebari.
• O regula Prolog exprima un fapt care depinde
de alte fapte si este de forma
S :- S1, S2, … , Sn.
cu S reprezentand capul sau antetul regulii, iar
membrul drept reprezentand corpul regulii.

• Constantele se mai numesc atomi simbolici si


denumirile lor incep cu litera mica.

• Numele de variabile incep cu litera mare; o


variabila poate fi instantiata sau legata daca
exista un obiect asociat acestei variabile sau
neinstantiata, respectiv nelegata, respectiv
libera daca nu se stie inca ce obiect va
desemna variabila.
La fixarea unui scop Prolog care contine variabile,
acestea sunt neinstantiate, iar sistemul incearca
satisfacerea acestui scop cautand printre faptele
din baza de cunostinte un fapt care poate
identifica cu scopul, printr-o instantiere adecvata
a variabilelor din scopul dat. Este vorba de fapt de
un proces de unificare a predicatului scop cu unul
din predicatele fapte existente in baza de
cunostinte. La incercarea de satisfacere a
scopului, cautarea se face intotdeauna pornind de
la inceputul bazei de cunostinte. Exista atatea
solutii cate unificari diferite exista. Obtinerea
primei solutii este numita satisfacerea scopului, iar
obtinerea altor solutii resatisfacerea scopului. La
satisfacerea unui scop cautarea se face
intotdeauna de la inceputul bazei de cunostinte.
La resatisfacerea unui scop cautarea se face
incepand de la marcajul stabilit de satisfacerea
anterioara a acelui scop.
Obtinerea solutiilor atunci cand baza de
cunostinte Prolog contine si reguli:

In acest caz, unificarea scopului se incearca atat cu


fapte din baza de cunostinte, cat si cu antetul
regulilor din baza.

La unificarea unui scop cu antetul unei reguli,


pentru a putea satisface acest scop trebuie
satisfacuta regula. Aceasta revine la a satisface
toate faptele din corpul regulii, deci conjunctia de
scopuri. Scopurile din corpul regulii devin
subscopuri a caror satisfacere se va incerca
printr-un mecanism similar cu cel al satisfacerii
scopului initial.

Comportarea sistemului Prolog in care se incearca


in mod repetat satisfacerea si resatisfacerea
scopurilor din conjunctia de scopuri se numeste
backtracking.
Un exemplu de program Prolog (definirea unor
relatii de familie):
- faptul ca Tom este parinte al lui Bob se poate
scrie in Prolog astfel:
parinte(tom, bob).
Aici parinte este numele relatiei, iar tom si bob
sunt argumentele sale.

 Program Prolog care defineste relatii de


familie:

parinte(pam, bob).
parinte(tom, bob).
parinte(tom, liz).
parinte(bob, ann).
parinte(bob, pat).
parinte(pat, jim).
Programul consta din 6 clauze. Fiecare
dintre aceste clauze declara un fapt despre
relatia parinte. Spre exemplu, parinte(tom,
bob) este o instantiere particulara a relatiei
parinte. In general, o relatie se defineste ca
fiind multimea tuturor instantierilor sale.

Obs.: Acest program simplu nu contine


(inca) regului (ci doar fapte).
Interogarea Prologului:

Ex.: Vrem sa aflam daca Bob este parinte al lui


Pat. Aceasta intrebare este comunicata sistemului
Prolog tastandu-se la terminal:
?- parinte(bob, pat).
Raspunsul Prologului va fi
yes

Alte exemple de interogari:

?-parinte(liz, pat).
no

?-parinte (tom, ben).


no

Cine este parintele lui Liz?


?-parinte(X, liz).
X = tom
• Cine sunt copiii lui Bob?

?-parinte (bob, X).


X = ann;
X= pat;
no

• Cine este parinte al cui?

?-parinte(X, Y).
X = pam
Y = bob;

X = tom
Y = bob;

X = tom
Y = liz;

• Cine este un bunic al lui Jim? i.e.
(1) Cine este parinte al lui Jim? Presupunem ca
acesta este un Y.
(2) Cine este parinte al lui Y? Presupunem ca
acesta este un X.

(1) si (2) necesita urmatoarea interogare


compusa:

?- parinte(Y, jim), parinte(X, Y).

Raspunsul Prologului este:

X = bob
Y = pat

Obs.: Interogarea
?- parinte(X, Y), parinte(Y, jim).
va produce acelasi rezultat.
• Cine sunt nepotii lui Tom?

?- parinte(tom, X), parinte (X, Y).

X = bob
Y = ann;

X = bob
Y = pat

• Ann si Pat au un parinte comun?

?-parinte(X, ann), parinte(X, pat).

X = bob
Extinderea programului cu reguli:

• Introducem, mai intai, urmatoarele fapte noi:

feminin(pam).
masculin(tom).
masculin(bob).
feminin(liz).
feminin(pat).
feminin(ann).
masculin(jim).
si
sex(pam, feminin).
sex(tom, masculin).
sex(bob, masculin).

si
urmas(liz, tom).

Obs.: Relatia urmas poate fi definita intr-un mod
mult mai elegant prin folosirea relatiei deja
definite parinte.

Pentru toti X si toti Y,


Y este urmas al lui X daca
X este parinte al lui Y.
Aceasta interpretare genereaza o clauza Prolog
reprezentata de urmatoarea regula:

urmas(Y, X) :- parinte(X, Y).

• Interogarea Prologului cand baza de


cunostinte contine si aceasta regula:
?- urmas(liz, tom).
Cum lucreaza Prologul acum: Intrucat nu
exista fapte referitoare la urmasi, trebuie
folosita regula, astfel: variabilele X si Y vor fi
instantiate in felul urmator
X = tom si Y = liz
Continuare:

- Dupa instantiere se obtine un caz particular al


regulii generale. Acest caz particular este:
urmas(liz, tom) :- parinte(tom, liz).
- Corpul regulii reprezinta partea de conditie,
iar antetul ei partea de concluzie. Prolog
incearca sa determine daca partea de conditie
este adevarata i.e. daca parinte(tom, liz) este
adevarat. In acest moment, scopul initial,
urmas(liz,tom), a fost inlocuit cu subscopul
parinte(tom, liz).
- Noul scop este imediat satisfacut intrucat el
reprezinta o fapta Prolog (din baza de
cunostinte).
- Aceasta inseamna ca partea de concluzie este,
de asemenea, adevarata, iar Prolog va
raspunde la intrebare cu yes.
• Introducem acum relatii de familie
suplimentare:

 relatia mama, definita astfel:

mama (X, Y) :- parinte (X,Y), feminin (X).

 relatia bunic, definita astfel:

bunic (X, Z) :- parinte (X, Y), parinte(Y, Z).

 relatia sora, definita astfel:

sora (X, Y) :-
parinte (Z, X),
parinte (Z, Y),
feminin (X).
• Interogarea Prologului:

 daca ann si pat sunt surori

?- sora (ann, pat).


yes

 cine este sora lui Pat

?- sora (X, pat).


X = ann;
X = pat

Obs.: Relatia sora ar trebui sa fie definita dupa cum


urmeaza
sora (X, Y) :-
parinte (Z, X),
parinte (Z, Y),
feminin (X),
diferit (X, Y).
unde predicatul diferit (X,Y) trebuie definit astfel incat
el sa fie satisfacut daca si numai daca X e diferit de Y.
Reguli recursive

 relatia predecesor: un predecesor poate fi


direct (parinte)

predecesor (X, Z) :- parinte (X, Z).

sau indirect

predecesor (X, Z) :-
parinte (X, Y),
parinte (Y, Z).

predecesor (X, Z):-


parinte (X, Y1),
parinte (Y1, Y2),
parinte(Y2, Z).

OBS.: Pentru ca relatia predecesor sa lucreze


corect in cazul predecesorilor aflati la orice
adancime, definitia ei trebuie gandita in felul
urmator:
• Pentru toti X si Z,
X este predecesor al lui Z daca
Exista un Y astfel incat
(1) X este parinte al lui Y si
(2) Y este un predecesor al lui Z.

Clauza Prolog corespunzatoare (recursiva) este:

Predecesor (X,Z) :-
parinte (X,Y),
predecesor (Y,Z).
Definirea relatiei predecesor:

- consta din doua reguli, una care se refera la


predecesori directi si cealalta la predecesori
indirecti. Definitia completa este urmatoarea:

predecesor (X, Z) :-
parinte (X,Z).

predecesor (X, Z) :-
parinte (X, Y),
predecesor (Y, Z).

Exemplu de interogare a Prologului (care sunt


succesorii lui Pam):

?- predecesor (pam, X).

X = bob;
X = ann;
X = pat;
X = jim
Semnificatia declarativa si procedurala a programelor
Prolog

Semnificatia declarativa a unui program Prolog se


refera la interpretarea strict logica a clauzelor acelui
program, rezultatul programului fiind reprezentat de
toate consecintele logice ale acestuia. Semnificatia
declarativa determina daca un scop este adevarat (poate
fi satisfacut) si, in acest caz, pentru ce instante de
variabile este adevarat scopul.

Semnificatia procedurala a unui program Prolog se


refera la modul in care sistemul incearca satisfacerea
scopurilor, deci la strategia de control utilizata.

Diferenta dintre semnificatia declarativa si cea


procedurala este aceea ca cea de-a doua defineste, pe
langa relatiile logice specificate de program, si ordinea
de satisfacere a scopurilor si subscopurilor.
OBS.1: Datorita semnificatiei procedurale a
limbajului Prolog, trebuie urmarit cu atentie
modul de definire a unui predicat, atat din
punctul de vedere al ordinii clauzelor, cat si din
punctul de vedere al ordinii scopurilor in corpul
regulilor.

OBS. 2: Ceea ce este neobisnuit in raport cu alte


limbaje de programare este faptul ca semnificatia
declarativa a programului este corecta, indiferent
de ordonarea clauzelor, in timp ce programul este
procedural incorect, avand comportari diferite in
functie de aceasta ordonare.
Satisfacerea clauzelor in Prolog
(Backtracking)

Presupunem ca programul nu contine


reguli, ci numai fapte

Presupunem ca avem un program ce


contine si reguli
1. Programul nu contine reguli, ci numai fapte:

Daca scopul are forma p 1, p 2 , … , pn , se incearca


satisfacerea lui de la stanga la dreapta. Atunci cand
acesta nu contine variabile, daca baza de fapte satisface
intreg scopul, Prolog raspunde cu YES, altfel cu NO.
Daca scopul contine variabile, atunci obiectivul este
acela de a gasi toate legaturile posibile pentru variabile,
care sa satisfaca scopul (deci de a da toate solutiile). Mai
precis, se parcurge baza de fapte si se satisface o data
p 1. Se trece apoi la satisfacerea lui p 2. Daca p 2 este
satisfacut, atunci se trece la p 3 . Daca p 2 nu se satisface,
atunci se dezleaga variabilele lui p1 si se inspecteaza
baza de fapte pentru a gasi alte valori care legate de
variabilele lui p 1 sa resatisfaca p 1 , apoi se reincearca
satisfacerea lui p 2 cu noile legaturi. Blocarea acestui
proces de Backtracking se poate face cu predicatul !
(“cut”), asezat intre doua clauze consecutive p i si p i+1
ale scopului. In acest caz, nu se incearca resatisfacerea
lui p i .
Daca programul contine si reguli:

Satisfacerea scopului se realizeaza in urmatorii pasi:


a) Presupunem: clauzele p 1 ,…, p i au fost satisfacute.
b) In vederea satisfacerii lui p i+1 se inspecteaza mai
intai baza de fapte. Daca p i+1 se satisface cu o
fapta, se trece la p i+2 . Daca nu exista elemente in
baza de fapte care sa satisfaca pe pi+1 , se
inspecteaza baza de reguli si se identifica prima
dintre regulile neluate in consideratie pana in
prezent, al carei cap se poate unifica cu p i+1 : se
intra in corpul regulii identificate, considerand
clauzele care il compun drept componente ale
scopului. Daca una din clauzele corpului nu poate
fi satisfacuta, se identifica o alta regula al carei
cap sa se unifice cu p i+1 . In cazul in care nu exista
o asemenea regula, se incearca resatisfacerea
clauzelor p i , p i-1, …
Unificare: Satisfacerea unui scop de tipul X =
Y se face prin incercarea de a unifica X cu Y.
Din aceasta cauza, dandu-se un scop de tipul
X = Y, regulile de decizie care indica daca
scopul se indeplineste sau nu sunt:
1. Daca X este variabila neinstantiata, iar Y este
instantiata la orice obiect Prolog, atunci
scopul reuseste. Ca efect lateral, X se va
instantia la aceeasi valoare cu cea a lui Y.
2. Daca atat X cat si Y sunt variabile
neinstantiate, scopul X = Y reuseste, variabila
X este legata la Y si reciproc, i.e.: ori de cate
ori una dintre cele doua variabile se
instantiaza la o anumita valoare, cealalta
variabila se va instantia la aceeasi valoare.
3. Atomii si numerele sunt intotdeauna egali cu
ei insisi.
4. Doua structuri (a se vedea sintaxa limbajului)
sunt egale daca au acelasi functor, acelasi
numar de componente si fiecare componenta
dintr-o structura este egala cu componenta
corespunzatoare din cealalta structura.
Sintaxa limbajului Prolog

• Constantele definesc:
 Obiecte particulare
 Relatii particulare

 Constantele sunt de urmatoarele tipuri:


 atomi – constante simbolice (desemneaza
predicate Prolog sau argumente ale
predicatelor)
 numere

Atomii pot fi construiti in 3 moduri; ei pot


constitui:
1) siruri de litere, cifre si caracterul
“underscore”, ‘_’, siruri care incep cu o
litera mica;
2) siruri de caractere speciale;
3) siruri de caractere incluse intre paranteze
simple (ex.: ‘South_America’).
Numerele: majoritatea implementarilor admit o
gama de valori cuprinse intre –16383 si +16383, dar
gama poate fi si mai larga.

• Variabilele:
 au denumiri care incep cu litere mari; numele
de variabila poate incepe si cu simbolul “_”,
ceea ce indica o variabila anonima;
 utilizarea unei variabile anonime semnifica
faptul ca nu intereseaza valoarea la care se va
instantia acea variabila;
 scopul lexical al unui nume de variabila il
constituie o unica clauza. (Daca, spre exemplu,
numele X15 intervine in doua clauze diferite,
atunci el semnifica doua variabile diferite.
Fiecare ocurenta a lui X15 in interiorul
aceleiasi clauze semnifica insa o aceeasi
variabila).
• Structurile sunt obiecte ce desemneaza o
colectie de obiecte corelate logic, care
formeaza componentele structurii.

Ex: poseda(mihai, carte(prolog, clocksin, 1981))

 Sunt folosite la reprezentarea structurilor de


date (liste, arbori)
 O structura se defineste prin specificarea:
 numelui structurii (functorul structurii);
 elementelor sau componentelor structurii.
 Desi alcatuite din mai multe componente, sunt
tratate de program ca obiecte unice. Pentru
combinarea componentelor intr-un unic
obiect, este folosit un functor. Acesta va fi
radacina arborelui intr-o reprezentare
arborescenta.
Extinderea programului cu reguli:

• Introducem, mai intai, urmatoarele fapte noi:

feminin(pam).
masculin(tom).
masculin(bob).
feminin(liz).
feminin(pat).
feminin(ann).
masculin(jim).
si
sex(pam, feminin).
sex(tom, masculin).
sex(bob, masculin).

si
urmas(liz, tom).

Obs.: Relatia urmas poate fi definita intr-un mod
mult mai elegant prin folosirea relatiei deja
definite parinte.

Pentru toti X si toti Y,


Y este urmas al lui X daca
X este parinte al lui Y.
Aceasta interpretare genereaza o clauza Prolog
reprezentata de urmatoarea regula:

urmas(Y, X) :- parinte(X, Y).

• Interogarea Prologului cand baza de


cunostinte contine si aceasta regula:
?- urmas(liz, tom).
Cum lucreaza Prologul acum: Intrucat nu
exista fapte referitoare la urmasi, trebuie
folosita regula, astfel: variabilele X si Y vor fi
instantiate in felul urmator
X = tom si Y = liz
Continuare:

- Dupa instantiere se obtine un caz particular al


regulii generale. Acest caz particular este:
urmas(liz, tom) :- parinte(tom, liz).
- Corpul regulii reprezinta partea de conditie,
iar antetul ei partea de concluzie. Prolog
incearca sa determine daca partea de conditie
este adevarata i.e. daca parinte(tom, liz) este
adevarat. In acest moment, scopul initial,
urmas(liz,tom), a fost inlocuit cu subscopul
parinte(tom, liz).
- Noul scop este imediat satisfacut intrucat el
reprezinta o fapta Prolog (din baza de
cunostinte).
- Aceasta inseamna ca partea de concluzie este,
de asemenea, adevarata, iar Prolog va
raspunde la intrebare cu yes.

S-ar putea să vă placă și