2024 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于 页面了解有关此操作的一些信息。

0
core.logic

嗨,
我在一个简单的 core.logic 程序中遇到了一个问题

(require '[clojure.core.logic :as l]

     '[clojure.core.logic.pldb :as db])
     

(def facts
(db/db

[In-zone 'A 'B]))

(println
(db/with-db facts

    (l/run* [q]
      (l/fresh [x y]
        (In-zone x y)
        (== q 'IN-ZONE)))))

它产生这个结果

user=> (load-file "../PROGS/CL/inzone.clj")
编译器异常:java.lang.ClassCastException: class clojure.core.logic.LVar cannot be cast to class java.lang.Number (clojure.core.logic.LVar 是在 clojure.lang.DynamicClassLoader 的匿名模块中;java.lang.Number 是在 'bootstrap' 模块中),编译:(/home/ru/clojure/core.logic-master/../PROGS/CL/inzone.clj:8:1)

哪里出问题了?没有提到数字!

非常感谢您的任何帮助。

1 个答案

0

我认为您忘记引用 core.logic 中的 ==,而是使用了 clojure.core/==,这就是数字错误的原因。

(require '[clojure.core.logic :as l]
         '[clojure.core.logic.pldb :as db])

(db/db-rel In-zone a b)

(def facts (db/db [In-zone 'A 'B])) 

(println
   (db/with-db facts
    (l/run* [q]
      (l/fresh [x y]
        (In-zone x y)
        (l/== q [x y])))))

;;([A B])
太好了,Tom!
我的错:( 感谢!
顺便问一下。你能推荐全面的核心逻辑及其 API 文档,包括示例等内容吗?我找到的都是零散的。
我认为传统的文档就是这个样子。大多数人推荐查看"The Reasoned Schemer",因为它是基于 miniKanren,这是 core.logic 实现的。特定操作中存在一些奇怪的错误或反直观的结果(项目就是一个例子)。

在这个阶段,库的本质已经达到它可能达到的程度,除非出现新的兴趣。虽然请不要介意,如果有我能帮助的问题,我很乐意回答。
"The Reasoned Schemer" 真的很有趣,有些理论性,不适合作为开发者的文档。
根据间接的证据,core.logic 在一些重要项目中得到了使用,例如 Datomic。我不是很确定。无论如何,再次感谢。
...