在导出谓词的模块中重新定义运算符优先级
Redefining operator precedence in a module for exported predicate
我想编写一个导出谓词的模块,用户应该能够在其中访问谓词 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 不支持模块)。有没有办法让用户不需要自己设置优先级?
您可以使用 module/2
指令 导出 运算符。
例如:
:- module(lala, [p/1,
op(500, fy, p)]).
因为操作符在模块中也是可用的,你可以这样写:
p comment.
p ça.
p va.
其中 p
用作前缀运算符。
我想编写一个导出谓词的模块,用户应该能够在其中访问谓词 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 不支持模块)。有没有办法让用户不需要自己设置优先级?
您可以使用 module/2
指令 导出 运算符。
例如:
:- module(lala, [p/1, op(500, fy, p)]).
因为操作符在模块中也是可用的,你可以这样写:
p comment. p ça. p va.
其中 p
用作前缀运算符。