Clojure core.logic解释“新鲜”如何改变结果
刚开始,版本为“0.8.11”: 我不明白结果:Clojure core.logic解释“新鲜”如何改变结果,clojure,logic,clojure-core.logic,Clojure,Logic,Clojure Core.logic,刚开始,版本为“0.8.11”: 我不明白结果:(11) 我的理解是,我用fresh创建了另一个变量a,它的值可以是2或3。 而q的值可以为1。因此,我希望看到类似的东西:(1),或者(1 2 1 3),或者([1 2][1 3])或者甚至({:q 1:a 2}{:q 1:a 3}),但不是实际结果 另一个例子: (q/run* [q] (q/fresh [a] (q/membero a [1 2 3]) (q/membero q [3 4 5])
(11)
我的理解是,我用fresh创建了另一个变量a
,它的值可以是2或3。
而q
的值可以为1。因此,我希望看到类似的东西:(1)
,或者(1 2 1 3)
,或者([1 2][1 3])
或者甚至({:q 1:a 2}{:q 1:a 3})
,但不是实际结果
另一个例子:
(q/run* [q]
(q/fresh [a]
(q/membero a [1 2 3])
(q/membero q [3 4 5])
(q/== a q)))
;; make sense to me, returns (3)
(q/run* [q]
(q/fresh [a]
(q/membero a [1 2 3]))
(q/membero q [3 4 5]))
;; does not make sense to me, returns (3 4 3 5 4 3 5 4 5)
;; I was expecting `(3 4 5)`
有人能解释一下这里发生了什么吗?core.logic可以被看作是一种搜索算法,搜索可能的方法来为所有不会引起冲突的相关变量赋值。它有很多非常智能的修剪技术,所以它不会搜索已知不好的子树,但基本上它是一个搜索 它找到了两种方法来分配满足查询的变量:
- a=2,q=1
- a=3,q=1
run*
的参数,你想知道的变量集的值),q在这两个赋值中是相同的,所以你会看到相同的结果(1)两次。一般来说,您不应该假设run*
的结果是不同的,除非您已经做了一些努力使它们是不同的
同样,在上一个示例中,有三个值可以指定给q,每个值都适用于可以指定给a的三个值中的任何一个,因此得到3*3=9的结果,每个q值重复三次。从您的角度来看,这些结果返回的顺序是任意的;实际上,它们的排序方式有助于core.logic防止在其他更复杂的程序中陷入僵局。如果您愿意,您可以通过编写
(q/run*[aq]…)
核心来查看所有的a,q对。逻辑可以通过搜索算法来查看,搜索可能的方法来为所有不会引起冲突的相关变量赋值。它有很多非常智能的修剪技术,所以它不会搜索已知不好的子树,但基本上它是一个搜索
它找到了两种方法来分配满足查询的变量:
- a=2,q=1
- a=3,q=1
run*
的参数,你想知道的变量集的值),q在这两个赋值中是相同的,所以你会看到相同的结果(1)两次。一般来说,您不应该假设run*
的结果是不同的,除非您已经做了一些努力使它们是不同的
同样,在上一个示例中,有三个值可以指定给q,每个值都适用于可以指定给a的三个值中的任何一个,因此得到3*3=9的结果,每个q值重复三次。从您的角度来看,这些结果返回的顺序是任意的;实际上,它们的排序方式有助于core.logic防止在其他更复杂的程序中陷入僵局。如果需要,您可以通过编写(q/run*[aq]…)
来查看所有的a、q对
(q/run* [q]
(q/fresh [a]
(q/membero a [1 2 3])
(q/membero q [3 4 5])
(q/== a q)))
;; make sense to me, returns (3)
(q/run* [q]
(q/fresh [a]
(q/membero a [1 2 3]))
(q/membero q [3 4 5]))
;; does not make sense to me, returns (3 4 3 5 4 3 5 4 5)
;; I was expecting `(3 4 5)`