我从“推理模式-第二版”这本书和DrRacket模式环境开始学习miniKanren。
我安装了"faster-minikanren“包,但本书的第一个使用命令run*的示例(例如,(run* q #f))会产生诸如run*: bad syntax in: (run* q #f)之类的错误消息。
这是否意味着"faster- minikanren“套餐没有提供正确的minikanren定义?还是我犯了个错误?
发布于 2018-05-29 00:42:14
正如the readme所说,您需要将(require minikanren)放入球拍源文件中。
我在第二行,在#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",并在提示符下尝试:
> (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-29 01:16:27
好了威尔·内斯说的都是对的。让我补充另一个高级评论:看起来是进一步发展和缺乏支持的结合导致了你的情况。
1)自这本书出版以来,minikanren语言似乎一直在不断发展。
2)看起来某些变化(例如#u成功的目标)并不容易适应球拍(尽管使用Reader扩展肯定是可能的),而您正在使用的库的作者选择了更改语言。
有一件事可能会有帮助,那就是原始minikanren包的文档(在线https://docs.racket-lang.org/minikanren/index.html ),它的格式很好,可读性很好,并为进一步阅读提供了参考。
发布于 2018-06-26 05:54:50
你可能会发现我们刚刚发布的第二版代码很有帮助:
https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd
希望这能有所帮助!
干杯,
--威尔
https://stackoverflow.com/questions/50568981
复制相似问题