8

我从《The Reasoned Schemer - 第二版》一书和 DrRacket 方案环境开始研究 miniKanren。

我安装了“faster-minikanren”包,但是本书的第一个示例使用命令run*(例如,(run* q #f))会产生错误消息,例如run*: bad syntax in: (run* q #f).

这是否意味着“faster-minikanren”包没有提供 minikanren 的正确定义?还是我犯了一个错误?

4

4 回答 4

6

正如自述文件所说,您需要放入(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))
'()
> 
于 2018-05-28T16:42:13.547 回答
5

好吧,Will Ness 所说的一切都是正确的。让我添加另一个高级评论:看起来有进一步的发展和某种缺乏支持的结合导致了您的情况。

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

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

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

于 2018-05-28T17:16:26.823 回答
4

您可能会发现我们刚刚发布的第二版中的代码很有帮助:

https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd

希望这可以帮助!

干杯,

- 将要

于 2018-06-25T21:54:49.643 回答
1

安装后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)

于 2020-12-21T12:00:16.733 回答