我开始学习miniKanren的书和#34; The Reasoned Schemer - 第二版"和DrRacket计划环境。
我安装了#34; fast-minikanren"包,但是使用命令run*
的书的第一个示例(例如,(run* q #f)
)会生成错误消息,例如run*: bad syntax in: (run* q #f)
。
这是否意味着" fast-minikanren"包装没有提供minikanren的正确定义?或者我犯了错误?
答案 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