2013-03-24 5 views
5

Я экспериментировал с core.logic, и хочу, чтобы включить свой собственный тип данных для участия в логических выражениях:Расширения core.logic пользовательских типов

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

В основном это представляет собой узел в математическом выражении дерева, содержащий дерево узлов и набор несвязанных переменных. node является либо константой, либо символом, либо узлом дерева (Operator Expression Expression....). Я хотел бы иметь возможность использовать core.logic для управления математическими выражениями и сопоставлять их с поддеревами таких выражений.

Как я могу это сделать, если это возможно?

я вижу из исходного кода core.logic, что есть number of protocols, которые выглядят как они бы хорошо, чтобы расширить (например, IUnifyTerms, IReifyTerms и т.д.), но это не совсем понятно, как они все предназначены для использования, и которые мне действительно нужно расширить.

+1

Возможно, вас заинтересует Term Rewrite Systems. Я обнаружил, что рассмотрение существующих реализаций того, что вы пытаетесь сделать, было плодотворным (Мод, Стратег/XT хороши). Кроме того, имейте в виду, что вы можете столкнуться с проблемой ассоциативно-коммутативного соответствия; сложная подзадача, сложная для того, что существующий core.logic механизм не будет поддерживать особенно хорошо (в прошлый раз я все равно проверял). – MRocklin

ответ

1

core.logic предназначен для расширяемых пользовательских типов. Однако это не так хорошо документировано, поскольку протоколы могут быть изменены, поскольку мы узнаем, что именно нужно. Стоит изучить пространство имен clojure.core.logic.nominal, чтобы получить представление о том, что требуется для расширения core.logic для пользовательских типов.