我的Prolog程序中有一个名为blanket(X,Y)
的规则,它检查X是否属于某种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
,different
和coparent
关系:
child(X,Y) :- parent(Y,X).
different(X,Y) :- not(X == Y).
coparent(Y,X) :- parent(Y,Z),parent(X,Z).
完整性。
答案 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).