Sunteți pe pagina 1din 9

Introducere in limbajul Prolog

1 Entitile limbajului Prolog

Limbajul Prolog este un limbaj logic, descriptiv, care permite specificarea problemei de rezolvat n termenii unor fapte cunoscute despre obiectele universului problemei i a relaiilor existente ntre aceste obiecte. Execuia unui program Prolog const n deducerea implicaiilor acestor fapte i relaii, programul definind astfel o mulime de consecine ce reprezint nelesul sau semnificaia declarativ a programului. Un program Prolog conine urmtoarele entiti: fapte despre obiecte i relaiile existente ntre aceste obiecte; reguli despre obiecte i relaiile dintre ele, care permit deducerea (inferarea) de noi fapte pe baza celor cunoscute; ntrebri, numite i scopuri, despre obiecte i relaiile dintre ele, la care programul rspunde pe baza faptelor i regulilor existente.

1.1 Fapte
Faptele sunt predicate de ordinul nti de aritate n considerate adevrate. Ele stabilesc relaii ntre obiectele universului problemei. Numrul de argumente ale faptelor este dat de aritatea (numrul de argumente) corespunztoare a predicatelor. Exemple: Fapt: papagal(coco). iubete(mihai, maria). iubete(mihai, ana). frumoas(ana). bun(gelu). deplaseaz(cub, camera1, camera2). Aritate: 1 2 2 1 1 3

Interpretarea particular a predicatului i a argumentelor acestuia depinde de programator. Ordinea argumentelor, odat fixat, este important i trebuie pstrat la orice alt utilizare a faptului, cu aceeai semnificaie. Mulimea faptelor unui program Prolog formeaz baza de cunotine Prolog. Se va vedea mai trziu c n baza de cunotinte a unui program Prolog sunt incluse i regulile Prolog.

1.2 Scopuri
Obinerea consecinelor sau a rezultatului unui program Prolog se face prin fixarea unor scopuri care pot fi adevrate sau false, n funcie de coninutul bazei de cunotine Prolog. Scopurile sunt predicate pentru care se dorete aflarea valorii de adevr n contextul faptelor existente n baza de cunotine. Cum scopurile pot fi vzute ca ntrebri, rezultatul unui program Prolog este rspunsul la o ntrebare (sau la o conjuncie de ntrebri). Acest rspuns poate fi afirmativ, yes, sau negativ, no. Se va vedea mai trziu c programul Prolog, n cazul unui rspuns afirmativ la o ntrebare, poate furniza i alte informaii din baza de cunotine.

Exemplu Considernd baza de cunotine specificat anterior, se pot pune diverse ntrebri, cum ar fi: ?- iubeste(mihai, maria). yes deoarece acest fapt exist n baza de cunotine ?- papagal(coco). yes ?- papagal(mihai). no deoarece acest fapt nu exist n baza de cunotine ?- inalt(gelu). no

1.3

Variabile

