如何在core.logic中编写自己的简单约束函数?

How to write your own simple constraint function in core.logic?

我刚刚阅读了 core.logic 的 primer。到目前为止它是有道理的,但我不确定去哪里了解更多。

假设我想编写自己的约束,有点像入门中显示的 membero。这个叫做 vectoro 并将事物约束为向量。

(defn vectoro [s] ???)

(run* [q]
  (conde
    [(== q [1 2])]
    [(== q :a)])
  (vectoro q))

现在我想要 return [1 2]vectoro怎么写?这在任何地方都有记录吗?

要继续学习,我建议寻找 projects that use core.logic 并查看他们的源代码是否能教给您任何东西。

至于你关于 vectoro 的具体问题,“project”函数(如 "projection" 中)可能会完成你想要的,类似于 [=14] =]

(defn vectoro [s v]
  (core.logic/project [v]
    (core.logic/== s (vector? v)))

有一个 core.logic pred 宏可以让这一切变得简单:

(run* [q]
  (== q [1 2])
  (pred q vector?))
=> ([1 2])

(run* [q]
  (== q '(1 2))
  (pred q vector?))
=> ()

以下是您可以定义 vectoro function/contraint 的方式(但请注意这是 essentially the exact same thing pred is doing):

(defn vectoro [a]
  (project [a]
    (== true (vector? a))))

project用于对逻辑变量(LVar)的actual/concrete进行运算。然后我们可以使用普通的旧谓词 vector? 并要求结果为真。这也适用于您的示例程序:

(run* [q]
  (conde
    [(== q [1 2])]
    [(== q :a)])
  (vectoro q))
=> ([1 2])

(run* [q]
  (conde
    [(== q '(1 2))]
    [(== q :a)])
  (vectoro q))
=> ()