Prolog - 不相关的对

时间:2011-03-21 08:06:01

标签: prolog

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文件,我需要的是找到所有不相关的人,我不知道如何。

1 个答案:

答案 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) XY。使用许多Prolog支持的member的改编版本,您可以做得更好。查看您的Prolog手册。

最后,过滤掉related

unrelated(X,Y) :-
    pair_of_people(X,Y),
    not(related(X,Y)).