Syntax 为什么作为高优先级操作符的原子不需要圆括号?
在旧的textbooks1中,经常会遇到如下运算符声明: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
?- 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
的函子T
的参数)包含在arg list
的语法规则中arg list
是arg
的非空列表arg
- 优先级小于1000的术语,优先级为(',')/2。例如,
和1200
fx
- 作为算符的原子。(没有附加任何条件!)
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是运算符。