2012-04-08 15 views
0

これは本当に愚かな質問ですが、私はそれを得ることができません。 私は Euclid(gcd)の再帰アルゴリズムを見つけなければなりません。私はここで、一つのケースのためにそれをやった:ユークリッド再帰アルゴリズム

nondeterm nod (integer,integer,integer) 
CLAUSES 
nod (X,0,X):- !. 
nod (0,X,X):- !. 
nod (X,0,X):-X>0. 
nod (X,Y,G):-Y>0, Z = X mod Y, nod (Y,Z,G). 

を、私はXiはその後、西+ 1をカウント機能を求める再帰がх0からbeginnigされる別のケースを、行う必要があります。 それのようにする必要があります:

PREDICATES 
nondeterm nod (integer,integer,integer) 
nondeterm nod1 (integer,integer,integer,integer,integer)  
CLAUSES 
nod(X,Y,Z):- nod1(X,Y,Z,0,0). 
nod1 (X,Y,Z,X,Y):- Otvet = Z, write("Otvet=", Otvet, "\n"), !. 
nod1 (X,Y,X,Y):- nod1 (X,Y,X,Y). 
nod1 (X,Y,Z,X1,Y1):- 
       X1>Y1, X>0, Y>0, 
       Y2 = X1 mod Y1, 
       X2 = Y1, 
       nod1(X,Y,Z,X2,Y2). 

しかし、それは動作しません。それで助けてください。

+0

なぜnondetermですか?私に決定的に見える – CapelliC

+0

申し訳ありませんあなたの質問を理解できません。 'Xi + 1'はどこですか? 'nod(X、0、X): - !.'は' nod(X、0、X):-X> 0.'と衝突します。第二のものは決して呼び出されません。 このルールは 'nod1(X、Y、X、Y): - nod1(X、Y、X、Y).'で無駄です。 – CapelliC

+0

まあ...私はうなずく私は頷いた結果を見つける必要があると思った。私が間違っている? – eeeee

答えて

0

次のコードは私に役立ちます。 REMの使用を注意してください、私はあなたにも、MOD使用することができます推測してください:ここでは

% sys_gcd(+Integer, +Integer, -Integer) 
sys_gcd(X, 0, X) :- !. 
sys_gcd(X, Y, Z) :- 
    H is X rem Y, 
    sys_gcd(Y, H, Z). 

は、いくつかの例では、SWI-Prologので実行されている:

?- sys_gcd(20,30,X). 
X = 10. 
?- sys_gcd(-20,30,X). 
X = 10. 
?- sys_gcd(20,-30,X). 
X = -10. 
?- sys_gcd(-20,-30,X). 
X = -10. 

あなたは結果の特定の記号をしたい場合、あなたは の周りに追加のコードが必要です。

bye

関連する問題