【问题标题】:behaviour of unification in prolog in presence of arithmetic operators在存在算术运算符的情况下序言中的统一行为
【发布时间】:2011-03-16 18:06:27
【问题描述】:
12 ?- 3+4*5 = X+Y.
X = 3,
Y = 4*5.

13 ?- 3+4*5 = X*Y.
false.

16 ?- 3*4+5 = X*Y.
false.

我期待

13 ?- 3+4*5 = X*Y.
X = 3+4, Y = 5.

16 ?- 3*4+5 = X*Y.
X = 3, Y = 4+5.

是否存在一些“优先级”问题?我正在使用最后一个 swi-prolog 版本。

【问题讨论】:

  • 那么,你需要一些谓词来从 '3+4*5' 中得到 '3+4' 还是只是一个奇怪的问题?
  • 奇怪的问题,但是得到 3+4 的谓词会很有趣。

标签: prolog unification


【解决方案1】:

是的,您需要考虑一个优先级问题。

Prolog 为定义的每个运算符附加一个数字优先级值,以便它的解析可以自动处理,例如,3+4*5,就像括号用于状态 3+(4*5) 一样。

所以您的第一个示例按预期工作,但不是第二个或第三个。根本没有办法统一条款,所以 Prolog 返回 false。

【讨论】:

  • 知道了!我认为自从我使用统一以来,3+4*5 = X*Y 只是一种模式识别或其他东西,但它是有道理的。
  • @dierre:它是一种模式识别形式,但纯粹是一种在线性时间运行的句法识别。统一不知道算术规则。完全添加它们是不可能的,因为算术相等通常是不可判定的。
  • 好吧,实际上我认为它考虑了算术,因为它基本上在 + 之前评估 * 所以 4*5 的统一发生在 3+4 之前,所以 Y 得到 4*5 但我有 *Y 我可以'不统一 3+,因为我错过了 *。
  • 我说的是 +(3, *(4,5) ) = *(X,Y) 我希望用前缀表示法清楚。所以不能统一。但我认为,因为在序言中,一切都是一个术语,我可以写 X = 4+5 并且 X 的输出将是 4+5,而不是编写我的示例将是一个简单的字符读取但 + 是一个谓词所以那就是为什么我错了。
  • @dierre:@hardmath 的评论是现场的,表达式被解析。它根本没有得到评估,这就是我所说的统一不做算术的意思。
【解决方案2】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
相关资源
最近更新 更多