Sch*_*mer 5 scheme racket 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 Code Online (Sandbox Code Playgroud)
然后点击“运行”,并在提示符下尝试:
> (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 Code Online (Sandbox Code Playgroud)
似乎正在工作。这不是:
> (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 Code Online (Sandbox Code Playgroud)
但是这样做:
> (run* (q) (lambda (_) #f))
'()
>
Run Code Online (Sandbox Code Playgroud)
好吧,威尔·尼斯说的一切都是正确的。让我再补充一条高级评论:看起来是进一步发展和某种缺乏支持的结合导致了您的情况。
1) 看起来 minikanren 语言自本书出版以来一直在不断发展。
2) 看起来某些更改(例如#u 成功目标)不太适合 Racket(尽管使用 Reader 扩展肯定可以实现),并且您正在使用的库的作者选择更改语言代替。
可能有帮助的一件事是原始 minikanren 包的文档(在https://docs.racket-lang.org/minikanren/index.html在线),它们格式良好且可读,并提供了进一步阅读的参考。