core.logic中的伪关系

时间:2019-07-15 19:24:04

标签: clojure clojure-core.logic

在函数core.logic中,我看到以下clojure.core.logic/everyg的定义。

  

采用coll并确保目标g的伪关系   在集合的每个元素上都成功。

pseudo-relation在此上下文中到底意味着什么?

1 个答案:

答案 0 :(得分:1)

以下是有关关系(和非关系)的一个很好的解释:What does non-relational mean in practice for core.logic?另一个背景是everygthis commit中从everyo重命名,因为{{1 }}后缀只能用于关系。

关系目标的一个特性是,当他们的全部/一些/都不是不真实的输入时,他们就可以做出答案。 o是关系型的,因此我们可以询问满足consol的{​​{1}}(其中所有变量都是新鲜的)的关系的值是什么:

a

这告诉我们d(run* [a d l] (conso a d l)) => ([_0 _1 (_0 . _1)]) )是新鲜的,a_0)是新鲜的,d_1)是新鲜的l之前是(_0 . _1)。尽管这些值都不是基础,但我们仍然可以在答案中看到它们之间的关系

a并非如此:

d

everyg不能告诉我们(run* [g coll] (everyg g coll)) ;; Don't know how to create ISeq from: clojure.core.logic.LVar everyg之间的关系是什么,也不能告诉我们g coll可能是因为我们提供了两个底值:

g

虽然coll本身不是关系,但您可以将新鲜和/或基本变量的目标(run* [coll] (everyg succeed coll)) ;; throws (let [coll (repeatedly 3 lvar)] ;; throws too (run* [g] (everyg g coll))) everyg传递给它:

g

无论目标coll的位置如何,该示例都将给出相同的答案,这是关系目标的另一特性。

我们可以使用所有新的逻辑变量将(let [coll (cons 1 (repeatedly 2 lvar))] ;; 1 prepended to two fresh logic vars (run* [q] (== q coll) (everyg #(fd/in % (fd/domain 0 1)) coll))) => ((1 0 0) (1 1 0) (1 0 1) (1 1 1)) 关系传递到everyg,并且仍然在答案中看到该关系,与上面的conso示例完全相同:

everyg

因此,有一些警告,conso可以用于关系,这就是为什么我认为它被认为是伪关系而不是非关系