Documente Academic
Documente Profesional
Documente Cultură
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
arctan(X)
exp(X
ln(X)
log(X)
Explicaie
"si bit cu bit" intre bitii cuvintelor X si Y
"sau bit cu bit" "
"
bitnot(X,Z)
bitxor(X,Y,Z)
bitleft(X,N,Z)
bitright(X,N,Z)=
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
Rspuns: No
Rspuns: Yes
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
predicat :conditie,
corp,
fail.
Tema 7
Rulai urmtorul program aa cum este scris mai jos, iar apoi scoatei tietura (!) i analizai
rezultatele obinute.
domains
nume=symbol
predicates
8
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
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):
Tem 8
Scriei un predicat care rezolv problema ridicrii la putere:
power(X,Y,Z) unde Z = X la puterea Y.
10