Prolog-不相关的对

Prolog-不相关的对,prolog,Prolog,这是我的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,

这是我的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).
然后使用以获取没有重复项的人员列表:

person(X) :- parent(X, _).
person(X) :- parent(_, X).
并从中收集所有对:

setof(X, person(X), People)
顺便说一下,这会产生“镜像”对:对于所有
X
Y
,都是
(X,Y)
。使用许多序言支持的
member
的改编版本,您可以做得更好。查看您的Prolog手册

最后,筛选出与
相关的对

pair_of_people(X,Y) :-
    setof(P, person(P), People),
    member(X, People),
    member(Y, People),
    X \= Y.
unrelated(X,Y) :-
    pair_of_people(X,Y),
    not(related(X,Y)).