parent(kresimir, jasna).
parent(kresimir, darko).
parent(vesna, darko).
parent(darko, vigor).
parent(darko, goran).
parent(vigor, ruzica).
parent(vigor, snjezana).
parent(mario, nenad).
ancestor(X, Y) :-
parent(X, Y).
ancestor(X, Y) :-
parent(X, Z),
ancestor(Z, Y).
related(X, Y) :-
parent(X,Y);
parent(Y,X).
related(X, Y) :-
X \= Y,
ancestor(Z, X),
ancestor(Z, Y).
这是我的prolog文件,我需要的是找到所有不相关的人,我不知道如何。
答案 0 :(得分:1)
你需要一种方法让所有人先行。
person(X) :- parent(X, _).
person(X) :- parent(_, X).
然后使用setof/3
获取没有重复项的人员列表:
setof(X, person(X), People)
并从中收集所有对:
pair_of_people(X,Y) :-
setof(P, person(P), People),
member(X, People),
member(Y, People),
X \= Y.
顺便说一下,这会产生“镜像”对:(X,Y)
和(Y,X)
X
和Y
。使用许多Prolog支持的member
的改编版本,您可以做得更好。查看您的Prolog手册。
最后,过滤掉related
:
unrelated(X,Y) :-
pair_of_people(X,Y),
not(related(X,Y)).