Prolog中的操作员优先级

时间:2013-03-24 09:25:54

标签: prolog

我正在研究Ivan Bratko的书:“人工智能编程”

现在我正在研究运营商,我对此有些怀疑,在本书上我可以阅读以下内容:

  

因此运算符的优先级决定了表达式的正确解释。例如,表达式 a + b * c 原则上可理解为:

1。 +(a, *(b,c))

或作为:

2。 *(+(a,b), c)

现在我开始怀疑第一个疑问:“这意味着什么?看起来我非常沮丧,因为这两个表达方式给出了不同的三个不同的结果!

例如,如果我有:a=2b=3c=4

第一个的结果是14,第二个的结果是20,所以有不同的:不同的thress意味着不同的操作员执行顺序,这意味着不同的结果!

所以我认为(使用算术运算符的通常优先级:首先执行乘法和总和之后)正确的表达式是第一个,第二个是错误的。

这是对的吗?

继续读这本书,我也可以阅读:

  

一般规则是具有最高优先级的运算符是该术语的主要函子。如果要根据我们的常规约定理解包含+和*的表达式,那么然后+具有更高的优先级,然后*运算符

现在我有第二个疑问:正如我所说,在正常的算术惯例中,我首先执行乘法,然后执行求和,所以在我看来,*运算符具有优先权而不是+

我对此缺少什么?为什么在书中说+的优先级高于*

2 个答案:

答案 0 :(得分:1)

“术语的主要函子”表示要执行的 last 操作,或前缀表示法中最外面的操作。这个定义与你的定义相反,因而是矛盾。

答案 1 :(得分:1)

  

因此,运算符的优先级决定了对表达式的正确解释。例如,表达式a + b*c原则上可以理解为:

+(a, *(b,c))
     

或作为:

*(+(a,b), c)

它表示没有优先权,这两种方法可以解释表达式(解析表达式的不同方式会产生不同的结果)。当您知道a + (b * c)应该在*之前执行时,您才知道要对+进行分组。 (我在这里避免用优先级解释,因为它如下所述令人困惑。)

+*只是符号,只是它们被用作具有某些已定义优先级的运算符。一般来说,您可以将任何内容定义为运算符,并赋予它优先权。

  

一般规则是具有最高优先级的运算符是该术语的主要函子。如果要根据我们的常规惯例理解包含+*的表达式,则+具有优先级而不是*运算符

英语中优先级的定义是“被认为比某人或其他人更重要的条件;重要性,顺序或等级的优先级”。只要事情必须在其他事情发生之前,我们就有优先级

在C中,operator precedence是表达式中绑定的顺序。 C中的高优先级运算符将在低优先级运算符之前执行。

在Prolog中,precedence是获取仿函数的顺序,这与C运算符的绑定顺序相反。当我们使用=..分析表达式时,较高的优先级运算符将出现在之前