:- module(_,_).
:- use_package(clpr).
% You can also try: :- use_package(clpq).

%% * CLP: a first comparison with classic Logic Programming
:- module(_,_).

:- use_package(clpq).
% :- use_package(clpr).

% A) Equality constraints on Herbrand terms (unifications)

% Classic LP
hp(X,Y,Z) :- Z = f(X,Y).

% CLP: Prolog+constrains (same in this case)
hc(X,Y,Z) :- Z = f(X,Y).

% B) Equality constraints on arithmetic expressions

% Classic Prolog using is/2
ap(X,Y,Z) :- Z is X + Y. 

% CLP: Prolog+constrains (note use of .=.)
ac(X,Y,Z) :- Z .=. X+Y. 

%% Query examples:

% A) Equality constraints on Herbrand terms fully
%    reversible in both cases:

% ?- hp(3, 4, Z).  
% ?- hp(X, Y, f(3,4)).  
% ?- hp(X, Y, Z).

% ?- hc(3, 4, Z).  
% ?- hc(X, Y, f(3,4)).  
% ?- hc(X, Y, Z).

% A) Equality constraints on arithmetic expressions

%    Not reversible with is/2:
% ?- ap(3, 4, Z).
% ?- ap(X, 4, 7).

%    Fully reversible with constraints:
% ?- ac(3, 4, Z).
% ?- ac(X, 4, 7).
% ?- ac(X, Y, 7).
% In the last case we get a constraint back
