MiniKanren 由 Dr. Racket 提供支持



我开始研究miniKanren,这本书是"The Reasoned Schemer - Second Edition"和DrRacket计划环境。

我安装了"更快的minikanren"软件包,但是带有命令run*(例如,(run* q #f)(的书的第一个示例会产生错误消息,例如run*: bad syntax in: (run* q #f)

这是否意味着"更快的迷你坎人"包没有提供迷你坎人的正确定义?还是我搞错了?

正如自述文件所说,您需要将(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(自本书出版以来,迷你坎语似乎一直在不断发展。

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)

最新更新