如何使用引号和取消引号更忠实地将“理智的策划者”翻译成“球拍”?

时间:2018-11-16 03:35:35

标签: scheme racket quote minikanren

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

“推理的计划程序”中引号和反引号的工作方式似乎与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]如here所述,我运行了raco pkg install minikanren,然后定义了一些缺失的部分。

[2]实际上,他们并没有准确地写出来,但是如果您留意该经文和更早的经文脚注中的建议,那么您便会明白。

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

1 个答案:

答案 0 :(得分:2)

使用反引号`代替您一直使用的简单引号'