【问题标题】:MiniKanren support by Dr RacketRacket 博士支持 MiniKanren
【发布时间】:2018-11-07 04:50:11
【问题描述】:

我是从《The Reasoned Schemer - 第二版》这本书和 DrRacket 方案环境开始学习 miniKanren 的。

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

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

【问题讨论】:

  • Racket 有很多可用的资源和教程。这个网站并不是一个教程的好地方,所以你不会在这里得到太多的关注。
  • 您能否包含您正在使用的定义窗口程序的全文,包括#lang 行和任何要求?
  • 编辑器窗口:#lang racket (需要 minikanren) (run* q #f) 欢迎使用 DrRacket,版本 6.12 [3m]。语言:球拍,带调试;内存限制:128 MB。 . run*: 语法错误: (run* q #f)
  • 对于“要求推荐一本书或一个工具”这个问题的投票结果是“离题”。我认为这是不对的。 OP 已经选择了书和包。

标签: scheme racket minikanren reasoned-schemer


【解决方案1】:

正如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))
'()
> 

【讨论】:

  • 嗯...调用 (run* q #f) 似乎不起作用,但是...那个对您有用吗?
  • 应该吗?我只有第一版。我希望至少 q 必须在括号中:(run* (q) ...)。 @约翰克莱门茨
  • 我想我在某个地方有一个副本,但它不在这里......我尝试了一堆变体,但无法得到任何类似的工作。 #f 似乎破坏了一些东西,很难想象 OP 会弥补这一点。
  • 是的,我只是看了亚马逊上第 2 版的前几页,事实上,看起来给定的示例使用 (run* q #u) ... 这也没有不工作。 #u 语法需要阅读器扩展,所以我猜需要进行大量调整。如果有一个可以帮助本书用户的 pkg 伴侣,那就太好了。
  • 您的示例运行良好,但“The Reasoned Schemer - 第二版”一书的示例并非如此。
【解决方案2】:

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

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

2)看起来像某些变化(例如#u成功目标)并不容易适合球拍(尽管他们当然可以通过读者扩展),以及您使用的库的作者改为更改语言。

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

【讨论】:

  • 新书解释说它涵盖了 5 类变化。语言、实施、法律、诫命和翻译。
  • 我很困惑。这本书有新版吗?我不太明白你的评论。
  • 是的,现在有第二版“The Reasoned Schemer”,它基于 MiniKanren 作为在 Scheme 中实现的关系语言的演变。
  • 嗯...我想我在看第二版,使用亚马逊的“看里面”,在我看来,书中的第一个例子仍然是(运行 q #u)...但是,完全免责声明,我可能没有足够仔细地阅读前面的材料。书头有没有提到这个问题?
【解决方案3】:

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

https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd

希望这会有所帮助!

干杯,

--会

【讨论】:

    【解决方案4】:

    安装faster-minikanren(通过包管理器或raco)后,将以下sn-p放在文件开头:

    #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)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-22
      • 2014-11-25
      • 2018-05-05
      • 1970-01-01
      相关资源
      最近更新 更多