n exemplele prezentate pn acum, argumentele faptelor i ntrebrilor au fost obiecte particulare, numite i constante sau atomi simbolici. Predicatele Prolog, ca orice predicate n logica cu predicate de ordinul I, admit ca argumente i obiecte generice numite variabile. n Prolog, prin convenie, numele argumentelor variabile ncepe cu liter iar numele constantelor simbolice ncepe cu liter mic. O variabil poate fi instaniat (legat) dac exist un obiect asociat acestei variabile, sau neinstaniat (liber) dac nu se tie nc ce obiect va desemna variabila. La fixarea unui scop Prolog care conine variabile, acestea sunt neinstaniate iar sistemul ncearc satisfacerea acestui scop cutnd printre faptele din baza de cunotine un fapt care poate identifica cu scopul, printr-o instaniere adecvat a variabilelor din scopul dat. Este vorba de fapt de un proces de unificare a predicatului scop cu unul din predicatele fapte existente n baza de cunotine. La ncercarea de satisfacere a scopului, cutarea se face ntotdeauna pornind de la nceputul bazei de cunotine. Dac se ntlnete un fapt cu un simbol predicativ identic cu cel al scopului, variabilele din scop se instaniaz conform algoritmului de unificare i valorile variabilelor astfel obinute sunt afiate ca rspuns la satisfacerea acestui scop. Exemple: ?- papagal(CineEste). CineEste = coco ?- deplaseaza(Ce, DeUnde, Unde). Ce = cub, DeUnde = camera1, Unde = camera2 ?- deplaseaza(Ce, Aici, Aici). No Cum se comport sistemul Prolog n cazul n care exist mai multe fapte n baza de cunotine care unific cu ntrebarea pus? n acest caz exist mai multe rspunsuri la ntrebare, corespunznd mai multor soluii ale scopului fixat. Prima soluie este dat de prima unificare i exist attea soluii cte unificri diferite exist. La realizarea primei unificri se marcheaz faptul care a unificat i care reprezint prima soluie. La obinerea urmtoarei soluii, cutarea este reluat de la marcaj n jos n baza de cunotine. Obinerea primei soluii este de obicei numit satisfacerea scopului iar obinerea altor soluii, resatisfacerea scopului. La satisfacera unui scop cutarea se face ntotdeauna de la nceputul bazei de cunotine. La resatisfacerea unui scop, cutarea se face ncepnd de la marcajul stabilit de satisfacerea anterioar a acelui scop.

Sistemul Prolog, fiind un sistem interactiv, permite utilizatorului obinerea fie a primului rspuns, fie a tuturor rspunsurilor. n cazul n care, dup afiarea tuturor rspunsurilor, un scop nu mai poate fi resatisfcut, sistemul rspunde no. Exemple: ?- iubeste(mihai, X). X = maria; tastnd caracterul ; i Enter, cerem o nou soluie X = ana; no ?- iubeste(Cine, PeCine). Cine = mihai, PeCine = maria; Cine = mihai, PeCine = ana; no Exist deci dou soluii pentru scopul iubeste(mihai, X) i tot dou soluii pentru scopul iubeste(Cine, PeCine), considernd tot baza de cunotine prezentat n seciunea 1.1.

1.4

Reguli

O regul Prolog exprim un fapt care depinde de alte fapte i este de forma: S :- S1, S2, Sn. Fiecare Si, i = 1,n i S au forma faptelor Prolog, deci sunt predicate, cu argumente constante, variabile sau structuri. Faptul S care definete regula, se numete antet de regul, iar S1, S2, Sn formeaz corpul regulii i reprezint conjuncia de scopuri care trebuie satisfcute pentru ca antetul regulii s fie satisfcut. Fie urmtoarea baz de cunotine Prolog: frumoasa(ana). bun(vlad). cunoaste(vlad, maria). cunoaste(vlad, ana). iubeste(mihai, maria). iubeste(X, Y) :bun(X), cunoaste(X, Y), frumoasa(Y). %1 %2 %3 %4 %5 %6

Se observ c enunul (6) definete o regul Prolog; relaia iubeste(Cine, PeCine), fiind definit att printr-un fapt (5) ct i printr-o regul (6). n condiiile existenei regulilor n baza de cunotine Prolog, satisfacerea unui scop se face printr-un procedeu similar cu cel prezentat n Seciunea 1.2, dar unificarea scopului se ncearc att cu fapte din baza de cunotine, ct i cu antetul regulilor din baz. La unificarea unui scop cu antetul unei reguli, pentru a putea satisface acest scop trebuie satisfcut regula. Aceasta revine la a satisface toate faptele din corpul regulii, deci conjuncia de scopuri. Scopurile din corpul regulii devin subscopuri a cror satisfacere se va ncerca printr-un mecanism similar cu cel al satisfacerii scopului iniial.

