Я экспериментировал с core.logic, и хочу, чтобы включить свой собственный тип данных для участия в логических выражениях:Расширения core.logic пользовательских типов
(deftype Expression [node vars]
....)
В основном это представляет собой узел в математическом выражении дерева, содержащий дерево узлов и набор несвязанных переменных. node
является либо константой, либо символом, либо узлом дерева (Operator Expression Expression....)
. Я хотел бы иметь возможность использовать core.logic для управления математическими выражениями и сопоставлять их с поддеревами таких выражений.
Как я могу это сделать, если это возможно?
я вижу из исходного кода core.logic, что есть number of protocols, которые выглядят как они бы хорошо, чтобы расширить (например, IUnifyTerms
, IReifyTerms
и т.д.), но это не совсем понятно, как они все предназначены для использования, и которые мне действительно нужно расширить.
Возможно, вас заинтересует Term Rewrite Systems. Я обнаружил, что рассмотрение существующих реализаций того, что вы пытаетесь сделать, было плодотворным (Мод, Стратег/XT хороши). Кроме того, имейте в виду, что вы можете столкнуться с проблемой ассоциативно-коммутативного соответствия; сложная подзадача, сложная для того, что существующий core.logic механизм не будет поддерживать особенно хорошо (в прошлый раз я все равно проверял). – MRocklin