Scheme 如何使用quote和unquote更忠实地将理性的阴谋家翻译成骗局?

Scheme 如何使用quote和unquote更忠实地将理性的阴谋家翻译成骗局?,scheme,racket,quote,minikanren,Scheme,Racket,Quote,Minikanren,(球拍设置中我的miniKanren的详细信息显示在底部[1]。) 引用和取消引用在推理Schemer中的工作方式似乎与它们在Racket中的工作方式不匹配。例如,第2章第2节建议[2]以下功能定义: (run #f (r ) (fresh (y x ) (== '(,x ,y) r ))) (run 5 (r) (fresh (w x y z) (loto (('g 'g) ('e w) (x y) . z))

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

引用和取消引用在推理Schemer中的工作方式似乎与它们在Racket中的工作方式不匹配。例如,第2章第2节建议[2]以下功能定义:

(run #f
     (r )
     (fresh (y x )
            (== '(,x ,y) r )))
(run 5 (r)
     (fresh (w x y z)
            (loto (('g 'g) ('e w) (x y) . z))
            (== (w (x y) z) r)))
如果我对它求值,就会得到
'(,x,y))
。如果我将其改写为:

(run #f
     (r )
     (fresh (y x )
            (== (list x y) r)))
我得到了预期的结果,
”((.0.1))

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

(run #f
     (r )
     (fresh (y x )
            (== '(,x ,y) r )))
(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安装minikanren
,然后定义了一些缺失的部分

[2] 事实上,他们并没有写得很准确,但如果你注意到那一节和更早一节的脚注中的建议,你就会得到它


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

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

看起来您应该使用,而不是
引号
。Quasikote是一个用反勾(``````````写的,它与tilde(
)在同一个键上,不是正常的勾号(
)也请注意,
(cons'(g)(cons(list'ew)(cons(list'ew)(cons(list x y)z))
可以写成
(list*'(g)(list'ew)(list'ew)(list x y)z)
@JeffreyBenjaminBrown当这不是真的时候,你能举个例子吗?假设
cons
list*
有其正常的定义,那么,
(list*a b c d e)
应该与
(cons a(cons b(cons c(cons d e)))相同。
@JeffreyBenjaminBrown
(列表13)
(13)
,但是
(列表13)
(1.3)