Sunteți pe pagina 1din 7

1

Entitile limbajului Prolog


1.1. Fapte, ntrebri, termeni
Sunt cunoscute numai trei componente ale unui program
Prolog: faptele, regulile i ntrebrile. Aici vom introduce
noiunile de fapte i ntrebri, iar regulile vor fi examinate mai
trziu.

1.1.1. Fapte
Un fapt exprim a relaie ntre obiecte. Considerm
cteva exemple de fapte, n care se va utiliza urmtoarele notaii
Prolog pentru comentarii: tot ce se conine ntre /* i */ este
un comentariu; dac comentariul ncape ntr-un rnd, atunci se
poate scrie n faa comentariului caracterul %.
zboara(corb). %corbul zboar
este_autor(shakespeare,hamlet).
/*Shakespeare
este autorul operei Hamlet */
traducere(bread,pain).
/*pain
este
varianta
francez a lui bread */

Astfel faptul
ruta(paris, roma).
poate semnifica c Parisul e legat cu Roma de o rut, ns noi nu
cunoatem nici numrul rutei, nici ora de plecare.
S considerm sintaxa ultimului fapt. El este compus
dintr-un scop ruta(paris,roma) i un punct, ., la sfrit.
irul de simboluri ruta este numele relaiei care se mai numete
nume de predicat sau functor, iar paris i roma sunt obiectele
antrenate n aceast relaie. ntruct predicatul ruta are dou
argumente paris i roma, care sunt puse ntre paranteze i
desprite prin virgul, el se numete predicat binar. n caz
general, un predicat poate avea orice numr de argumente (i,
bineneles, zero). Acest numr se numete aritatea predicatului,
care n cazul predicatului ruta este 2. Deci, faptul este cea mai
simpl form de predicat ce semnific existena unei relaii ntre
o mulime de obiecte.
Fie c predicatele

Atunci cnd se declar o relaie ntre obiecte trebuie s se


atrag atenia la numrul de obiecte puse n relaie de predicat i
la ordinea acestor obiecte. Pentru Prolog faptul ruta/2 nu este
dect o simpl consecutivitate de simboluri i nu-i asociaz nici
un sens, nici o semnificaie. Se poate ns perfect de considerat
c primul obiect din predicatul ruta/2 este oraul plecrii, iar al
doilea este oraul sosirii. Ordinea este, deci, arbitrar, dar fiind
fcut o alegere, trebuie s se in cont de ea dac dorim ca
relaia ruta/2 s reprezinte o semnificaie valid (i ca un
program ce o utilizeaz s produc rspunsuri coerente). Aa dar,
predicatul poate fi conceput ca numele relaiei (proprietii) ntre
obiecte nzestrat cu aritate n care ordinea obiectelor e
important.
Deci interpretarea particular a predicatelor i
argumentelor depinde de programator. Ordinea argumentelor
odat fixat, este important i trebuie pstrat la orice utilizare a
faptului.
S considerm, acum, faptul Ion este tatl lui Vasile.
Acest fapt se refer la Ion i Vasile i o relaie tatl lui
(relaia de paternitate). n Prolog acest fapt se poate declara prin
tatal_lui(ion, vasile).
Adic se presupune c primul argument al relaiei tatal_lui/2
reprezint tatl, iar al doilea - feciorul.
Mulimea tuturor faptelor formeaz baza de fapte. Ea
constituie o parte a unui program Prolog. Fie c avem
urmtoarea baz de fapte:
ruta(paris, roma).
ruta(paris, madrid).
ruta(madrid, porto).
ruta(londra, paris).
ruta(londra, madrid).
ruta(amsterdam, paris).
S remarcm, acum, urmtoarele:

numele de obiecte (constantele) i relaiile


(predicatele) n limbajul Prolog ncep cu minuscul
(i pot continua cu caracterul sublinierea, _)

predicatul (numele relaiei) se scrie primul, iar


obiectele n relaie sunt puse ntre paranteze i
separate prin virgule (atenie la operatori pentru care
Prologul utilizeaz i alte notaii)

punctul, ., indic c declaraia faptului s-a


terminat.

ruta(oras_plecare, oras_sosire).
i
ruta(oras_plecare, oras_sosire, ruta).
sunt adevrate dac oras_plecare e legat cu oras_sosire i dac
oras_plecare e legat cu oras_sosire prin ruta ruta,
corespunztor. Aceste dou predicate sunt diferite. Pentru a ne
referi la predicatul de aritatea 3 vom utiliza notaia ruta/3, iar
pentru cel de aritatea doi - ruta/2.

