Summe der ersten n zahlen in prolog
Hallo kann mir jemand helfen bei der Berechnung der Summe der ersten n zahlen. Für das Beispiel n=4 => Summe = 10.
Bisher habe ich dies schrieb,
predicates
sum(integer,integer)
clauses
sum(0,0).
sum(N,R):-
N1=N-1,
sum(N1,R1),
R=R1+N.
Diese arbeitet, aber ich brauche eine andere Implementierung. Ich habe keine Ideen wie ich das machen könnte, diese Unterschiede . Bitte helfen Sie
Was passiert, wenn Sie das Programm ausgeführt haben?
kannst du bitte editieren Sie Ihren code, um klar zu machen, was Kommentar und was ist code? Diese Datei würde nicht laden/kompilieren.
dies scheint zu sein, Visual Prolog, die verwendet benannte Abschnitte und ermöglicht die definition von Datentypen, die innerhalb der
Ich bin mit Turbo Prolog. Ich bekomme die folgende Fehlermeldung : Freie variable in expresion R=R+N
Turbo Prolog ist das gleiche wie Visual Prolog. Borland kaufte es vor vielen Jahren von Prolog Development Corp und verkaufte es dann später wieder auf. 🙂
kannst du bitte editieren Sie Ihren code, um klar zu machen, was Kommentar und was ist code? Diese Datei würde nicht laden/kompilieren.
dies scheint zu sein, Visual Prolog, die verwendet benannte Abschnitte und ermöglicht die definition von Datentypen, die innerhalb der
domains
Abschnitt. Es ist ein wenig off-standard. Der obige code ist syntaktisch gültig Visual Prolog-code (mit der exeception der Rechtschreibfehler "intger").Ich bin mit Turbo Prolog. Ich bekomme die folgende Fehlermeldung : Freie variable in expresion R=R+N
Turbo Prolog ist das gleiche wie Visual Prolog. Borland kaufte es vor vielen Jahren von Prolog Development Corp und verkaufte es dann später wieder auf. 🙂
InformationsquelleAutor user3043278 | 2014-01-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was @mbratch sagte.
Was du bist-computing ist eine dreieckszahl. Wenn Sie Ihre Hausaufgaben über die dreieckigen zahlen und nicht über das lernen von rekursiven denken, können Sie einfach berechnen Sie so:
Wenn, was wahrscheinlicher ist, Sie sind das lernen rekursiver dachte, versuchen Sie dies:
Bearbeitet, um hinzufügen:
Oder, wenn Sie lieber ein count-down-Ansatz:
Beide sind tail-rekursive, was bedeutet, dass die prolog-compiler können Sie in iteration (google "tail recursion optimization" für details).
Wenn Sie möchten, beseitigen Sie den Akku, müssen Sie etwas tun, wie dieses:
Etwas einfacher, aber jeder Rekursion verbraucht ein weiterer Stapelrahmen (stack frame): gegeben sei ein hinreichend großen Wert für N, Ausführung schlägt fehl mit einem stack-überlauf.
Ich bevorzuge zählen auf, anstatt nach unten. Sechs; ein halbes Dutzend der anderen, wie Sie sagen. Ich habe einen einfachen count-down-version auf meine Antwort. Auch etwas näher, was Sie ursprünglich hatte mit einer Erklärung, warum, habe ich den Ansatz habe ich.
InformationsquelleAutor Nicholas Carey
siehe Arithmetische progression sum.
Ich glaube, die Antwort Nicholas hat bereits darauf hingewiesen, dass aus. 😉
InformationsquelleAutor salva
Da Sie schon viel von der Beratung über Ihren code, lassen Sie mich werfen ein snippet (ein bisschen off-topic).
Zählen, und mehr im Allgemeinen, zu verdichten, es ist ein Bereich, wo der Prolog nicht Leuchten, wenn im Vergleich zu anderen relationalen,deklarative Sprachen (Lesen von SQL). Aber einige herstellerspezifische Bibliothek es viel angenehmer:
InformationsquelleAutor CapelliC
Dies ist das "Herz" des Programms:
Den
=/2
Prädikat (Hinweis: die/2
bedeutet es akzeptiert 2 Argumente) ist die Instanziierung Prädikat, nicht um eine Abtretung oder logisch gleich ist. Es versucht zu vereinen, die seine Argumente machen Sie das gleiche. Also, wennN
ist alles andere als0
, dannR=R+N
wird immer scheitern, weilR
kann nie die gleiche sein, wieR+N
. Ebenfalls fürN=N-1
: es wird immer fehlschlagen, weilN
undN-1
können nie gleich sein.Im Fall von
=/2
(Vereinigung), - Ausdrücke sind nicht ausgewertet. Sie sind nur Begriffe. Also, wennY = 1
, dannX = Y + 1
vereintX
mit1+1
als ein Begriff, der (in ähnlicher Weise geschrieben+(1,1)
).Wegen der oben genannten Probleme,
sum
wird immer scheitern.Numerische Zuordnung eines arithmetischen Ausdrucks erfolgt in Prolog mit der
is/2
Prädikat. Wie diese:Dieser operator vereint der Wert
X
der gleiche sein wie der Wert des ausgewerteten AusdrucksY+1
. In diesem Fall werden Sie auch nicht habenX is X+1
aus den gleichen Gründen, die oben gegeben:X
kann nicht das gleiche gemacht wieX+1
und Prolog nicht erlaubt "re-Instanziierung einer Variablen innerhalb einer Klausel. So müssten Sie so etwas wieX1 is X + 1
. Beachten Sie auch, dass füris/2
zur Arbeit, alles in den Ausdruck auf der rechten Seite müssen zuvor instanziiert. Wenn alle Variablen in dem Ausdruck auf der rechten Seite nicht einen Wert haben, erhalten Sie eine Instanziierung Fehler oder, im Falle von Turbo-Prolog, Freie Variablen im Ausdruck....So müssen Sie verschiedene Variablen für den Ausdruck ergibt, und den code zu organisieren, so dass, wenn Sie mit
is/2
Variablen, die im Ausdruck instanziiert.BEARBEITEN
Ich verstehe von Sergej Dymchenko, Turbo Prolog, im Gegensatz zu GNU oder SWI, wertet Ausdrücke für
=/2
. Also die=
wird die Arbeit in der vorgegebenen Problems. Allerdings ist der Fehler bezüglich Instanziierung (oder "freien Variablen") ist immer noch durch das gleiche Problem verursacht, die ich oben erwähnt.Finden Sie unter Elemente meiner Antwort bezüglich
=/2
versusis/2
. Siehe auch meine Beschreibung in Bezug auf die Ursache der "Freien variable in Ausdruck..." Zuerst müssen Sieis
statt=
.=
ist nicht die richtige Prädikat. Zweitens, in der Reihenfolge, in der Sie existieren in Ihrer Klauselis
scheitern wird durch eine Instanziierung (freie variable) Fehler.mbratch, Visual Prolog (und Turbo Prolog) ist eine lustige Sache, =/2 statt/2: Beispiele hierzu finden Sie unter progopedia.com/implementation/visual-prolog
wow, das ist interessant. Es ist schon eine lange Zeit, seit ich verwendet, Turbo Prolog und ich hatte vergessen, dass Sie wichen von den basic-standard, das ist schade. Die
=/2
versusis/2
ist etwas ganz grundlegendes. Ich habe versucht, das Beispiel, das Sie verknüpft GNU Prolog für das Interesse und it-stack übergelaufen (nachdem ich bearbeitet habe, aus der Turbo-Prolog-Umgebung-Gegenstände), wahrscheinlich, weil es versucht, die Vereinigung mit=/2
, wie es soll. Aber das heißt, meine Kommentare über "Freie Variablen..." immer noch gelten.InformationsquelleAutor lurker
InformationsquelleAutor rashedcs