Cuts am Ende der rekursiven Prädikate in Prolog
-
20-09-2019 - |
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?
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 :-
...