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 关联。
- 抱歉给您带来了困惑和困难!!谢谢你的提问!
您可以将(典型的)Kanren 术语语言视为具有单个二元函子标记 cons/2
和无限数量的常量(确切的构成从嵌入到嵌入变化)。
假设 cons/2
是唯一的 (n < 0) 元仿函数标记,每个 复合项都将用它构建。如果您查找统一的标准演示文稿(例如 Martelli-Montanari),您通常会看到一个步骤 f(t0,...,tn) g(s0,...,sm) => fail if f =/= g or n =/= m
。在比较基础原子术语时,我们处理统一中的冲突失败;对我们来说,复合词必须具有相同的数量和标签。
pair?
识别 cons
es。实际上,在 Racket 中,他们提供了一个 cons?
别名,以使其更清楚!
再次感谢您!
理解 MicroKanren DSL 的核心术语有点困难。第 4 节说:
Terms of the language are defined by the
unify
operator. Here, terms of the language consist of variables, objects deemed identical undereqv?
, 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 关联。
- 抱歉给您带来了困惑和困难!!谢谢你的提问!
您可以将(典型的)Kanren 术语语言视为具有单个二元函子标记 cons/2
和无限数量的常量(确切的构成从嵌入到嵌入变化)。
假设 cons/2
是唯一的 (n < 0) 元仿函数标记,每个 复合项都将用它构建。如果您查找统一的标准演示文稿(例如 Martelli-Montanari),您通常会看到一个步骤 f(t0,...,tn) g(s0,...,sm) => fail if f =/= g or n =/= m
。在比较基础原子术语时,我们处理统一中的冲突失败;对我们来说,复合词必须具有相同的数量和标签。
pair?
识别 cons
es。实际上,在 Racket 中,他们提供了一个 cons?
别名,以使其更清楚!
再次感谢您!