1.1.2. ntrebri asupra unei baze


de fapte
ndat ce sunt declarate faptele e posibil interogarea
Prologului despre subiectele lor. ntrebarea se mai numete scop

29

i se deosebete la unele sisteme prin prezena simbolului :-


sau ?, ce de fapt este invitaia Prologului de a o insera.
Considerm, de exemplu, ntrebarea
?-ruta(paris, roma)
Precum se va tie din ultimele capitole ale lucrrii de
fa, a rspunde la o ntrebare pus unui program const n
determinarea dac ea poate fi dedus din program, aplicnd
regulile de deducere (fie regula rezoluiei). Dac programul
conine un fapt ce coincide cu ntrebarea, atunci rspunsul
sistemului este afirmativ, yes, n caz contrar negativ, no.
Rspunsul no semnific numai c faptul nu este n baza de fapte.
Mai trziu se va vedea c sistemul, n cazul unui rspuns
afirmativ la o ntrebare, poate furniza i alte informaii din baza
de fapte.

Prolog nu se declar datele (cu mici excepii, de exemplu, Turbo


Prolog sau Visual Prolog).
Constante. Orice constant se refer la un obiect
individual. Constantele n Prolog servesc pentru definirea
obiectelor i relaiilor particulare. Exist dou categorii de
constante: atomi i numere. Modul de interpretare a constantei,
cum ar fi locul ei ntr-o relaie, depinde de programator.
Atomi. Atomul este o varietate de termen ce ncepe cu o
liter minuscul. Celelalte simboluri pot fi litere (inclusiv
majuscule), numere i simbolul de subliniere, _. O serie de
simboluri sistemul le consider atomi (+, -, =, :- etc.).
Perechea de simboluri [ ] de asemenea este un atom, ns nici [,
nici ] aparte nu sunt atomi. Exemplu de atomi:
atom
a2000
a_Fi_sau_A_nu_fi

La baza de fapte de mai sus se poate, n particular, de pus


urmtoarele ntrebri la care Prologul va rspunde precum
urmeaz.
?-ruta(paris, roma)
yes

+
:-->

Orice nume de predicat este un atom. Deci, n faptul

?-ruta(roma, paris)
no

ruta(paris, roma).

1.1.3. Termenii n Prolog

O secven de caractere incluse ntre ghilimele simple


(n Turbo Prolog se folosesc ghilimele duble ) de
asemenea este considerat n calitate de atom. Pentru o mai bun
reprezentare a atomilor ntre ghilimele poate fi inserat i
caracterul blanc, de exemplu:

termenii ruta, paris i roma sunt atomi.

Descrierea sintactic a limbajului Prolog are dou


aspecte: sintaxa termenilor i sintaxa componentelor unui
program. Aici, vom ntrerupe pentru un timp descrierea
componentelor unui program pentru a defini termenii.

32
Rebreanu

Termenii sunt formai dintr-o mulime de caractere.


Caracterele recunoscute n Prolog se divizeaz n patru categorii:

mulimea de litere majuscule: A B C D X Y Z

mulimea de litere minuscule: a b c d x y z

mulimea de caractere numerice: 0 1 2 3 4 5 6 7 8


9

mulimea de caractere speciale: ! # $ % ( ) =


