代码之家  ›  专栏  ›  技术社区  ›  lambda.xy.x

为导出的谓词重新定义模块中的运算符优先级

  •  1
  • lambda.xy.x  · 技术社区  · 7 年前

    我想编写一个模块,在该模块中导出一个谓词,用户应该能够访问该谓词 p/1 作为前缀运算符。我定义了以下模块:

    :- module(lala, [p/1]).
    
    :- op(500, fy, [p]).
    
    p(comment).
    p(ca).
    p(va).
    

    现在通过以下方式加载:

    ?- use_module(lala).
    true.
    

    不幸的是,查询失败:

    ?- p X.
    ERROR: Syntax error: Operator expected
    ERROR: p
    ERROR: ** here **
    ERROR:  X .
    

    正确设置运算符优先级后,所有操作都会正常工作:

    ?- op(500, fy, [p]).
    true.
    ?- p X.
    X = comment ;
    X = ca ;
    X = va.
    

    我在输出中使用了swi prolog,但同样的问题也出现在yap中(gnu prolog不支持模块)。有没有一种用户不需要自己设置优先级的方法?

    1 回复  |  直到 7 年前
        1
  •  2
  •   mat    7 年前

    你可以 出口 操作员 module/2 指令。

    例如:

    :- module(lala, [p/1,
                     op(500, fy, p)]).
    

    由于操作员也可以在模块中使用,因此您可以编写以下内容:

    p comment.
    p ça.
    p va.
    

    哪里 p 用作前缀运算符。

    推荐文章