Sunteți pe pagina 1din 12

IA

Laborator 3


Scopul: Definirea ideilor de unificare, backtracking si recursivitate in Prolog. Controlul backtracking-
ului: predicatele cut si fail. Negatia in Prolog.

PARTEA 1: SUPORT LABORATOR

Procesul de unificare const n asocierea (matching) unei ntrebri (goal) cu o anumit clauz, cu
scopul de a gsi o solutie la ntrebare. Dar pentru un set de clauze date si pentru o singur ntrebare pot
exista mai multe clauze care se pot asocia respectivei ntrebri; deci se pot gsi mai multe solutii pentru
aceeasi ntrebare. Cutarea solutiilor alternative este posibil datorit procesului de backtracking.

1. Unificarea

Unificarea se defineste ca fiind procesul de asociere ntre o ntrebare si o clauz.

Asocierea (matching)
Termenul de asociere se poate folosi cu diverse semnificatii, de exemplu :
asocierea unei ntrebri cu o clauz
asocierea unei variabile cu o constant
asocierea a dou variabile, etc.

n general, exist 4 cazuri distincte de asociere, considernd nivelul cel mai de jos al acestui proces:

(1) Structurile identice se asociaz evident ntre ele.

Astfel, avnd o clauz (un fapt) de forma :
printe(mircea, ioana). (f)
si o ntrebare :
printe(mircea, ioana) (g)
evident structurile clauzei si a ntrebrii sunt identice.
n consecint, se asociaz :
- predicatul din ntrebarea (g) cu predicatul din clauza (f) -axioma
- primul argument din ntrebarea (g) cu primul argument din clauza (f)
- al doilea argument din ntrebarea (g) cu al doilea argument din clauza (f)
Ca urmare, se poate spune c ntrebarea (g) se asociaz cu clauza (f), mai exact (g) se unific cu (f).
IA 2010 Laborator 3
2


(2) O asociere se poate face si cnd apar una sau mai multe variabile libere.

Fie clauza (fapt) :
printe (mircea, ioana). (f)
si ntrebarea :
printe(mircea, X). (g)
care se traduce prin : ''Al cui printe este Mircea?''
n cadrul procesului de asociere (matching) dintre (g) si (f), are loc :
- asocierea ntre predicatele ntrebrii (g) si a clauzei (f)
- asocierea ntre primul argument din ntrebare si clauza (f)
- asocierea ntre variabila X din ntrebare si argumentul ''ioana'' din clauz; aceasta este posibil
doar dac variabila X este liber, iar n urma procesului de asociere, variabila X se leag de
valoarea ''ioana''.

Nota: Dac n momentul n care se ncearc asocierea, variabila X ar fi ''legat'', asocierea reuseste
doar dac X ar fi legat de valoarea ''ioana''. Aceast situatie este de fapt o variant a cazului (1).
Variabilele rmn ''legate'' pn n momentul obtinerii unei solutii pentru acea instantiere a lor, dup
care devin ''libere'' si, dac este cazul, se caut alte solutii. Astfel, singura posibilitate ca o variabil
dintr-o ntrebare s fie ''legat'' n momentul ncercrii unei asocieri este ca ntrebarea s fie compus,
s implice mai multi pasi; variabila poate deveni ''legat'' ntr-un pas anterior.

Exemplu:
printe(mircea, X) and printe(X, anca).
adic : ''Gseste pe cineva care este copilul lui Mircea si este printele Ancai.''
ntrebarea este compus de fapt din dou sub-ntrebri, si ntotdeauna cnd se ajunge la a doua
subntrebare, variabila X este ''legat'' de o valoare. Prima sub-ntrebare se asociaz conform cazului
(2), a doua subntrebare conform cazului (1).

(3) Dou variabile libere se asociaz ntre ele.
Fie clauzele :
tata (mircea, ioana). (f)
printe(mircea, X) :- tata(mircea, X). (r)
si ntrebarea :
printe (mircea, Y) (g)

Procesul de obtinere a solutiilor la ntrebarea dat este urmtorul:

(3.1.) Se unific ntrebarea (g) cu capul regulii (r) astfel :
- se asociaz predicatele ''printe'' pentru (g) si (r)
- se asociaz primul argument (care are valoarea ''mircea'') din (g) cu cel din (r).
- se asociaz variabila liber Y din (g) cu variabila liber X din (r); ca urmare cele dou
IA 2010 Laborator 3
3

