Prolog动态算术表达式

时间:2014-04-10 07:46:03

标签: prolog arithmetic-expressions

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

所以,这是我的想法:

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

现在,我期待Prolog的这个:

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

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

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

提前致谢!

2 个答案:

答案 0 :(得分:4)

虽然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.

答案 1 :(得分:-3)

你需要告诉Prolog,如果Op是'+',那么总和X和Y.你可以这样做

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

您可以增加操作次数。