2016-05-30 99 views
3

我對Prolog還是一個新手,我遇到了一個錯誤,我不知道如何解決。 我寫了一個簡單的程序冪看起來像這樣: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. 

有沒有什麼我做錯了?還是以某種我不知道的方式來格式化結果?

回答

4

你很困惑變量原子。它按預期工作,如果你簡單的改變兩個nonrecusive子句:

 
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 . 
+2

問題解決了。感謝您的解釋,它確實有幫助! –