Sunteți pe pagina 1din 9

Laborator 1

Scopul: nsuirea ideilor fundamentale de programare n 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 (reprezint cea mai simpl form de
predicat din Prolog). Ele stabilesc relaii ntre obiectele universului problemei. Numrul de argumente ale
faptelor este dat de aritatea (numrul de argumente) corespunztoare a predicatelor.
Exemple:

Fapt: Aritate:
cine(bobic). 1
place(ion, ioana). 2
place(ion, ana). 2
frumoas(ana). 1
bun(daniel). 1
deplaseaz(cub, camera1, camera2). 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 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 % deoarece acest fapt exist n baza de cunotine
?- papagal(ion).
No % deoarece acest fapt nu exist n baza de cunotine

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 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 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.

1
Exemple:
?- caine(CineEste).
CineEste = bobic
?- 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 formeaz corpul
regulii i reprezint conjuncia de scopuri care trebuie satisfcute pentru ca antetul regulii s fie satisfcut.

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

3
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 cel mai din
stnga scop din conjuncia de scopuri nu poate fi satisfcut, ntreaga conjuncie de scopuri eueaz.

4
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,
sotie(Femeie, Barbat):-
femeie(Femeie), cuplu_casatorit(Barbat, Femeie).
5
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

copil(Copil,Parinte):-parinte(Parinte,Copil).

6
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 soluionare 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 familia
proprie D-str 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.

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