0

如果我定义这个运算符:

op(700, yfx, sum).

700:表示尊重其他运营商的优先级。

yfx:表示参数的优先级尊重运算符本身。此配置表示运算符是中的,并且参数 y 的优先级 <= 运算符优先级,参数 x 的优先级 <= 运算符优先级。

最高优先级是 therms 的主要函子,这意味着这是要执行的最后一个操作。

所以,这意味着如果我有以下评估:

9 sum 5 sum 7

所以这意味着我有一个三个,其中首先我评估 5 sum 7 的值,然后我评估:9 sum (5 sum 7)

我对运营商优先级的推理是否正确?

4

1 回答 1

2

我认为措辞与您使用的不同:

700:优先级。下绑定更严格。

yfx:向左的关联性。

?- write_canonical(1 sum 2 sum 3).产量sum(sum(1,2),3)

此运算符与左关联,如算术二元运算符:

?- setof(X-O,current_op(X,yfx,O),L),pairs_keys_values(L,_,Os).
L = [250- (?), 400- (*), 400- (/), 400- (//), 400- (<<), 400- (>>), 400- (div), 400- (mod), ... - ...|...],
Os = [?, *, /, //, <<, >>, div, mod, rdiv|...].

检查操作员关系的一种实用方法是通过统一。

?- (1 sum 2 sum 3) = (1 sum X).
false.

?- (1 sum 2 sum 3) = (X sum 3).
X = (1 sum 2).

请注意,括号是必需的(总和的优先级高于统一 (=)/2)。

对于预定义的系统操作员,请参阅文档页面。

于 2013-03-24T15:42:31.620 回答