2013-03-24 14 views
5

ich mit core.logic experimentieren, und möchte meine eigenen benutzerdefinierten Datentyp ermöglichen, in logischen Ausdrücken teilnehmen:Erweiterung core.logic, um benutzerdefinierte Typen

(deftype Expression [node vars] 
    ....) 

Im Grunde ist dies ein Knoten in einem mathematischen Ausdruck Baum darstellt, enthält einen Knotenbaum und einen Satz von ungebundenen Variablen, die verwendet werden. node ist entweder eine Konstante, ein Symbol oder ein (Operator Expression Expression....) Baumknoten. Ich würde gerne in der Lage sein, core.logic zu benutzen, um mathematische Ausdrücke zu manipulieren und gegen Teilbäume solcher Ausdrücke zu passen.

Wie kann ich das tun, wenn möglich?

ich aus dem core.logic Quellcode sehe, dass es ein number of protocols, die aussehen wie sie wären gut (zB IUnifyTerms, IReifyTerms etc.) zu verlängern, aber es ist nicht ganz klar, wie diese sind alle verwendet werden soll, und welche ich wirklich erweitern muss.

+1

Sie könnten Interesse an Term Rewrite-Systeme. Ich habe festgestellt, dass das Betrachten der vorhandenen Implementierungen von dem, was Sie versuchen, fruchtbar waren (Maude, Stratego/XT sind nett). Beachten Sie auch, dass Sie möglicherweise auf das assoziative-kommutative Matching-Problem stoßen. Ein rechenintensives Teilproblem, das bestehende core.logic-Maschinen nicht besonders gut unterstützen würden (das letzte Mal, als ich es überhaupt überprüft habe.) – MRocklin

Antwort

1

core.logic wurde entwickelt, um benutzerdefinierte Typen zu erweitern. Dies ist jedoch nicht gut dokumentiert, da sich die Protokolle ändern können, wenn wir erfahren, was genau benötigt wird. Es lohnt sich, den Namespace clojure.core.logic.nominal zu untersuchen, um herauszufinden, was erforderlich ist, um core.logic auf benutzerdefinierte Typen zu erweitern.

Verwandte Themen