如何避免Prolog结果中的重复?

如何避免Prolog结果中的重复?,prolog,rules,Prolog,Rules,我正在用prolog编写一个程序,下面的代码是: isa(dumbo, smallelephant). isa(cuatropataspequeñas, extremidad). isa(cuatropatas, extremidad). isa(trompa, cabeza). isa(smallelephant, elephant). isa(elephant, animal). subclass(Class, Sup) :- isa(Class, Sup). subclass(Class

我正在用prolog编写一个程序,下面的代码是:

isa(dumbo, smallelephant).
isa(cuatropataspequeñas, extremidad).
isa(cuatropatas, extremidad).
isa(trompa, cabeza).
isa(smallelephant, elephant).
isa(elephant, animal).

subclass(Class, Sup) :- isa(Class, Sup).
subclass(Class, Sup) :- isa(Class, Midclass), subclass(Midclass, Sup).

partOf(head, animal).
partOf(tip, animal).
partOf(t1, smallelephant).
partOf(t2, elephant).
partOf(h1, elephant).

hasPart(Object, Part) :- partOf(Part, Object).

hasPart(Object, Part) :- subclass(Object, Class), hasPart(Class, Part), not(is(_,Part)).
根据这些事实和规则,当我执行hasPartdumbo,X时得到的结果是下一个:

?- hasPart(dumbo, X).
X = t1;
X = t2;
X = h1;
X = t2;
X = h1;
false.
但我只想得到t1,t2和t3。我怎么做呢


非常感谢你

tieneParte/2谓词的定义?也许你的意思是写hasPart/2?我很确定,notis,Part不是你想要表达的:我想你更想使用isa/2。不幸的是,is/2是一个预定义的谓词……这不是重复了你的另一个问题吗?我假设这是,Part真的应该是isa,Part?我想你需要简洁地定义规则是什么。当您想要检查对象的超类的一部分时,您想要往上走多远?在您的示例中,您希望达到两个级别—一个是通过isa,然后是一个。它总是限制2吗?或者您是否有其他需要定义的更高级别类的分类?此外,谓词还有终止问题:在找到解决方案后,它会进入堆栈溢出。检查子类的循环定义。让谓词名称与事实不同通常是一个好主意,有助于分离。