:- module(_,_).
:- use_package(clpq).

% -------------------------------------------------------------------
% - Finonacci revisited 

% ** Fibonacci in standard Prolog

fib_pl(0,0).
fib_pl(1,1).
fib_pl(N,R) :-
    N > 1, 
    N1 is N-1,
    N2 is N-2,
    fib_pl(N1,F1),
    fib_pl(N2,F2),
    R is F1+F2.

% ** Fibonacci in CLP

fib_clp(N,N) :- N .=. 0.
fib_clp(N,N) :- N .=. 1.
fib_clp(N,R) :- 
    N .>. 1,
    F1 .>=. 0, 
    F2 .>=. 0, 
    N1 .=. N - 1,
    N2 .=. N - 2,
    fib_clp(N1,F1),
    fib_clp(N2,F2),
    R .=. F1 + F2.

% ?- fib_pl(11,Y).
% ?- fib_clp(11,Y).

% ?- fib_pl(X,89).
% -> Error
% ?- fib_clp(X,89).
% -> Works...

% ?- fib_pl(X,Y).
% -> Error (at third solution)
% ?- fib_clp(X,Y).
% -> Works!