variabile se leag ntre ele, procesul decurge n continuare tratandu-le ca o singur variabil.

Cnd una dintre ele se leag de o valoare, automat si cealalt se leag de aceeasi valoare.
Cnd se face o asemenea asociere, variabilele devin ''variabile libere comune'' (free sharing variables).

(3.2.) Dup realizarea unificrii ntre ntrebarea (g) si capul regulii (r), noua ntrebare pentru care se
caut una sau mai multe solutii este :
tata(mircea, X) (g1)
obtinut din corpul regulii (r).

(3.3.) Noua ntrebare (g1) se unific cu clauza (f), moment n care, conform cazului (3.2.), variabila X
devine ''legat'' de valoarea ''ioana''. Variabila X fiind comun cu variabila Y, rezult c si Y se leag de
aceeasi valoare ''ioana''.

(4) O variabil anonim (''_'') se asociaz ntotdeauna cu orice.

Fie clauzele :
tata (mircea, ioana). (f1)
tata (sandu, ana). (f2)
si ntrebarea :
tata (X, _) (g)
tradus astfel : ''Cine este tat ?'', fr a se cere si cine este copilul.

(4.1.) n primul rnd se ncearc unificarea ntrebrii (g) cu clauza (f1):
- se asociaz predicatele ''tata'' pentru (g) si (a1).
- se asociaz variabila liber X din (g) cu valoarea ''mircea'' din (a1); variabila X devine
''legat'' de valoarea ''mircea''
- variabila anonim din (g) se asociaz cu orice ar fi pe pozitia argumentului doi din (a1).
(4.2.) Se returneaz o solutie X = mircea.
(4.3.) Se revine la clauza (f2), unde ntrebarea (g) ncearc o nou unificare; n prealabil variabila X a
devenit ''liber''. De data aceasta X se ''leag'' de valoarea ''sanda'' , iar variabila anonim din (g) se
asociaz cu argumentul ''ana'' din (f2).
(4.4.) Se returneaz a doua solutie X = sandu.

Nota: In cadrul procesului de unificare a 2 termeni se mai foloseste termenul de ''instantiere'' n loc de
''legare'' a unei variabile de o valoare. Astfel, n exemplul de mai sus se poate spune c variabila X se
instantiaz cu valoarea ''mircea'', apoi cu valoarea ''sandu''.

2. Backtracking

Este o metod folosit de Visual Prolog pentru obtinerea unei solutii (eventual mai multe solutii) pentru
o anumit problem. Din momentul n care sistemul Visual Prolog ncepe cutarea unei solutii pentru o
IA 2010 Laborator 3
4

ntrebare dat, se poate ajunge n situatia de a decide ntre dou sau mai multe posibile ci pe care s se
continue cutarea; n acest caz se fixeaz un indicator pentru acest punct de ramificare (punct de
backtracking) si se selecteaz prima cale pentru cutare. Dac se termin cutarea pe aceast variant,
se revine la ''punctul de backtracking'' si se reia cutarea unei solutii pe urmtoarea cale disponibil.

n continuare, se va folosi si notiunea de sub-ntrebare (sub-scop) pentru a exprima mai exact faptul c
o ntrebare (scop) poate fi compus din mai multe sub-ntrebri.

Cele patru principii de baz ale procesului de backtracking sunt:

(1) Sub-ntrebrile trebuie s fie satisfcute (rezolvate) n ordinea n care apar.
(2) Clauzele sunt testate n ordinea n care apar n program (de la nceputul la sfrsitul
programului).
(3) Cnd o sub-ntrebare se unific cu capul unei reguli, corpul acelei reguli este cel care urmeaz
s fie satisfcut (rezolvat). Deci corpul regulii constituie un nou set de sub-ntrebri (sub-scopuri)
ce trebuie rezolvate.
(4) O ntrebare (scop) este satisfcut cnd se gseste cte o axiom pentru procesul de unificare
cu fiecare sub-ntrebare pozitionat la extremittile arborelui de sub-ntrebri.


Algoritmul de cutare a solutiilor

Astfel, pentru a rezolva o sub-ntrebare oarecare, sistemul Visual Prolog ncepe cutarea cu prima
clauz din setul de clauze care definesc predicatul ce apare n sub-ntrebare. Pot exista dou situatii
distincte :

