避免序言中的重复结果

问题描述 投票:0回答:0

我有以下代码:


male(prince_charles).
male(prince_andrew).
male(prince_edward).
female(princess_ann).
female(queen_elizabeth).

child_of(prince_charles, queen_elizabeth).
child_of(princess_ann, queen_elizabeth).
child_of(prince_andrew, queen_elizabeth).
child_of(prince_edward, queen_elizabeth).

throne(queen_elizabeth).

older(prince_charles, princess_ann).
older(prince_charles, prince_andrew).
older(prince_charles, prince_edward).
older(prince_andrew, prince_edward).
older(princess_ann, prince_andrew).
older(princess_ann, prince_edward).

successor(X) :-
                     male(X), 
                     older(X, Y), 
                     not(female(Y)),
                     child_of(X, A), 
                     child_of(Y, A), 
                     throne(A).

successor(X) :- 
                     female(X), 
                     child_of(X, Y), 
                     throne(Y).

运行

findall(X,successor(X), List).
得到这个结果:
List = [prince_charles, prince_charles, prince_andrew, princess_ann].

我很期待

List = [prince_charles, prince_andrew, prince_edward, princess_ann].

我已经尝试重新排序关系和规则,但我似乎无法获得预期的列表。

为什么查尔斯王子出现了两次而爱德华王子没有出现?

我错过了什么?

prolog
© www.soinside.com 2019 - 2024. All rights reserved.