1

(我在 Racket 设置中的 miniKanren 的详细信息显示在底部 [1]。)

The Reasoned Schemer 中引号和取消引号的工作方式似乎与它们在 Racket 中的工作方式不匹配。例如,第 2 章第 2 节建议 [2] 以下函数定义:

(run #f
     (r )
     (fresh (y x )
            (== '(,x ,y) r )))

如果我对此进行评估,我会得到'((,x ,y)). 如果相反,我将其重写为:

(run #f
     (r )
     (fresh (y x )
            (== (list x y) r)))

我得到了预期的结果,'((_.0 _.1)).

这似乎是一个小问题,但在许多情况下,所需的翻译非常冗长。例如,在第 3 章(第 34 页)的练习 45 中,本书提供了大致 [3] 以下定义:

(run 5 (r)
     (fresh (w x y z)
            (loto (('g 'g) ('e w) (x y) . z))
            (== (w (x y) z) r)))

为了得到他们得到的结果,我不得不像这样重写它:

(run 5 (r)
     (fresh (w x y z)
            (loto (cons '(g g)
                        (cons (list 'e w)
                              (cons (list x y)
                                    z))))
            (== (list w (list x y) z)
                r)))

[1]如此所述,我运行raco pkg install minikanren并定义了一些缺失的部分。

[2] 实际上,他们并没有准确地这么写,但是如果您注意该节和更早一节的脚注中的建议,那就是您所得到的。

[3] 模数一些我无法推断的隐式引用和取消引用。

4

1 回答 1

2

使用反引号而不是您一直使用`的简单引号。'

于 2018-12-03T08:03:54.653 回答