2016-09-16 7 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です。どうやら、プロローグが私たちをからかっている

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

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

:):プロローグトップレベルの素晴らしいところは、あなたが簡単にあなたのコードが何をするか試してみることができるということです。 =演算子は統一に使用されます。あなたが算術演算を行いたい場合、あなたは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. 

階乗の定義には、算術演算を修正すると効果があります。初めにXの条件がX \== 0の代わりにX > 1と表示されている場合は、より清潔になります。現在のプログラムはfact(1,F)のために何を行いますか?

+0

これは機能します。どうもありがとう! – telekineser

関連する問題