为什么高优先级运算符的原子不需要圆括号?

fal*_*lse 13 syntax operators prolog iso-prolog

在较旧的教科书1中,经常遇到如下的操作员声明:

?- op(1200,fx,(:-)).
              ^  ^
Run Code Online (Sandbox Code Playgroud)

过去,这些圆括号是必要的.但今天,他们不再需要了:

| ?- writeq(op(1200,fx,(:-))).     
op(1200,fx,:-)
Run Code Online (Sandbox Code Playgroud)

为什么不再需要它们?标准如何应对这种情况?


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

rep*_*eat 6

以下所有内容均参考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 ;
Run Code Online (Sandbox Code Playgroud)

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

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

我们假设T = op(1200,fx,:-)持有.

  1. T 是以功能表示法提供的复合术语.

  2. T 受上述规则约束 term = atom, open ct, arg list, close;

  3. atom匹配op,这是.的算符T.

  4. open ct匹配一个开放式括号.

  5. "中间部分"(参数T)由语法规则涵盖arg list.

  6. arg list是一个非空列表arg.

  7. 什么arg

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

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

  8. close匹配一个右括号.

引用:

参数(arg在语法规则中表示作为compount术语或列表元素的参数出现.它可以是作为运算符的原子,或者优先级不大于999的术语.当参数是任意术语时,其优先级应小于','(逗号)运算符的优先级,以便逗号作为中缀运算符和逗号作为参数或列表元素分隔符之间不存在冲突.

注意:

这个"参数"的概念确保了术语f(x,y)f(:-, ;, [:-, :-|:-])语法有效,无论当前定义的操作符定义如何.逗号不是原子和下面的"术语"具有语法错误:f(,,a),[a,,|v],和[a,b|,]; 但以下两个术语是语法有效:f(',',a),[a,','|v],和[a,b|','].


rep*_*eat 6

op(1200,fx,:-) 是功能表示法中的复合术语.

引用6.3.3复合词 - 功能表示法:

用功能符号编写的复合术语的形式f(A1,...,An)是每个参数Ai都是一个arg ,它们用(逗号)分隔.

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

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

引用6.3.3.1参数:

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

arg = atom;if atom是一个运算符(具有任意优先级)
arg = term;(优先级为999)

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

如果不是因为上述特殊情况,我们需要圆括弧,因为派生就必须遵循6.3.1.3原子:

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