2016-05-21 13 views
-1

Ich möchte die Summation von ungeraden Zahlen in einem bestimmten Bereich wie 1 bis 9 ist die angegebene Eingabe berechnen. und mein Programm wird die Summe aller ungeraden Zahlen zwischen 1 und 9 anzeigen. Obwohl die Aufgabe theoretisch so einfach ist, aber als Starter von Turbo Prolog, kann ich nicht mit der Schleife umgehen, um die Summe zu berechnen. Irgendwelche Hilfe würden schätzen.Wie simuliere ich loop in turbo prolog

Voran Dank.

+0

Dank Inkrementieren tun @lurker zum Hinzufügen des Tags. –

+1

@lurker: Da diese Frage nicht spezifisch für Turbo-Prolog ist, ist es besser, sie zu entfernen. – false

+0

@false der Titel ist "wie man Schleife in ** Turbo Prolog ** simuliert". Ich habe das für Turbo Prolog-spezifisch gehalten, was eine ganz andere Antwort haben könnte als für "normale" Prologs, da Turbo Prolog dazu neigt, viele Dinge anders zu machen. – lurker

Antwort

0

Ich werde nicht die vollständige Lösung für Sie schreiben, kann aber eine Idee geben, wie man durch eine Summierung in einer allgemeinen Weise "Schleife". Das Einschleifen in Prolog wird oft durch Rekursion durchgeführt. Die Rekursion umgeht die Tatsache, dass Prolog es nicht erlaubt, eine Variable innerhalb der gleichen Prädikatsklausel wiederherzustellen, sobald sie instanziiert wurde (es sei denn, Sie rückverfolgen). Das Folgende ist ISO-Prolog-Syntax.

sum_values(First, Last, Sum) :- 
    sum_values(First, Last, 0, Sum). 

sum_values(First, Last, Sum, Sum) :- 
    First > Last. 
sum_values(First, Last, Acc, Sum) :- 
    First =< Last, 
    NewAcc is Acc + First, 
    NewFirst is First + 1, 
    sum_values(NewFirst, NewAcc, Sum). 

Die erste Klausel stellt einen Akkumulator auf dem Wert 0.

Die zweite Klausel verarbeitet den normalen rekursiven Fall ausgehend, wo der erste Wert nicht mit dem letzten nicht übersteigt. Der erste Wert wird dem Akkumulator hinzugefügt, um einen aktualisierten Akkumulator zu erzeugen, und der "erste" Wert wird erhöht, um einen neuen ersten Wert zu erzeugen. Der rekursive Aufruf an sum_values berechnet den Rest der Summe mit dem neuen Akkumulator.

Die letzte (dritte) Klausel vereinheitlicht die endgültige Summe mit dem Akkumulator, wenn der erste Wert schließlich den letzten überschreitet.

Beachten Sie, dass ich dies ohne Einführung des Akkumulators hätte implementieren können, aber dann hätte ich nicht die Tail-Rekursion, die (wenn gewünscht) vom Prolog-System optimiert werden kann. Die Nicht-Akkumulator-Version sieht wie folgt aus:

sum_values(First, Last, 0) :- First > Last. 
sum_values(First, Last, Sum) :- 
    First =< Last, 
    NewFirst is First + 1, 
    sum_values(NewFirst, Last, PartialSum), 
    Sum is PartialSum + First. 

Dies ist etwas kürzer, aber es gibt keine Endrekursion die Refactoring werden kann.

Änderungen müssten Sie für Ihr Problem (das sind diejenigen, die ich bin mir dessen bewusst, als ich mit einigen TP Syntax nur ein wenig vertraut bin) zu machen:

  • ersetzen is/2 mit =/2 (I TP denken verwendet =/2 zur Expression Evaluation)
  • Sie könnten =< mit <= ersetzen müssen (ich kann mich nicht erinnern, die man TP mag)
  • überprüfen Sie, ob First ungerade ist. Wenn nicht, müssen Sie das Hinzufügen zum Akkumulator überspringen.

Sie könnten auch eine erste Prüfung auf ungerade First tun, und wenn es nicht seltsam ist, erhöht es ein neues First zu bilden, dann gehen Sie eine Summe von 2 durch die Rekursion statt von 1.

+0

Vielen Dank Herr, Es könnte hilfreich sein @ lurker –