在较旧的教科书 1 中,经常会遇到以下操作员声明:
?- op(1200,fx,(:-)).
^ ^
这些圆括号过去是必要的。但今天,他们不再需要了:
| ?- writeq(op(1200,fx,(:-))).
op(1200,fx,:-)
为什么不再需要它们?标准如何应对这种情况?
1 p.97 6. MU-Prolog 3.2db参考手册的标准操作员声明,出现在Prolog的否定和控制中,Lee Naish,LNCS 238,Springer-Verlag 1985。
答案 0 :(得分: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 ;
所以我们回到最初的问题:
这些圆括号过去是必要的。但今天,他们不再需要了。为什么不再需要它们?标准如何应对这种情况?
我们假设T = op(1200,fx,:-)
成立。
T
是以功能表示法提供的复合术语。
T
涵盖了 term = atom, open ct, arg list, close;
atom
匹配op
,T
的算符。
open ct与开放式括号匹配。
T
的语法规则涵盖了“中间部分”(arg list
的参数)。
arg list
是arg
的非空列表。
什么是arg
?
优先级小于1000的术语,优先级为(',')/ 2。例如,1200
和fx
。
作为运算符的原子。 (没有附加条件!)
close与结束括号匹配。
引用:
语法规则中由
arg
表示的参数作为compount术语或列表元素的参数出现。它可以是作为运算符的原子,也可以是优先级不大于999的术语。当一个参数是一个任意的术语时,它的优先级应小于','(逗号)运算符的优先级,这样逗号作为中缀操作符和逗号作为参数或列表元素分隔符之间不存在冲突。
注意:
这个“参数”的概念确保术语
f(x,y)
和f(:-, ;, [:-, :-|:-])
在语法上都是有效的当前定义的任何运算符定义。逗号不是原子,以下“术语”有语法错误:f(,,a)
,[a,,|v]
和[a,b|,]
;但以下两个术语在语法上有效:f(',',a)
,[a,','|v]
和[a,b|',']
。
答案 1 :(得分: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;
如果atom是运算符(具有任意优先级)
arg = term;
(优先级为999)
由于上面突出显示的案例arg = atom;
,:-
op(1200,fx,:-)
中不需要圆括号。
如果不是针对上述特殊情况,我们将需要圆括号,因为推导必须遵循 6.3.1.3 Atoms :
如果atom不是运算符,则
term = atom;
优先级为0term = atom;
优先级为1201,如果atom是运算符。