在试图理解类型的中缀运算符xfy
并yfx
具有相同的优先级和顺序时,我看到只有四种组合。
使用
a = xfy right-associative
b = yfx left-associative
有
aa e.g. 1 xfy 2 xfy 3 e.g. 1 ^ 2 ^ 3
ab e.g. 1 xfy 2 yfx 3
ba e.g. 1 yfx 2 xfy 3
bb e.g. 1 yfx 2 yfx 3 e.g. 1 - 2 - 3
现在对于 (xfy xfy)aa
运算符都是右结合的。
对于 (yfx yfx) bb
,运算符都是左关联的。
然而,对于 (xfy yfx) ab
,(xfy)a
运算符是右结合的,而 (yfx)b
运算符是左结合的。如果我理解正确,Prolog 会将其评估为:
使用优先级500
和x
意义<
和y
意义<=
xfy
500
<500 <=500
/ \
1 yfx
500
/ \
2 3
对于 (yfx xfy)ba
我希望
500
yfx
<=500 <500
/ \
xfy 3
500
/ \
1 2
然而 ISO Prolog 标准写道:
仅当操作数的主函子是右关联运算符时,与在该运算符之前的左关联运算符具有相同优先级的操作数才需要用括号括起来。
带符号:
仅当操作数 (xfy)的主仿函数是右关联运算符时
a
,与在该运算符 (yfx) 之前的左关联运算符具有相同优先级 (500)的操作数 (xfy)b
才需要括起来a
。
我理解正确吗?如果是这样,为什么 (xfy yfx)ab
需要括号,而 (yfx xfy)ba
不需要?
我还寻找了两个具有相同优先级的运算符的实际示例,一个是 xfy,另一个是 yfx,但只找到了Seed7 mult 和 tiimes的一个案例。如果有人可以提供一个更实际的例子ab
,ba
那将不胜感激。
编辑
在阅读了错误的答案后,这是我的理解。
由于这仅与关联性有关,因此使用 < 和 <= 的规则不适用。
相反,我们使用 Y = Yes, X = No 的含义。
Unbracketed term Yes/No Equivalent bracketed term
--------------------------------------------------------------------------------------
1 xfy 2 xfy 3 1 No|Yes 2 No|Yes 3 1 xfy (2 xfy 3) ** right-associative
1 xfy 2 yfx 3 1 No|Yes 2 Yes|No 3 1 xfy (2 yfx 3) ** this is a special!
1 yfx 2 xfy 3 1 Yes|No 2 No|Yes 3 -------------- ** invalid: noone wants association
1 yfx 2 yfx 3 1 Yes|No 2 Yes|No 3 (1 yfx 2) yfx 3 ** left-associative
编辑
在寻找具有相同优先级的示例时,xyf
我yfx
发现Meta-Interpreters定义了op(500,xfy,<==).
Valid
3 <== 1 + 2
3 xfy 1 yfx 2
3 No|Yes 1 Yes|No 2
Invalid
1 + 2 <== 3
1 yfx 2 xfy 3
1 Yes|No 2 No|Yes 3
Valid and makes sense.
(1 + 2) <== 3
Prec 0 xfy Prec 0
Valid but does not make sense.
1 + (2 <== 3)
Prec 0 yfx Prec 0
虽然带有括号的示例是有效的,但您必须使用括号来选择哪个有意义。