Sunteți pe pagina 1din 10

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

Aritmetica, comparaii
Expresii aritmetice
Expresiile aritmetice constau din operanzi (constante numerice i variabile), operatori (+, -, *, /, div i
mod) i paranteze. Simbolurile din partea dreapt a semnului = ( care este predicatul = ) de mai jos
formeaz o expresie aritmetic:
A = 1 + 6 / (11 + 3) * Z
Valoarea unei expresii poate fi calculat dac toate variabilele sunt legate la momentul evalurii.
Calculele se fac ntr-o anumit ordine determinat de prioritatea operatorilor aritmetici: operatorii cu
cea mai mare prioritate sunt evaluai primii.
Operaii aritmetice
Tipul rezultatului unei operaii aritmetice este dat de urmatorul tabel:
Operand1
ntreg
real
ntreg
real
ntreg,real
ntreg
ntreg

Operator
+,-,*
+,-,*
+,-,*
+,-,*
/
div
mod

Operand2
ntreg
ntreg
real
real
ntreg,real
ntreg
ntreg

Rezultat
ntreg
real
real
real
real
ntreg
ntreg

Ordinea evalurii
1. Subexpresiile din paranteze se evalueaz primele.
2. Apoi, se execut nmulirile (*) sau mpririle (/, div, mod), lucrnd de la stnga la dreapta.
3. Apoi se execut adunrile (+) i scderile (-), lucrnd de la stnga la dreapta.
Funcii i predicate
Funcii
X mod Y
X div Y
abs(X)

Explicaie
restul mpririi lui X la Y
ctul mpririi lui X la Y
valoarea absolut a lui X

cos(X), sin(X) , tan(X)

funciile trigonometrice cer ca X s fie legat de o valoare


reprezentnd unghiul n radiani

