我从《The Reasoned Schemer - 第二版》一书和 DrRacket 方案环境开始研究 miniKanren。
我安装了“faster-minikanren”包,但是本书的第一个示例使用命令run*
(例如,(run* q #f)
)会产生错误消息,例如run*: bad syntax in: (run* q #f)
.
这是否意味着“faster-minikanren”包没有提供 minikanren 的正确定义?还是我犯了一个错误?
我从《The Reasoned Schemer - 第二版》一书和 DrRacket 方案环境开始研究 miniKanren。
我安装了“faster-minikanren”包,但是本书的第一个示例使用命令run*
(例如,(run* q #f)
)会产生错误消息,例如run*: bad syntax in: (run* q #f)
.
这是否意味着“faster-minikanren”包没有提供 minikanren 的正确定义?还是我犯了一个错误?
正如自述文件所说,您需要放入(require minikanren)
Racket 源文件。
#lang racket
在复制appendo
定义之后,我已经在第二行添加了,
#lang racket
(require minikanren)
(define (appendo l s out)
(conde
[(== l '()) (== s out)]
[(fresh (a d res)
(== `(,a . ,d) l)
(== `(,a . ,res) out)
(appendo d s res))]))
然后单击“运行”,并在提示符下尝试:
> (run* (q r) (appendo q r '(1 2 3 4 5)))
'((() (1 2 3 4 5))
((1) (2 3 4 5))
((1 2) (3 4 5))
((1 2 3) (4 5))
((1 2 3 4) (5))
((1 2 3 4 5) ()))
>
似乎正在工作。这没有:
> (run* q #f)
. run*: bad syntax in: (run* q #f)
> (run* (q) #f)
application: not a procedure;
expected a procedure that can be applied to arguments
given: #f
arguments...:
但这确实:
> (run* (q) (lambda (_) #f))
'()
>
好吧,Will Ness 所说的一切都是正确的。让我添加另一个高级评论:看起来有进一步的发展和某种缺乏支持的结合导致了您的情况。
1) 自本书出版以来,minikanren 语言似乎一直在不断发展。
2) 看起来某些更改(例如#u 成功目标)并不适合 Racket(尽管它们肯定可以通过 Reader 扩展实现),并且您正在使用的库的作者选择更改代替语言。
可能有帮助的一件事是原始 minikanren 包的文档(在线https://docs.racket-lang.org/minikanren/index.html),它们的格式和可读性都很好,并为进一步阅读提供了参考。
您可能会发现我们刚刚发布的第二版中的代码很有帮助:
https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd
希望这可以帮助!
干杯,
- 将要
安装后faster-minikanren
(通过包管理器或raco
),将以下代码段放在文件开头:
#lang racket
(require minikanren)
(define succeed (== #t #t)) ;; suggested as per the footnote in frame 6 of Chapter 1, #s is written "succeed"
(define fail (== #f #t)) ;; and #u is written fail
(run* (q) succeed) ;; evaluates to '(_.0)