0

わかりました、それが本当にばかげた質問であることはわかっていますが、わかりません。Euclid (gcd)の再帰アルゴリズムを見つけなければならないタスクがあります 。ここで、1つのケースでそれを行いました:

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 が Xi+1 をカウントする関数を呼び出すときに、再帰が х0 から始まる別のケースを実行する必要があります。それは一種のはずです:

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).

しかし、うまくいきません。助けてください。

4

1 に答える 1

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.

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

さよなら

于 2015-08-18T09:24:55.790 に答える