logical-purity

___ tag123prolog ___ Prolog ist die am häufigsten verwendete Logik-Programmiersprache. Es unterstützt nicht-deterministische Programmierung durch chronologische Rückverfolgung und Mustererkennung durch Vereinheitlichung. ___ tag123deterministic ___ Das System oder Programm weist in verschiedenen Läufen das gleiche Verhalten auf. ___ qstnhdr ___ Prolog: Vermeiden Sie redundante Auswahlpunkte (Nicht-Determinismus) mit und ohne Schnittoperator ___ answer37776337 ___

Der Trick ist das "currying" über die Anzahl der Unbunds in der Regel:

%Vor%

Es ist jedoch eine schlechte Regel zu sagen, dass Schnitte schlecht sind. In der Tat wird mein Favorit sein:

%Vor%

Thing über dieses Beispiel von %code% :

%Vor%

vs

%Vor%     
___ tag123logicpurity ___ Logische Reinheit ist die Eigenschaft von Logikprogrammen, die nur mit Horn-Klauseln geschrieben werden. ___ qstntxt ___

Erstens habe ich alle anderen Beiträge zu SO bezüglich der Verwendung von Schnitten in Prolog gelesen und sehe definitiv die Probleme, die mit ihrer Verwendung zusammenhängen. Allerdings gibt es immer noch Unklarheiten für mich und ich möchte das ein für allemal beilegen.

Im folgenden trivialen Beispiel durchlaufen wir rekursiv eine Liste und prüfen, ob jedes zweite Element gleich eins ist. Der rekursive Prozess kann dabei in einem der folgenden Fälle enden: entweder eine leere Liste oder eine Liste mit einem einzelnen Element.

%Vor%

Wenn ausgeführt:

%Vor%

In solchen Situationen habe ich immer einen expliziten Schnittoperator im zweiten Basisfall (d. h. den einen, der ein Element in der Liste darstellt) wie unten verwendet, um den redundanten Auswahlpunkt zu beseitigen.

%Vor%

Jetzt bekommen wir:

%Vor%

Ich verstehe, dass das Verhalten dieses Schnitts für die Position der Regel spezifisch ist und als schlechte Praxis angesehen werden kann.

Weiter könnte man die Fälle jedoch wie folgt neu positionieren:

%Vor%

würde auch den redundanten Auswahlpunkt überflüssig machen, ohne einen Schnitt zu verwenden, aber natürlich würden wir den Auswahlpunkt einfach auf Abfragen mit Listen mit einer geraden Anzahl von Ziffern wie unten verschieben:

%Vor%

Das ist natürlich auch keine Lösung. Wir könnten diese Reihenfolge der Regeln jedoch wie folgt anpassen:

%Vor%

da dies tatsächlich keine Auswahlpunkte übrig lassen würde. Blick auf einige Fragen:

%Vor%

Das Verhalten dieses Schnitts funktioniert jedoch aufgrund der Reihenfolge der Regeln wieder korrekt. Wenn jemand die Basisgehäuse wieder in das ursprüngliche Formular zurücksetzt, wie unten gezeigt:

%Vor%

wir würden immer noch das unerwünschte Verhalten bekommen:

%Vor%

In solchen Szenarien habe ich immer den Single-Cut im zweiten Base-Case verwendet, da ich der einzige bin, der meinen Code durchläuft und ich mich daran gewöhnt habe. Allerdings wurde mir in einer meiner Antworten zu einem anderen SO-Post gesagt, dass dies keine empfohlene Verwendung des Cut-Operators ist und dass ich versuchen sollte, es so weit wie möglich zu vermeiden.

Das bringt mich zu meiner zweiseitigen Frage:

  • Wenn ein Schnitt unabhängig von der Position der Regel, in der er vorhanden ist, das Verhalten ändert, nicht jedoch die Lösung (wie in den Beispielen) oben), gilt es immer noch als schlechte Übung?

  • Wenn ich einen typischen redundanten Auswahlpunkt als den in den obigen Beispielen abschaffen möchte, um ein Prädikat vollständig deterministisch zu machen, gibt es einen anderen, empfohlenen Weg, dies zu erreichen, anstatt Schnitte zu verwenden ?

Vielen Dank im Voraus!

    
___ tag123prologcut ___ Ausschneiden, als Ausrufezeichen "!" geschrieben, ist ein spezielles Ziel, das in der Programmiersprache Prolog als Kontrollkonstrukt dient. ___ tag123nondeterministic ___ Nichtdeterminismus bezieht sich entweder auf ein Computersystem, bei dem das Ergebnis eines von vielen spezifizierten Ergebnissen sein kann, oder auf ein theoretisches Konstrukt, in dem ein Computersystem viele Optionen parallel ausprobieren kann, um nach einem Ergebnis zu suchen. ___ answer37776547 ___

Immer versuchen Sie, %code% zu vermeiden. Fast immer zerstört %code% die deklarative Semantik Ihres Programms vollständig.

Alles, was kann ausgedrückt werden durch Mustererkennung sollte durch Mustererkennung ausgedrückt werden. In Ihrem Beispiel:

%Vor%

Wie in Ihrer unreinen Version bleiben für die von Ihnen geposteten Beispiele keinerlei Auswahlpunkte übrig:

%Vor%

Beachten Sie auch, dass in dieser Version alle Prädikate vollständig rein und in allen Richtungen verwendbar sind. Die Beziehung funktioniert auch für die allgemeinste Abfrage und erzeugt Antworten, genau wie wir es von einer logischen Beziehung erwarten:

%Vor%

Keine der von Ihnen geposteten Versionen kann dies aufgrund der unreinen oder nicht deklarativen Prädikate ( %code% , %code% ), die Sie verwenden, verwenden!

Wenn Sie über Listen nachdenken, können Sie fast immer die Mustererkennung verwenden, um die Fälle zu unterscheiden. Wenn das nicht möglich ist, verwenden Sie zum Beispiel %code% für die logische Reinheit, während Sie weiterhin eine akzeptable Leistung beibehalten.

    
___
2
Antworten

Reinheit der Prolog-Prädikate, die unreine Primitive verwenden

Ich weiß, dass var/1 , nonvar/1 und !/0 unreine Primitive sind, aber macht ihre Verwendung jedes Programm, das sie unrein verwendet? Ich habe das folgende Prädikat plus/3 geschrieben, das sich so verhält, als wäre es rein oder zu...
12.01.2015, 17:26
2
Antworten

Prolog: Vermeiden Sie redundante Auswahlpunkte (Nicht-Determinismus) mit und ohne Schnittoperator

Erstens habe ich alle anderen Beiträge zu SO bezüglich der Verwendung von Schnitten in Prolog gelesen und sehe definitiv die Probleme, die mit ihrer Verwendung zusammenhängen. Allerdings gibt es immer noch Unklarheiten für mich und ich möchte da...
12.06.2016, 15:16