(1) S se realizeze o unificare ntre sub-ntrebare si una din clauze, caz n care :
(a) - dac mai exist o alt clauz care ar putea s se unifice cu aceeasi sub-ntrebare, sistemul
PROLOG fixeaz un pointer (indicator, punct de backtracking) la urmtoarea clauz, dup cea
pentru care s-a reusit unificarea.
(b) - toate variabilele ''libere'' din sub-ntrebare, care se asociaz cu valori din clauz devin
variabile ''legate'' de valorile corespunztoare.
(c) - dac clauza cu care s-a reusit unificarea sub-ntrebrii este capul unei reguli, urmeaz
evaluarea corpului acelei reguli. Termenii ce formeaz corpul devin sub-ntrebri care trebuie
satisfcute n ordinea n care apar, pentru a putea spune c apelul la acea clauz a reusit.

(2) S nu se gseasc nici o clauz care s se unifice cu sub-ntrebarea dat.
Sistemul PROLOG revine la ultimul pointer de backtracking, elibereaz de valori toate variabilele care
au fost ''legate'' dup momentul pozitionrii acelui indicator de backtracking, apoi ncearc s
resatisfac subntrebarea ce era activ n acel punct.


IA 2010 Laborator 3
5

Exemplu:

PREDICATES
nondeterm place(symbol,symbol)
gust(symbol,symbol)
nondeterm mancare(symbol)
CLAUSES
place(paul,X):-mancare(X),gust(X,bun).
gust(pizza,bun).
gust(mere_verzi,rau).
mancare(mere_verzi).
mancare(pizza).

Pentru a explicita mai bine ceea ce nseamn tehnica backtracking se va testa acest program cu
urmtorul goal:
place(paul, Ce).

Cnd Visual Prolog ncepe satisfacerea unui obiectiv, ncepe cutarea unei posibile unificri ncepnd
de la nceputul programului.

O prim potrivire se va gsi cu prima clauz din program i varibila Ce se va unifica cu variabila
X. Aceast potrivire cu antetul regulii va determina ca Prolog s ncerce s satisfac i corpul regulii.
Pentru aceasta va fi apelat primul subobiectiv al acestei reguli i anume: mancare(X).

Cnd se face un apel, de asemenea Prolog va ncepe cutarea de la nceput spre sfrit.

Prin ncercarea satisfacerii primului obiectiv, Visual Prolog va ncepe de sus n jos ncercnd o
potrivire cu fiecare fapt sau antet al unei reguli. Se va lega astfel variabila liber X cu mere_verzi.
Deoarece mai exist i alte fapte n continuare i se mai pot gsi i alte soluii, Prolog va pune un punct
de ntrerupere (backtrack point) chiar aici, dup faptul mancare(mere_verzi). Acest punct va reine
poziia n care se va ntoarce Prolog pentru a cuta alte soluii dac mai sunt.

Dac un apel a gsit o potrivire, el se va ncheia cu success, i se va ncerca n continuare
satisfacerea urmtorului subobiectiv.

n cazul de fa urmtorul subobiectiv va fi
gust(mere_verzi,bun)
Nu se va gsi n program nici un fapt care s conduc la satisfacerea acestui subobiectiv, deci,
prolog automat va reveni la punctual de ntrerupere lsat prin mecanismul backtracking. n cazul de
fa, punctual de ntrerupere a fost pus la faptul mancare(mere_verzi)

Odat ce o variabil a fost legat, ntr-un program Prolog, singura modalitate de a deveni liber
este prin backtracking.

IA 2010 Laborator 3
6

La revenire la un punct de ntrerupere, prolog va elibera toate variabilele legate dup acest punct
i va cuta o alt soluie pentru apelul iniial. Acest apel, n cazul de fa a fost mancare(X), aa c
variabila X din acest moment nu va mai fi legat cu mere_verzi, ea devenind o variabil liber. Se va
gsi n continuare o nou potrivire i variabila X va fi legat cu pizza.

n continuare, prolog va ncerca din nou satisfacerea urmtorului obiectiv din apelul iniial, cu
noua variabil legat X. Acest nou subobiectiv este n cazul de fa gust(pizza, bun), pentru satisfacerea
cruia din nou va ncepe cutarea de la nceput. De data aceasta se va gsi o potrivire i obiectivul se va
ncheia cu success. Deoarece variabila Ce din obiectivul iniial este unificat cu variabila X din regula
place, i variabila X este legat cu valoarea pizza, i variabila Ce va fi legat cu valoarea pizza i Prolog
va afia soluia

Ce=pizza
1 Solution


