2012-04-08 3 views
0

Ok, ich weiß, es ist wirklich eine dumme Frage, aber ich kann es nicht bekommen. Es gibt eine Aufgabe, wo ich einen rekursiven Algorithmus von Euclid (gcd) finden sollte. Ich habe es für einen Fall gemacht, hier:Euclidean rekursive Algorithmus

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

Ich brauche einen anderen Fall zu tun, in denen Rekursion von х0 ist beginnig, wenn Xi dann für die Funktion Zählen Xi + 1 Aufruf. Es sollte eine Art es sein:

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

Aber es funktioniert nicht. Bitte, hilf mir dabei.

+0

warum nichtdeterminiert? scheint mir deterministisch – CapelliC

+0

Sorry ich verstehe deine Frage nicht. Wo ist 'Xi + 1'? In der ersten Code-Box steht 'nicken (X, 0, X): -! .' in Konflikt mit' nicken (X, 0, X): - X> 0.'. Der zweite wird nie aufgerufen werden. Diese Regel ist nutzlos 'nod1 (X, Y, X, Y): - nod1 (X, Y, X, Y) .' und würde eine Schleife, wenn sie aufgerufen wird. – CapelliC

+0

gut ... ich dachte, ich muss das Ergebnis von Nicken finden. Liege ich falsch? – eeeee

Antwort

0

Der folgende Code funktioniert für mich. Bitte beachten Sie die Verwendung von rem, aber ich denke, Sie auch mod verwenden:

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

Hier sind einige Beispiel läuft mit 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. 

Wenn Sie ein bestimmtes Vorzeichen des Ergebnisses wollen Sie benötigen zusätzlichen Code um es herum.

Tschüss