Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure core.logic解释“新鲜”如何改变结果_Clojure_Logic_Clojure Core.logic - Fatal编程技术网

Clojure core.logic解释“新鲜”如何改变结果

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])

刚开始,版本为“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])
      (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
因此,它返回了两个结果。但是你只问q(这就是
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
因此,它返回了两个结果。但是你只问q(这就是
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)`