Makros in SWI-Prolog schreiben

8

Ich versuche, ein einfaches Makro für switch-Anweisungen in SWI-Prolog zu implementieren.

Dies ist eine Reihe von bedingten Anweisungen:

%Vor%

und das ist ein äquivalenter (aber viel langsamer) Ausdruck mit demselben Effekt:

%Vor%

Ich habe viele Prädikate wie dieses in einer Anwendung verwendet, aber das verlangsamt das erheblich. Ist es möglich, dieses Switch-Prädikat als Makro zu implementieren, so dass es bei der Kompilierung in einen normalen bedingten Ausdruck geändert wird , um die Leistung der Anwendung zu verbessern?

    
Anderson Green 16.06.2016, 18:29
quelle

2 Antworten

3

ein minimaler Versuch: Erstellen Sie eine Datei namens switch.pl

%Vor%

benutze es dann wie gewöhnlich: zum Beispiel in einer Datei switch_test.pl

%Vor%

nach der Kompilierung von switch_test.pl:

%Vor%

edit aufgrund mehrerer Anfragen, hier ist ein Kompilierungsschema, um Klauseln zu trennen:

%Vor%

Nun wurde das Testskript in ein Modul eingefügt, um die weitere Auflistung zu vereinfachen:

%Vor%

und das Ergebnis nach dem Kompilieren von switch_test.pl :

%Vor%

erleichtert das Debugging:

%Vor%

, die beim Kompilieren eine Nachricht wie folgt ausgibt:

%Vor%

Hinweis: Diese Skizze ist offensichtlich sehr wahrscheinlich mehr Tests benötigen.

Wenn Sie sich entscheiden, die Verbesserungen zu benchmarken (falls vorhanden), benutzen Sie bitte keine IO-Anweisungen (wie zB writeln), da diese sowieso die Ausführungszeiten dominieren würden.

    
CapelliC 16.06.2016, 20:20
quelle
1

Ich hoffe, dass Sie die writeln oben nur zu Demonstrationszwecken verwenden. Hier ist der idiomatische Weg, das gleiche Programm wie in Ihrer Frage zu schreiben:

%Vor%

Und das macht dieses Programm:

%Vor%

Wichtige Punkte:

  • Keine Notwendigkeit für writeln , die oberste Ebene tut das (wenn Sie wirklich in die Ausgabe schreiben müssen, können Sie das natürlich tun, aber es würde nicht schaden, sie vom Rest der Logik getrennt zu halten).
  • Dies ist auf jeden Fall mehr Platz und Zeit effizienter als alle anderen Vorschläge
  • Sie können Ihre Fälle aufzählen, wenn der Schalterausdruck eine Variable
  • ist

Ist es möglich, dass Sie diese Antwort für diesen Frage von dir ?.

Beachten Sie, dass Sie, wenn Sie alles im Kopf des Prädikats machen können, nicht einmal den Prädikatkörper benötigen: siehe die gleiche Antwort und mein Beispiel.

Sie scheinen diesen Vorschlag wegen der Anzahl der Argumente zu verwerfen, aber ich sehe nicht, wie eine andere Lösung dieses Problem lösen wird. Können Sie in Ihrer Frage demonstrieren, wie Sie Ihre switch-Anweisung genau schreiben möchten, wenn mehr Argumente involviert sind?

Noch eine Sache: Wenn Sie viele Fälle haben, kann es einfacher sein, sie tatsächlich in eine Liste zu schreiben; Anschließend können Sie die Termexpansion verwenden, um Ihrer Datenbank zur Kompilierungszeit eine Tabelle hinzuzufügen. Siehe diese Frage und das term_expansion Beispiel gegen Ende der Antwort ; Das Beispiel ist eine wörtliche Kopie aus der SWI-Prolog-Dokumentation (siehe unten auf dieser Seite) ). Sie könnten natürlich goal_expansion anstelle von term_expansion verwenden.

    
user1812457 17.06.2016 13:14
quelle

Tags und Links