Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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 有没有办法向解算器提供提示,哪些路径更好?_Clojure_Clojure Core.logic - Fatal编程技术网

Clojure 有没有办法向解算器提供提示,哪些路径更好?

Clojure 有没有办法向解算器提供提示,哪些路径更好?,clojure,clojure-core.logic,Clojure,Clojure Core.logic,在解决问题的过程中,是否有一种方法可以优先选择某些路径?这实际上是一个性能问题。当我把我所有的逻辑放在一起时,它会产生1000个解,这需要指数增长的时间。这些都是有效的解决方案,所以我可以做一些类似于(运行1…)的事情,而不是(运行*…),但这给了我一个任意的解决方案。我想做的是能够提供一些关于哪些路径更好的提示 我知道,通过使用自定义比较器对它们进行排序,我可以得到一个最佳答案,但这无助于解决性能问题 下面是一个简化的人为示例: (require '[clojure.core.logic

在解决问题的过程中,是否有一种方法可以优先选择某些路径?这实际上是一个性能问题。当我把我所有的逻辑放在一起时,它会产生1000个解,这需要指数增长的时间。这些都是有效的解决方案,所以我可以做一些类似于
(运行1…
)的事情,而不是
(运行*…)
,但这给了我一个任意的解决方案。我想做的是能够提供一些关于哪些路径更好的提示

我知道,通过使用自定义比较器对它们进行排序,我可以得到一个最佳答案,但这无助于解决性能问题

下面是一个简化的人为示例:

(require
  '[clojure.core.logic :refer :all]
  '[clojure.core.logic.fd :as fd]))

(defn multipleo
  [multiple value domain]
  (fresh [n]
    (fd/in multiple domain)
    (fd/in n (fd/interval 1 10))
    (fd/* n multiple value)))

(run* [q]
  (multipleo q 60 (fd/domain 30 24 15 12)))
=> (12 15 30)

12、15和30都是有效的解决方案,但我想要的是最大的
(>*1最后排序)
,但我还是想用解算器来做
(运行1[q](multipleo q 60(fd/domain 30 24 15 12))
会产生
(30)
扩展@amlloy的建议,我可以尝试以下方法:

(defn multipleo
  [multiple value]
  (fresh [n]
    (conde
      [(== multiple 6)]
      [(== multiple 3)])
    (fd/in n (fd/interval 1 10))
    (fd/* n multiple value)))

(run* [q] (multipleo q 12))
=> (6 3)
这似乎奏效了。就我所知,在fd/in中对域进行排序没有影响。但是,如果我按照我喜欢的顺序将域条目intp a
conde
移动,就可以了。如果没有
conde
,上述代码将生成
(36)
。然而,这比fd/in方法慢得多。我猜fd/in比conde做了一些不错的性能技巧

我还尝试了
condu
,但这并不像我预期的那样有效

(defn multipleo
  [multiple value]
  (fresh [n]
    (condu
      [(== multiple 6)]
      [(== multiple 3)])
    (fd/in n (fd/interval 1 10))
    (fd/* n multiple value)))

(run* [q] (multipleo q 3))
=> ()

我本以为第一个
condu
组会失败,因为在本例中,整体逻辑不能成功w/multiple=6。有人能帮我理解为什么它不能像我期望的那样工作吗?

我不知道关于fd,但是对于普通的逻辑变量,你可以简单地把“首选”路径放在你的
conde
或任何东西的前面,然后首先搜索它。