兄弟(X,Y): - 父亲(Z,X),父亲(Z,Y),不是(X = Y)。
妹妹(X,Y): - 父亲(Z,X),父亲(Z,Y),女性(X)。 兄弟(X,Y): - 父亲(Z,X),父亲(Z,Y),男性(X)。我使用not功能有点问题。我没试过X = Y.但无济于事,兄弟姐妹的规则仍然会产生错误。
如果我要删除not x = y,输出会有点“难看”。 我应该怎么写not函数?
答案 0 :(得分:1)
实施不可证明的 ISO谓词称为(\+)/1
。
但是,正如@coder在评论中所解释的那样,使用dif/2
来表达两个词不同是好得多。
dif/2
是一个纯谓词,可以在所有方向上正常工作,如果它的参数尚未实例化的话。
例如,使用(\+)/1
,我们得到:
?- \+ (X = Y ). false.
不存在满足此目标的X
和Y
,对吗?的错误的强>:
?- X = a, Y = b, \+ (X = Y ). X = a, Y = b.
相反,使用dif/2
:
?- dif(X, Y). dif(X, Y).
和特别是:
?- X = a, Y = b, dif(X, Y). X = a, Y = b.
有关详细信息,请参阅prolog-dif。自第一个Prolog系统以来dif/2
与我们同在。我强烈建议你使用它。
答案 1 :(得分:0)
SWI Prolog 没有not
运营商。它可以用作常规复合词,e.i。 not(X)
。
仿函数和打开括号之间必须没有空格:
foo(参数列表)。
这是错误的原因。
SWI Prolog suggests ISO-standard replacement for not/1
: (\+)/1