【问题标题】:Prolog dynamic arithmetic expressionProlog动态算术表达式
【发布时间】:2014-05-23 19:00:13
【问题描述】:

我是 Prolog 的新手,想定义一个简单的谓词,根据我选择在算术表达式中使用的函数来计算结果。

所以,这是我的想法:

operation(X,Y, Op, Result):-
  Result is X Op Y.

现在,我期待 Prolog 会这样:

operation(3,4,'+', X).
X = 7.

但正如您可能猜到的那样,Prolog 无法将Op 识别为算术运算。 有谁知道这怎么可能?

我还没有在互联网上找到任何东西,尽管我认为它是相当基本的。

提前致谢!

【问题讨论】:

    标签: prolog arithmetic-expressions


    【解决方案1】:

    虽然 Tudor 和 gokhans 的答案提供了想要的结果,但我认为还有一个更优雅的解决方案。

    便携式解决方案

    以下内容适用于大多数 Prolog 实现:

    operation(X, Y, Operator, Result):-
      Goal =.. [Operator, X, Y],
      Result is Goal.
    

    扩展但 SWI-Prolog 特定的解决方案

    SWI-Prolog 允许定义custom arithmetic functions。以下代码扩展了上面的代码,以便与来自其他模块的此类用户定义函数一起使用:

    :- meta_predicate(operation(+,+,2,-)).
    
    operation(X, Y, Module:Operator, Result):-
      Goal =.. [Operator, X, Y],
      Module:(Result is Goal).
    

    请注意,对用户定义函数的支持在 SWI-Prolog 中已弃用,并且在其他没有此功能的 Prolog 中不起作用。

    使用示例

    使用operation/4 的这些实现的一些示例:

    ?- operation(1, 2, mod, X).
    X = 1.
    
    ?- operation(1, 2, //, X).
    X = 0.
    
    ?- operation(1, 2, /, X).
    X = 0.5.
    
    ?- operation(1, 2, -, X).
    X = -1.
    
    ?- operation(1, 2, +, X).
    X = 3.
    

    【讨论】:

    • Wouter,你少了一个右括号。除此之外,算术运算符是否可调用?我不认为,但我可能是错的......
    • @CapelliC 谢谢,我已经修复了括号,并包含了一些正在使用的谓词示例。我不确定为什么算术运算符不可调用,但我可能是这里弄错的人......你能详细说明一下吗?
    • 我希望在 调用 时调用成功。 ?- X + Y. 给出错误,我想。确实,我得到了ERROR: toplevel: Undefined procedure: (+)/2
    • 不需要显式的模块限定或将谓词声明为元谓词,因为is/2 是内置谓词,内置算术函数也不需要模块限定。您也不能在标准 Prolog 中定义自己的算术函数。
    • 正如 Carlo 所指出的,您正在使用已弃用的 SWI-Prolog only 功能。最好有一个普遍问题的答案。
    【解决方案2】:

    如果 Op 是“+”,则需要告诉 Prolog,然后将 X 和 Y 相加。您可以按照以下方式进行操作

    operation(X,Y, Op, Result) :- 
       Op = '+',  
       Result is X + Y
     ;
       Op = '-',  
       Result is X - Y.
    

    您可以增加操作次数。

    【讨论】:

    • 谢谢伙计!这绝对可以解决问题。所以一般来说没有更简单的方法可以做到这一点?
    • 据我所知,没有更好的方法。但每个操作只有几行:)
    • 考虑使用(=..)/2。例如:Expr =.. [Op,X,Y], Result is Expr.
    • @mat 建议改进。另一种,更基本的:使用pattern matching,即operation(X,Y, +, Result) :- Result is X + Y.
    猜你喜欢
    • 2015-12-20
    • 1970-01-01
    • 2013-09-12
    • 2014-07-14
    • 1970-01-01
    • 2011-01-25
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多