Sunteți pe pagina 1din 11

Laborator 3

Unificare i Backtracking
Procesul de unificare const n asocierea (matching) unei ntrebri (goal) cu o anumit
clauz, cu scopul de a gsi o soluie la ntrebare. Dar pentru un set de clauze date i pentru o
singur ntrebare pot exista mai multe clauze care se pot asocia respectivei ntrebri; deci se pot
gsi mai multe soluii pentru aceeai ntrebare. Cutarea soluiilor alternative este posibil
datorit procesului de backtracking.
1. Unificarea
Unificarea se definete ca fiind procesul de asociere ntre o ntrebare i o clauz.
1.1. Asocierea (matching)
Termenul de asociere se poate folosi cu diverse semnificaii, de exemplu : asocierea unei
ntrebri cu o clauz, asocierea unei variabile cu o constant, asocierea a dou variabile, etc. n
general, exist trei 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 (axioma) de forma :
printe(mircea, ioana).
(f)
i o ntrebare :
goal : printe(mircea, ioana) (g)
evident structurile clauzei i a ntrebrii sunt identice.
n consecin, 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).
(2) O asociere se poate face i cnd apar una sau mai multe variabile libere.
--Fie clauza (axioma) :
printe (mircea, ioana).
(a)
i ntrebarea :
goal : printe(mircea, X).
(g)
care se traduce prin : ''Al cui printe este Mircea?''
n cadrul procesului de asociere (matching) dintre (g) i (a), are loc :
-- asocierea ntre predicatele ntrebrii (g) i a clauzei (a)
-- asocierea ntre primul argument din ntrebare i clauza (a)
-- asocierea ntre variabila X din ntrebare i 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''.
Obs : Dac n momentul n care se ncearc asocierea, variabila X ar fi ''legat'', asocierea
reuete doar dac X ar fi legat de valoarea ''ioana''. Aceast situaie este de fapt o variant a
cazului (1).
Variabilele rmn ''legate'' pn n momentul obinerii unei soluii pentru acea instaniere

a lor, dup care devin ''libere'' i, dac este cazul, se caut alte soluii.
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 muli pai; variabila
poate deveni ''legat'' ntr-un pas anterior.
Exemplu :
Goal : printe(mircea, X) and printe(X, anca).
adic : ''Gsete pe cineva care este copilul lui Mircea i este printele lui Anca.''
ntrebarea este compus de fapt din dou sub-ntrebri, i ntotdeauna cnd se ajunge la a
doua sub-ntrebare, variabila X este ''legat'' de o valoare. Prima sub-ntrebare se asociaz
conform cazului (2), a doua sub-ntrebare conform cazului (1).
(3) Dou variabile libere se asociaz ntre ele.
--Fie clauzele :
tata (mircea, ioana).
printe(mircea, X) if tata(mircea, X).
i ntrebarea :
Goal : printe (mircea, Y)
(g)

(a)
(r)

Procesul de obinere a soluiilor la ntrebarea dat este urmtorul:


