Sunteți pe pagina 1din 9

Introducere in limbajul Prolog

1 Entităţile limbajului Prolog

Limbajul Prolog este un limbaj logic, descriptiv, care permite specificarea problemei de rezolvat în
termenii unor fapte cunoscute despre obiectele universului problemei şi a relaţiilor existente între
aceste obiecte. Execuţia unui program Prolog constă în deducerea implicaţiilor acestor fapte şi relaţii,
programul definind astfel o mulţime de consecinţe ce reprezintă înţelesul sau semnificaţia declarativă a
programului.

Un program Prolog conţine următoarele entităţi:


• fapte despre obiecte şi relaţiile existente între aceste obiecte;
• reguli despre obiecte şi relaţiile dintre ele, care permit deducerea (inferarea) de noi fapte pe
baza celor cunoscute;
• întrebări, numite şi scopuri, despre obiecte şi relaţiile dintre ele, la care programul răspunde
pe baza faptelor şi regulilor existente.

1.1 Fapte

Faptele sunt predicate de ordinul întâi de aritate n considerate adevărate. Ele stabilesc relaţii între
obiectele universului problemei. Numărul de argumente ale faptelor este dat de aritatea (numărul de
argumente) corespunzătoare a predicatelor.

Exemple:
Fapt: Aritate:
papagal(coco). 1
iubeşte(mihai, maria). 2
iubeşte(mihai, ana). 2
frumoasă(ana). 1
bun(gelu). 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 păstrată la orice altă utilizare a faptului, cu aceeaşi
semnificaţie. Mulţimea faptelor unui program Prolog formează baza de cunoştinţe Prolog. Se va vedea
mai târziu că în baza de cunoştinte a unui program Prolog sunt incluse şi regulile Prolog.

1.2 Scopuri

Obţinerea consecinţelor sau a rezultatului unui program Prolog se face prin fixarea unor scopuri care
pot fi adevărate sau false, în funcţie de conţinutul bazei de cunoştinţe Prolog. Scopurile sunt predicate
pentru care se doreşte aflarea valorii de adevăr în contextul faptelor existente în baza de cunoştinţe.
Cum scopurile pot fi văzute ca întrebări, rezultatul unui program Prolog este răspunsul la o întrebare
(sau la o conjuncţie de întrebări). Acest răspuns poate fi afirmativ, yes, sau negativ, no. Se va vedea
mai târziu că programul Prolog, în cazul unui răspuns afirmativ la o întrebare, poate furniza şi alte
informaţii din baza de cunoştinţe.
Exemplu

Considerând baza de cunoştinţe specificată anterior, se pot pune diverse întrebări, cum ar fi:
?- iubeste(mihai, maria).
yes deoarece acest fapt există în baza de cunoştinţe
?- papagal(coco).
yes
?- papagal(mihai).
no deoarece acest fapt nu există în baza de cunoştinţe
?- inalt(gelu).
no

1.3 Variabile

În exemplele prezentate până acum, argumentele faptelor şi întrebărilor 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 convenţie, numele
argumentelor variabile începe cu literă iar numele constantelor simbolice începe cu literă mică. O
variabilă poate fi instanţiată (legată) dacă există un obiect asociat acestei variabile, sau neinstanţiată
(liberă) dacă nu se ştie încă ce obiect va desemna variabila.

La fixarea unui scop Prolog care conţine variabile, acestea sunt neinstanţiate iar sistemul încearcă
satisfacerea acestui scop căutând printre faptele din baza de cunoştinţe un fapt care poate identifica cu
scopul, printr-o instanţiere 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 cunoştinţe.

La încercarea de satisfacere a scopului, căutarea se face întotdeauna pornind de la începutul bazei de


cunoştinţe. Dacă se întâlneşte un fapt cu un simbol predicativ identic cu cel al scopului, variabilele din
scop se instanţiază conform algoritmului de unificare şi valorile variabilelor astfel obţinute sunt afişate
ca răspuns la satisfacerea acestui scop.