Pentru baza de cunotine descris mai sus, satisfacerea scopului ?- iubeste(vlad, ana). se va face n urmtorul mod. Scopul unific cu antetul regulii (6) i duce la instanierea variabilelor din regula (6): X = vlad i Y = ana. Pentru ca acest scop s fie ndeplinit, trebuie ndeplinit regula, deci fiecare subscop din corpul acesteia. Aceasta revine la ndeplinirea scopurilor bun(vlad), care reuete prin unificare cu faptul (2), cunoaste(vlad, ana), care reuete prin unificare cu faptul (4), i a scopului frumoasa(ana), care reuete prin unificare cu faptul (1). n consecin, regula a fost ndeplinit, deci i ntrebarea iniial este adevarat, iar sistemul rspunde yes. Ce se ntmpl dac se pune ntrebarea: ?- iubeste(X, Y). Prima soluie a acestui scop este dat de unificarea cu faptul (5), iar rspunsul este: X = mihai, Y = maria Sistemul Prolog va pune un marcaj n dreptul faptului (5) care a satisfcut scopul. Urmtoarea soluie a scopului iubeste(X, Y) se obine ncepnd cutarea de la acest marcaj n continuare n baza de cunotine. Scopul unific cu antetul regulii (6) i se vor fixa trei noi subscopuri de ndeplinit, bun(X), cunoaste(X, Y) i frumoasa(Y). Scopul bun(X) este satisfcut de faptul (2) i variabila X este instaniat cu valoarea vlad, X = vlad . Se ncearc acum satisfacerea scopului cunoaste(vlad, Y), care este satisfcut de faptul (3) i determin instanierea Y = maria. Se introduce n baza de cunotine un marcaj asociat scopului cunoaste(vlad, Y), care a fost satisfcut de faptul (3). Se ncearc apoi satisfacerea scopului frumoasa(maria). Acesta eueaz. n acest moment sistemul intr ntr-un proces de backtracking n care se ncearc resatisfacerea scopului anterior satisfcut, cunoaste(vlad, Y), n sperana c o noua soluie a acestui scop va putea satisface i scopul curent care a euat, frumoasa(Y). Resatisfacerea scopului cunoaste(vlad, Y) se face pornind cutarea de la marcajul asociat scopului n jos, deci de la faptul (3) n jos. O nou soluie (resatisfacere) a scopului cunoaste(vlad, Y) este dat de faptul (4) care determin instanierea Y = ana. n acest moment se ncearc satisfacerea scopului frumoasa(ana). Cum este vorba de un nou scop, cutarea se face de la nceputul bazei de cunotine i scopul frumoasa(ana) este satisfcut de faptul (1). n consecin a doua soluie a scopului iubeste(X, Y) este obinut i sistemul rspunde: X = vlad, Y = ana urmnd un mecanism de backtracking, descris intuitiv n figura 1 prin prezentarea arborilor de deducie construii de sistemul Prolog. La ncercarea de resatisfacere a scopului iubeste(X, Y), printr-un mecanism similar, se observ c nu mai exist alte solutii. n concluzie, fiind dat baza de fapte i reguli Prolog anterioar, comportarea sistemului Prolog este: ?- iubeste(X, Y). X = mihai, Y = maria; X = vlad, Y = ana; no

iubeste(X,Y) %5 iubeste(mihai,maria) SUCCES solutie 1: X=mihai, Y=maria

iubeste(X,Y)

bun(X) %2 bun(vlad)

cunoaste(X,Y) cunoaste(vlad,Y)

%6 frumoasa(Y) frumoasa(maria) %1 frumoasa(ana) SUCCES

SUCCES %3 cunoaste(vlad,maria) %4 cunoaste(vlad,ana) INSUCCES SUCCES SUCCES

solutie 2: X=vlad, Y=ana


