理解MicroKanren DSL的核心术语时遇到一些麻烦。第4节说:
语言术语由统一运算符定义。在这里,语言的术语包括变量,在eqv?下被认为相同的对象,以及前面的对。
但他们从未描述“对”实际上是什么意思。这些对应该代表两个子项的相等,如下所示:
type 'a ukanren = KVar of int | KVal of 'a | KEq of 'a kanren * 'a kanren
这样的术语如下:
(call/fresh (λ (a) (≡ a 7)))
为(≡a7)生成一对?
编辑:经过进一步思考,我不这么认为。本文中对“对”的提及似乎要晚得多,对基本系统进行扩展和改进,这意味着对在基本介绍的术语中没有任何意义。这是对的吗?
答案 0 :(得分:3)
在这种情况下,"配对"仅表示cons
对,例如(5 . 6)
或(foo . #t)
。两对之间的一个示例统一是:
(call/fresh
(λ (a)
(call/fresh
(λ (b)
(≡ (cons a b) (cons 5 6))))))
将a
与5和b
与6相关联。
答案 1 :(得分:1)
您可以认为(典型的)Kanren术语语言具有单个二进制函子标记cons/2
和无限数量的常数(确切的组成从嵌入变为嵌入)。
假设cons/2
是唯一的(n <0)元仿函数标记,则将使用它构建每个复合词。如果您查看统一的标准表示形式(例如Martelli-Montanari),通常会看到步骤f(t0,...,tn) g(s0,...,sm) => fail if f =/= g or n =/= m
。比较基本原子术语时,我们统一处理冲突失败;对我们来说,复合词必须具有相同的含义和标签。
pair?
识别cons
。实际上,在Racket中,他们提供了cons?
别名,以使内容更清楚!
再次感谢您!