パワーファンクションで何が問題になっていますか?プロローグ内のパワーファンクション
pow(_,0,1).
pow(X,Y,Z) :-
pow(X,Y-1,X*Z).
?- pow(2,3,Z).
ERROR: Out of global stack
パワーファンクションで何が問題になっていますか?プロローグ内のパワーファンクション
pow(_,0,1).
pow(X,Y,Z) :-
pow(X,Y-1,X*Z).
?- pow(2,3,Z).
ERROR: Out of global stack
あなたのYは減算されません。機能のような述語は使用できません。また、乗算の結果をZに統一する必要があります。
pow(_,0,1).
pow(X,Y,Z) :- Y1 is Y - 1,
pow(X,Y1,Z1), Z is Z1*X.
はるかに高速になります組み込み電源機能もあります:
pow2(X,Y,Z) :- Z is X**Y.
も捕虜は最後の呼び出しではなく、唯一のスタックフレームを使用するように最適化することができないことに注意してください。
pow3(X,Y,Z) :- powend(X,Y,1,Z),!.
powend(_,0,A,Z) :- Z is A.
powend(X,Y,A,Z) :- Y1 is Y - 1, A1 is A*X, powend(X,Y1,A1,Z).
DOMAINS
num=INTEGER
PREDICATES
nondeterm power(num,num,num)
CLAUSES
power(X,0,1).
power(X,P,F):-X>0,P1=P-1,power(X,P1,F1),F=X*F1.
GOAL
power(2,5,X).
まあ
自分がプロローグを学ぶことですこれを行うのポイント:あなたはそれを再公式化する必要があります。 :) – TheOne
プロローグでhttp://projecteuler.netの問題を解決してください... – ebo
@ebo:あなたの定義pow/3とpow3/3は終了しません! 'pow(1,0,0)'を試してください。これは失敗するはずです。 – false