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")
CompilerException java.lang.ClassCastException: class clojure.core.logic.LVar cannot be cast to class java.lang.Number (clojure.core.logic.LVar is in unnamed module of loader clojure.lang.DynamicClassLoader @4d2015a9; java.lang.Number is in module java.base of loader 'bootstrap'), compiling:(/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!
是我的错:( 感谢!
顺便问一下。你能推荐一份关于core.logic及其API的全面文档吗?其中包含示例等,我找到的都是零散的。
by
我认为传统的文档已经足够了。大多数人推荐看看"The Reasoned Schemer",因为它是基于miniKanren的,而core.logic就是实现的。某些操作(例如project)存在奇特的错误或不符合直觉的结果。

到这个程度,库的性质基本已经定型,除非出现新的兴趣。如果我能帮忙解答问题,我将很乐意。
by
"The Reasoned Schemer"这本书奇特且有趣,某种程度上属于理论性质,不适合作为开发者的文档。
根据间接证据,core.logic在某些重要项目中得到了使用,例如Datomic。我不确定。无论如何,再次感谢。
...