(Auf Vorschlag von @repeat ) Betrachten Sie eine Abfrage eines reinen Programms. 1 ?- G_0.
Was nützt die Abfrage, wenn überhaupt ?- G_0, G_0.
?
Fußnoten
1 Keine Einreichung (um sicher zu gehen), Einschränkungen sind in Ordnung.
Vorheriger Beitrag zum Thema.
prolog
logical-purity
falsch
quelle
quelle
?- G_0(State), G_0(State).
Status des ersten zum zweiten Ziel kein Status auf dem Stapel übergeben?G_0
kann jedes (reine) Ziel sein, einschließlich beispielsweiseG_0 = append(Xs,Ys,Zs)
G_0;G_0
einem könnte man Nebenwirkungen oder Leistungs- / Caching- / Tabeling-Probleme testen)G_0(State),G_0(State)
eher zu schreibencall(G_1,State), call(G_1,State)
Antworten:
Die Abfrage
?- G_0, G_0.
hilft, redundante Antworten von zu identifizieren?- G_0.
Dazu reicht es aus, die Anzahl der Antworten von
?- G_0.
mit der Anzahl der Antworten von zu vergleichen?- G_0, G_0.
. Diese Antworten müssen nicht gespeichert werden (was ohnehin eine häufige Fehlerquelle ist). Nur zwei ganze Zahlen reichen aus! Wenn sie gleich sind, gibt es keine Redundanz. Wenn es?- G_0, G_0.
jedoch mehr Antworten gibt, gibt es eine gewisse Redundanz. Hier ist ein Beispiel:... und jetzt beheben wir das:
Sie müssen die damit verbundenen Einschränkungen nicht manuell überprüfen.
Dies kann weiter ausgebaut werden, wenn wir explizit nur mit nach redundanten Antworten suchen
call_nth/2
.quelle
Ich sehe keine Nützlichkeit des zweiten Ziels, insbesondere wenn die Optimierung der Schwanzrekursion ( Optimierung des letzten Aufrufs ) aktiviert ist .
Ich könnte ein GC-Problem (Stapel- / Heap-Überlauf) feststellen, wenn die Abfrage ressourcenintensiv ist und die oben genannten Optionen deaktiviert sind (z. B. beim Debuggen).
Ich denke, der zweite Aufruf ist redundant (für reines Programm) und sollte vom Compiler beseitigt werden.
quelle