小编pet*_*pun的帖子

如何在Clojure中实现并行逻辑或提前终止

我想定义一个谓词,以某些谓词与相应的输入作为输入(它们可以作为懒惰的调用序列提供),并行运行它们并计算逻辑或结果,以使谓词调用终止返回时true,整个计算也终止(return true)。

除了提供时间优化之外,这还有助于避免在某些情况下不终止(某些谓词调用可能不会终止)。实际上,undefined该谓词将非终止解释为第三个值,它模拟Kleene K3逻辑 (初始居中Kleene代数中的连接)的or运算。

Haskell家族的情况与类似。Clojure中有任何(最好是简单的)方法可以做到这一点吗?

编辑:在阅读评论后,我决定添加一些说明。

(a)首先,在线程池用尽之后发生的事情不太重要。我认为创建一个足以满足我们需求的线程池是一个合理的约定。

(b)最关键的要求是谓词调用开始并行运行,并且一旦谓词调用终止返回true,所有其他运行线程都会被中断。预期的行为是:

  • 如果有谓词调用返回true:并行或返回true
  • 否则,如果有一个谓词调用不终止:并行或不终止
  • 否则:平行或返回 false

换句话说,它的行为就像在由下式给出的3元素晶格中的加入false< undefined< true,与undefined代表非终止。

(c)并行或应该能够接受许多谓词和许多谓词输入(每个对应于一个谓词)作为输入。但是,如果将延迟序列作为输入,那就更好了。然后,命名并行或pany(对于“任何并行”),我们可以进行如下调用:

  • (pany (map (comp eval list) predicates inputs))
  • (pany (map (comp eval list) predicates (repeat input)))
  • (pany (map (comp eval list) (repeat predicate) inputs)) 相当于 (pany (map predicate (unchunk inputs)))

最后,我认为,很自然地要求这样的事情pany,例如双重pall,机制或机制,以构建此类尽早终止的并行约简,以易于实现,甚至内置于面向并行性的语言(如Clojure)中。

parallel-processing logic functional-programming clojure terminate

5
推荐指数
1
解决办法
233
查看次数