(3.1.) Se unific ntrebarea (g) cu capul regulii (r) astfel :
-- se asociaz predicatele ''printe'' pentru (g) i (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 variabile se leag ntre ele, procesul decurge n continuare tratndu-le ca o singur variabil.
Cnd una dintre ele se leag de o valoare, automat i cealalt se leag de aceeai valoare.
Cnd se face o asemenea asociere, variabilele devin ''variabile libere comune'' (free
sharing variables).
(3.2.) Dup realizarea unificrii ntre ntrebarea (g) i capul regulii (r), noua ntrebare pentru care
se caut una sau mai multe soluii este :
tata(mircea, X)
(g1)
obinut din corpul regulii (r).
(3.3.) Noua ntrebare (g1) se unific cu clauza (a), moment n care, conform cazului (3.2.),
variabila X devine ''legat'' de valoarea ''ioana''. Variabila X fiind comun cu variabila Y, rezult
c i Y se leag de aceeai valoare ''ioana''.
(4) O variabil anonim (''_'') se asociaz ntotdeauna cu orice.
-- Fie clauzele :
tata (mircea, ioana).
(a1)
tata (sandu, ana).
(a2)
i ntrebarea :
Goal : tata (X, _)
(g)
tradus astfel : ''Cine este tat ?'', fr a se cere i cine este copilul.
(4.1.) n primul rnd se ncearc unificarea ntrebrii (g) cu clauza (a1):
-- se asociaz predicatele ''tata'' pentru (g) i (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 poziia argumentului doi din
(a1).
(4.2.) Se returneaz o soluie X = mircea.
(4.3.) Se revine la clauza (a2), 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 (a2).
(4.4.) Se returneaz a doua soluie X = sanda.
Obs. : - n cadrul procesului de unificare a 2 termeni se mai folosete termenul de
''instaniere'' n loc de ''legare'' a unei variabile de o valoare; astfel, n exemplul de mai sus se
poate spune c variabila X se instaniaz cu valoarea ''mircea'', apoi cu valoarea ''sandu''.
2. Backtracking
Este o metod folosit de VISUAL PROLOG pentru obinerea unei soluii (eventual mai
multe soluii) pentru o anumit problem.
Din momentul n care sistemul VISUAL PROLOG ncepe cutarea unei soluii pentru o
ntrebare dat, se poate ajunge n situaia 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) i se selecteaz prima cale pentru cutare. Dac se termin cutarea pe
aceast variant, se revine la ''punctul de backtracking'' i se reia cutarea unei soluii pe
urmtoarea cale disponibil.
n continuare, se va folosi i noiunea de sub-ntrebare (sub-scop); aceasta 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 sfritul
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 gsete cte o axiom pentru procesul de
unificare cu fiecare sub-ntrebare poziionat la extremitile arborelui de sub-ntrebri.
Algoritmul de cutare a soluiilor
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 situaii distincte :
(1.) S se realizeze o unificare ntre sub-ntrebare i una din clauze, caz n care :
(a) - dac mai exist o alt clauz care ar putea s se unifice cu aceeai sub-ntrebare,
sistemul PROLOG fixeaz un pointer (indicator, punct de backtracking) la urmtoarea clauz,
dup cea pentru care s-a reuit 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 reuit 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 reuit.

(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 poziionrii acelui indicator de backtracking,
apoi ncearc s resatisfac sub-ntrebarea ce era activ n acel punct.
Conform algoritmului de cutare a soluiilor descris mai sus, se poate dezvolta un arbore
al ntrebrilor (goal tree), dup cum se va putea urmri mai jos.
Structura de control a limbajului Visual Prolog

n aceast seciune se prezint n detaliu structura de control specific sistemului


Visual Prolog. Spre deosebire de limbajele de programare clasice, n care programul
definete integral structura de control i fluxul de prelucrri de date, n Visual Prolog
exist un mecanism de control predefinit.
Semnificaia declarativ i procedural a programelor Visual Prolog

Semnificaia declarativ a unui program Visual Prolog se refer la interpretarea


strict logic a clauzelor acelui program, rezultatul programului fiind reprezentat de toate
consecinele logice ale acestuia. Semnificaia declarativ determin dac un scop este
adevrat (poate fi satisfcut) i, n acest caz, pentru ce instane de variabile este adevrat
scopul. Se reamintete c o instan a unei clauze este clauza de baz (clauza fr
variabile) obinut prin instanierea variabilelor din clauza iniial. n aceste condiii
semnificaia declarativ a unui program Visual Prolog se poate defini precum urmeaz:
Definiie. Un scop S este adevrat ntr-un program Visual Prolog, adic poate fi
satisfcut sau deriv logic din program, dac i numai dac:
1. exist o clauz C a programului;
2. exist o instan I a clauzei C astfel nct:
2.1. antetul lui I s fie identic cu cel al lui S;
2.2. toate scopurile din corpul lui I sunt adevrate, deci pot fi satisfcute.
Observaii:
n definiia de mai sus clauzele refer att fapte, ct i reguli Visual Prolog.
Antetul unei clauze este antetul regulii dac, clauza este o regul Visual Prolog
(clauz Horn mixt) i este chiar faptul dac clauza este un fapt Visual Prolog
(clauz unitar pozitiv). Corpul unui fapt este considerat vid i un fapt este un
scop care se ndeplinete ntotdeauna.
n cazul n care ntrebarea pus sistemului Visual Prolog este o conjuncie de
scopuri, definiia anterioar se aplic fiecrui scop din conjuncie.
Semnificaia procedural a unui program Visual Prolog se refer la modul n care sistemul
ncearc satisfacerea scopurilor, deci la strategia de control utilizat. Diferena dintre semnificaia
declarativ i semnificaia procedural este aceea c cea de a doua definete, pe lng relaiile
logice specificate de program, i ordinea de satisfacere a scopurilor i subscopurilor. n
continuare se prezint modalitatea procedural de satisfacere a scopurilor n Visual Prolog.
Semnificaia procedural a unui program Visual Prolog poate fi descris de urmtorul
algoritm n care L = {S1, S2, , Sn} este lista de scopuri de satisfcut, iar B este lista de
instanieri (unificri) ale variabilelor din scopuri, iniial vid. Aceast list se va actualiza la
fiecare apel.

Algoritm. Strategia de control Visual Prolog


SATISFACE(L,B)
1. dac L = {}
% lista vid
atunci afieaz B i ntoarce SUCCES.
2. Fie S1
primul scop din L i p predicatul referit de S1. Parcurge clauzele
programului, de la prima clauz sau de la ultimul marcaj fixat, asociat lui p, pn ce se
gsete o clauz C al crei antet unific cu S1.
3. dac nu exist o astfel de clauz
atunci ntoarce INSUCCES.
4. Fie C de forma H :- D1,,Dm, m 0. Plaseaz un marcaj n dreptul clauzei C, asociat
lui p. (H conine predicatul p).
5. Redenumete variabilele din C i obine C' astfel nct s nu existe nici o variabil
comun ntre C' i L; C' este de tot forma H :- D1,,Dm. cu redenumirile fcute.
6. L { D1,,Dm, S2,,Sn } % dac C este fapt, atunci L se va reduce
7. Fie B1 instanierea variabilelor care rezult din unificarea lui S1 cu H.
8. Substituie variabilele din L cu valorile date de B1 i obine:
L { D1,,Dm, S2,,Sn }.
9. B B B1.
10. dac SATISFACE(L, B)=SUCCES
atunci afieaz B i ntoarce SUCCES.
11. repet de la 1.
sfrit
Observaii:
Algoritmul de mai sus reprezint de fapt implementarea strategiei rezolutive de intrare
liniar utilizat de limbajul Visual Prolog, pentru care se impune o ordine prestabilit de
considerare a clauzelor.
Algoritmul arat funcionarea sistemului pentru gsirea primei soluii.
Indicatorul SUCCES/INSUCCES corespunde rspunsurilor de yes, respectiv no, date de
sistemul Visual Prolog la ncercarea de satisfacere a unei liste de scopuri.
Urmtoarele dou exemple pun n eviden diferena dintre semnificaia declarativ i
semnificaia procedural a programelor Visual Prolog.
Se consider urmtoarea aplicaie. Fie arborele genealogic:
predicates
nondeterm parinte(symbol, symbol)
nondeterm str1(symbol, symbol)
clauses
parinte(vali, gelu).
parinte(ada, gelu).
parinte (ada, mia).
parinte (gelu, lina).
parinte (gelu, misu).
parinte (misu, roco).

Definind relaia printe, se pot scrie axiomele:


printe (vali, gelu).
printe (ada, gelu).
printe (ada, mia).
printe (gelu, lina).
printe (gelu, miu).
printe (miu, roco).

Referitor la setul de clauze de mai sus, se pot formula urmtoarele tipuri de ntrebri:
1) --Este Vali printele lui Gelu ?
ntrebare:
printe (vali, gelu).
rspuns:
Yes
--Este Mia printele lui Roco ?
ntrebare:
printe (mia, roco).
rspuns:
No
--Este Gelu printele lui Nick ?
ntrebare:
printe (gelu, nick).
rspuns:
No
2) --Cine este printele lui Lina ?
ntrebare:
printe (Cine, lina).
rspuns:
Cine = gelu
--Cine este printele lui Gelu ?
ntrebare:
printe (X, gelu).
rspuns:
X = vali
X = ada
3)-- Cine este copilul lui Gelu ?
ntrebare:
printe (gelu, X).
rspuns:
X = lina
X = miu
4) --Cine este printele cui ?
O alt formulare a acestei ntrebri este:
--Gsete X i Y, astfel nct X s fie printele lui Y.
ntrebare:
printele (X, Y).
rspuns:
X = vali, Y = gelu
X = ada, Y = gelu
X = ada, Y = mia
X = gelu, Y = lina
X = gelu, Y = miu
X = miu, Y = roco
Se vor extinde ntrebrile, astfel:
5) -- Cine este bunicul lui Roco?
Relaia care se observ n aceast ntrebare este bunic, relaie care nu este definit n setul
de clauze, deci nu poate fi folosit n ntrebare. Se poate rspunde la ntrebarea de mai sus
formulnd alte dou ntrebri:
a) Cine este printele lui Roco ? Se presupune c este un Y.
b) Cine este printele lui Y ? Se presupune c este un X.
ntrebare:
printe(Y, roco) and printe(X, Y).

