【问题标题】:Why (= (run 1 [q] (membero 'cat q)) ['(cat . _.0)]) is false?为什么 (= (run 1 [q] (membero 'cat q)) ['(cat . _.0)]) 是假的?
【发布时间】:2013-08-28 21:20:40
【问题描述】:

我正在做 clojure/core.logic koans 并坚持this one

"Here we give run a specific number to control how many answers we get. Think
carefully. Is there only one list in the universe that satisfies this relation?
Are there infinitely many?"
 (= (run 1 [q]
       (membero 'cat q))
    [__])

在 REPL 中运行 (run 1 [q] (membero 'cat q)) 告诉我答案是 ((cat . _.0))。我不太确定中间的点是什么意思,但无论如何,在原始公文中粘贴 '(cat . _.0) 而不是 __ 占位符并没有帮助(断言仍然失败)。你能指出我正确的方向吗?还要解释cat_.0 之间的点是什么意思?我的猜测是,这意味着 接下来的内容(即_.0)是任意长度的尾巴,但我不能 100% 确定。 === 更新

amalloy 为我指明了正确的方向(谢谢,先生!)。 lcons 成功了:

 (= (run 1 [q]
       (membero 'cat q))
    [(lcons 'cat '_.0)])

还有一点 REPL:

user=> (lcons 'cat '_.0)
(cat . _.0)
user=> '(cat . _.0)
(cat . _.0)
user=> (= '(cat . _.0) (lcons 'cat '_.0))
false

这个点用来表示dotted lists。根据Wikipedia,点列表是一种不正确的列表,另一种是循环列表。因此,在上面的 REPL 会话中,第一个列表是带有两个元素('cat'_.0)的虚线列表,而第二个列表是带有三个元素('cat''. 和 @987654340)的正确列表@)。它们的字符串表示是相同的,但它们是不同的。

【问题讨论】:

  • 我只是想说谢谢你链接到逻辑 koans。我从来不知道他们,必须说他们很棒。它们应该链接在 core.logic 页面上!

标签: clojure clojure-core.logic


【解决方案1】:

(a . b) 符号是其他 lisp 的遗留物,它们使用 cons 单元来构建不正确的列表。你是对的,它的意思是“符号 cat 后跟任何长度的任何列表”,但实际上它是 core.logic LCons 值的打印表示。没有简单的文字可以输入来生成该类型的值,因此您无法真正将其与您自己的值进行比较。但是,我希望 LCons 是可排序的,因此您可以将 (first the-thing)'cat 进行比较,等等。

【讨论】:

  • 谢谢你,+amalloy。我用详细的答案和几个链接更新了我的问题。
猜你喜欢
  • 2017-08-08
  • 1970-01-01
  • 2017-04-24
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
相关资源
最近更新 更多