MicroKanren - 这些术语是什么?

时间:2015-02-22 13:09:11

标签: scheme minikanren

理解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)生成一对?

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

2 个答案:

答案 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)

  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?别名,以使内容更清楚!

再次感谢您!

相关问题