arctan(X)
exp(X
ln(X)
log(X)

arctangenta valorii reale de care e legata X


e la puterea X
logaritm din X, n baza e
logaritm din X, n baza 10
1

Inteligen Artificial PROLOG


sqrt(X)
random(X)
random(X, Y)
round(X)
trunc(X)

Lucrarea de laborator nr. 5

rdcina ptrat a lui X


leag X de o valoare real aleatoare, 0 <= X < 1
leag Y de o valoare ntreag aleatoare, 0 <= Y < X
ntoarce valoarea rotunjit a lui X
ntoarce valoarea trunchiat a lui X

ntrebare: Ce returneaz scopul t(X) ?


predicates
t(real)
clauses
t(X):- X = 9.0 / 3.0.
Operaii pe bii:
Operaii pe bii
bitand(X,Y,Z)
bitor(X,Y,Z)

Explicaie
"si bit cu bit" intre bitii cuvintelor X si Y
"sau bit cu bit" "
"

bitnot(X,Z)

"negarea lui X"

bitxor(X,Y,Z)
bitleft(X,N,Z)
bitright(X,N,Z)=

"sau exclusiv" intre X si Y


deplasare cu N pozitii la stanga
deplasare cu N pozitii la dreapta

Observaii
- rezultatul este ntotdeauna depus n Z care este un ntreg;
- n momentul executrii unei operaii pe bii, variabilele X i Y trebuie s fie legate.
Comparaii
T.Pro. poate compara expresii aritmetice, caractere, string-uri i simboluri.
n T.Pro. se folosete notaia nfix, ceea ce nseamn c operatorii sunt plasai ntre operanzi (ex: X < 4)
i nu naintea lor (ex: <(X, 4)).
Iat operatorii relaionali permii n T.Pro.:

<
mai mic
<= mai mic sau egal
>
mai mare
<= mai mare sau egal
=
egal
<>, ><diferit (neegal)
2

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

Egalitate i predicatul egal ( = )


n T.Pro. propoziii precum N = N1 - 2 indic fie o relaie ntre trei obiecte (N, N1, 2) fie o relaie ntre
dou obiecte (N i valoarea N1 - 2).
Dac N este variabila liber, propoziia este satisfcut legnd pe N de rezultatul evalurii N1 - 2.
Aceasta corespunde unei instruciuni de atribuire din limbajele de programare.
Dac N este o variabil legat, atunci propoziia este satisfacut dac relaia de egalitate are loc.
De remarcat c n ambele situaii variabila N1 trebuie s fie legat.
S considerm exemplele urmtoare:
1. predicates
plus(integer,integer,integer)
minus(integer,integer,integer)
less_than(integer,integer)
clauses
plus(X,7,Z):-Z=X+7.
minus(9,Y,W):-W=9-Y.
less_than(X,Y):-plus(X,7,Z),minus(9,Y,W),Z<W.
Verifcai cazurile: - less_than(10,4)
- less_than(1,0)

Rspuns: No
Rspuns: Yes

2. Un exemplu clasic de utilizare a "aritmeticii" este rezolvarea ecuaiei de gradul II:


predicates
soluie(real,real,real)
unu(real,real,real)
doi(real,real,real)
radical(real,real)
clauses
soluie(A,B,C):-A<>0,
D=B*B-4*A*C,doi(A,B,D),nl,!.
soluie(A,B,C):-unu(A,B,C),nl,!.
doi(A,B,D):-D>=0,
radical(D,Rad),
X1=(-B+Rad)/(2*A),
X2=(-B-Rad)/(2*A),
write("X1=",X1," X2=",X2).
doi(A,B,D):- D1=-D,
radical(D1,Rad),
X1=-B/(2*A), X2=Rad/(2*A),
write("Soluii complex conjugate, Partea Real=", X1,"\n"," Coeficienii Prii
Imaginare=",X2),nl,!.
unu(_,B,C):-B<>0, X=-C/B,
write("Ecuaia este de gradul I. X=",X),nl,!.
unu(_,_,C):-C=0,
write("Ecuaie nedeterminat!"),nl,!.
3

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

unu(_,_,_):- write("Ecuaie imposibil!"),nl.


radical(D,Rad):-Rad=sqrt(D).

Compararea caracterelor, string-urilor i symbol-urilor


Caractere
Cnd T.Pro. compar
'a' < 'b'
el convertete aceast expresie la expresia artimetic echivalent 97 < 98, folosind codurile ASCII ale
caracterelor de comparat.
String-uri
Comparaia
"antony" > "antonia"
se evalueaz la adevrat, deoarece cele dou string-uri difer prima oar la poziia unde primul conine
litera y (79 ASCII) iar al doilea conine litera i (69 ASCII).
n aceeasi logic,
"aa" > "a"
este adevrat.
Simboluri
Simbolurile nu pot fi comparate direct, din motive de sintax. Ele trebuie s fie mai nti legate de
variabile:
P1 = peter, P2 = sally, P1 > P2
Tema 6
Utiliznd operaiile i funciile aritmetice s se construiasc o problem care simuleaz un joc cu zaruri.

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

Backtracking, Predicatele CUT i FAIL


Backtracking
Fie programul urmtor:
domains
child = symbol
age = integer
predicates
player(child, age)
clauses
player(peter, 9).
player(paul, 10).
player(chris, 9).
player(susan, 9).
Dorim s aflm toate perechile de copii n vrst de 9 ani. Adresm urmtoarea ntrebare T.Pro.:
player(P1, 9),
player(P2, 9),
P1 <> P2.
Iat mecanismul prin care T.Pro. gsete soluiile:
1. T.Pro. gsete soluie la primul sub-goal, mergnd de sus n jos: P1 va fi legat de peter
2. T.Pro. gsete soluie la al doilea subgoal: P2 va fi legat de peter.
3. T.Pro. ncearc s verifice al treilea subgoal: P1 si P2 sunt ambele legate de peter, deci eec.
4. T.Pro. revine la al doilea subgoal. Urmtoarea soluie: P2 e legat de chris.
5. T.Pro. verific condiia a treia: P1 si P2 sunt diferite, rezult o soluie:
P1=peter, P2=chris
6. T.Pro. revine la al doilea subgoal. Urmtoarea soluie: P2 e legat de susan.
7. T.Pro. verific condiia a treia: P1 si P2 sunt diferite, rezult o soluie:
P1=peter, P2=susan
8. T.Pro. revine la al doilea subgoal, dar nu mai gsete alte soluii.
9. T.Pro. revine la primul subgoal. Urmtoarea soluie: P1 e legat de chris.
10. T.Pro. trece la al doilea subgoal: P2 va fi legat de peter.
11. T.Pro. verific condiia a treia: P1 si P2 sunt diferite, rezult o soluie:
P1=chris, P2=peter
.a.m.d. n final, T.Pro. gsete ase soluii:
P1=peter, P2=chris
P1=peter, P2=susan
P1=chris, P2=peter
P1=chris, P2=susan
P1=susan, P2=peter
5

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

P1=susan, P2=chris
6 Solutions
Not
T.Pro. a gsit soluii redundante. Mecanismul backtracking face de data aceasta cautare nenecesar.
Pentru alterarea mecanismului backtracking, T.Pro. ofer doua predicate:
- fail, care foreaz backtracking-ul;
- ! (cut, taietura), care mpiedic backtracking-ul.
Utilizarea predicatului fail
Valoarea lui fail este eec. Prin aceasta el ncurajeaz backtracking-ul. Efectul lui este acelai cu al unui
predicat imposibil, de genul 2 = 3.
Exemplu:
domains
nume = symbol
predicates
tatl(nume, nume)
oricine
oricine1
clauses
tatl(gheorghe,maria).
tatl(vasile,ion).
tatl(vasile,elena).
oricine :tatl(X, Y),
write(X, " este tatl lui ", Y, "\n"),
fail.
oricine1 :tatl(X, Y),
write(X, " este tatl lui ", Y, "\n").
Rspunsul la ntrebarea
oricine1.
va fi
gheorghe este tatl lui maria
Yes
iar rspunsul la ntrebarea
oricine
va fi
gheorghe este tatl lui maria
vasile este tatl lui ion
6

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

vasile este tatl lui elena


No
Faptul c apelul lui oricine se termin cu fail (care eueaz ntotdeauna) oblig T.Pro. s nceap
backtrackingul prin corpul regulii oricine. Prolog va reveni pn la ultimul apel care poate oferi mai
multe soluii. Un astfel de apel se numete apel nedeterminist. Predicatul write nu poate da alte soluii,
deci revine la apelul lui tatl.
Observatii:
1. Acel No semnific faptul c predicatul oricine nu a fost satisfcut.
2. Dup fail nu are rost s punei nici un predicat, deoarece Prolog nu va ajunge s-l execute
niciodat.
Not
Secvena Pseudocod echivalent cu predicatul oricine este:
ct timp tatl(X, Y) are soluii execut
write(...)
Deci, secvenele urmtoare sunt echivalente
cat timp conditie
executa
corp

predicat :conditie,
corp,
fail.

Utilizarea predicatului ! (cut)


T.Pro. conine predicatul cut (!) folosit pentru a preveni backtracking-ul.
Cnd se proceseaz predicatul !, apelul reuete imediat i se trece la subgoalul urmtor. Odat ce s-a
trecut peste o tietur, nu este posibil revenirea la subgoal-urile plasate naintea ei i nu este posibil
backtrack-ul la alte reguli ce definesc predicatul n execuie.
Exist dou utilizri importante ale tieturii:
1. Cnd tii dinainte c anumite posibiliti nu vor duce la soluii semnificative, este o pierdere
de timp s lsai Prolog-ul s lucreze. n acest caz, tietura se numete tietur verde.
2. Cnd logica programului cere o tietur, pentru prevenirea lurii n consideraie a subgoalurilor alternative. n acest caz, tietura se numete tietur roie.
Prevenirea backtrack-ului la un subgoal anterior
Utilizare:
r1 :- a, b, !, c.
Aceasta este o modalitate de a spune c suntei mulumii cu primele soluii descoperite cu subgoalurile a i b. Dei T.Pro. ar putea gsi mai multe soluii prin apelul la c, nu este autorizat s revin la a i
b. Deasemenea,nu este autorizat s revin la alt clauz care definete predicatul r1.

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

Prevenirea backtrack-ului la urmtoarea clauz


Tietura poate fi utilizat pentru a-i spune T.Pro. 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 restul apelurilor).
Folosirea tieturii face predicatul r determinist. Aici, T.Pro. apeleaz predicatul r cu un argument
ntreg. S presupunem c apelul este r(1). T.Pro. caut o potrivire a apelului. O gsete la prima clauz.
Faptul c imediat dup intrarea n clauz urmeaz o tietur, mpiedic T.Pro. s mai caute i alte
potriviri ale apelului r(1) (cu alte clauze).
Observaie
Acest tip de structur este echivalent cu un 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 intr restul apelurilor).
Note
1. Deci, urmtoarele secvene sunt echivalente:
case X of
v1: corp1;
v2: corp2;
...
else corp_else.