Figura 1. Mecanismul de satisfacere a scopurilor n Prolog Observaii: La satisfacerea unei conjuncii de scopuri n Prolog, se ncearc satisfacerea fiecrui scop pe rnd, de la stnga la dreapta. Prima satisfacere a unui scop determin plasarea unui marcaj n baza de cunotine n dreptul faptului sau regulii care a determinat satisfacerea scopului. Dac un scop nu poate fi satisfcut (eueaz), sistemul Prolog se ntoarce i ncearc resatisfacerea scopului din stnga, pornind cutarea n baza de cunotine de la marcaj n jos. nainte de resatisfacerea unui scop se elimin toate instanierile de variabile determinate de ultima satisfacere a acestuia. Dac cel mai din stnga scop din conjuncia de scopuri nu poate fi satisfcut, ntreaga conjuncie de scopuri eueaz. Aceast comportare a sistemului Prolog n care se ncearc n mod repetat satisfacerea i resatisfacerea scopurilor din conjunciile de scopuri se numete backtracking.

Sintaxa limbajului Prolog

Clasificarea obiectelor din limbajul Prolog este prezentat n figura urmatoare:


structuri obiect obiecte elementare numere reale variabile constante numere ntregi

atomi

Un atom este un identificator care ncepe cu litera mic i se continu cu orice niruire de litere mici, litere mari, cifre sau underscore _ . Dac se dorete ca atomul s nceap cu liter mare sau s conin caractere speciale, atunci atomul se ncadreaz ntre caractere apostrof. Exemple de atomi: dana nil x25 x_25 x_25AB x_ x__y domnul_popescu 'Ivan Bratko' '<<------>>' Un numr ntreg este un ir de cifre zecimale, eventual precedate de un semn. Exemple de numere ntregi: 1 +23 1515 0 -97. Numerele reale depind de implementarea de Prolog. n general ele sunt reprezentate ntr-o form similar celor din limbaje gen Pascal, C, etc. Exemple de numere reale: 3.14 -0.0035 100.2 +12.02 O variabil este un ir de litere, cifre sau underscore ( _ ) care ncepe cu liter mare sau underscore. Exemple de variabile: X Rezultat Obiect1 Lista_de_nume _x23 _23 n Prolog exist situaii n care o variabil apare o singur dat ntr-o regul, caz n care nu avem nevoie de un nume pentru ea, deoarece nu este referit dect ntr-un singur loc. De exemplu, dac dorim s scriem o regul care ne spune dac cineva este fiul cuiva, o soluie ar fi: este_fiu(X) :- parinte(Z,X).

Se observ c s-a denumit cu Z un printe anonim. n acest caz, nu intereseaz cine apare pe post de printe. Pentru a nu ncrca regulile cu nume inutile care pot distrage atenia i ngreuna citirea programelor, se pot considera astfel de variabile c anonime, notate cu underscore _. Deci regula anterioar se poate rescrie astfel: este_fiu(X) :- parinte( _ ,X). Obiectele structurate, numite pe scurt structuri, sunt acele obiecte formate din mai muli constitueni sau componente. Componentele pot fi la rndul lor structuri. Pentru a mixa constituenii ntr-un singur obiect avem nevoie de un functor. De exemplu, dac dorim reprezentarea unui obiect structurat data, el poate fi: data(24,august,1997). n acest caz, componentele sunt: 24, august i 1997, iar liantul este functorul data. Functorul poate fi orice atom. Constituenii pot fi orice obiect Prolog. S vedem un exemplu de obiect compus din alte obiecte compuse. Fie tipul punct(X,Y). Atunci tipul segment poate fi reprezentat ca segment(P1,P2). De exemplu, un segment, avnd capetele n punctele (1, 1) i (2, 3), poate fi reprezentat astfel: segment(punct(1,1),punct(2,3)). Exist i cazuri n care un obiect poate avea constitueni compui de adncime variabil. De exemplu, un arbore binar, cu chei numerice poate fi definit astfel: 1) Nodul vid este un arbore; putem nota acest nod vid prin constanta nil; 2) Un nod frunz este un arbore, de exemplu nod(15,nil,nil); 3) Un nod cu succesor stng i succesor drept este un arbore, de exemplu nod(20,ArbStng,ArbDrept). De exemplu, reprezentarea n Prolog a arborelui
1 2 4 7 5 3 6

