Расширение core.logic для пользовательских типов

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

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

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

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

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


person mikera    schedule 24.03.2013    source источник
comment
Вас могут заинтересовать системы перезаписи терминов. Я обнаружил, что просмотр существующих реализаций того, что вы пытаетесь сделать, был плодотворным (Мод, Stratego/XT хороши). Кроме того, имейте в виду, что вы можете столкнуться с проблемой ассоциативно-коммутативного сопоставления; вычислительно сложная подзадача, которую существующий механизм core.logic не поддерживает особенно хорошо (во всяком случае, в последний раз, когда я проверял).   -  person MRocklin    schedule 24.03.2013


Ответы (1)


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

person dnolen    schedule 29.03.2013