如何写一个prolog数学函数?

时间:2015-07-16 00:28:19

标签: prolog

我正在尝试将数学函数转换为prolog,但我不断收到错误。任何人都可以给我一个提示,我的错误在哪里吗?

我想转换f(x)= x 2 + f(x - 1)。所以我假设这是一个递归过程。以下是我到目前为止所做的工作。

function(0,0) :- !.
function(1,1) :- !.
function(X,Y) :-
   X1 is ((X * X) + (X - 1)),
   function(X1, Y).

我也试过

function(0,0) :- !.
function(1,1) :- !.
function(X,Y) :- 
  X1 is (X * X), X2 is (X - 1),
  function(X1, N1),
  function(X2, N2),
  Y is N1 + N2.

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

Prolog使用谓词演算。 谓词可以评估为真或假。

你需要写出什么是真的(其他任何东西都假定为假,因为prolog解释器将使用封闭的世界假设)。

对于你的函数我们可以定义一个谓词:

func(X,Y)

其中func是一个谓词,如果X是x而Y是f(X)则求值为true 当func(X,Y)为真时,你需要告诉prolog

func(0, 0).
func(X, Y) :- X > 0, U is X - 1, func(U, V), Y is X * X + V.

可以想到上面的代码 当X为0且Y为0

时,谓词函数为真

这将是您的基本情况。 (你只需要一个,因为你只有一次递归调用)。

接下来是您的递归案例:

对于一般X来说,当func为真时

  • 我们需要X大于0
  • 我们需要f(x-1)的结果,我们称之为V
  • 当func(X-1,V)为真时,V是f(X-1)的结果
  • prolog不允许在谓词中使用表达式,因此我们声明U是X-1
  • 然后我们把所有东西放在一起,状态Y是X * X + V

答案 1 :(得分:2)

试试这个:

f(0,0) .        % f(0) is 0.
f(X,Y) :-       % otherwise...
  integer(X) ,  % - constrain X to be an integer, and
  X > 0 ,       % - constrain X to be positive,
  X1 is X-1 ,   # - then decrement X
  f(X1,Y1) ,    % - compute f(X-1) ,
  Y is X*X + Y1 % - and add X*X to that to get the result.
  .             % Easy!