Prolog递归程序不返回值

时间:2016-05-30 15:06:39

标签: recursion prolog clpfd

我还是Prolog的新手,我遇到了一个我不知道如何解决的错误。 我编写了一个简单的取幂程序,如下所示:

exp(b, 0, R) :- R is 1.         % non-recursive case: exponent is 0
exp(0, e, R) :- R is 0.         % non-recursive case: base is 0
exp(Base, Exponent, Result) :-  % recurse if base and exponent are non-negative
    Base >= 0,
    Exponent >= 0,
    E1 is Exponent-1,
    exp(Base, E1, R1),
    Result is Base*R1.

这个编译很好,但是当我运行它并给它一个查询,比如说,exp(2, 4, X)。我遇到了以下输出:

?- exp(2, 4, X).
false.

我做错了吗?或者是以某种我不知道的方式格式化结果的问题?

1 个答案:

答案 0 :(得分:4)

您将变量 atoms 混淆。如果您将两个非重复子句简单地更改为:

,它将按预期工作
exp(_, 0, 1).
exp(0, _, 0).

事实上,我建议改变整个程序,以便在整个过程中使用 CLP(FD)约束

exp(_, 0, 1).
exp(0, _, 0).
exp(Base, Exponent, Result):-
    Base #>= 0,
    Exponent #>= 0,
    E1 #= Exponent-1,
    exp(Base, E1, R1),
    Result #= Base*R1.

现在举例来说,以下至少会产生一个解决方案:

?- exp(2, X, 16).
X = 4

而我们之前有:

?- exp(2, X, 16).
>=/2: Arguments are not sufficiently instantiated

还请注意最常见的查询:

?- exp(X, Y, Z).
Y = 0,
Z = 1 ;
X = Z, Z = 0 ;
X = Z,
Y = 1,
Z in 0..sup ;
X = Z, Z = 0,
Y in 0..sup,
_G801+1#=Y,
_G801 in -1..sup .