rspuns:

X = gelu, Y = miu

6)-- Cine este nepotul lui Ada ?


ntrebare:
printe(ada, X), printe(X, Y).
rspuns:
X = gelu, Y = lina
X = gelu, Y = miu
7)--Lina si Miu au acelai printe ?
a) Cine este printele X al lui Lina ?
b) Este X printele lui Miu ?
ntrebare:
printe(X, lina), printe(X, miu).
rspuns:
X = gelu
Extinderea exemplului de mai sus folosind reguli
Pentru definirea relaiei descendent se poate folosi scrierea sub forma unui ir de axiome
identice cu cele pentru relaia printe, inversndu-se doar ordinea argumentelor.
descendent(gelu, vali).
descendent(gelu, ada).
.a.m.d.
O scriere mai elegant se poate obine, dac se face simpla observaie c relaia
descendent este invers relaiei printe.
Se poate afirma astfel: ''Oricare ar fi X i Y, Y este descendent fa de X, dac X este
printe fa de Y.''
n VISUAL PROLOG, aceast formulare se concretizeaz ntr-o regul:
descendent(Y, X) if printe(X, Y).
Deci, printr-o singur regul se nlocuiete scrierea mai multor axiome avnd i un grad
mai mare de generalitate.
ntrebare:
descendent(mia, ada).
rspuns:
Yes
ntrebare:
rspuns:

