2

我的 Prolog 程序中有一条规则,blanket(X,Y)它检查 X 是否在某种 Y 集合中,其中包括:

  • Y的父母
  • Y的孩子们
  • Y的共同父母

我将其定义如下:

blanket(Y,X) :- different(Y,X),parent(Y,X);child(Y,X);coparent(Y,X).

但是,这并不像我预期的那样工作。它正确地识别了 X 的父母、孩子和共同父母(如果有的话),但它将自己列为父母和共同父母,这是我不想要的。是否可以设置某种顺序,以便different(Y,X)首先独立评估?当然,我尝试了类似 :different(Y,X),(parent(Y,X);child(Y,X);coparent(Y,X)).的方法,但这会产生语法错误,因为我仍然对这种语言非常不熟悉。

任何建议将不胜感激。

编辑:这里是child,differentcoparent关系:

child(X,Y) :- parent(Y,X).

different(X,Y) :- not(X == Y).

coparent(Y,X) :- parent(Y,Z),parent(X,Z).

为了完整性。

4

2 回答 2

0
blanket(Y,X) :- different(Y,X), parent(Y,X).
blanket(Y,X) :- different(Y,X), child(Y,X).
blanket(Y,X) :- different(Y,X), coparent(Y,X).
于 2013-01-30T14:54:26.370 回答
0

问题是您对共同父母的定义。它是允许将自身作为有效结果返回的语句。

我建议您重新定义它,例如:

coparent(Y,X) :- parent(Y,Z),parent(X,Z), X \= Y.

这样,您可以简单地:

blanket(Y,X) :-parent(Y,X);child(Y,X);coparent(Y,X).

当然,您可以保留“coparent”的定义,仅将毯子修改为:

blanket(Y,X) :-parent(Y,X);child(Y,X);(coparent(Y,X), X\=Y).
于 2015-05-24T17:46:28.303 回答