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

时间:2018-12-13 19:09:24

标签: module prolog operators

我想编写一个模块,该模块导出谓词,以便用户可以作为前缀运算符访问谓词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 个答案:

答案 0 :(得分:4)

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

例如:

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

由于该模块中还提供了运算符,因此您可以编写例如:

p comment.
p ça.
p va.

其中p用作前缀运算符。