具有相同优先级的Prolog中缀运算符一个xfy,另一个yfx具有两个顺序运算符

Guy*_*der 2 operators infix-notation iso-prolog

在试图理解该类型的中缀运算符xfy并且yfx具有相同的优先级和顺序时,我看到只有四种组合.

运用

a = xfy  right-associative
b = yfx  left-associative
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

现在对于(xfy xfy)aa,运算符都是正确关联的.
对于(yfx yfx)bb,运营商都是左联盟.

但是对于(xfy yfx)ab ,(xfy)a运算符是右关联的,而(yfx)b运算符是左关联的.如果我理解正确,Prolog将评估为:

使用优先权500x意义<y意义<=

    xfy
    500
<500  <=500
  /     \
 1      yfx
        500
        / \
       2   3
Run Code Online (Sandbox Code Playgroud)

对于(yfx xfy)ba我会期待

      500
      yfx
  <=500  <500
    /     \
  xfy      3
  500
  / \
 1   2
Run Code Online (Sandbox Code Playgroud)

但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
Run Code Online (Sandbox Code Playgroud)

编辑

在寻找有一个例子xyfyfx优先级相同的是有道理的,我发现元口译定义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
Run Code Online (Sandbox Code Playgroud)

虽然有parens的例子是有效的,但你必须使用parens来选择哪一个是有意义的.

fal*_*lse 6

(你使用的符号对我来说非常混乱,编写没有操作数的运算符,所以我将坚持标准符号,它总是显示运算符和参数.)

至于关联性 - 这就是它的全部 - 有一个简单的经验法则.看看yx意义是和否xfy在其左侧"说" x.因此,它"不希望"与具有相同优先级的运营商相关联.而在右侧,它"说" y,因此我想联想.当有两个运算符都"互相称"时,它是第一个发生的(当从左到右阅读时)将第二个作为参数.如果你愿意的话,那个案子的处理就像正确的关联性一样.

出于这个原因,op(500,xfy,xfy), op(500,yfx,yfx)我们有:

   Unbracketed term   Equivalent bracketed term
  -----------------------------------------------
    1 xfy 2 xfy 3        1 xfy (2 xfy 3)     ** right-associative
    1 xfy 2 yfx 3        1 xfy (2 yfx 3)     ** this is a special!
    1 yfx 2 xfy 3        --------------      ** invalid: noone wants association
    1 yfx 2 yfx 3        (1 yfx 2) yfx 3     ** left-associative
Run Code Online (Sandbox Code Playgroud)

实施得如何?类似情况的#147开始这个比较.所以除了SWI以外都正确地实现了阅读.但是对于写作,还有一些系统不符合要求.

我认为这清楚地表明Prolog程序员很少依赖于这种情况.实际上,标准运算符表没有任何与此问题相关的情况.

对于一个真实的例子,考虑fyyf打算表示一些类似括号的语法.事实上,在预ISO时间几个系统有{}以这样的方式限定在DCG或CLP(Q)中使用.请注意,这两个运营商无法完全模拟"包围".举个例子,考虑一下

   Unbracketed term   Equivalent bracketed term
  -----------------------------------------------
    fy fy 1 yf yf       fy (fy ((1 yf) yf)
Run Code Online (Sandbox Code Playgroud)

另一方面,如果一个人有一个形式的术语fy( fy(X) )(注意,它是规范的语法!),那么X必须是(fy)/1或者(yf)/1.任何其他术语都必须被拒绝.