MicroKanren - 术语是什么?

MicroKanren - what are the terms?

理解 MicroKanren DSL 的核心术语有点困难。第 4 节说:

Terms of the language are defined by the unify operator. Here, terms of the language consist of variables, objects deemed identical under eqv?, and pairs of the foregoing.

但他们从不描述“对”的实际意思。这些对是否应该表示两个子项的相等性,如下所示:

type 'a ukanren = KVar of int | KVal of 'a | KEq of 'a kanren * 'a kanren

所以像这样的术语:

(call/fresh (λ (a) (≡ a 7)))

(≡ a 7)?

生成一对

编辑:经过进一步思考,我不认为是这样。论文中提到“对”似乎要晚得多,对基本系统进行了扩展和改进,这意味着这些对在基本介绍的术语中没有任何意义。这是正确的吗?

在此上下文中,"pair" 仅表示 cons 对,例如 (5 . 6)(foo . #t)。两对之间的统一示例是:

(call/fresh
  (λ (a)
    (call/fresh
      (λ (b)
        (≡ (cons a b) (cons 5 6))))))

a 与 5 关联,将 b 与 6 关联。

  1. 抱歉给您带来了困惑和困难!!谢谢你的提问!

您可以将(典型的)Kanren 术语语言视为具有单个二元函子标记 cons/2 和无限数量的常量(确切的构成从嵌入到嵌入变化)。

假设 cons/2 是唯一的 (n < 0) 元仿函数标记,每个 复合项都将用它构建。如果您查找统一的标准演示文稿(例如 Martelli-Montanari),您通常会看到一个步骤 f(t0,...,tn) g(s0,...,sm) => fail if f =/= g or n =/= m。在比较基础原子术语时,我们处理统一中的冲突失败;对我们来说,复合词必须具有相同的数量和标签。

pair? 识别 conses。实际上,在 Racket 中,他们提供了一个 cons? 别名,以使其更清楚!

再次感谢您!