存在算术运算符时prolog中的统一行为

存在算术运算符时prolog中的统一行为,prolog,unification,Prolog,Unification,我期待着 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. 是否存在“优先”问题?我使用的是上一个swi prolog版本。是的,是关于它的 是的,您需要考虑优先级问题 Prolog为定义的每个运算符附加一个数字优先值,以便其解析可以自动处理,例如,3+4*5,就像使用括号表示3+(4*5)一样 因此,您的第一个示例按预期工作,但第二个或第三个示例没有工作。根本无法统

我期待着

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.

是否存在“优先”问题?我使用的是上一个swi prolog版本。

是的,是关于它的


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

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


因此,您的第一个示例按预期工作,但第二个或第三个示例没有工作。根本无法统一术语,因此Prolog返回false。

因此,您需要一些谓词来从“3+4*5”中获取“3+4”,或者这只是一个奇怪的问题?奇怪的问题,但获取3+4的谓词会很有趣。明白了!因为我使用统一,所以我认为3+4*5=X*Y只是一种模式识别或其他东西,但它是有意义的。@dierre:这是一种模式识别形式,但纯粹是一种以线性时间运行的语法形式。统一不知道算术规则。完全相加是不可能的,因为算术等式一般来说是不可判定的。好吧,实际上我认为它考虑算术,因为它基本上在+之前求值,所以4*5的统一发生在3+4之前,所以Y得到4*5,但是比我有*Y,我不能统一3+,因为我缺少了*。我说的是+(3,*(4,5))=*(X,Y)我希望前缀符号能清楚地表达出来。这就是它不能统一的原因。但我认为,因为在prolog中,一切都是一个术语,我可以写X=4+5,X的输出将是4+5,而写我的示例只是简单地读取字符,而+是一个谓词,这就是为什么我错了。@dierre:@hardmath的评论是即时的,快报离子被解析,它根本不会被计算,这就是我所说的“统一不做算术”的意思。
13 ?- 3+4*5 = X*Y.
X = 3+4, Y = 5.

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