Documente Academic
Documente Profesional
Documente Cultură
Limbajul Prolog
Prolog are un cmp de aplicaii foarte larg: baze de date relaionale, inteligen artificial,
logic matematic, demonstrarea de teoreme, sisteme expert, rezolvarea de probleme
abstracte sau ecuaii simbolice, etc.
Nu exist standard pentru programare orientat obiect n Prolog, exist doar extensii:
TrincProlog, SWI-Prolog.
SWI-Prolog 1986
ofer o interfa bidirecional cu limbajele C i Java
folosete XPCE un sistem GUI orientat obiect
multithreading bazat pe suportul multithreading oferit de limbajul standard C.
Program Prolog
caracter descriptiv: un program Prolog este o colecie de definiii ce descriu relaii sau funcii
de calculat reprezentri simbolice de obiecte i relaii ntre obiecte. Soluia problemelor nu
se mai vede ca o execuie pas cu pas a unei secvene de instruciuni.
1
p q se transcrie n Prolog folosind clauza q :- p. ( q if p.)
Exemple
Logic Prolog
x p ( x) q ( x) r ( x) r ( X ) : - p( X ), q( X ).
x w( x) s ( x) p ( x) p( X ) : -w( X ).
p ( X ) : -s ( X ).
x t ( x) s( x) q( x) s ( X ) : -t ( X ).
q ( X ) : -t ( X ).
t (a ) t (a ).
w(b) w(b) .
Concluzie r (a )
Logic Prolog
x s ( x) p ( x) q ( x) ????
1. Termen
SIMPLU
a. constant
simbol (symbol)
o secven de litere, cifre, _
o ncepe cu liter mic
numr =ntreg, real (number)
ir de caractere (string): text (caracter: c, \t,...)
b. variabil
secven de litere, cifre, _
ncepe cu liter mare
variabila anonim este reprezentat de caracterul underline (_).
COMPUS (a se vedea Seciunea 13).
o listele (list) sunt o clas special de termeni compui
2
2. Comentariu
% Acesta este un comentariu
/* Acesta este un comentariu */
3. Predicat
Tipuri
!!! lista vid [] este singura list care e considerat n Prolog atom.
Convenii.
4. Clauza
fapt
o relaie ntre obiecte
o nume_predicat [(obiect [, obiect....)]
regula
o permite deducere de fapte din alte fapte
Exemplu:
fie predicatele
3
tata(X, Y) reprezentnd relaia Y este tatl lui X
mama(X, Y) reprezentnd relaia Y este mama lui X
mama(a,b).
mama(e,b).
tata(c,d).
tata(a,d).
Clauze n Prolog
parinte(X,Y) :-tata(X,Y).
parinte(X,Y) :-mama(X,Y).
frate(X,Y) :-parinte(X,Z),parinte(Y,Z),X\=Y.
5. Intrebare (goal)
?- parinte(a,b). ?- parinte(a,X).
true. X=d;
X=b.
? - parinte(a,f).
false.
?- frate(a,X). ?- frate(a,_).
X=c; true.
X=e.
Observaie. Este important de reinut c nu se pot stoca informaii prin atribuire de valori unor
variabile. Variabilele sunt folosite ca parte a unui proces de potrivire, nu ca un tip de stocare de
informaii.
4
Ce este o potrivire?
Iat cteva reguli care vor explica termenul 'potrivire':
Observaie. Mecanismul prin care Prolog ncearc s potriveasc partea din ntrebare pe care
doreste s o rezolve cu un anumit predicat se numeste unificare.
4. Modele de flux
n Prolog, legrile de variabile se fac n dou moduri: la intrarea n clauz sau la ieirea din
clauz. Direcia n care se leag o valoare se numete model de flux. Cnd o variabil este dat
la intrarea ntr-o clauz, aceasta este un parametru de intrare (i), iar cnd o variabil este dat la
ieirea dintr-o clauz, aceasta este un parametru de ieire (o). O anumit clauz poate s aib mai
multe modele de flux. De exemplu clauza
factorial (N, F)
Observaie. Proprietatea unui predicat de a funciona cu mai multe modele de flux depinde de
abilitatea programatorului de a programa predicatul n mod corespunztor.
5. Sintaxa regulilor
Regulile sunt folosite n Prolog cnd un fapt depinde de succesul (veridicitatea) altor fapte sau
succesiuni de fapte. O regul Prolog are trei prti: capul, corpul i simbolul if (:-) care le separ
pe primele dou.
capul regulii :-
5
subgoal,
subgoal,
...,
subgoal.
Fiecare subgoal este un apel la un alt predicat Prolog. Cnd programul face acest apel, Prolog
testeaz predicatul apelat s vad dac poate fi adevarat. Odat ce subgoal-ul curent a fost
satisfcut (a fost gsit adevrat), se revine i procesul continu cu urmtorul subgoal. Dac
procesul a ajuns cu succes la punct, regula a reuit. Pentru a utiliza cu succes o regul, Prolog
trebuie s satisfac toate subgoal-urile ei, crend o mulime consistent de legri de variabile.
Dac un subgoal eueaz (este gsit fals), procesul revine la subgoal-ul anterior i caut alte
legri de variabile, i apoi continu. Acest mecanism se numete backtracking.
6. Operatori de egalitate
6
7. Operatori aritmetici
!!! Important
2+4 e doar o structur, utilizarea sa nu efectueaz adunarea
Utilizarea 2+4 nu e aceeai ca utilizarea lui 6.
Operatori aritmetici
?- X is 2+4-1. ?- X is 5.
X=5 X=5
Inegaliti
7
true true true
8. Predicate predefinite
Prolog ofer o modalitate de a gsi toate soluiile unui predicat n acelai timp: predicatul
findall, care colecteaz ntr-o list toate soluiile gsite.
8
?- \+ (2 = 4). ?- not(2 = 4).
true. true.
Turbo Prolog conine predicatul cut (!) folosit pentru a preveni backtracking-ul. Cnd se
proceseaz predicatul !, apelul reuete imediat i se trece la subgoalul urmtor. O dat ce s-a
trecut peste o tietur, nu este posibil revenirea la subgoal-urile plasate naintea ei i nu este
posibil backtracking-ul la alte reguli ce definesc predicatul n execuie.
1. Cnd tim dinainte c anumite posibiliti nu vor duce la soluii, este o pierdere de timp s
lsm sistemul s lucreze. n acest caz, tietura se numete tietur verde.
2. Cnd logica programului cere o tietur, pentru prevenirea lurii n consideraie a subgoal-
urilor alternative, pentru a evita obinerea de soluii eronate. n acest caz, tietura se numete
tietur roie.
Tietura poate fi utilizat pentru a-i spune sistemului Prolog c a ales corect clauza
pentru un predicat particular. De exemplu, fie codul urmtor:
r(1) :- !, a, b, c.
r(2) :- !, d.
r(3) :- !, e.
r(_) :- write("Aici intr resul apelurilor").
Observaie. Acest tip de structur este echivalent cu o instruciune de tip case unde condiia de
test a fost inclus n capul clauzei. La fel de bine s-ar fi putut spune i
r(X) :- X = 1, !, a, b, c.
r(X) :- X = 2, !, d.
r(X) :- X = 3, !, e.
r(_) :- write("Aici intra restul apelurilor").
9
Not. Deci, urmtoarele secvene sunt echivalente:
case X of
v1: corp1; predicat(X) :- X = v1, !, corp1.
v2: corp2; predicat(X) :- X = v2, !, corp2.
... ...
else corp_else. predicat(X) :- corp_else.
Valoarea lui fail este eec. Prin aceasta el ncurajeaz backtracking-ul. Efectul lui este
acelai cu al unui predicat imposibil, de genul 2 = 3. Fie urmtorul exemplu:
predicat(a, b).
predicat(c, d).
predicat(e, f).
toate :-
predicat(X, Y),
write(X),write(Y),nl,
fail.
toate1 :-
predicat(X, Y),
write(X),write(Y),nl.
?- toate. ?-toate1.
ab ab
cd true ;
ef cd
false. true ;
ef
true.
10
?-predicat(X,Y).
X = a,
Y=b;
X = c,
Y=d;
X = e,
Y = f.
Faptul c apelul predicatului toate se termin cu fail (care eueaz ntotdeauna) oblig
Prolog s nceap backtracking prin corpul regulii toate. Prolog va reveni pn la ultimul apel
care poate oferi mai multe soluii. Predicatul write nu poate da alte soluii, deci revine la apelul
lui predicat.
Observaii.
Acel false de la sfritul soluiilor semnific faptul c predicatul toate nu a fost
satisfcut.
Dupa fail nu are rost s punei nici un predicat, deoarece Prolog nu va ajunge s-l
execute niciodat.
11
data(2, februarie, 1998)
Aceasta seamn cu un fapt Prolog, dar nu este dect un obiect (o dat) pe care l putem
manevra la fel ca pe un simbol sau numr. Din punct de vedere sintactic, ncepe cu un nume (sau
functor, n acest caz cuvntul data) urmat de trei argumente.
Not. Functorul n Prolog nu este acelai lucru cu funcia din alte limbaje de programare. Este
doar un nume care identific un tip de date compuse i care ine argumentele laolalt.
Argumentele unei date compuse pot fi chiar ele compuse. Iat un exemplu:
natere(persoana(Ioan, Popescu), data(2, februarie, 1918))
Un obiect compus se poate unifica fie cu o variabila simpl, fie cu un obiect compus care
se potrivete cu el. De exemplu,
Observaii
Convenim s folosim urmtoarea declaraie pentru specificarea unui domeniu cu
alternative
% domeniu = alternativa1(dom, dom, ..., dom);
% alternativa2(dom, dom, ..., dom);
% ...
Functorii pot fi folosii pentru controla argumentele care pot avea tipuri multiple
% element = i(integer); r(real); s(string)
Totui, exist un caz special cnd o procedur se apeleaz pe ea far s genereze cadru
de stiv. Dac procedura apelatoare apeleaz o procedur ca ultim pas al sau (dup acest apel
urmeaz punctul). Cnd procedura apelat se termin, procedura apelatoare nu mai are altceva
de fcut. Aceasta nseamn c procedura apelatoare nu are sens s-i memoreze stadiul
execuiei, deoarece nu mai are nevoie de acesta.
12
Funcionarea recursivitii de coad
Iat un exemplu:
tip(N) :-
write(N),
nl,
Nou is N + 1,
tip(Nou).
1. Dac apelul recursiv nu este ultimul pas, procedura nu folosete recursivitatea de coad.
Exemplu:
tip (N) :-
write(N),
nl,
Nou is N + 1,
tip (Nou),
nl.
Exemplu:
tip(N) :-
write(N),
nl,
Nou is N + 1,
tip(Nou).
tip(N) :-
N < 0,
write(N este negativ.).
13
Aici, prima clauz se apeleaz nainte ca a doua s fie ncercat. Dup un anumit numr
de pai intr n criz de memorie.
Exemplu:
tip (N) :-
write(N),
nl,
Nou is N + 1,
verif(Nou),
tip(Nou).
verif(Z) :- Z >= 0.
verif(Z) :- Z < 0.
Dac N este pozitiv, prima clauz a predicatului verif a reuit, dar a doua nu a fost
ncercat. Deci, tip trebuie s-i pastreze o copie a cadrului de stiv.
A doua i a treia situaie de mai sus pot fi nlturate dac se utilizeaz tietura, chiar dac
exist alternative nencercate.
tip (N) :-
N>= 0,
!,
write(N),
nl,
Nou = N + 1,
tip(Nou).
tip(N) :-
N < 0,
write("N este negativ.").
Exemplu la situaia a treia:
tip(N) :-
write(N),
nl,
Nou = N + 1,
verif(Nou),
!,
tip(Nou).
verif(Z) :- Z >= 0.
verif(Z) :- Z < 0.
14