fact(father(mel,maurice)).
fact(father(maurice,thomas)).
fact(father(maurice,nicolas)).
rule(son(X,Y),[father(Y,X)]).
rule(grandson(X,Z),[son(X,Y),son(Y,Z)]).
% Find if a predicate relation of the form R1(X,Y) exists
relation(X, Y, R1) :-
rule(R, _F),
R =.. [R1, _, _],
R2 =..[R1, X, Y],
rule(R2, F),
derivable(F).
relation(X, Y, R1) :-
fact(R),
R =.. [R1, X, Y].
% Used by relation to see if the rule or fact can be derived
derivable([]).
derivable([F | T]) :-
fact(F),
derivable(T).
derivable([F | T]) :-
rule(F, L),
derivable(L),
derivable(T).
% If a fact X of the form A(B,C,..) can be proved, show how it is proven, as a list of facts
prove([],E):-
E=[].
prove([X|Y],[E1|E2]):-
prove(X,E1),
prove(Y,E2).
prove(X,E):-
\+ rule(X,_),
fact(X),
E=X.
prove(X,E):-
rule(X,[R1|R2]),
prove([R1|R2],[E1|E2]),
E=[E1|E2].
test:-
writeln('Maurice has the following relations:'),
findall((X,Y),relation(maurice,X,Y),R),
writeln(R),
writeln('Thomas is a grandson of somebody, because:'),
findall((X,Y),prove(grandson(thomas,X),Y),P),
writeln(P).
Partager