Verwendung redundanter Ziele in Abfragen


12

(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.


Quadrieren der Anzahl der Ergebnisse?
Willem Van Onsem

1
Ich gehe davon aus, dass beim aufeinanderfolgenden Ausführen des Ziels keine Statusinformationen erhalten bleiben. Mit anderen Worten, eine Variation der Frage ist nicht zulässig, z. B. wird vom ?- G_0(State), G_0(State).Status des ersten zum zweiten Ziel kein Status auf dem Stapel übergeben?
Guy Coder

1
G_0kann jedes (reine) Ziel sein, einschließlich beispielsweiseG_0 = append(Xs,Ys,Zs)
falscher

1
@ GuyCoder: Konjunktion ist erforderlich. (Mit G_0;G_0einem könnte man Nebenwirkungen oder Leistungs- / Caching- / Tabeling-Probleme testen)
false

1
Übrigens, anstatt G_0(State),G_0(State)eher zu schreibencall(G_1,State), call(G_1,State)
falsch

Antworten:


3

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:

p(f(_,a)).
p(f(b,_)).

?- p(X).
   X = f(_A, a)
;  X = f(b, _A).  % two answers

?- p(X), p(X).
   X = f(_A, a) 
;  X = f(b, a)
;  X = f(b, a)
;  X = f(b, _A).   % four answers
                   % thus p(X) contains redundancies

... und jetzt beheben wir das:

p(f(B,a)) :-
   dif(B, b).
p(f(b,_)).

?- p(X).
   X = f(_A, a), dif(_A, b)
;  X = f(b, _A).

?- p(X), p(X).
   X = f(_A, a), dif(_A, b), dif(_A, b).
;  X = f(b, _A).    % again two answers, thus no redundancy

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.

?- G_0, call_nth(G_0, 2).

1

Betrachten Sie eine Abfrage eines reinen Programms1? - G_0. Was nützt die Abfrage, wenn sie vorhanden ist? - G_0, G_0. haben?

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.