Exemple:

?- papagal(CineEste).
CineEste = coco
?- deplaseaza(Ce, DeUnde, Unde).
Ce = cub, DeUnde = camera1, Unde = camera2
?- deplaseaza(Ce, Aici, Aici).
No

Cum se comportă sistemul Prolog în cazul în care există mai multe fapte în baza de cunoştinţe care
unifică cu întrebarea pusă? În acest caz există mai multe răspunsuri la întrebare, corespunzând mai
multor soluţii ale scopului fixat. Prima soluţie este dată de prima unificare şi există atâtea soluţii câte
unificări diferite există. La realizarea primei unificări se marchează faptul care a unificat şi care
reprezintă prima soluţie. La obţinerea următoarei soluţii, căutarea este reluată de la marcaj în jos în
baza de cunoştinţe. Obţinerea primei soluţii este de obicei numită satisfacerea scopului iar obţinerea
altor soluţii, resatisfacerea scopului. La satisfacera unui scop căutarea se face întotdeauna de la
începutul bazei de cunoştinţe. La resatisfacerea unui scop, căutarea se face începând de la marcajul
stabilit de satisfacerea anterioară a acelui scop.
Sistemul Prolog, fiind un sistem interactiv, permite utilizatorului obţinerea fie a primului răspuns, fie a
tuturor răspunsurilor. În cazul în care, după afişarea tuturor răspunsurilor, un scop nu mai poate fi
resatisfăcut, sistemul răspunde no.

Exemple:

?- iubeste(mihai, X).
X = maria; tastând caracterul “;” şi Enter, cerem o nouă soluţie
X = ana;
no
?- iubeste(Cine, PeCine).
Cine = mihai, PeCine = maria;
Cine = mihai, PeCine = ana;
no

Există deci două soluţii pentru scopul iubeste(mihai, X) şi tot două soluţii pentru scopul
iubeste(Cine, PeCine), considerând tot baza de cunoştinţe prezentată în secţiunea 1.1.

1.4 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 defineşte regula, se numeşte antet de regulă, iar S1, S2, …Sn formează
corpul regulii şi reprezintă conjuncţia de scopuri care trebuie satisfăcute pentru ca antetul regulii să fie
satisfăcut.

Fie următoarea bază de cunoştinţe Prolog:

frumoasa(ana). %1
bun(vlad). %2
cunoaste(vlad, maria). %3
cunoaste(vlad, ana). %4
iubeste(mihai, maria). %5
iubeste(X, Y) :- %6
bun(X),
cunoaste(X, Y),
frumoasa(Y).

Se observă că enunţul (6) defineşte o regulă Prolog; relaţia iubeste(Cine, PeCine), fiind definită atât
printr-un fapt (5) cât şi printr-o regulă (6).

În condiţiile existenţei regulilor în baza de cunoştinţe Prolog, satisfacerea unui scop se face printr-un
procedeu similar cu cel prezentat în Secţiunea 1.2, dar unificarea scopului se încearcă atât cu fapte din
baza de cunoştinţe, cât şi cu antetul regulilor din bază. La unificarea unui scop cu antetul unei reguli,
pentru a putea satisface acest scop trebuie satisfăcută regula. Aceasta revine la a satisface toate faptele
din corpul regulii, deci conjuncţia de scopuri. Scopurile din corpul regulii devin subscopuri a căror
satisfacere se va încerca printr-un mecanism similar cu cel al satisfacerii scopului iniţial.
Pentru baza de cunoştinţe descrisă mai sus, satisfacerea scopului
?- iubeste(vlad, ana).
se va face în următorul mod. Scopul unifică cu antetul regulii (6) şi duce la instanţierea variabilelor din
regula (6): X = vlad ş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(vlad), care reuşeşte
prin unificare cu faptul (2), cunoaste(vlad, ana), care reuşeşte prin unificare cu faptul (4), şi a scopului
frumoasa(ana), care reuşeşte prin unificare cu faptul (1). În consecinţă, regula a fost îndeplinită, deci
şi întrebarea iniţială este adevarată, iar sistemul răspunde yes.

