2009-09-19 4 views

答えて

14

あなたの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). 
+0

自分がプロローグを学ぶことですこれを行うのポイント:あなたはそれを再公式化する必要があります。 :) – TheOne

+2

プロローグでhttp://projecteuler.netの問題を解決してください... – ebo

+0

@ebo:あなたの定義pow/3とpow3/3は終了しません! 'pow(1,0,0)'を試してください。これは失敗するはずです。 – false

0
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). 
まあ
1
Predicates 
fac(Integer,Integer,Integer). 
Clauses 
fac(X,N,X):- N=1,!. 
fac(X,N,M):- N1=N-1,fac(X,N1,M1), M= X*M1. 
Goal 
fac(5,3,X). 
+0

'fac(5,3,1)'は失敗しますが、ループします。 – false

+0

私の場合、 'fac(5,3,1)'は 'no'を返します。ループを使わないで、私はVisual_Prolog_v52_peを使います。 – Maik

+0

不可能です。別のプログラムが必要です。 – false