2016-09-16 36 views
1

我想在序言中做一個階乘代碼,但得到本地堆棧的錯誤,也就是說,它被卡在無限循環中。我無法理解如何。 這是我的代碼:序言錯誤:在局部堆棧中的因子

fact(0,1). 
fact(1,1). 

fact(X,Y):- X\==0, A=X-1, fact(A,Z), Y=X*Z. 

我在哪裏出錯了?

回答

2

這是A=X-1,後來Y=X*Z。關於Prolog的頂級偉大的事情是,你可以輕鬆地嘗試一下你的代碼做什麼:

?- A = X-1. 
A = X-1. 

?- A = 5-1. 
A = 5-1. 

顯然,Prolog是諷刺我們:)。 =運算符用於統一;如果你想要做算術,你必須使用is/2

?- is(A, -(5, 1)). 
A = 4. 

通常寫爲:

?- A is 5-1. 
A = 4. 

這只是告訴你,一個表達式是一個術語,並評估了其第二術語參數:

?- Expr = X-1, X = 3, Result is Expr. 
Expr = 3-1, 
X = 3, 
Result = 2. 

對於您的factorial定義:它應該工作,如果您修復算術。請注意,如果X開頭的條件是X > 1而不是X \== 0,那麼它會更乾淨:您當前的程序爲fact(1,F)做了什麼?您獲得了多少個答案?

+0

它的工作原理!非常感謝! – telekineser