通常,将变量与固定长度的向量或列表统一,例如{{(== q (list a b))}},然后定义更多关于{{a}}和{{b}}的目标,目的是定义*查询的结果格式。然而,如果在集合上做同样的事情,则会得到StackOverflowError。
示例
`
(run* [q]
(fresh [a b]
(== q #{a b}) ;; StackOverflowError
;;(== q [a b]) ;; works
;;(== q (list a b)) ;; works, too
(conde [(== a 1)] [(== a 2)] [(== a 3)])
(conde [(== b 1)] [(== b 2)] [(== b 3)])))
`
基本上,我想在这里表达的是,{{a}}和{{b}}的顺序并不重要,这样* } 就给了我独特的结果。
回溯是
`
logic.clj: 231 clojure.core.logic/walk*/fn
logic.clj: 984 clojure.core.logic/eval8917/fn
protocols.clj: 55 clojure.core.logic.protocols/eval7398/fn/G
logic.clj: 229 clojure.core.logic/walk*
logic.clj: 233 clojure.core.logic/walk*/fn
logic.clj: 984 clojure.core.logic/eval8917/fn
protocols.clj: 55 clojure.core.logic.protocols/eval7398/fn/G
logic.clj: 229 clojure.core.logic/walk*
logic.clj: 233 clojure.core.logic/walk*/fn
logic.clj: 984 clojure.core.logic/eval8917/fn
protocols.clj: 55 clojure.core.logic.protocols/eval7398/fn/G
[...]
`