Ich versuche, einen adaptiven Parser
Um dies zu tun, muss ich zur Laufzeit neue Prädikate generieren, aber ich bin mir nicht sicher, ob dies möglich ist. Wäre es möglich, ein Prädikat zu schreiben, das eine Liste wie diese annimmt:
%Vor%... und erzeugt dann ein neues Prädikat wie dieses?
%Vor%Ja , das ist einfach möglich.
Prolog ist eine sehr dynamische Sprache, und Sie können zur Laufzeit beliebige Klauseln verwenden, zum Beispiel mit assertz/1
.
Sie können DCG-Regeln auf normale Prolog-Regeln erweitern, indem Sie den Prolog-Termexpansionsmechanismus verwenden, der normalerweise dafür verwendet wird.
Zum Beispiel mit expand_term/2
:
Sie können solche Klauseln mit assertz/1
:
Beachten Sie, dass ich in diesem Beispiel double_quotes
auf chars
festgelegt habe, d. h. verwende:
in Ihren Quelldateien. Das ist auf jeden Fall eine gute Idee.
Beachten Sie auch, dass ich davon ausgehe, dass Sie bereits eine Möglichkeit gefunden haben, die Listen, die Sie in Ihrem generate_dcg_rule/1
-Beispiel angeben, in tatsächliche DCGs zu übersetzen. Für diese Übersetzung empfehle ich eher ein Prädikat wie list_dcg/2
, das deklarativ die Relation zwischen solchen Listen und DCG-Regeln beschreibt. Der Vorteil liegt auf der Hand: Sie können solche Beziehungen beispielsweise testen interaktiv und mit Testfällen usw. Für Ihr konkretes Beispiel könnte eine Klausel, die diese Beziehung definiert, ähnlich sein:
Ich verlasse das auf Ihre anderen Anwendungsfälle als Übung. Eine Möglichkeit, solche Klauseln dynamisch zu setzen, lautet also:
%Vor%Beachten Sie, wie wir von Prologs homoikonischer Natur in solchen Beispielen profitieren: Prolog-Regeln und DCG-Regeln haben eine natürliche Darstellung als Prolog Begriffe und wir können sie einfach aufschreiben und über sie wie alle anderen Begriffe auch innerhalb von Zielen nachdenken.
Ich habe einen adaptiven Parser geschrieben, der englische Phrasen in mathematische Ausdrücke umwandelt. Sie können es leicht mit Ihren eigenen Übersetzungsregeln erweitern, sodass es zum Erstellen erweiterbarer Benutzeroberflächen in natürlicher Sprache verwendet werden kann.
Dies ist eine mögliche Eingabe:
%Vor%und das ist seine Ausgabe:
%Vor%Die Implementierung des Programms wird hier gezeigt:
%Vor%Tags und Links machine-learning prolog dcg