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")
编译器异常:class clojure.core.logic.LVar 无法转换为 class java.lang.Number (clojure.core.logic.LVar 在未知模块 clojure.lang.DynamicClassLoader @4d2015a9 中;java.lang.Number 在模块 java.base 的 loader 'bootstrap' 中),编译:(斯坦尼斯拉夫/家/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])
太好了,汤姆!
是我的错 :( 感谢!
顺便问一下,你能推荐一份关于 core.logic 及其 API 的全面文档,包括示例等内容吗?我找到的都是大致的、零散的。
by
我认为原有的文档已经到了尽头。大多数人建议查看《理性的方案师》,因为它基于 miniKanren,这是 core.logic 实现的基础。对于某些操作(例如投影),存在一些奇怪的错误或相反直觉的结果。

到目前为止,库的本质已经固化,除非出现新的兴趣。尽管如此,如果我可以帮忙,我很乐意回答问题。
by
《理性的方案师》既奇特又有趣,有些理论性,不太适合作为开发者文档。
间接证据显示 core.logic 在一些重要项目中得到了应用,例如 Datomic。我不确定。无论如何,再次感谢。
...