首页 > 解决方案 > 为导出的谓词重新定义模块中的运算符优先级

问题描述

我想编写一个导出谓词的模块,用户应该能够在其中访问谓词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 不支持模块)。有没有一种用户不需要自己设置优先级的方法?

标签: moduleprologoperators

解决方案


您可以使用指令导出运算符。module/2

例如:

:- 模块(lala, [p/1,
                  op(500, fy, p) ])。

由于该运算符在模块中也可用,因此您可以编写例如:

p 评论。
pça.
弗吉尼亚州

wherep用作前缀运算符。


推荐阅读