este nod(1,nod(2,nod(4,nil,nil),nod(5,nod(7,nil,nil),nil)),nod(3,nil,nod(6,nil,nil))) Aa cum s-a artat n prima parte, un program Prolog este o niruire de fapte (facts) i reguli (rules) care poart denumirea de clauze (clauses). Faptele i regulile au o structur comun ceea ce permite sinteza dinamic de cod care este adugat n baza de cunotine. Un fapt poate fi privit ca o regul care are ca premis (ipotez) scopul true, care este adevrat ntotdeauna. Astfel: fapt. este echivalent cu fapt :- true.

Un program Prolog simplu


place(ellen,tenis). place(john,fotbal). place(tom,baseball). place(eric,not). place(mark,tenis). place(bill,X) :- place(tom,X). % Ce sporturi i plac lui john? ?- place(john,X). X = fotbal % Cui i place tenisul? ?- place(Y,tenis). Y = ellen; Y = mark % Putem pune i ntrebri particulare: ?- place(ellen,tenis). yes ?- place(ellen,fotbal). no ?- place(bill,baseball). yes % lui ellen i place tenisul % lui john i place fotbalul % lui tom place baseball-ul % lui eric i place notul % lui mark i place tenisul % lui bill i place ce i place lui tom

Probleme propuse

1. Se d o baz de fapte de forma: parinte(Parinte,Copil). barbat(Persoana). femeie(Persoana). Se cere: 1) S se introduc cteva fapte de aceast form. 2) S se scrie regulile care definesc urmtoarele relaii de rudenie: tata(Tata,Copil). mama(Mama,Copil). fiu(Parinte,Copil). fiica(Parinte,Copil). bunic(Bunic,Copil). bunica(Bunica,Copil). nepot(Bunic,Copil). nepoata(Bunic,Copil). 3) S se puna urmtoarele ntrebri: Cine este printele lui Dan? Cine este fiu? Cine este bunic?

Cine este si fiu i tat? 2. Fie faptele: figura(triunghi,albastru,3). figura(patrat,rosu,4). figura(romb,albastru,4). figura(paralelogram,verde,4). figura(pentagon,rosu,5). Se cere: 1) Sa se scrie o regula care sa defineasca patrulaterele (de orice culoare). 2) Sa se scrie o regula care sa defineasca figurile geometrice cu cel putin 4 laturi (de orice culoare). 3) Sa se puna urmatoarele intrebari: Ce figuri sunt roii? Ce figuri au 3 laturi? Ce figuri au 4 laturi si sunt verzi? 3. Doi copii pot juca un meci ntr-un turneu de tenis dac au aceeai vrst. Fie urmtorii copii i vrstele lor: copil(peter, 9). copil(paul, 10). copil(chris, 9). copil(susan, 9). Scrieti o regula care sa determine toate perechile de copii care pot juca un meci ntr-un turneu de tenis. 4. Scrieti un program Prolog care s i gseasca Anei un partener la bal. Ea dorete sa mearga cu un brbat care este nefumtor sau vegetarian. Pentru aceasta dispunem de o baz de date cu informaii despre civa brbaii: barbat(gelu). barbat(bogdan). barbat(toma). fumator(toma). fumator(dan). vegetarian(gelu). 5. Fie o baza de date cu drumuri intre orase de forma: drum(bucuresti,ploiesti). drum(bucuresti,cheia). drum(cheia,sinaia). drum(ploiesti,sinaia). drum(ploiesti,brasov). Sa se scrie un predicat care spune daca se poate ajunge de la un oras la altul. 6. Se dau urmtoarele enunuri: 1) Oricine poate citi este literat. 2) Delfinii nu sunt literai. 3) Anumii delfini sunt inteligeni. Sa se conceapa un program logic care sa reprezinte aceste fapte si sa se utilizeze acest program pentru a demonstra urmatorul enunt: "Exista inteligenti care nu pot citi".

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