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: 类 clojure.core.logic.LVar 无法转换为类 java.lang.Number (clojure.core.logic.LVar 在未命名的模块 clojure.lang.DynamicClassLoader @4d2015a9 中,java.lang.Number 在模块 java.base 中),编译:(/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 的全面文档,包括示例等内容吗?我所找到的都是零碎的。
我认为遗留文档已经很不错了。大多数人推荐查看“The Reasoned Schemer”,因为它基于miniKanren,这正是core.logic所实现的。在某些操作(例如project)中存在一些奇怪的错误或不直观的结果。

库的本质已经固化到这个程度,除非出现新的兴趣。尽管如此,如果我能帮助到您,我很乐意回答问题。
"The Reasoned Schemer" 很奇特又有趣,有些理论性,不寻常地作为一个开发者的文档。
根据间接证据,core.logic在一些严肃的项目中被使用,例如Datomic。我不确定。无论如何,再次感谢。
...