无法在prolog中定义中缀二进制运算符

时间:2013-11-18 19:17:16

标签: prolog operators swi-prolog

我刚刚接受新闻。我想定义一个中缀二进制运算符“rA”,当我给出矩形的宽度和宽度时,它给出了矩形区域。这是我的代码:

:-op(300, xfy, rA).

rA(X,Y,R) :- R is X*Y.

当我这样做时代码工作正常:

1 ?- rA(3,4,A).
A = 12. 

我无法弄清楚的是将其定义为中缀二元运算符。我收到这个错误:

2 ?- A is 3 rA 4.
ERROR: evaluable `3 rA 4' does not exist 

由于

2 个答案:

答案 0 :(得分:8)

您无法在标准Prolog中执行此操作。但是,SWI-Prolog曾用于支持算术函数的用户定义,但我认为,在最近的版本中,该功能已被弃用。查看文档。一种可能的替代方案是利用术语扩展机制,即几个Prolog系统(包括SWI-Prolog)定义和目标扩展is/2目标来处理利用用户定义的算术函数的调用。类似的东西:

goal_expansion(X is Expression, X is ExpandedExpression) :-
    % traverse and transform Expression

但请记住,重复调用goal_expansion/2直到达到一个修正点。因此,请注意尝试扩展已扩展的算术表达式所产生的无限循环。解决此问题的一种方法是使用在调用goal_expansion/2时检查的动态谓词来缓存扩展的结果。可以废除缓存动态谓词,例如当你正在处理文件的结尾时:

term_expansion(end_of_file, _) :-
    abolish(...), % the argument will be the predicate indicator of the caching predicate
    fail.

在执行任何必要的操作后,建议扩展end_of_file时失败,因为可能还有其他(正交)扩展也依赖于end_of_file的扩展。

答案 1 :(得分:4)

Paulo得到了一个很好的答案,无论如何,这里是一个示例,说明指示SWI-Prolog关于您的功能所需的详细信息:

22 ?- [user].
|: :- arithmetic_function(rA/2).
|: rA(X,Y,Z) :- Z is X*Y.
% user://1 compiled 0.07 sec, 3 clauses
true.

23 ?- F is rA(3,6).
F = 18.

24 ?- [user].
|: :-op(300,xfx,rA).
% user://2 compiled 0.02 sec, 1 clauses
true.

25 ?- F is 3 rA 6.
F = 18.