ConcepteAritmetică și egalitate (is, =, ==, =:=)

Aritmetică și egalitate (is, =, ==, =:=)

În Prolog există mai multe simboluri pentru egalitate, fiecare cu alt scop. E una dintre distincțiile de mare confuzie din breviar.

9 exerciții folosesc acest concept fapte-reguli-baze-de-cunostintecut-si-cazuri-de-baza

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

Exerciții care folosesc acest concept