Programm für das Auffinden von Gcd in Prolog
Ich zu schreiben versucht, einen code in Prolog für die Suche nach GCD (ohne modulo)
kann mir jemand sagen, was ist Los mit diesem Programm?
gcd(X,Y,Z):- X>=Y, X1=X-Y, gcd(X1,Y,Z).
gcd(X,Y,Z):- X<Y, X1=Y- X, gcd(X1,X,Z).
gcd(0,X,X):- X>0.
InformationsquelleAutor Ohad | 2014-03-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum die ursprüngliche Implementierung nicht funktioniert, gibt es zwei Gründe:
Das Prädikat
=/2
ist für die Vereinigung, nicht das arithmetische ZuweisungDen Ausdruck
X1 = X - Y
nicht subtrahierenY
ausX
und speichern das Ergebnis inX1
. Vielmehr vereintX1
mit dem Begriff-(X,Y)
. Wenn, zum Beispiel,X=5
undY=3
, dann das Ergebnis wäre,X1=5-3
, nichtX1=2
. Die Lösung ist die Verwendungis/2
was weist bewertet arithmetische Ausdrücke:X1 is X - Y
.Andere Prädikate, neben dem base-case-Prädikat, erfolgreich entsprechen die base-case -
Die Klausel
gcd(0,X,X) :- X > 0.
ist eine vernünftige Basis, aber es ist nie versucht, da die zweite Klausel (gcd(X,Y,Z):- X<Y,...
) immer erfolgreich den gleichen Bedingungen zuerst, was zu einer unendlichen Rekursion und ein stack-überlauf.Einen Weg, um dies zu beheben, bewegen Sie den base case auf die erste Klausel, und verwenden Sie einen cut zu vermeiden, backtracking, nachdem es erfolgreich ausgeführt:
Nun wird es funktionieren:
(HINWEIS: die hier "Nein" bedeutet, dass keine weiteren Lösungen gefunden, nach der Suche nach die erste)
NACHTRAG
Gibt es noch ein paar verbleibenden "Lücken" in der oben genannten Umsetzung. Einer ist, dass es nicht handhaben
gcd(0, 0, R)
ordnungsgemäß (es überläuft). Zweitens, es muss nicht mit negativen Werten. Eine mögliche Lösung wäre zu erarbeiten, in diesen Fällen:InformationsquelleAutor lurker
Versuchen Sie Folgendes statt:
Entnommen rosettacode.org auf der GCD in allen Arten von Sprachen.
Irgendwie ist die Ausgabe von gcd(10,5,X) ist falsch.. in Ihrem Programm und in meinem Programm (nach dem hinzufügen des "ist").. keine Ahnung warum ?
Sorry, siehe meine aktualisierte Antwort. Ich versuchte es auf dieser Seite
Es ist richtig.. haben Sie eine Idee, warum mein original Programm ist falsch ?( außer der "ist" - Betrieb).
InformationsquelleAutor helb
Prolog-code für GCD
InformationsquelleAutor Dvir Arad
InformationsquelleAutor rashedcs
prolog Antwort ist:-
InformationsquelleAutor AMIT KUMAR