Zdroj






p(1).
p(2) :- !.
p(3).
% Jaké budou odpovědi na následující dotazy?

% ?- p(X).
% ?- p(X), p(Y).
% ?- p(X), !, p(Y).



% Vlastní if-then-else, odpovídající
%   If -> Then; Else.
% ite(If, Then, Else)
ite(I, T, _) :- call(I), !, call(T).
ite(_, _, E) :- call(E).


% Termy jsou unifikovatelné ale *nechceme* je zunifikovat
% uni(+T1, +T2)
uni(T1, T2) :- T1 \= T2 -> fail; true.

uni2(T1, T2) :- \+ T1 \= T2.

uni3(T1, T2) :- T1 \= T2, !, fail.
uni3(_, _).

uni4(T1, _) :- var(T1), !.
uni4(_, T2) :- var(T2), !.
uni4(T1, T2) :- T1 =.. [F|L1], T2 =.. [F|L2], zip(L1, L2).

zip([], []).
zip([H1|L1], [H2|L2]) :- uni4(H1, H2), zip(L1, L2).

Dotazy



?- p(X).
X = 1 ;
X = 2.

?- p(X), p(Y).
X = Y, Y = 1 ;
X = 1,
Y = 2 ;
X = 2,
Y = 1 ;
X = Y, Y = 2.

?- p(X), !, p(Y).
X = Y, Y = 1 ;
X = 1,
Y = 2.

?- p(W), p(X), !, p(Y).
W = X, X = Y, Y = 1 ;
W = X, X = 1,
Y = 2.