我的prolog翻译中加载了下两个事实:
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
这个解释是否正确?
答案 0 :(得分:4)
是的,这是正确的。
默认运算符优先级定义为自然的,即使用正常的数学优先级。但如果你不喜欢它,你可以重新定义它。
更改优先级是否是一个好主意是另一回事,它有效地改变了Prolog的语法并且可能导致解析问题。特别是如果您更改Prolog语法的运算符的优先级,优先级高于1000。