descendent(X, gelu)
X = lina
X = miu

ntrebare:
rspuns:

descendent(gelu, X)
X = vali
X = ada

Tema
1. Traducei n limbaj natural urmtoarea ntrebare VISUAL PROLOG i precizai
rspunsul posibil:
printe(vali, X), printe(X, Y), printe(Y, roco).
2. Formulai n Visual Prolog urmtoarea ntrebare:
''Care sunt nepoii care au acelai bunic ?''
3. Completai arborele genealogic de mai sus astfel nct s se obin cel puin o soluie i
la ntrebarea:

"Care sunt nepoii care au acelai bunic, dar prini diferii ?"
4. Se vor completa setul de axiome cu dou relaii care definesc sexul fiecrei persoane:
feminin(ada).
feminin(mia).
feminin(lina).
masculin(miu).
masculin(vali).
masculin(gelu).
masculin(roco).
Scriei n limbaj natural i n VISUAL PROLOG regulile care definesc relaiile: mama,
tata, bunic, sora, frate, nepot, mtua, unchi.
Pornind de la exemplul anterior, se consider programul care definete relaiile de printe i
strmo existente ntre membrii unei familii. Se dau patru definiii posibile ale relaiei de
strmo, str1, str2, str3 i str4, toate fiind perfect corecte din punct de vedere logic, deci din
punct de vedere a semnificaiei declarative a limbajului.
% parinte(IndividX, IndividY)
% stramos(IndividX, IndividZ)
parinte(vali, gelu).
parinte(ada, gelu).
parinte(ada, mia).
parinte(gelu, lina).
parinte(gelu, misu).
parinte(misu, roco).
str1(X, Z) :- parinte(X, Z).
str1(X, Z) :- parinte(X, Y), str1(Y, Z).
% Se schimb ordinea regulilor:
str2(X, Z) :- parinte(X, Y), str2(Y, Z).
str2(X, Z) :- parinte(X, Z).
% Se schimb ordinea scopurilor n prima variant:
str3(X, Z) :- parinte(X, Z).
str3(X, Z) :- str3(X, Y), parinte(Y, Z).
% Se schimb att ordinea regulilor, ct i ordinea scopurilor:
str4(X, Z) :- str4(X, Y), parinte(Y, Z).
str4(X, Z) :- parinte(X,Z).

n raport cu semantica declarativ a limbajului se pot schimba, fr a modifica nelesul


logic, att ordinea clauzelor care definesc relaia de strmo, ct i ordinea scopurilor n corpul
regulii de aflare a strmoilor. Schimbnd ordinea clauzelor se obine din predicatul str1 definiia
alternativ a relaiei de strmo str2; schimbnd ordinea scopurilor din corpul regulii n varianta
iniial se obine definiia predicatului str3; i, schimbnd att ordinea clauzelor, ct i ordinea
scopurilor n regul, se obine predicatul str4.
Comportarea programului folosind cele patru definiii alternative, dac se dorete aflarea
adevrului relaiei de strmo pentru perechile (ada, miu) i (mia, roco), este cea prezentat n
continuare.

