2011-03-21 76 views
0
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). 

这是我的序言文件,我需要的是找到所有对不相关的人,我不知道如何。序言 - 对不相关

回答

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. 

这,顺便说一句,生产的 “镜子”对:所有XY均为(X,Y)(Y,X)。您可以使用许多Prolog支持的改编版本member做得更好。查看你的Prolog手册。

最后,过滤掉related的对:

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