Sunteți pe pagina 1din 9

Laborator 1 Scopul: Insusirea ideilor fundamentale de programare in Prolog.

PARTEA 1: SUPORT LABORATOR Entitile limbajului PROLOG 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. a) Fapte Faptele sunt predicate de ordinul nti de aritate n considerate adevrate (reprezinta cea mai simpla forma de predicat din Prolog). Ele stabilesc relaii ntre Exemple: Fapt: cine(bobi). place(ion, ioana). place(ion, ana). frumoas(ana). bun(daniel). deplaseaz(cub, camera1, camera2). Aritate: 1 2 2 1 1 3 obiectele universului problemei. Numrul de argumente ale faptelor este dat de aritatea (numrul de argumente) corespunztoare a predicatelor.

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 i regulolor unui program Prolog formeaz baza de cunotine Prolog.
-1-

b) 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. Scopurile sunt predicate pentru care se dorete aflarea valorii de adevr n contextul faptelor existente n baza de cunotine.Rezultatul unui program Prolog este rspunsul la o ntrebare (sau la o conjuncie de ntrebri). Acest rspuns poate fi afirmativ, yes, sau negativ, no. Un program 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: ?- place(ion, ioana). Yes No n % deoarece acest fapt exist n baza de cunotine % deoarece acest fapt nu exist n baza de cunotine exemplele prezentate pn acum, argumentele faptelor i ntrebrilor au fost obiecte ?- papagal(ion).

particulare, numite i constante sau atomi simbolici. Predicatele Prolog, ca orice predicate n logica cu predicate de ordinul I, admit ca argumente i obiecte enerice numite variabile. n Prolog, prin convenie, numele argumentelor variabile ncepe cu liter mare 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 se 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 satisfacerea acestui scop. identic cu cel al scopului, variabilele din scop se instaniaz conform algoritmului de unificare i valorile variabilelor astfel obinute sunt afiate ca rspuns la

-1-

Exemple: ?- caine(CineEste). CineEste = bobi ?- deplaseaza(Ce, DeUnde, Unde). Ce = cub, DeUnde = camera1, Unde = camera2 ?- deplaseaza(Ce, Aici, Aici). no n cazul n care exist mai multe fapte n baza de cunotine care unific cu ntrebarea pus, deci exist mai multe rspunsuri la ntrebare, corespunznd mai multor soluii ale scopului fixat, limbajul Prolog procedeaz astfel. 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: ?- place(ion, X). X = ioana; X = ana; no c) 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 satisfcut.
-2-

formeaz

corpul regulii i reprezint conjuncia de scopuri care trebuie satisfcute pentru ca antetul regulii s fie

Fie urmtoarea baz de cunotine Prolog: Ana este frumoas. Ion este bun. Ion o cunoate pe Ana. Mihai o place pe Maria. frumoasa(ana). bun(ion). cunoaste(ion, ana). place(mihai, maria). % Ipoteza 1 % Ipoteza 2 % Ipoteza 3 % Ipoteza 4 % Ipoteza 5

Ion o cunoate pe Maria. cunoaste(ion, maria).

Dac dou persoane X i Y se cunosc i persoana X este bun i persoana Y este frumoas, atunci cele dou persoane, X i Y, se plac. place(X, Y) :- bun(X), cunoaste(X, Y), frumoasa(Y). % Ipoteza 6

