在prolog中定义中缀二进制运算符时出现问题



我刚开始使用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 

感谢

您不能在标准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的扩展。

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.

最新更新