我刚刚接受新闻。我想定义一个中缀二进制运算符“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
由于
答案 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.