Единая структура объединения в миниканрен

Как определить унификацию и включение структуры объектов в 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.

Я бы порекомендовал не использовать списки для представления структур объектов, но вместо этого вы можете определить новый тип записи, в котором содержится список, который всегда заканчивается новой переменной, и один из них будет представлять структуру объектов. Тогда вы все еще можете использовать списки и другие объекты, а также иметь доступ к этим новым объектам.

Когда код объединения видит две структурные особенности, он должен рекурсивно объединить все совпадающие ключи и расширить "остальную" часть каждой из них, чтобы она содержала поля, уникальные для другой структурной особенности (без деструктивной мутации).

Другие вопросы по тегам