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

lam*_*y.x 3 module operators prolog

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

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

:- op(500, fy, [p]).

p(comment).
p(ca).
p(va).
Run Code Online (Sandbox Code Playgroud)

并立即通过以下方式加载:

?- use_module(lala).
true.
Run Code Online (Sandbox Code Playgroud)

不幸的是,查询失败:

?- p X.
ERROR: Syntax error: Operator expected
ERROR: p
ERROR: ** here **
ERROR:  X .
Run Code Online (Sandbox Code Playgroud)

正确设置运算符优先级后,一切正常:

?- op(500, fy, [p]).
true.
?- p X.
X = comment ;
X = ca ;
X = va.
Run Code Online (Sandbox Code Playgroud)

我使用 SWI Prolog 进行输出,但在 YAP 中也出现同样的问题(GNU Prolog 不支持模块)。有没有办法让用户不需要自己设置优先级?

mat*_*mat 5

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

\n\n

例如:

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

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

\n\n
\np 注释。\np \xc3\xa7a。\np va。\n
\n\n

wherep用作前缀运算符。

\n