Ce se întîmplă dacă se pune întrebarea:


?- iubeste(X, Y).
Prima soluţie a acestui scop este dată de unificarea cu faptul (5), iar răspunsul este:
X = mihai, Y = maria
Sistemul Prolog va pune un marcaj în dreptul faptului (5) care a satisfăcut scopul. Următoarea soluţie a
scopului iubeste(X, Y) se obţine începând căutarea de la acest marcaj în continuare în baza de
cunoştinţe. 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 satisfăcut de faptul (2) şi variabila X este
instanţiată cu valoarea vlad, X = vlad . Se încearcă acum satisfacerea scopului cunoaste(vlad, Y), care
este satisfăcut de faptul (3) şi determină instanţierea Y = maria. Se introduce în baza de cunoştinţe un
marcaj asociat scopului cunoaste(vlad, Y), care a fost satisfăcut de faptul (3). Se încearcă apoi
satisfacerea scopului frumoasa(maria). Acesta eşuează. În acest moment sistemul intră într-un proces
de backtracking în care se încearcă resatisfacerea scopului anterior satisfăcut, cunoaste(vlad, Y), în
speranţa că o noua soluţie a acestui scop va putea satisface şi scopul curent care a eşuat, frumoasa(Y).
Resatisfacerea scopului cunoaste(vlad, Y) se face pornind căutarea de la marcajul asociat scopului în
jos, deci de la faptul (3) în jos. O nouă soluţie (resatisfacere) a scopului cunoaste(vlad, Y) este dată de
faptul (4) care determină instanţierea Y = ana. În acest moment se încearcă satisfacerea scopului
frumoasa(ana). Cum este vorba de un nou scop, căutarea se face de la începutul bazei de cunoştinţe şi
scopul frumoasa(ana) este satisfăcut de faptul (1). În consecinţă a doua soluţie a scopului
iubeste(X, Y) este obţinută şi sistemul răspunde:
X = vlad, Y = ana
urmând un mecanism de backtracking, descris intuitiv în figura 1 prin prezentarea arborilor de deducţie
construiţi de sistemul Prolog.

La încercarea de resatisfacere a scopului iubeste(X, Y), printr-un mecanism similar, se observă că nu


mai există alte solutii. În concluzie, fiind dată baza de fapte şi reguli Prolog anterioară, comportarea
sistemului Prolog este:

?- iubeste(X, Y).
X = mihai, Y = maria;
X = vlad, Y = ana;
no
iubeste(X,Y)

%5 iubeste(mihai,maria)

SUCCES

solutie 1: X=mihai, Y=maria

iubeste(X,Y)

bun(X) cunoaste(X,Y) %6 frumoasa(Y)

%2 bun(vlad) cunoaste(vlad,Y) frumoasa(maria) %1 frumoasa(ana)

SUCCES %3 cunoaste(vlad,maria) %4 cunoaste(vlad,ana) INSUCCES SUCCES

SUCCES SUCCES

solutie 2: X=vlad, Y=ana

Figura 1. Mecanismul de satisfacere a scopurilor în Prolog

Observaţii:
• La satisfacerea unei conjuncţii de scopuri în Prolog, se încearcă satisfacerea fiecărui scop pe
rând, de la stânga la dreapta. Prima satisfacere a unui scop determină plasarea unui marcaj în
baza de cunoştinţe în dreptul faptului sau regulii care a determinat satisfacerea scopului.
• Dacă un scop nu poate fi satisfăcut (eşuează), sistemul Prolog se întoarce şi încearcă
resatisfacerea scopului din stânga, pornind căutarea în baza de cunoştinţe de la marcaj în jos.
Înainte de resatisfacerea unui scop se elimină toate instanţierile de variabile determinate de
ultima satisfacere a acestuia. Dacă cel mai din stânga scop din conjuncţia de scopuri nu poate
fi satisfăcut, întreaga conjuncţie de scopuri eşuează.
• Această comportare a sistemului Prolog în care se încearcă în mod repetat satisfacerea şi
resatisfacerea scopurilor din conjuncţiile de scopuri se numeşte backtracking.
2 Sintaxa limbajului Prolog

