Prolog 动态算术表达式

Xer*_*Xes 4 arithmetic-expressions prolog

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

所以,这是我的想法:

operation(X,Y, Op, Result):-
  Result is X Op Y.
Run Code Online (Sandbox Code Playgroud)

现在,我期待 Prolog 的这一点:

operation(3,4,'+', X).
X = 7.
Run Code Online (Sandbox Code Playgroud)

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

我还没有在互联网上找到任何东西,即使它是相当基本的,我想。

提前致谢!

Wou*_*eek 5

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

便携式解决方案

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

operation(X, Y, Operator, Result):-
  Goal =.. [Operator, X, Y],
  Result is Goal.
Run Code Online (Sandbox Code Playgroud)

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

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

:- meta_predicate(operation(+,+,2,-)).

operation(X, Y, Module:Operator, Result):-
  Goal =.. [Operator, X, Y],
  Module:(Result is Goal).
Run Code Online (Sandbox Code Playgroud)

请注意,对用户定义函数的支持在 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.
Run Code Online (Sandbox Code Playgroud)

  • 不需要显式模块限定或将谓词声明为元谓词,因为“is/2”是内置谓词,内置算术函数也不需要模块限定。您也不能在标准 Prolog 中定义自己的算术函数。 (2认同)
  • 正如 Carlo's 所指出的,您正在使用已弃用的 SWI-Prolog *only* 功能。最好有一个普遍问题的答案。 (2认同)