Frage

pred(Args).
pred(Args) :-
    goalA,
    goalB,
    !,
    pred(Args).
pred(Args) :-
    goalC,
    goalD,
    !,
    pred(Args).

Normalerweise würde ich ein rekursive Prädikat schreiben, die mit Speicherleistung etwas entlang der Linien des obigen Code-Snippet angingen. Mit dem Schnitt verwendet wird, um zu versuchen Endrekursion Optimierung zu zwingen, aufzutreten. Ich habe vor kurzem durch eine große Prolog Code-Basis gegangen und habe einige Beispiele gefunden, wo der Schnitt tatsächlich nach dem rekursiven Aufruf ist nicht unmittelbar davor. Vermutlich hat dies den Effekt geschieht eher Endaufruf Optimierung zu verhindern, als es zu unterstützen.

Meine Frage ist kann ich den Schnitt aus der Zeit nach dem rekursiven Aufruf unmittelbar vor ihm, ohne die Bedeutung des Programms zu bewegen? Das setzt voraus, dass es ein Schnitt in der gleichen relativen Position für jede Klausel des Prädikats.

Jetzt sind einige mehr darüber nachgedacht habe mich, denke ich vielleicht die Antwort „nicht unbedingt“, aber nachdem neu geschrieben gesamten Code durch den Schnitt vor dem Aufruf und festgestellt, dass die Testsuite noch vorbei ist, ich ‚frage mich auch, ob es vielleicht einige andere esoterische Grund für das Schreiben von Prädikaten wie dieses. Oder ist es nur schlecht Codierung?

War es hilfreich?

Lösung

Meine Vermutung ist, dass es schlecht sein könnte Codierung (oder Missverständnis, was Autor tat)

ich das sage, weil ich selbst habe einmal den gleichen Fehler:

https: //mailbox.iai .uni-bonn.de / mailman / public / swi-prolog / 2009 / 001540.html

http://xonix.habrahabr.ru/blog/60430/ (Warnung in russisch)

,

Aber die Leute von SWI Mailing-Liste bestätigt, dass die richtige Art und Weise der Schwanz-rekursive Code

head :-
       <guard goals>, !,
       <deterministic stuff>,
       head.
head :-
       ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top