3. Controlul procesului de backtracking: cut si fail

Dup cum am artat mai nainte pentru satisfacerea scopului n PROLOG se utilizeaz tehnica
backtracking. Procesul de resatisfacere prin backtracking poate fi oprit de programator cu ajutorul
predicatului cut, simbolizat prin caracterul !. Cut este un predicat fr argumente. n poziia n care
apare interzice revenirea, blocnd astfel cutarea de noi soluii. Semnul ! aezat ntre clauzele pi i
pi+1 ale scopului blocheaz resatisfacerea clauzei pi. Un efect asemntor se obine utiliznd tietura
(semnul !) n corpul unei reguli, deoarece pentru satisfacerea corpului unei reguli PROLOG
utilizeaz backtracking.

Fie urmatoarele clauze:.
(1) debitor(popescu, ionescu).
(2) debitor(georgescu, ionescu).
(3) creditor(cristescu, popescu).
(4) creditor(vasilescu, ionescu).
(5) are_obligatii(X, Y) :- debitor(Y, X).
(6) are_obligatii(X, Y) :- creditor(X, Y).

S presupunem c scopul programului este are_obligatii(X, Y). Reprezentm arborele de cutare
corespunztor scopului are_obligatii(X, Y). Sgeile indic modul n care se avanseaz i respectiv, se
revine la puncte deja explorate, n cutarea tuturor soluiilor posibile.

IA 2010 Laborator 3
7



Rspunsul la interogare este:
X = ionescu, Y = popescu
X = ionescu, Y = georgescu
X =cristescu, Y = popescu
X = vasilescu , Y = ionescu
4 Solutions

Modificm cele dou reguli anterioare, introducnd tietura
(5) are_obligatii(X, Y) :- debitor(Y, X), !.
(6) are_obligatii(X, Y) :- creditor(X, Y), !.

i analizm efectul su asupra modului n care se va parcurge arborele de cutare.


Dup parcurgerea nodurilor 1 i 3, se ntlnete tietura care blocheaz revenirea. Rezultatul
IA 2010 Laborator 3
8

obinut este
X = ionescu, Y = popescu
1 Solution

Un scop eueaz n Prolog dac toate ncercrile posibile de a-l satisface prin revenire pe urme
(backtracking) eueaz. Euarea poate fi exprimat n PROLOG printr-un predicat predefinit, care are
valoarea de adevr fals, i anume predicatul fail. Predicatul fail este utilizat pentru forarea revenirii
pe urme. Urmtoarele exemple vor pune n eviden forarea backtrackingului cu ajutorul acestui
predicat. Pentru a nelege exemplele este necesar s precizm semnificaia predicatelor nl i write.
Predicatul write este un predicat predefinit a crui valoare logic este adevrat i care nu se
resatisface niciodat. Clauza write(X) determin afiarea pe ecran a valorii legate de variabila X.
Predicatul nl este un predicat predefinit care determin trecerea la linie nou.

/* Program 1 */
domains
nume = symbol
predicates
client(nume)
afis_clienti
clauses
client(popescu).
client(ionescu).
client(vasilecu).
afis_clienti : - client(X), write(X), nl.

/* Program 2 */
domains
nume = symbol
predicates
client(nume)
afis_clienti
clauses
client(popescu).
client(ionescu).
client(vasilecu).
afis_clienti : - client(X), write(X), nl, fail.

La interogarea: afis_clienti, primul program va rspunde
popescu
Yes
n timp ce al doilea program va rspunde
popescu
IA 2010 Laborator 3
9

ionescu
vasilescu
No

n primul program, pentru scopului afis_clienti se leag variabila X la primul obiect care satisface
clauza client(X), dup care se afieaz pe ecran obiectul respectiv (popescu). Deoarece predicatul write
nu se resatisface nu se mai ncearc nici resatisfacerea scopului. Utilizarea, n cel de-al doilea program
al predicatului fail n corpul clauzei determin dezlegarea variabilei X i legarea ei la urmtorul obiect
care face clauza client(X) adevrat. Mesajul no de la sfrit este determinat de faptul c scopul
eueaz. Putem evita obinerea acestui mesaj modificnd programul n felul urmtor:

/* Program 3 */
domains
nume = symbol
predicates
client(nume)
afis_clienti
clauses
client(popescu).
client(ionescu).
client(vasilecu).
afis_clienti : - client(X), write(X), nl, fail.
afis_clenti.

