【问题标题】:Trouble defining an infix binary operator in prolog在 prolog 中定义中缀二元运算符时遇到问题
【发布时间】:2013-11-18 19:17:16
【问题描述】:

我只是 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 operators swi-prolog


    【解决方案1】:

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

    【讨论】:

    • 并非在任何地方都有效。例如,gprolog 1.4.4 似乎没有 goal_expansion/2 和 expand_goal/2。
    • 术语扩展机制既不是通用的也不是标准的(这就是为什么我写了“几个”(Prolog 系统)而不是“全部”或“大多数”。如果你正在寻找一个可移植的术语-扩展解决方案,Logtalk 提供了一个在最现代和积极支持的 Prolog 系统上运行。
    • 是的,当然。如果您定义的表达式需要谓词调用,X is E 将转换为G, X is E'。今天刚刚跨过一个旧示例,其中 SWI-Prolog 允许定义可评估函数,请参见此处:courses.ece.ubc.ca/571f/randoml.html。例如,box mueller 需要一个目标。
    【解决方案2】:

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      相关资源
      最近更新 更多