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.