Racket博士对MiniKanren的支持

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定义?还是我做错了?

Wil*_*ess 5

自述(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)


Joh*_*nts 5

好吧,威尔·尼斯说的一切都是正确的。让我再补充一条高级评论:看起来是进一步发展和某种缺乏支持的结合导致了您的情况。

1) 看起来 minikanren 语言自本书出版以来一直在不断发展。

2) 看起来某些更改(例如#u 成功目标)不太适合 Racket(尽管使用 Reader 扩展肯定可以实现),并且您正在使用的库的作者选择更改语言代替。

可能有帮助的一件事是原始 minikanren 包的文档(在https://docs.racket-lang.org/minikanren/index.html在线),它们格式良好且可读,并提供了进一步阅读的参考。