6

我在我的序言解释器中加载了接下来的两个事实:

foo(U+V,1).
foo(U*V,2).

现在我尝试使用该结果进行下一个查询:

foo(x*x+x,R).  -->  R = 1
foo(x+x*x,R).  -->  R = 1
foo(x*x*x,R).  -->  R = 2

现在我尝试下一个查询:

foo(x*x-x,R).  -->  no

据我了解,这可以通过运算符优先级如何构建树表达式来解释:

x+x*x  -->  +           so it matches with  -->  +
           / \                                  / \
          x   *                                U   V
             / \
            x   x

x-x*x  -->  -           DOES NOT matches any fact.
           / \                             
          x   *                                
             / \
            x   x

这个解释正确吗?

4

1 回答 1

4

是的,这是正确的。

默认运算符优先级被定义为自然的,即使用正常的数学优先级。但如果你不喜欢,你可以重新定义它。

改变优先级是否是一个好主意是另一回事,它有效地改变了 Prolog 的语法并可能导致解析问题。特别是如果您更改 Prolog 语法的运算符优先级,优先级高于 1000。

于 2009-04-20T11:14:33.717 回答