Единая структура объединения в миниканрен
Как определить унификацию и включение структуры объектов в minikanren, если мы представляем структуры объектов с помощью списков?
Общее поведение будет примерно таким (я думаю):
(run* (q) (unifyo '(a b) '(a b) q))) => (a b)
(run* (q) (unifyo '(x (a b)) '(x (c d)) q)) => (x (a b) (c d)) (x (c d) (a b))
(run* (q) (unifyo '(x (a b)) '(x (a d)) q)) => () ; fails because '(a b) is
; incompatible with '(a d)
(run* (q) (unifyo '(x (a b)) `(x ,y) q)) => (x (a b))
(run* (q) (unifyo q '(x (a b)) '(x (a b) (c d)))) => (x (c d))
0 ответов
Вы можете реализовать это, изменив код для объединения в вашей реализации minikanren.
Я бы порекомендовал не использовать списки для представления структур объектов, но вместо этого вы можете определить новый тип записи, в котором содержится список, который всегда заканчивается новой переменной, и один из них будет представлять структуру объектов. Тогда вы все еще можете использовать списки и другие объекты, а также иметь доступ к этим новым объектам.
Когда код объединения видит две структурные особенности, он должен рекурсивно объединить все совпадающие ключи и расширить "остальную" часть каждой из них, чтобы она содержала поля, уникальные для другой структурной особенности (без деструктивной мутации).