【发布时间】:2019-04-20 04:35:29
【问题描述】:
问题
Reasoned Schemer 描述了如何使用 miniKanren,它类似于 Prolog,但它是类 Lisp 语言的库。这本书的“第一诫”是这样的:
转换一个布尔值的函数 变成一个以目标为值的函数,替换 cond 每个问题和答案都带有 conde 和 unnest。 将答案#t(或#f)替换为#s (或#u)。
它们并没有真正定义取消嵌套,除非通过一些大致等效的示例。最清楚的是:取消嵌套将您从(list? (cdr l)) 带到
(fresh (d)
(cdro l d)
(listo d))
我不明白为什么需要取消嵌套。比如上面的目标,为什么tp write (listo (cdr l))不够?
[1] 我在 Racket 中的迷你 kanren 设置
如here 所述,我运行了raco pkg install minikanren,然后定义了一些缺失的部分。
[2] 一些你可能不需要的函数定义
这里是listo 的定义以及它使用的所有东西,除了minikanren 库或Racket 的前奏中定义的东西。
(define listo
(lambda (l)
(conde
((nullo l) #s)
((pairo l)
(fresh (d)
(cdro l d)
(listo d)))
(else #u))))
(define nullo
(lambda (x)
(== x '())))
(define pairo
(lambda (p)
(fresh (a d)
(conso a d p))))
(define cdro
(lambda (p d)
(fresh (a)
(== (cons a d) p))))
(define conso
(lambda (head tail result)
(== (cons head tail) result)))
【问题讨论】:
标签: logic-programming minikanren