【问题标题】:Operator priority evaluation order in PrologProlog中的运算符优先级评估顺序
【发布时间】:2013-03-24 13:29:22
【问题描述】:

如果我定义了这个操作符:

op(700, yfx, sum).

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

yfx: 表示参数的优先级尊重运算符本身。这个配置说操作符是 infix 并且参数 y 优先于操作符的优先级

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

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

9 sum 5 sum 7

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

我对运算符优先级的推理是否正确?

【问题讨论】:

    标签: prolog


    【解决方案1】:

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

    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).
    

    注意括号是必需的(sum 的优先级高于 unification (=)/2)。

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

    【讨论】:

      猜你喜欢
      • 2016-12-31
      • 2014-04-14
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2019-06-05
      • 2018-03-28
      相关资源
      最近更新 更多