Clasificarea obiectelor din limbajul Prolog este prezentată în figura urmatoare:

structuri
atomi
constante
obiect
numere întregi
obiecte elementare
numere reale
variabile

Un atom este un identificator care începe cu litera mică şi se continuă cu orice înşiruire de litere mici,
litere mari, cifre sau underscore “_” . Dacă se doreşte ca atomul să înceapă cu literă mare sau să conţină
caractere speciale, atunci atomul se încadrează între caractere apostrof.

Exemple de atomi:
dana
nil
x25
x_25
x_25AB
x_
x__y
domnul_popescu
'Ivan Bratko'
'<<------>>'

Un număr întreg este un şir de cifre zecimale, eventual precedate de un semn. Exemple de numere
întregi: 1 +23 1515 0 -97. Numerele reale depind de implementarea de Prolog. În general ele sunt
reprezentate într-o formă similară celor din limbaje gen Pascal, C, etc. Exemple de numere reale: 3.14
-0.0035 100.2 +12.02

O variabilă este un şir de litere, cifre sau underscore ( _ ) care începe cu literă mare sau underscore.
Exemple de variabile:
X
Rezultat
Obiect1
Lista_de_nume
_x23
_23

În Prolog există situaţii în care o variabilă apare o singură dată într-o regulă, caz în care nu avem
nevoie de un nume pentru ea, deoarece nu este referită decât într-un singur loc. De exemplu, dacă
dorim să scriem o regulă care ne spune dacă cineva este fiul cuiva, o soluţie ar fi:
este_fiu(X) :- parinte(Z,X).
Se observă că s-a denumit cu Z un părinte anonim. În acest caz, nu interesează cine apare pe post de
părinte. Pentru a nu încărca regulile cu nume inutile care pot distrage atenţia şi îngreuna citirea
programelor, se pot considera astfel de variabile că anonime, notate cu underscore “_”. Deci regula
anterioară se poate rescrie astfel:
este_fiu(X) :- parinte( _ ,X).

Obiectele structurate, numite pe scurt structuri, sunt acele obiecte formate din mai mulţi constituenţi
sau componente. Componentele pot fi la rândul lor structuri. Pentru a mixa constituenţii într-un singur
obiect avem nevoie de un functor. De exemplu, dacă dorim reprezentarea unui obiect structurat data,
el poate fi:
data(24,august,1997).

În acest caz, componentele sunt: 24, august şi 1997, iar liantul este functorul data. Functorul poate fi
orice atom. Constituenţii pot fi orice obiect Prolog. Să vedem un exemplu de obiect compus din alte
obiecte compuse.

Fie tipul punct(X,Y). Atunci tipul segment poate fi reprezentat ca segment(P1,P2). De exemplu, un
segment, având capetele în punctele (1, 1) şi (2, 3), poate fi reprezentat astfel:
segment(punct(1,1),punct(2,3)).

Există şi cazuri în care un obiect poate avea constituenţi compuşi de adâncime variabilă. De exemplu,
un arbore binar, cu chei numerice poate fi definit astfel:
1) Nodul vid este un arbore; putem nota acest nod vid prin constanta nil;
2) Un nod frunză este un arbore, de exemplu nod(15,nil,nil);
3) Un nod cu succesor stâng şi succesor drept este un arbore, de exemplu
nod(20,ArbStâng,ArbDrept).

De exemplu, reprezentarea în Prolog a arborelui

2 3

4 5 6

7
este nod(1,nod(2,nod(4,nil,nil),nod(5,nod(7,nil,nil),nil)),nod(3,nil,nod(6,nil,nil)))

