Recursion Prolog递归程序不返回值

Recursion Prolog递归程序不返回值,recursion,prolog,clpfd,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 n

我对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.

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

您将变量原子混淆了。如果将两个非对消性从句简单更改为:

exp(_, 0, 1). exp(0, _, 0). exp(\u0,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(\u0,1)。 exp(0,0)。 exp(基数、指数、结果):- 基数#>=0, 指数#>=0, E1#=指数-1, exp(基准、E1、R1), 结果#=基数*R1。 现在,例如,以下内容至少会产生一个解决方案:

?- exp(2, X, 16). X = 4 ?-exp(2,X,16)。 X=4 鉴于我们以前有:

?- exp(2, X, 16). >=/2: Arguments are not sufficiently instantiated ?-exp(2,X,16)。 >=/2:参数没有充分实例化 另请注意最一般的查询:

?- 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 . ?-exp(X,Y,Z)。 Y=0, Z=1; X=Z,Z=0; X=Z, Y=1, Z在0..sup; X=Z,Z=0, Y在0..sup中, _G801+1#=Y, _G801英寸-1..sup。
这就解决了问题。谢谢你的解释,真的很有帮助!