【问题标题】:Function not in prolog功能不在序言中
【发布时间】:2016-11-02 07:33:55
【问题描述】:

兄弟(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函数应该怎么写?

【问题讨论】:

  • 你可以写成 X\=Y 或者更好地使用 iso 谓词 dif/2 并写成:dif(X,Y)。
  • 非常感谢先生。我得到了正确的输出。 :)

标签: prolog


【解决方案1】:

实现不可证明ISO谓词称为(\+)/1

然而,正如@coder 在 cmets 中解释的那样,使用dif/2 来表示两个术语不同要好得多

dif/2 是一个谓词,可以在所有方向上正常工作,即使它的参数尚未实例化。

例如,(\+)/1,我们得到:

?- \+ (X = Y)。 错误。

不存在满足此目标的XY,对吗? 错误

?- X = a, Y = b, \+ (X = Y )。 X = a, Y = b。

相比之下,dif/2:

?- 差异(X,Y)。 dif(X, Y)。

尤其是

?- X = a, Y = b, dif(X, Y)。 X = a, Y = b。

请参阅 了解更多信息。 dif/2 从第一个 Prolog 系统开始就与我们同在。我强烈建议您使用它。

【讨论】:

    【解决方案2】:

    SWI Prolog 没有 notoperator。它可以用作常规复合词,例如not(X)

    functor开括号之间不能有空格:

    foo( 参数列表)。

    这是错误的原因。

    SWI Prolog suggests ISO-standard replacement for not/1: (\+)/1

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 2016-09-28
      • 2011-03-14
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多