Enunul de la iptoteza 6 definete o regul Prolog. Relaia place(Cine, PeCine), este definit att printr-un fapt (Ipoteza 5) ct i printr-o regul (Ipoteza 6). n condiiile existenei regulilor n baza de cunotine Prolog, satisfacerea unui scop se face printr-un procedeu similar cu cel prezentat n seciunea b), 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 ?- place(ion, ana). se va astfel: scopul unific cu antetul regulii (6) i duce la instanierea variabilelor din regula (6): X = ion 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(ion), care reuete prin unificare cu faptul (2), cunoaste(ion, 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. Mai departe s vedem ce se ntmpl dac se pune ntrebarea: ?- place(X, Y). Prima soluie a acestui scop este dat de unificarea cu faptul (5), iar rspunsul este: X = mihai, Y = maria
-3-

Sistemul Prolog va pune un marcaj n dreptul faptului (5) care a satisfcut scopul. Urmtoarea soluie a scopului place(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 ion, X=ion. Se ncearc acum satisfacerea scopului cunoaste(ion, Y), care este satisfcut de faptul (3) i determin instanierea Y = maria. Se introduce n baza de cunotine un marcaj asociat scopului cunoaste(ion, 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(ion, Y), n sperana c o noua soluie a acestui scop va putea satisface i scopul curent care a euat, frumoasa(Y). Resatisfacerea scopului cunoaste(ion, 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(ion, 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 place(X, Y) este obinut i sistemul rspunde: X = ion, 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 place(X, Y), printr-un mecanism similar, se observ c nu mai exist alte solutii. n concluzie, fiind dat baza de cunotine Prolog anterioar, rspunsul sistemului Prolog la ntrebarea place(X, Y) este: ?- place(X, Y). X = mihai, Y = maria; X = ion, Y = ana; No 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
-4-

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 conjuciile de scopuri se numete backtracking.

Figura 1. Algoritmul de satisfacere a scopurilor n Prolog. n general, o regul are urmtoarea sintax: nume_rel(arg1, , argN) :- nume_rel_1(), , nume_rel_M(). Exemplu: putem defini predicatul so astfel Barbat este sot dac este barbat i este casatorit cu o femeie (Femeie). Aceast definiie va fi codificat prin urmtoarea regul. sot(Barbat, Femeie):barbat(Barbat), cuplu_casatorit(Barbat, Femeie). Similar,
-5-

sotie(Femeie, Barbat):femeie(Femeie), cuplu_casatorit(Barbat, Femeie). Operatorul :- are semnificaia dac. Partea sin stnga operatorului :- este numit capul regulii (head), iar cea din dreapta corpul regulii (body). Observaii: Un fapt poate fi vzut ca o regul fr corp (fr condiie). Regulile i faptele care definesc aceeai relaie (au acelai nume de relaie n cap) trebuie grupate n sursa programului. n Prolog, relaiile sunt numite de obicei predicate. Dup adugarea celor dou reguli, se poate de ntrodus interogarea: ?- sot(Barbat,Femeie), writeln(Barbat),fail. Ca rezultat va aparea un rspuns n care se vor conine toate numele de barbai din baza de cunotine (de exemplu: ion, andrei, gheorghe, gabriel, mihai.) Pentru a putea urmri modul n care este rezolvat interogarea poate fi utiliyat comanda trace. Pe ecran vor apare diferite subscopuri care trebuie rezolvate de programul Prolog pentru a obine rspunsul al interogare. Urmtoarea regul definete dac o persoan este printele unui copil. parinte(Parinte,Copil):-tata(Parinte,Copil); mama(Parinte,Copil). n aceast regul, punctul i virgula (;) desemneaz operatorul logic SAU. Mai departe putem utiliza regula parinte pentru a crea o nou regul ce testeaz dac o persoan este copilul unei persoane date.

Figura 2. Graful pentru relaiile bunic, nepot utiliznd relaii deja definite
-6-

copil(Copil,Parinte):-parinte(Parinte,Copil). Pn acum am definit reguli focalizate pe relaii directe dintre persoanele ce alctuiesc baza de cunotine. n continuare vom defini dou reguli care prezint relaii indirecte ntre persoanele din baza de cunotine. Vom defini regula bunic i regula nepot utiliznd relaiile prezentate n figura 2. Pentru a afla bunicul Z unei persoane X procedm astfel: Cine este printele lui X? (presupunem c este Y). Cine este printele lui Y? (presupunem c este Z). Deci, Z va fi bunicul lui X.

Relaia sora de exemplu poate fi descris cu algoritmul urmtor: Pentru orice X i Y, X este sora lui Y dac (1) X i Y au acelai printe, i (2) X este femeie. O posibil implementare n Prolog a algoritmului prezentat mai sus este urmtoarea: sora(X,Y):-parinte(Z,X), parinte(Z,Y), femeie(X), X <>Y. Menionm faptul c modalitatea n care X i Y au acelai printe a fost prezentat anterior. n Prolog, operatorul <> are sensul de diferit.

Desfaurarea lucrrii:
1. Se va citi breviarul teoretic. Se atrage atenia asupra faptului c toate cunotinele din aceast lucrare vor fi necesare i n derularea celorlalte lucrri. 2. Se vor studia exemplele propuse , ncercnd gsirea altor posibiliti de soluinare a acestora. Utilizai i alte scopuri (interogri) pentru a testa definiiile predicatelor introduse 3. Se va elabora un arbore genealogic i o baz de cunotie Prolog care descrie relaiile existente n familiea proprie D-sr i o s permite cercetarea acestor relaii prin utilizarea acopurilor externe. Arbore genealogic elaborat trebuie s conin cel puin trei nivele. Pentru cercetarea relaiilor existente n familie sa fie utilizate nu mai puin de ase scopuri. 4. Se va prezenta darea de seam .
-7-

Bibliografie
Carti A. Florea, A. Boangiu. Elemente de Ineligena Artificial. A. Florea. Bazele logice ale Inteligentei Artificiale. Cap. 4, 6. A. Florea, B. Dorohonceanu, C. Francu. Programare in Prolog. Articole on-line "Computing Machinery and Intelligence", Turing, A.M. Mind, 59, 1950, 433-460. "AI's Greatest Trends and Controversies", IEEE Intelligent Systems January/February 2000. "A Framework for Representing Knowledge", Marvin Minsky, MIT-AI Laboratory Memo 306, June, 1974.

-8-

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