- ~ ^ \ | { } [ ] _ ` @ + : ; * < > , .
? /

E cunoscut faptul c termenul este singura structur de


date utilizat n programarea logic. Mulimea de termeni ce
poate fi creat i utilizat n Prolog se grupeaz conform
structurii ierarhice reprezentate n Fig. 1.1.

constante
atomi

Deci atomii pot desemna:

obiecte constante ce sunt argumente ale predicatelor

nume de predicate, fie definite de utilizator, fie cele


predefinite n sistem

atomi speciali

Numere. Numerele sunt formate din cifre, punct i din


semnele + i -. Precizia i tipul numerelor depind de
implementarea limbajului Prolog. Astfel
32
28.9

structurai
variabile

numere
Fig. 1.1. Termenii n Prolog

Diferena dintre diveri termeni se bazeaz doar pe


sintaxa lor. Astfel, numai considernd componentele termenului
se poate concluziona ce fel de termen el este (un atom, un
numr, o variabil sau un termen structurat) fr a ne referi la
declaraia lor. De fapt, spre deosebire de limbajele imperative, n

Variabile. Variabila este un termen ce ncepe cu o


majuscul sau cu caracterul de subliniere, _. Celelalte
simboluri pot fi numere, litere majuscule i/sau minuscule.
Variabilele se utilizeaz pentru desemnarea obiectelor
necunoscute. O astfel de interpretare difer de interpretrile
variabilei n alte limbaje de programare. n limbajele imperative
o variabil este conceput ca un loc de memorare, n care n
diferite momente de timp pot fi plasate diferite valori ale
variabilei. n programarea funcional (de exemplu, n limbajul
Lisp) variabilele sunt nume cu care se asociaz valori odat i
pentru totdeauna. E important de reinut aceste trei concepii
diferite de variabile.
Termenii ce urmeaz sunt variabile
Atom

Vitalie Cotelea

+1.2
-1

sunt numere. Operaiile aritmetice pot fi fcute doar asupra


numerelor. Asupra atomului 32 nu pot fi aplicate operaii
aritmetice.

termeni
simpli

Triasc regele!
+important

_aceasta_de_asemenea

Rebreanu
Aceasta_e_1_variabila

_2000
__

dar termenii
aCESTA_NU
NICI-ACESTA
nu sunt variabile. Un singur caracter _ este o form special
de variabil numit variabila anonim. Ea se utilizeaz pentru a
arta c pe poziia dat se accept orice valoare care nu ne
intereseaz.
Termeni structurai (compui sau compleci).
Termenul structurat desemneaz un obiect n care sunt regrupate
alte obiecte numite componente. Regruparea permite o
manipulare mai uoar a obiectelor complexe.

1.1.4. Unificarea termenilor


Unificarea este unul din mecanismele ce situeaz
Prologul completamente pe alt parte dect limbajele tradiionale
de programare. Programatorii nceptori frecvent greesc, fiindc
unificarea se aseamn att cu testul de egalitate (== n C), ct
i cu procesul de asignare a unei valori unei variabile (ca := in
Pascal).
Unificarea se aseamn cu un test de egalitate, fiindc ea
permite Prologului de a verifica dac doi termeni sunt identici.
Pentru aceasta se utilizeaz un predicat predefinit =. Pentru a
testa dac doi termeni se unific, e suficient s se scrie expresia
termen1=termen2.
Urmeaz regulile generale pentru determinarea n ce
mod doi termeni termen1 i termen2 pot fi unificai.

Un termen structurat se definete de functorul su,


componentele sale i aritatea sa (numrul de componente).
Considerm, de exemplu, urmtorul termen structurat

nainte de toate, menionm c dac termen1 (sau


termen2) e o variabil instaniat, atunci termen1
(sau termen2) se comport ca termenul cu care a fost
instaniat, adic ca o constant sau o structur, sau o
alt variabil.

Dac termen1 i termen2 ambii sunt atomi sau


numere, ei pot s se unifice cnd fiecare este acelai
atom sau numr. n particular, un numr real nu
poate s se unifice cu un numr ntreg, chiar dac
exprim aceeai valoare.

Dac termen1 i termen2 ambii sunt termeni


structurai, ei pot fi unificai cnd fiecare are acelai
functor principal, acelai numr de argumente i
argumentele ce corespund acelorai poziii la rndul
su pot s se unifice.

n sfrit, dac termen1 i termen2 sunt ambii


variabile neinstaniate, ei pot fi unificai. n acest caz
variabilele rmn neinstaniate, dar legate una de
alta, pn cel puin una din ele nu va fi instaniat i
atunci, i cealalt devine automat instaniat cu
acelai termen.

autor(blaise, pascale)
El poate fi interpretat c exist un autor al crui nume
este pascal i prenume blaise. Acest termen are functorul autor,
componentele blaise i pascale i aritatea 2. E evident c
componentele unui termen structurat pot fi la rndul su termeni
structurai. Astfel termenul structurat
cartea(cugetari, autor(blaise, pascale))
semnific c cugetri este o carte a crei autor este blaise
pascale. Acest termen are dou componente cugetari i
termenul structurat autor(blaise, pascale).
Un termen structurat poate fi reprezentat sub forma unui
arbore a crui rdcin e simbolul funcional (adic, functorul),
numrul de descendeni ai rdcinii fiind aritatea, adic numrul
de componente ale termenului structurat, ordonarea
descendenelor corespunde ordonrii componentelor. Dac, la
rndul su, o component e un termen structurat, ea se
descompune n acelai mod. De exemplu termenul structurat
cartea(cugetari, autor(blaise, pascale)) e reprezentat de arborele
din Fig 2.2.
Sintaxa termenilor structurai e asemntoare cu cea a
faptelor. Deci, un predicat poate fi considerat ca un termen
structurat a crui functor este numele predicatului, iar
argumentele reprezint componentele termenilor structurai.
Acest lucru este utilizat n diverse implementri Prolog pentru
tratarea uniform i sinteza dinamic de programe.

S aducem, acum, nite exemple.


Atomii i numerele se unific numai cu ei nsi.
Prologul procedeaz astfel. El compar termenii de la stnga la
dreapta simbol cu simbol. Dac toate simbolurile acestor doi
termeni coincid, atunci ei se unific, n caz contrar ei nu se
unific (vezi Fig 1.3).
Termenul 1
Ion
Ion
12
12
Liviu Rebreanu
Liviu Rebreanu
+
12

cartea
cugetari

autor
blaise

Termenul 2
ion
petru
12
12.0
Liviu Rebreanu
scriitor
plus
3*4

Se unific?
Da
Nu
Da
Nu
Da
Nu
Nu
Nu

Fig. 1.3. Unificarea atomilor i numerelor

pascale

Un termen structurat se unific cu altul dac i numai


Fig. 1.2. Reprezentarea unui termen structurat

Vitalie Cotelea

dac:

ei au acelai functor

ei au acelai numr de argumente

orice argument al unui termen se unific cu


argumentul corespunztor (de pe aceeai poziie) al
celuilalt termen

Exemple de unificare a termenilor structurai sunt aduse


n Fig 2.4.
Termenul 1
Autor(blaise,pascale)
Autor(blaise,pascale)
Autor(blaise,pascale)
3*4
3+4

Termenul 2
autor(blaise,pascale)
nume(blaise,pascale)
autor(blaise,pascale,1623)
*(3,4)
4+3

Se unific?
da
nu
nu
da
nu

Fig. 1.4. Unificarea unor termeni structurai


O variabil se unific cu orice termen dac ea nu este
instaniat. n caz contrar, ea se comport ca valoarea sa.
Variabilele instaniate (Instantiated Variables) sunt variabilele
care au denotat obiecte necunoscute i n procesul de instaniere
s-au transformat n variabile ce denot obiecte cunoscute.
Variabila este neinstaniat dac nu desemneaz nici un obiect.
S observm aici c mecanismul de unificare a variabilei
poate juca dou roluri: de testare a egalitii i de asociere a unei
valori variabilei. Dac variabila X nu este instaniat, atunci
expresia X=a i va atribui n calitate de valoare atomul a.
Cnd variabila are o valoare asociat, se spune c ea s-a unificat
cu aceast valoare. De exemplu, dac variabila X nu este
instaniat, ea poate s se unifice cu a(x,y,z). Dar, a(x,y,z) nu se
poate unifica dect cu un termen structurat care are n calitate de
functor a i are trei argumente, primul argument al crui se
poate unifica cu x, al doilea cu y i al treilea cu z. Deci a(G,y,K)
se poate unifica cu variabila instaniat X, adic cu a(x,y,z), dac
G i K nu sunt instaniate (sau dac G are valoarea x i/sau dac
K are valoarea z).
S menionm c, n limbajul Pascal expresia X:=a
(ce denot plasarea valorii a n memoria notat de X) variabila se
gsete ntotdeauna n partea stng a semnului de atribuire,
:=. n Prolog, ns, expresiile X=a i a=X sunt
echivalente.

1.1.5. ntrebri cu variabile


S revenim la ntrebri. ntrebrile asupra bazei de fapte
de tipul celor considerate mai sus nu prezint prea mare interes.
Singura alegere permis const n verificarea dac o informaie
este sau nu n baza de fapte. Din cele cunoscute de mai sus, pare
dificil ca Prologul s poat obine un rspuns la o ntrebare
simpl (pentru noi) cum ar fi: n ce orae zboar avioanele din
Paris?. Ar trebui de ntrebat Prologul dac orice ora posibil e
legat cu Parisul. Acest lucru e foarte ineficient, deoarece sunt
multe orae i, atunci, se presupune c le cunoatem pe toate.
Evident c, ideal ar fi dac Prologul singur ar cuta
faptele despre oraele n care sosesc avioane din Paris i ar afia
pentru orice fapt gsit oraul de sosire.
Graie utilizrii variabilelor este posibil obinerea
rezultatului dezirabil, rmnnd ca Prologul s fac lucrul de
cutare. Precum se tie, o variabil este un nume n care prima
liter este o majuscul sau caracterul de subliniere, _ i
permite desemnarea unui obiect oarecare. ntr-o ntrebare, de
exemplu, ea servete pentru desemnarea unui obiect necunoscut
(oraul de sosire, ca n ntrebarea de mai jos).
Deci, cnd se pune o ntrebare care conine o variabil,
Prologul parcurge baza de fapte pentru a cuta un obiect pe care
Vitalie Cotelea

variabila poate s-l desemneze. Aa dar, pornind de la baza


noastr de fapte i fiind pus ntrebarea
?-ruta(paris, X)
ce semnific n ce orae zboar avioanele din Paris?, sistemul
va rspunde
X=roma
Aici trebuie s remarcm, c unele sisteme Prolog
enumr toate oraele ce sunt legate cu Parisul, iar altele ateapt
o instruciune special, dac dorim ca dup fiecare rspuns
Prologul s mai continue cutarea. n sistemul Turbo Prolog, de
exemplu, dac ntrebarea este extern n sensul c este pus n
fereastra de dialog, atunci sistemul enumr toate oraele n care
sosesc avioane din Paris. ns, dac ntrebarea este pus n
program, atunci se afieaz primul rspuns, iar de obinerea i
celorlalte rspunsuri posibile trebuie s aib grij programatorul.
Dar acum presupunem, c se dorete de a afla dac
zboar undeva avioane din Paris, fr a fi preocupai care sunt
aceste orae. Pentru aceasta se utilizeaz variabila anonim _,
iar scopul se formuleaz astfel
?-ruta(paris, _)
Prologul rspunde simplu yes sau no n dependen dac
exist un astfel de ora sau nu.
Se poate, de asemenea, de pus variabile i n fapte. Astfel
faptul
ruta(paris, _).
presupune c Parisul e legat cu toate celelalte orae. Mai departe,
n alte seciuni, se va vedea cum pot fi utilizate variabilele pentru
a formula proprieti mai complexe referitor la obiecte.
Spre deosebire de variabila obinuit, variabila anonim
are urmtoarele particulariti:

Prologul nu ntoarce valoarea cu care variabila este


instaniat

Dac variabila apare de mai multe ori n aceeai


clauz (a se vedea noiunea mai departe) sau
ntrebare, fiecare apariie a ei nu desemneaz
neaprat acelai obiect. Cu alte cuvinte, orice
variabil anonim este o variabil independent de
celelalte.

1.1.6. ntrebri cu termeni


structurai
E posibil formularea ntrebrilor asupra faptelor ce
conin termeni structurai. De exemplu, cu baza de fapte
poseda(marcel, cartea(cugetari, autor(blaise, pascale))).
poseda(marcel, cartea(moby_dick, autor(herman, melville))).

la ntrebarea
?-poseda(marcel, Obiect)
care semnific Ce obiecte posed Marcel?, Prologul rspunde
Obiect=cartea(cugetari, autor(blaise, pascale));
Obiect=cartea(moby_dick, autor(herman, melville))
La ntrebarea
?-poseda(marcel, cartea(_, autor(Prenume, _)))

ce semnific Care sunt prenumele autorilor crilor ce le posed


Marcel?, Prologul rspunde
Prenume=blaise;
Prenume=herman
S se observe aici utilizarea variabilelor anonime pentru
obinerea doar a prenumelor.
Dac la baza de fapte de mai sus se adaug faptul
poseda(marcel, bicicleta).
atunci la ntrebarea
?-poseda(marcel, Obiect)
care semnific Ce obiecte posed Marcel?, Prologul va
rspunde
Obiect=cartea(cugetari, autor(blaise, pascale))
Obiect=cartea(moby_dick, autor(herman, melville))
Obiect=bicicleta
Deci, nimic nu ne impune ca obiectele despre care este
vorba s fie neaprat cri.

1.1.7. Mecanismul de unificare i


substituia
S examinm neformal mecanismul utilizat de Prolog n
cutarea soluiilor la ntrebri. Prologul caut n baza de fapte un
fapt ce se unific cu scopul formulat, adic ncearc s fac ca
variabila, care este liber n ntrebarea pus, s coincid cu orice
argument ce se gsete pe acelai loc ntr-un fapt cu acelai
nume de predicat i acelai numr de argumente ca i ntrebarea.
n cazul ntrebrii
?-ruta(paris, X)
Prologul parcurge baza de fapte i cut un fapt cu numele de
predicat ruta i dou argumente, primul dintre care este paris.
Cnd Prologul gsete un astfel de fapt, el unific X cu
argumentul doi al faptului. n acest caz se mai spune c variabila
X este instaniat de acest argument.
Precizm n ce mod Prologul parcurge baza de fapte. El
examineaz faptele n ordinea n care sunt stocate n baza de
fapte, ncepnd cu primul. De aceea, n exemplul nostru Prologul
afieaz mai multe rspunsuri n urmtoarea ordine:
X=roma
X=madrid
Dup unificare Prologul efectueaz o operaie invizibil
pentru utilizator: el marcheaz faptul din baza de fapte cu care sa produs unificarea.
Utilitatea acestui marcaj se explic prin urmtoarele.
ndat ce este gsit un fapt cu care se unific, faptul este marcat.
Dac e necesar parcurgerea mai departe a bazei de fapte pentru
a cuta i alte posibile unificri, sistemul nu cerceteaz dect
partea baza de fapte ce urmeaz dup faptul marcat. Dac nu ar
fi fost marcate faptele unificate, atunci Prologul ar relua
parcurgerea bazei de fapte de la nceput i ar fi afiat acelai
rspuns - primul gsit. Adic programul ar fi intrat ntr-o bucl.
Deci, marcajul permite Prologului s recunoasc partea din baza
de fapte ce nu a fost nc examinat ntr-un anumit context.
Relund parcurgerea mai jos de faptul marcat, marcajul se
suprim i Prologul caut un nou fapt cu care scopul ar putea fi
unificat etc.

Vitalie Cotelea

n exemplul nostru, dac se folosete sistemul Turbo


Prolog i scopul este inserat n program, sistemul nu consider
faptele ce urmeaz dup faptul
ruta(paris, roma).
dac, bineneles, scopul nu presupune cutarea tuturor soluiilor.
Dac, ns, ntrebarea este inserat n fereastra de dialog, atunci
sistemul marcheaz faptul de mai sus, afieaz rspunsul
X=roma
Apoi se rentoarce la faptul marcat, suprim marcajul i
examineaz faptele ce urmeaz dup el. Deci, sistemul ncearc
s unifice scopul cu faptul
ruta(paris, madrid).
Unificarea, evident, are loc. Acest fapt este marcat i se afieaz
soluia
X=madrid

1.1.8. Conjuncii de scopuri i


variabile partajate
Fie c dorim s punem o ntrebare de felul Care sunt
oraele n care aterizeaz avioane ce sosesc din Paris i din
Londra?. E evident, c mai nti se poate de ntrebat sistemul ce
orae sunt legate cu Parisul, apoi, dac rspunsul conine careva
orae, de ntrebat ce orae din cele legate cu Parisul sunt legate
cu Londra. Deci, ntrebarea de fapt e descompus n dou. ns
Prologul ofer posibilitatea de a pune direct ntrebarea global,
separnd subscopurile prin virgul:
?-ruta(paris, X), ruta(londra, X)
Virgula se citete i i permite separarea a orice numr
de subscopuri ce trebuie satisfcute pentru a rspunde la scopul
ntreg. Deci, cnd o consecutivitate de subscopuri sunt puse
Prologului, acesta ncearc s treac (pentru a satisface) succesiv
orice subscop, cutnd pentru el un fapt corespunztor din baza
de fapte. Consecutivitatea de subscopuri, adic ntreg scopul, va
putea fi parcurs (i atunci Prologul va putea rspunde la
ntrebare) numai dac vor fi satisfcute succesiv toate
subscopurile. Deci, pentru a rspunde la ntrebarea de mai sus
Prologul procedeaz astfel. El ncearc s treac primul subscop;
dac subscopul este unificat, Prologul marcheaz faptul cu care
se unific i ncearc s treac la urmtorul subscop; dac
reuete s unifice i al doilea subscop, Prologul l marcheaz i
afieaz rspunsul. Dac, din potriv, al doilea subscop nu poate
fi trecut, atunci Prologul se ntoarce la primul subscop, suprim
marcarea faptului ce s-a unificat cu primul subscop i ncearc s
treac primul subscop, ncepnd cu faptele din baz ce urmeaz
dup faptul marcarea cruia a fost suprimat. Acest
comportament se numete backtracking.
S considerm, acum, ntrebarea
?-ruta(paris, X), ruta(amsterdam, Y)
care semnific Unde pleac avioanele din Paris i din
Amsterdam?. Rspunsul bineneles va fi
X=roma, Y=paris;
X=madrid, Y=paris

S aducem o scurt explicaie. Dup primul rspuns


(X=roma, Y=paris), Prologul ncearc s parcurg n alt mod
subscopul ruta(amsterdam, Y), suprimnd marcajul de la faptul

grec, dac X este atenian sau Pentru orice X, X este grec, dac
X este spartan. Dar n astfel de expresii numele variabilelor nu
este semnificativ. Astfel, regulile de mai sus reprezint acelai
lucru ca i regulile

ruta(amsterdam, paris).

grec(X):-atenian(X).
grec(Y):-spartan(Y).

ntruct acest lucru nu e posibil, sistemul revine la faptul ce a


fost unificat cu primul subscop, i suprim marcarea i ncerc s
unifice primul subscop cu faptele ce urmeaz mai jos de faptul
marcat. Primul subscop se unific cu faptul
ruta(paris, madrid).
l marcheaz i purcede la unificarea subscopului doi. El poate fi
unificat doar cu acelai fapt
ruta(amsterdam, paris).
n urma cruia s-a obinut cea dea doua soluie. E evident, c mai
multe soluii nu pot fi.
Acum, s considerm puin mecanismul backtracking. El
const n satisfacerea i resatisfacerea repetat a subscopurilor
unui scop. La satisfacerea unei conjuncii de subscopuri, se
ncearc satisfacerea fiecrui subscop pe rnd, de la stnga la
dreapta. Prima satisfacere a unui subscop determin plasarea
unui marcaj n dreptul faptului care a determinat satisfacerea
subscopului. Dac un subscop nu poate fi satisfcut, adic
eueaz, sistemul se ntoarce i ncearc resatisfacerea
subscopului cel mai aproape din stnga, pornind cutarea n baz
de la marcaj n jos. nainte de resatisfacerea unui subscop, se
elimin toate instanierile de variabile determinate de ultima
satisfacere a acestuia.

1.2. Reguli

S vedem acum cum poate fi parcurs o regul. Regula


p:-q1,q2,,qn se poate citi: pentru a trece p, trebuie de trecut
succesiv q1,q2,,qn. S detaliem acest mecanism asupra unui
exemplu. Fie baza de fapte:
barbat(paul).
barbat(andrei).
femeie(maria).
femeie(eliza).
femeie(emilia).
parinti(emilia, maria, paul).
parinti(andrei, maria, paul).
parinti(eliza, maria, paul).
unde semnificaia faptului parinti(E, M, T) este M i T sunt
prinii lui E, M fiind mama, iar T - tata. S definim regula
sora_lui, n conformitate cu definiiile date mai sus (caracterul %
indic un comentariu).
sora_lui(X,Y):- % X e sora lui Y, dac
femeie(X), % X e femeie i
parinti(X,M,T), % prinii lui X, M i T, sunt
parinti(Y,M,T). % i prinii lui Y

Considerm acum o ntrebare mai complicat care


conine o variabil i apelez la backtracking. Aici se va plasa
marcajul, fiindc vor fi soluii de alternativ.
?-sora_lui(eliza, X)

Presupunem c se afirm: Toi atenienii sunt greci.


Aceast afirmaie poate fi descris dac pentru orice nume de
persoan se construiete un fapt ce indic c persoana este
atenian i un fapt c persoana este grec. Dar acest lucru este
foarte ineficient. Din fericire, Prologul permite de a descrie
propoziii de acest tip prin intermediul regulilor.
nainte de a arta cum se descriu regulile n Prolog,
menionm c afirmaia de mai sus poate de asemenea s se
formuleze: Dac cineva e atenian, atunci el este grec sau
Orice persoan e grec, dac e atenian. n Prolog se scrie
grec(X):-atenian(X).
i se citete X este grec, dac X este atenian sau X este atenian
implic X este grec.

Y=emilia
Y=andrei
Y=eliza
S revenim pentru un moment la rspunsul obinut. Nu e
curios acest rspuns? ntrebarea pus, de fapt, este Cui Eliza i
este sor?, iar Prologul, dup ce a rspuns corect c Eliza este
sora lui Emilia i a lui Andrei, ne afirm c ea este de asemenea
sor sie. Din punctul de vedere al mecanismului de cutare a
soluiilor rspunsul este just. Examinnd regula sora_lui/2,
constatm c nimic nu interzice ca X i Y s primeasc aceleai
valori. Pentru ca regula s fie ntr-adevr corect, trebuie
adugat o condiie suplimentar, ce ar spune c variabilele X i
Y nu pot desemna aceeai persoan. n Prolog aceasta se va scrie

Aadar, Prologul permite de a formula reguli de tipul:


Un fapt a este adevrat, dac un fapt b i un fapt c etc. sunt
adevrate. De exemplu, X este sora lui Y, dac X e de sex
feminin i X, i Y au aceiai prini sau X este o pasre, dac X
este animal i X are pene.

sora_lui(X,Y):- % X e sora lui Y, dac


femeie(X), % X e femeie i
parinti(X,M,T), % prinii lui X, M i T, sunt
parinti(Y,M,T), % i prinii lui Y i
X<>Y. % X i Y sunt persoane diferite

Deci, o regul Prolog e compus din cap i corp separai


de simbolul :-, care se citete dac. n exemplul de mai sus
grec(X) este capul regulii, iar atenian(X) corpul su.

1.3. Reguli recursive

Menionm c variabilele sunt locale n regula n care


figureaz. Aceast nseamn, de exemplu, c dac sunt regulile

E cunoscut faptul c definiiile unor operaii sau funcii


pot fi sau analitice, sau recursive. De exemplu, definiia analitic
a factorialului este urmtoarea:

grec(X):-atenian(X).
grec(X):-spartan(X).
variabila X, aprut n prima regul, nu are nimic comun cu cea
din regula a doua, cu toate c au acelai nume. Regulile de mai
sus sunt traduceri ale expresiilor logice: Pentru orice X, X este
Vitalie Cotelea

n!=12(n-1)n
care nseamn c factorialul unui numr este produsul tuturor
numerelor de la 1 la cel specificat.

Pe de alt parte subexpresia 12(n-1) este realmente


(n-1)!. Prin urmare, definiia factorialului poate fi:
n!= n (n-1)!
care se numete recursiv, fiindc factorialul se definete prin
nsi factorial.
Dar definiiile recursive trebuie s conin i partea ce nu
este recursiv. Aceast parte se numete baza definiiei, condiia
limit sau condiia de terminare a recursiei. Necesitatea condiiei
e evident. Atunci definiia complet a factorialului este
1, dac n=0
n!=
n (n-1)! , dac n>0
Definiia recursiv se bazeaz pe principiul induciei
matematice i este un instrument declarativ, deoarece definiia
recursiv definete mai degrab ce este funcia definit, dect
cum ea poate fi calculat. n Prolog mai greu se exprim
definiiile analitice, fiindc el nu posed instruciuni de tipul
celor din limbajele imperative (de exemplu, while, for, repeat
until). Deci, recursia este larg utilizat drept tehnic de
programare ce substituie deseori necesitile iteraiei.
Un principiu de elaborare a programelor recursive n
Prolog poate fi:

Pentru a soluiona problema de ordinul N, se


presupune c aceast problem este rezolvat pentru
un ordin mai mic (fie N-1) i apoi se leag rezultatul
problemei mici cu rezultatul problemei iniiale

n final se scriu condiiile limit corespunztoare

Astfel definiia corect a predicatului factorial/2 poate


avea forma:
factorial(0,1).
factorial(N,Fac):N>0,
N1 is N-1,
factorial(N1,Fac1),
Fac is Fac1*N.
Deci, regula recursiv este regula n corpul creia exist
cel puin un apel la capul regulii.
Acum putem defini predicatul cale(A,B), care este
adevrat dac exist o cale din oraul A n oraul B, adic se
poate pleca din oraul A spre oraul B, dac ele sunt legate cu o
rut direct sau exist un ora C legat cu A cu o rut direct, din
care se poate apoi pleca n oraul B.
cale(OrasA, OrasB):ruta(OrasA, OrasB).
cale(OrasA, OrasB):ruta(OrasA, OrasC),
cale(OrasC, OrasB).
Menionm c acest predicat nu poate evita buclele. O
variant mai general va fi adus la momentul potrivit n
seciunea urmtoare.

Vitalie Cotelea

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