Rspunsul la aceeai interogare este:
popescu
ionescu
vasilescu
Yes

4. Negatia in Prolog

Cu ajutorul predicatului fail se poate programa n PROLOG negaia. S presupunem c vrem s
exprimm urmtoarea regul: Dac cererea pentru un produs crete i producia nu crete, atunci
preul produsului crete. Aceasta se poate realiza cu programul urmtor:

domains
produs=symbol
predicates
creste_cerere(produs)
creste_productie(produs)
np(produs)
IA 2010 Laborator 3
10

creste_pret(produs)
clauses
creste_cerere(mat_de_constructie).
creste_cerere(confectii).
creste_productie(confectii).
np(X):- creste_productie(X),!,fail. /*1*/
np(_). /*2*/
creste_pret(X):-creste_cerere(X),np(X).

Predicatul np(X) definit n acest program este satisfcut dac i numai dac preul produsului X nu
crete. Folosim tietura , !, pentru a evita activarea clauzei notate cu 2. Dac pentru un anumit produs
producia crete, tietura va mpiedica PROLOG s revin pe urme la regula 2, iar predicatul fail va
duce la euarea capului regulii 1, deci va rezulta c pentru acel produs anume preul nu crete. S
considerm un produs pentru care se menioneaz n baza de fapte c cererea crete. Dac pentru acel
produs nu se menioneaz n baza de fapte c producia crete, atunci regula 1 va eua, iar PROLOG va
reveni pe urme, activnd regula 2, al crui cap va fi satisfcut.

Iat i rspunsurile la cteva interogri:
creste_pret(confectii)
No

creste_pret(mat_de_constructii)
Yes

creste_pret(X)
X = mat_de_constructii
1 Solution

O ncercare diferit de exprima negaia n Prolog o constituie predicatul special not. Negaia
predicatului p(arg1, arg2,, argn) se exprim prin not(p(arg1, arg2,, argn)). Predicatul not(p(arg1,
arg2,, argn)) are valoarea logic adevrat dac predicatul p(arg1, arg2,, argn) nu se poate
satisface. n caz contrar, are valoarea fals. Rescriem programul de mai sus folosind predicatul not.

domains
produs=symbol
predicates
creste_cerere(produs)
creste_productie(produs)
creste_pret(produs)
clauses
creste_cerere(mat_de_constructie).
creste_cerere(confectii).
creste_productie(confectii).
IA 2010 Laborator 3
11

creste_pret(X):-creste_cerere(X), not(creste_productie(X)).

S considerm un alt exemplu i s analizm rspunsurile sistemului PROLOG:
predicates
patrat_perfect(integer)
clauses
patrat_perfect(4).
patrat_perfect(25).

Goal: patrat_perfect(16)
No

Goal: not(patrat_perfect(9))
Yes

Rspunsul no la prima interogare nu trebuie interpretat ca 16 nu este ptrat perfect. Ceea ce
se nelege de fapt prin rspunsul no este c, dup ce s-au verificat toate clauzele acestui program,
sistemul PROLOG nu poate considera 16 ptrat perfect. Rspunsul la a doua interogare este yes
deoarece clauza patrat_perfect(9) eueaz neputnd fi dedus din cauzele programului. Acest
mecanism de gndire al sistemului PROLOG se bazeaz pe ipoteza lumii nchise (Closed World
Assumption) : Dac o afirmaie A nu este exprimat nici direct, nici indirect ntr-un program P, ceea
ce nseamn c ea nu este nici fapt i nici concluzie bazat pe datele unui program P, atunci acceptm
c este valabil negaia sa.

PARTEA a-II-a: EXERCITII

1. Exprimati in Prolog urmatoarele fapte:
a) susan are un cal;
b) rex mnnc carne;
c) aurul este preios;
d) maina este un mercedes albastru cu capacitatea de cinci cltori

2. Traduceti n limbaj natural urmtoarea ntrebare Visual Prolog si precizati rspunsul posibil:
printe(vali, X), printe(X, Y), printe(Y, roco).

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).
Definiti un predicat din care rezulta toate perechile de copii care pot juca un meci ntr-un turneu de
tenis.
IA 2010 Laborator 3
12

4. Scrieti un program 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).
4. Se dau urmtoarele enunuri:
1) Oricine poate citi este literat.
2) Delfinii nu sunt literai.
3) Anumii delfini sunt inteligeni.
S se demonstreze n Prolog c: Exist fiine inteligente care nu pot citi.

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