由Racket博士提供的MiniKanren支持

时间:2018-05-28 14:51:47

标签: scheme racket minikanren

我开始学习miniKanren的书和#34; The Reasoned Schemer - 第二版"和DrRacket计划环境。

我安装了#34; fast-minikanren"包,但是使用命令run*的书的第一个示例(例如,(run* q #f))会生成错误消息,例如run*: bad syntax in: (run* q #f)

这是否意味着" fast-minikanren"包装没有提供minikanren的正确定义?或者我犯了错误?

4 个答案:

答案 0 :(得分:4)

正如the readme所说,您需要将(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))
'()
> 

答案 1 :(得分:3)

好吧,尼斯说的一切都是正确的。让我添加另一个高级评论:看起来有进一步发展和某些缺乏支持的组合,这有助于你的情况。

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

2)看起来某些变化(例如#u成功目标)不适合Racket(虽然它们当然可以使用Reader扩展),并且您使用的库的作者当选改为改变语言。

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

答案 2 :(得分:2)

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

https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd

希望这会有所帮助!

干杯

-将

答案 3 :(得分:1)

安装 <img src={logo} alt="Logo" /> <img src={require('./navigation/singapour.jpg')} /> (通过包管理器或 faster-minikanren)后,将以下代码段放在文件的开头:

raco