为prolog表达式设置一些顺序

时间:2013-01-30 14:44:20

标签: prolog prolog-dif

我的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)).的内容,但由于我仍然不熟悉该语言,因此会产生语法错误。

任何建议都将不胜感激。

编辑:以下是childdifferentcoparent关系:

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

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

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

完整性。

2 个答案:

答案 0 :(得分: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).

答案 1 :(得分:0)

问题是你对coparent的定义。它是允许将自身返回为有效结果的语句。

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

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).