predicat(X) :- X = v1, !, corp1.


predicat(X) :- X = v2, !, corp2.
...
predicat(X) :- corp_else.

2. De-asemenea, urmtoarele secvene sunt echivalente:


if cond1 then
corp1
else if cond2 then
corp2
...
else
corp_else.

predicat(...) :cond1, !, corp1.


predicat(...) :cond2, !, corp2.
...
predicat(...) :corp_else.

Tema 7
Rulai urmtorul program aa cum este scris mai jos, iar apoi scoatei tietura (!) i analizai
rezultatele obinute.
domains
nume=symbol
predicates
8

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

tatl(nume,nume)
ef(nume,nume)
citete(nume)
oricine(nume,nume,nume,nume,nume)
clauses
tatl(gheorghe,maria).
tatl(vasile,ion).
citete(carte).
citete(ziar).
ef(ana,viorica).
ef(nae,nicu).
oricine(X,Y,Z,V,W):-tatl(X,Y),citete(Z),!,ef(V,W).
Predicatul not
Sintaxa:
not(subgoal(Arg1, ..., ArgN))
Predicatul not reuete atunci cnd subgoal-ul care este argument al lui not nu poate fi dovedit adevrat.
Dac subgoal-ul este apelat cu variabile libere,T.Pro. va emite eroare: Variabilele libere nu sunt
autorizate n NOT.
De exemplu, fie secvena:
place(bill, Cineva) :place(sue, Cineva),
not(uraste(bill, Cineva)).
Acest enun este echivalent cu: lui Bill i place de cineva dac i lui Sue i place, i dac Bill nu l
urte.
De observat c, la intrare, Cineva este liber, dar la ieirea din primul subgoal, Cineva este legat. Astfel,
la intrarea n not, Cineva este legat, i totul va funciona bine.
Dac se inverseaz ordinea clauzelor, rezultatul nu va mai fi corect, deoarece la intrarea n not Cineva
va fi variabil liber. Folosirea variabilei anonime (_) n not n locul lui Cineva tot nu va rezolva
problema.
Direcii de flux
n Prolog, legrile de variabile se fac n dou moduri: la intrarea n clauz sau la ieirea din clauz.
Direcia n care este trecut o valoare se numete 'direcia de flux'. Cnd o variabil este dat la intrarea
ntr-o clauz este un parametru de intrare (i), iar cnd o variabil este dat la ieirea dintr-o clauz este
un parametru de ieire (o). O anumit clauz poate s aib mai multe modele de flux.
S analizm aceste direcii de flux pe exemplul cu factorial.
factorial(N,F)
9

Inteligen Artificial PROLOG

Lucrarea de laborator nr. 5

este predicatul care va calcula factorialul lui N poate avea urmtoarele direcii de flux:
(i,i) - verific dac N!=F : factorial(3,6) --> Yes;
(i,o) - atribuie F:= N! : factorial(4,F) --> F=24;
(o,i) - gsete acel N pt. care N! = F : pentru acest caz trebuie construit alt program;
(o,o) - ? situaia este absurd factorial(N,R), se obine eroare de compilare.
S regndim problema pentru cazul (o,i):

Varianta clasic pentru limbajele procedurale este:


i=2;
while(m mod i=0) do
begin
m:=m div i;
i:=i+1;
end;
if (m=1) then n:=i-1;
Varianta PROLOG este:
domains
n = real
f = integer
predicates
fact(f,f)
fact1(f,f,f)
clauses
fact(0,1).
fact(N,M) :- I=2, fact1(N,M,I).
fact1(N,M,I) :- M mod I = 0,
M1=M div I, I1=I+1,
fact1(N,M1,I1).
fact1(N,1,I):-N=I-1.

Tem 8
Scriei un predicat care rezolv problema ridicrii la putere:
power(X,Y,Z) unde Z = X la puterea Y.

10

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