2015-06-17 45 views
13

在旧课本一个经常遇到运营商的声明如下所示:为什么高优先级操作符的原子不需要圆括号?

?- op(1200,fx,(:-)). 
      ^^ 

使用这些圆括弧是必要的。但今天,他们不再需要:

| ?- writeq(op(1200,fx,(:-))).  
op(1200,fx,:-) 

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


第97页MU-的Prolog3.2分贝参考手册6.标准运算符声明由Lee纳什,LNCS 238,施普林格出版社1985年

回答

6

op(1200,fx,:-)是功能符号中的复合术语。

引用6.3.3化合物而言---函数符号

写入功能表示法的化合物,术语具有如下形式f(A1,...,An)其中每个参数AiARG ,并且它们通过分离,(逗号)。

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

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

引用6.3.3.1参数

的参数(由ARG中的语法规则表示)发生作为参数复合术语或元素列表的nt。它可以是一个原子是一个操作符,或者与优先级的术语不大于999

arg = atom;如果原子是操作者(具有任意的优先级)
arg = term;(具有优先级999)

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

如果不是以上特例,我们需要圆括号,因为推导必须遵循6.3.1。3个原子

term = atom;优先级为0,如果原子不是操作者
term = atom;优先1201,如果原子是一个运算符。


6

出现在否定与控制的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,:-)成立。

  1. T是以功能符号提供的复合术语。

  2. T由上述规则覆盖term = atom, open ct, arg list, close;

  3. ​​op匹配,这是T函子。

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

  5. “中间部分”(T的参数)由arg list的语法规则覆盖。

  6. arg listarg的非空列表。

  7. 什么是arg

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

    • 作为操作员的原子。 (不附带任何条纹!)

  8. 与结束括号近似匹配。

引用:

的参数(由arg中的语法规则表示发生为列表的compount术语或元件的自变量它可以是一个原子,其是一个操作符,或。一个优先级不超过999的术语。当参数是一个任意的术语时,它的优先级应该小于','(逗号)运算符的优先级,这样在作为中缀运算符的逗号和作为逗号的逗号之间没有冲突参数或列表元素分隔符

注:

一个“说法”的概念,保证了这两个词f(x,y)f(:-, ;, [:-, :-|:-])在语法上是有效的任何运营商定义当前定义。逗号不是原子,下列“术语”具有语法错误:f(,,a)[a,,|v][a,b|,];但以下两个术语在语法上有效:f(',',a),[a,','|v][a,b|',']