Prolog中的递归函数

时间:2014-11-10 17:39:51

标签: function recursion prolog clpfd

我尝试计算递归函数:

f(x, y) = 0 if x = 0;
f(x, y) = 1 if x = 1;
f(x, y) = y*y*f(x-2,y) if x>1.

我试过这种方式:

f(0,_,0).
f(1,_,1).
f(X,Y,Z):-
          X>1,
          XX is X-2,
          ZZ = Y*Y*Z,
          f(XX,Y,ZZ).

我只能获得真/假。如何计算此函数的值?

非常感谢!

2 个答案:

答案 0 :(得分:3)

如果您只是使用CLP(FD)约束,则可以轻松将其转换为真正的关系:

:- use_module(library(clpfd)).

f(0, _, 0).
f(1, _, 1).
f(X, Y, Z):-
        X #> 1,
        XX #= X-2,
        Z #= Y*Y*ZZ,
        f(XX, Y, ZZ).

示例查询及其结果:

?- f(X, 5, Z).
X = Z, Z = 0 ;
X = Z, Z = 1 ;
X = 2, Z = 0 ;
X = 3, Z = 25 .

答案 1 :(得分:1)

你的最后一条规则对我来说有点奇怪。我会尝试这样的事情:

f(X,Y,Z) :-
    X > 1,
    XX is X-2,
    f(XX,Y,ZZ),
    Z is Y * Y * ZZ.