Documente Academic
Documente Profesional
Documente Cultură
Aritmetica, comparaţii
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 evaluării.
Calculele se fac într-o anumită ordine determinată de prioritatea operatorilor aritmetici: operatorii cu
cea mai mare prioritate sunt evaluaţi primii.
Operaţii aritmetice
Ordinea evaluării
1. Subexpresiile din paranteze se evaluează primele.
2. Apoi, se execută înmulţirile (*) sau împărţirile (/, div, mod), lucrând de la stânga la dreapta.
3. Apoi se execută adunările (+) şi scăderile (-), lucrând de la stânga la dreapta.
Funcţii şi predicate
Funcţii Explicaţie
X mod Y restul împărţirii lui X la Y
X div Y câtul împărţirii lui X la Y
abs(X) valoarea absolută a lui X
1
Inteligenţă Artificială – PROLOG Lucrarea de laborator nr. 3
predicates
t(real)
clauses
t(X):- X = 9.0 / 3.0.
Operaţii pe biţi:
Observaţii
- rezultatul este întotdeauna depus în Z care este un întreg;
- în momentul executării unei operaţii pe biţi, variabilele X şi Y trebuie să fie legate.
Comparaţii
În T.Pro. se foloseşte notaţia înfix, ceea ce înseamnă că operatorii sunt plasaţi între operanzi (ex: X < 4)
şi nu înaintea lor (ex: <(X, 4)).
2
Inteligenţă Artificială – PROLOG Lucrarea de laborator nr. 3
În T.Pro. propoziţii precum N = N1 - 2 indică fie o relaţie între trei obiecte (N, N1, 2) fie o relaţie între
două obiecte (N şi valoarea N1 - 2).
Dacă N este variabila liberă, propoziţia este satisfăcută legând pe N de rezultatul evaluării N1 - 2.
Aceasta corespunde unei instrucţiuni de atribuire din limbajele de programare.
Dacă N este o variabilă legată, atunci propoziţia este satisfacută dacă relaţia de egalitate are loc.
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.
predicates
soluţie(real,real,real)
unu(real,real,real)
doi(real,real,real)
radical(real,real)
clauses
soluţie(A,B,C):-A<>0,
D=B*B-4*A*C,doi(A,B,D),nl,!.
soluţie(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("Soluţii complex conjugate, Partea Reală=", X1,"\n"," Coeficienţii Părţii
Imaginare=",X2),nl,!.
unu(_,B,C):-B<>0, X=-C/B,
write("Ecuaţia este de gradul I. X=",X),nl,!.
unu(_,_,C):-C=0,
write("Ecuaţie nedeterminată!"),nl,!.
3
Inteligenţă Artificială – PROLOG Lucrarea de laborator nr. 3
Caractere
el converteşte această expresie la expresia artimetică echivalentă 97 < 98, folosind codurile ASCII ale
caracterelor de comparat.
String-uri
Comparaţia
se evaluează la adevărat, deoarece cele două string-uri diferă prima oară la poziţia unde primul conţine
litera y (79 ASCII) iar al doilea conţine litera i (69 ASCII).
În aceeasi logică,
este adevărat.
Simboluri
Simbolurile nu pot fi comparate direct, din motive de sintaxă. Ele trebuie să fie mai întâi legate de
variabile:
Tema
Utilizând operaţiile şi funcţiile aritmetice să se construiască o problemă care simulează un joc cu zaruri.
4
Inteligenţă Artificială – PROLOG Lucrarea de laborator nr. 3
Backtracking
domains
child = symbol
age = integer
predicates
player(child, age)
clauses
player(peter, 9).
player(paul, 10).
player(chris, 9).
player(susan, 9).
Dorim să aflăm toate perechile de copii în vârstă de 9 ani. Adresăm următoarea întrebare T.Pro.:
player(P1, 9),
player(P2, 9),
P1 <> P2.
1. T.Pro. găseşte soluţie la primul sub-goal, mergând de sus în jos: P1 va fi legat de peter
2. T.Pro. găseşte soluţie 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 eşec.
4. T.Pro. revine la al doilea subgoal. Următoarea soluţie: P2 e legat de chris.
5. T.Pro. verifică condiţia a treia: P1 si P2 sunt diferite, rezultă o soluţie:
P1=peter, P2=chris
P1=peter, P2=susan
P1=chris, P2=peter
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. 3
P1=susan, P2=chris
6 Solutions
Notă
T.Pro. a găsit soluţii redundante. Mecanismul backtracking face de data aceasta cautare nenecesară.
Valoarea lui fail este eşec. Prin aceasta el încurajează backtracking-ul. Efectul lui este acelaşi cu al unui
predicat imposibil, de genul 2 = 3.
Exemplu:
domains
nume = symbol
predicates
tatăl(nume, nume)
oricine
oricine1
clauses
tatăl(gheorghe,maria).
tatăl(vasile,ion).
tatăl(vasile,elena).
oricine :-
tatăl(X, Y),
write(X, " este tatăl lui ", Y, "\n"),
fail.
oricine1 :-
tatăl(X, Y),
write(X, " este tatăl lui ", Y, "\n").
Răspunsul la întrebarea
oricine1.
va fi
gheorghe este tatăl lui maria
Yes
oricine
va fi
6
Inteligenţă Artificială – PROLOG Lucrarea de laborator nr. 3
Faptul că apelul lui oricine se termină cu fail (care eşuează întotdeauna) obligă T.Pro. să înceapă
backtrackingul prin corpul regulii oricine. Prolog va reveni până la ultimul apel care poate oferi mai
multe soluţii. Un astfel de apel se numeşte apel nedeterminist. Predicatul write nu poate da alte soluţii,
deci revine la apelul lui tatăl.
Observatii:
1. Acel No semnifică faptul că predicatul oricine nu a fost satisfăcut.
2. După fail nu are rost să puneţi nici un predicat, deoarece Prolog nu va ajunge să-l execute
niciodată.
Notă
Secvenţa Pseudocod echivalentă cu predicatul oricine este:
Când se procesează predicatul !, apelul reuşeşte imediat şi se trece la subgoalul următor. Odată ce s-a
trecut peste o tăietură, nu este posibilă revenirea la subgoal-urile plasate înaintea ei şi nu este posibil
backtrack-ul la alte reguli ce definesc predicatul în execuţie.
2. Când logica programului cere o tăietură, pentru prevenirea luării în consideraţie a subgoal-
urilor alternative. În acest caz, tăietura se numeşte tăietură roşie.
Utilizare:
r1 :- a, b, !, c.
Aceasta este o modalitate de a spune că sunteţi mulţumiţi cu primele soluţii descoperite cu subgoal-
urile a şi b. Deşi T.Pro. ar putea găsi mai multe soluţii prin apelul la c, nu este autorizat să revină la a şi
b. Deasemenea,nu este autorizat să revină la altă clauză care defineşte predicatul r1.
7
Inteligenţă Artificială – PROLOG Lucrarea de laborator nr. 3
Tăietura poate fi utilizată pentru a-i spune T.Pro. că a ales corect clauza pentru un predicat particular.
r(1) :- !, a, b, c.
r(2) :- !, d.
r(3) :- !, e.
r(_) :- write(“Aici intră restul apelurilor”).
Folosirea “tăieturii” 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 găseşte la prima clauză.
Faptul că imediat după intrarea în clauză urmează o tăietură, împiedică T.Pro. să mai caute şi alte
potriviri ale apelului r(1) (cu alte clauze).
Observaţie
Acest tip de structură este echivalent cu un case unde condiţia 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, următoarele secvenţe 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.
Tema
Rulaţi următorul program aşa cum este scris mai jos, iar apoi scoateţi “tăietura” (!) şi analizaţi
rezultatele obţinute.
domains
nume=symbol
predicates
8
Inteligenţă Artificială – PROLOG Lucrarea de laborator nr. 3
tatăl(nume,nume)
şef(nume,nume)
citeşte(nume)
oricine(nume,nume,nume,nume,nume)
clauses
tatăl(gheorghe,maria).
tatăl(vasile,ion).
citeşte(carte).
citeşte(ziar).
şef(ana,viorica).
şef(nae,nicu).
oricine(X,Y,Z,V,W):-tatăl(X,Y),citeşte(Z),!,şef(V,W).
Predicatul not
Sintaxa:
not(subgoal(Arg1, ..., ArgN))
Predicatul not reuşeşte atunci când subgoal-ul care este argument al lui not nu poate fi dovedit adevărat.
Dacă subgoal-ul este apelat cu variabile libere,T.Pro. va emite eroare: Variabilele libere nu sunt
autorizate în NOT.
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
urăşte.
De observat că, la intrare, Cineva este liberă, dar la ieşirea din primul subgoal, Cineva este legat. Astfel,
la intrarea în not, Cineva este legat, şi totul va funcţiona 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.
Direcţii de flux
În Prolog, legările de variabile se fac în două moduri: la intrarea în clauză sau la ieşirea din clauză.
Direcţia în care este trecută o valoare se numeşte 'direcţia de flux'. Când o variabilă este dată la intrarea
într-o clauză este un parametru de intrare (i), iar când o variabilă este dată la ieşirea dintr-o clauză este
un parametru de ieşire (o). O anumită clauză poate să aibă mai multe modele de flux.
factorial(N,F)
9
Inteligenţă Artificială – PROLOG Lucrarea de laborator nr. 3
este predicatul care va calcula factorialul lui N poate avea următoarele direcţii de flux:
i=2;
while(m mod i=0) do
begin
m:=m div i;
i:=i+1;
end;
if (m=1) then n:=i-1;
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ă
10