Sumar
Din breviar:
În Prolog există mai multe simboluri pentru egalitate, fiecare cu alt scop!
=caută un unificator între termeni==verifică egalitatea structurală a termenilor=:=compară egalitatea aritmetică
Astfel, 8 == 3 + 5 și 8 = 3 + 5 vor fi evaluate la false, dar 8 =:= 3 + 5 va fi evaluat la true.
Operatori aritmetici uzuali
+ adunare
- diferență
* înmulțire
/ împărțire pe floats
// câtul împărțirii
div tot câtul împărțirii
mod restul împărțirii
** ridicarea la o putere
Operatorul is/2
Pentru a efectua calcule, nu putem folosi doar operatorii de mai sus. Pentru a evalua expresia aritmetică 3 + 5 și a stoca rezultatul în X, folosim is/2:
?- X is 1 + 2.
X = 3
Reguli:
- primește două argumente
- al doilea argument trebuie să fie o expresie aritmetică validă, cu toate variabilele instanțiate
- primul argument este fie un număr, fie o variabilă
- dacă primul argument este un număr, operatorul se comportă ca egalitatea aritmetică
- dacă primul argument este o variabilă, răspunsul este pozitiv dacă variabila poate fi unificată cu evaluarea expresiei din al doilea argument
?- Y = 2, X is Y + 2.
Y = 2, X = 4
?- X is Y + 2.
% EROARE — "Arguments are not sufficiently instantiated"
Relații de ordine
>, >=, <, =<
Atenție la =< (nu <=!).
Exemplu de predicat aritmetic
add(X, Y, Z, Result) :-
Result is X + Y + Z.
?- add(1, 2, 3, Res).
Res = 6
Funcții aritmetice avansate
?- X is 2 + (-3.2 * 7 - max(17, 3)) / 2 ** 5.
X = 0.7687499999999998
Disponibile și: min/2, abs/1, sqrt/1, sin/1 etc.
Capcana clasică
% GREȘIT
double(X, Y) :- Y = X * 2.
?- double(3, R).
R = 3*2 % doar structura, nu valoarea!
% CORECT
double(X, Y) :- Y is X * 2.
?- double(3, R).
R = 6