?- str1(ada, misu).
yes
Pentru acest scop, arborele de deducie este prezentat n figura urmtoare.
str1(ada, misu)

parinte(ada, misu)

parinte(ada, Y), str1(Y, misu)


Y=gelu

INSUCCES

str1(gelu, misu)

parinte(ada, gelu)
parinte(gelu, misu)
SUCCES
SUCCES

Figura - Arborele de deducie a scopului str1(ada, misu)


?- str2(ada, misu).
yes
?- str3(ada, misu).
yes
Pentru scopul str3(ada, misu), arborele de deducie este cel prezentat n urmtoarea figur.
str3(ada, misu)

parinte(ada, misu)

INSUCCES

str3(ada, Y), parinte(Y, misu)


Y=Y'

parinte(gelu, misu)

parinte(ada, Y')
SUCCES
Y'=gelu
parinte(ada, gelu)

SUCCES

Figura - Arborele de deducie a scopului str3(ada, misu)


?- str4(ada, misu).
% bucl infinita; eventual mesaj de depire a stivei
Pentru acest scop, arborele de deducie este cel prezentat n figura urmtoare.

str4(ada, misu)

str4(ada, Y), parinte(Y, misu)

str4(ada, Y'), parinte(Y', Y)

str4(ada, Y"), parinte(Y", Y)

...
arbore infinit

Figura - Arborele de deducie (infinit) a scopului str4(ada, misu)


Din punctul de vedere al semnificaiei procedurale, cele patru definiii nu sunt echivalente.
Primele dou, str1 i str2, pot da rspuns pozitiv sau negativ la orice ntrebare, dar str2 este mai
ineficient dect str1. Cititorul poate ncerca trasarea arborelui de deducie al satisfacerii scopului
str2(ada, misu) i compararea acestuia cu cel corespunztor satisfacerii scopului str1(ada,
misu). Definiia str4 produce o bucl infinit datorit intrrii infinite n recursivitate. Este evident
o definiie greit din punct de vedere procedural. Definiia relaiei de strmo str3 este o
definiie "capcan". Dup cum se poate observ din arborele de deducie prezentat, rspunsul
sistemului este afirmativ n cazul n care exist o relaie de strmo ntre cele dou persoane
argumente ale predicatului. n cazul n care o astfel de relaie nu exist, sistemul intr ntr-o bucl
infinit, cum ar fi, de exemplu, pentru persoanele mia i roco.

?- str1(mia, roco).
no
?- str2(mia, roco).
no
?- str3(mia, roco).
% bucl infinit; eventual mesaj de depire a stivei
n acest caz, arborele de deducie al scopului str3(mia, roco) este prezentat n figura de
mai jos. Datorit semnificaiei procedurale a limbajului Visual Prolog trebuie urmrit cu atenie
modul de definire a unui predicat att din punctul de vedere al ordinii clauzelor, ct i din punctul
de vedere al ordinii scopurilor n corpul regulilor.

str3(mia, roco)

parinte(mia, roco)

INSUCCES

str3(mia, Y), parinte(Y, roco)

parinte(mia, Y)

INSUCCES

str3(mia, Y'), parinte(Y', Y)

parinte(mia, Y')

INSUCCES

str3(mia, Y"), parinte(Y", Y')

parinte(mia, Y")

...
arbore infinit

INSUCCES

Figura - Arbore de deducie infinit pentru un scop fals


Simplitatea i expresivitatea limbajului Visual Prolog poate fi pus n eviden de
urmtorul exemplu de cautare a unei rute ntre diferite orae.
DOMAINS
oras = symbol
distanta = integer
PREDICATES
nondeterm drum(oras,oras,distanta) %pentru orase vecine
nondeterm ruta(oras,oras,distanta) %pentru a gasi o ruta intre oricare 2
orase
CLAUSES
drum(suceava,gura_humorului,60).
drum(falticeni,suceava,25).
drum(gura_humorului,campulung_M_nesc,70).
drum(falticeni,campulung_M_nesc,155).
ruta(Oras1,Oras2,Dist):drum(Oras1,Oras2,Dist).
ruta(Oras1,Oras2,Dist):drum(Oras1,X,Dist1),
ruta(X,Oras2,Dist2),
Dist=Dist1+Dist2.
goal
ruta(suceava, campulung_M_nesc, X).

Tem
1. Realizai arborele de deducie corespunztor.

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