Syntax 为什么作为高优先级操作符的原子不需要圆括号?

Syntax 为什么作为高优先级操作符的原子不需要圆括号?,syntax,prolog,operators,iso-prolog,Syntax,Prolog,Operators,Iso Prolog,在旧的textbooks1中,经常会遇到如下运算符声明: ?- op(1200,fx,(:-)). ^ ^ 这些圆括号过去是必要的。但如今,他们不再需要: | ?- writeq(op(1200,fx,(:-))). op(1200,fx,:-) 为什么不再需要它们?标准如何应对这种情况 1 p.976。MU Prolog 3.2db参考手册的标准操作员声明,由Lee Naish,LNCS 238,Springer Verlag 1985在Prolo

在旧的textbooks1中,经常会遇到如下运算符声明:

?- op(1200,fx,(:-)).
              ^  ^
这些圆括号过去是必要的。但如今,他们不再需要:

| ?- writeq(op(1200,fx,(:-))).     
op(1200,fx,:-)
为什么不再需要它们?标准如何应对这种情况



1 p.976。MU Prolog 3.2db参考手册的标准操作员声明,由Lee Naish,LNCS 238,Springer Verlag 1985在Prolog的否定和控制中出现。

以下所有内容均参考ISO/IEC 13211-1:1995。 让我从里到外

6.5.1     graphic char       = ":";
          graphic char       = "-";

6.4.2     graphic token char = graphic char;

          graphic token      = graphic token char, { graphic token char };

          name token         = graphic token;

6.4       name               = [ layout text sequence (* 6.4.1 *) ], name token;

6.3.1.3   atom               = name;

6.5.3     open  char         = "(";
          close char         = ")";
          comma char         = ",";

6.4.8     open  token        = open  char; 
          close token        = close char;
          comma token        = comma char;

6.4.1     (* grammar rules for layout text sequence were omitted *)

6.4       comma              = comma token;
          open ct            = open  token;
          close              = [ layout text sequence ], close token;

6.3.3.1   arg                = atom; (* if that atom is an operator *)
          arg                = term; (* otherwise: priority = 999   *)

6.3.3     arg list           = arg;
          arg list           = arg, comma, arg list;

6.3.3     term               = atom, open ct, arg list, close ;

所以我们回到最初的问题:

这些圆括号过去是必要的。但如今,它们不再需要了。为什么不再需要它们?标准如何应对这种情况

让我们假设
T=op(1200,fx,:-)
成立

  • T
    是函数表示法中提供的复合术语

  • T
    包含在上述规则中
    term=atom,open-ct,arg-list,close

  • atom
    匹配
    op
    ,它是
    T
    的函子

  • 开放式ct与开放式支架匹配

  • “中间部分”(
    T
    的参数)包含在
    arg list
    的语法规则中

  • arg list
    arg
    的非空列表

  • 什么是
    arg

    • 优先级小于1000的术语,优先级为(',')/2。例如,
      1200
      fx

    • 作为算符的原子。(没有附加任何条件!)

  • close与右括号匹配

  • 引述:

    语法规则中的参数(由
    arg
    表示)作为复合项或列表元素的参数出现。它可以是作为运算符的原子,也可以是优先级不大于999的项。当参数是任意项时,其优先级应小于“,”的优先级(逗号)运算符,使逗号作为中缀运算符和逗号作为参数或列表元素分隔符之间不存在冲突

    注:

    “参数”的这个概念确保术语
    f(x,y)
    f(:-,;,[:-,:-,:-,:-::-::-)
    在语法上都是有效的,无论当前定义了什么运算符定义。逗号不是原子,以下“术语”都有语法错误:
    f(,,,,,,[124; v]
    [a,b,]
    ;但以下两个术语在语法上是有效的:
    f(',',a)
    [a','|v]
    ,和
    [a,b |',']

    op(1200,fx,:-)
    是函数表示法中的复合术语

    引用6.3.3复合术语——函数表示法

    以函数表示法编写的复合术语的形式为
    f(A1,…,An)
    ,其中每个参数
    Ai
    都是一个参数 它们之间用(逗号)分隔

    term=atom,打开ct,参数列表,关闭;

    arg list=arg;

    arg list=arg,逗号,arg list;

    引用6.3.3.1参数

    参数(在语法规则中由arg表示)作为复合项或列表元素的参数出现。它可以是作为运算符的原子,也可以是优先级不大于999的项

    arg=atom;
    如果atom是运算符(具有任意优先级)

    arg=term;
    (优先级为999)

    由于上述突出显示的情况,
    arg=atom;
    :-
    op(1200,fx,:-)
    中不需要圆括号

    如果不是上述特殊情况,我们需要圆括号,因为推导必须遵循6.3.1.3原子

    term=atom;
    优先级为0,如果atom不是运算符
    term=atom;
    优先级为1201,如果atom是运算符。