Aşa cum s-a arătat în prima parte, un program Prolog este o înşiruire de fapte (facts) şi reguli
(rules) care poartă denumirea de clauze (clauses). Faptele şi regulile au o structură comună ceea ce
permite sinteza dinamică de cod care este adăugat în baza de cunoştinţe. Un fapt poate fi privit ca o
regulă care are ca premisă (ipoteză) scopul true, care este adevărat întotdeauna. Astfel:
fapt.
este echivalent cu
fapt :- true.
3 Un program Prolog simplu
place(ellen,tenis). % lui ellen îi place tenisul
place(john,fotbal). % lui john îi place fotbalul
place(tom,baseball). % lui tom îî place baseball-ul
place(eric,înot). % lui eric îi place înotul
place(mark,tenis). % lui mark îi place tenisul
place(bill,X) :- place(tom,X). % lui bill îi place ce îi place lui tom

% Ce sporturi îi plac lui john?


?- place(john,X).
X = fotbal

% Cui îi place tenisul?


?- place(Y,tenis).
Y = ellen;
Y = mark

% Putem pune şi întrebări particulare:


?- place(ellen,tenis).
yes
?- place(ellen,fotbal).
no
?- place(bill,baseball).
yes

4 Probleme propuse
1. Se dă o bază de fapte de forma:
parinte(Parinte,Copil).
barbat(Persoana).
femeie(Persoana).
Se cere:
1) Să se introducă câteva fapte de această formă.
2) Să se scrie regulile care definesc următoarele relaţii de rudenie:
tata(Tata,Copil).
mama(Mama,Copil).
fiu(Parinte,Copil).
fiica(Parinte,Copil).
bunic(Bunic,Copil).
bunica(Bunica,Copil).
nepot(Bunic,Copil).
nepoata(Bunic,Copil).
3) Să se puna următoarele întrebări:
Cine este părintele lui Dan?
Cine este fiu?
Cine este bunic?
Cine este si fiu şi tată?

2. Fie faptele:
figura(triunghi,albastru,3).
figura(patrat,rosu,4).
figura(romb,albastru,4).
figura(paralelogram,verde,4).
figura(pentagon,rosu,5).
Se cere:
1) Sa se scrie o regula care sa defineasca patrulaterele (de orice culoare).
2) Sa se scrie o regula care sa defineasca figurile geometrice cu cel putin 4 laturi (de orice
culoare).
3) Sa se puna urmatoarele intrebari:
Ce figuri sunt roşii?
Ce figuri au 3 laturi?
Ce figuri au 4 laturi si sunt verzi?

3. Doi copii pot juca un meci într-un turneu de tenis dacă au aceeaşi vârstă. Fie următorii copii şi
vârstele lor:
copil(peter, 9).
copil(paul, 10).
copil(chris, 9).
copil(susan, 9).
Scrieti o regula care sa determine toate perechile de copii care pot juca un meci într-un turneu de tenis.

4. Scrieti un program Prolog care să îi găseasca Anei un partener la bal. Ea doreşte sa mearga cu un
bărbat care este nefumător sau vegetarian. Pentru aceasta dispunem de o bază de date cu informaţii
despre câţiva bărbaţii:
barbat(gelu).
barbat(bogdan).
barbat(toma).
fumator(toma).
fumator(dan).
vegetarian(gelu).

5. Fie o baza de date cu drumuri intre orase de forma:


drum(bucuresti,ploiesti).
drum(bucuresti,cheia).
drum(cheia,sinaia).
drum(ploiesti,sinaia).
drum(ploiesti,brasov).
Sa se scrie un predicat care spune daca se poate ajunge de la un oras la altul.

6. Se dau următoarele enunţuri:


1) Oricine poate citi este literat.
2) Delfinii nu sunt literaţi.
3) Anumiţi delfini sunt inteligenţi.
Sa se conceapa un program logic care sa reprezinte aceste fapte si sa se utilizeze acest program
pentru a demonstra urmatorul enunt: "Exista inteligenti care nu pot citi".

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