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

Clojure 如何在core.logic中编写自己的简单约束函数?,clojure,clojure-core.logic,Clojure,Clojure Core.logic,我只是读了核心逻辑。到目前为止,这是有道理的,但我不确定去哪里学习更多 假设我想编写自己的约束,有点像初级读物中显示的membero。这个被称为vectoro,它将事物约束为一个向量 (defn vectoro [s] ???) (run* [q] (conde [(== q [1 2])] [(== q :a)]) (vectoro q)) 现在我想让它返回[12]。你是如何写向量的?这在任何地方都有文档记录吗?要继续学习,我建议您查找并查看他们的源代码是否教给您任

我只是读了核心逻辑。到目前为止,这是有道理的,但我不确定去哪里学习更多

假设我想编写自己的约束,有点像初级读物中显示的
membero
。这个被称为
vectoro
,它将事物约束为一个向量

(defn vectoro [s] ???)

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

现在我想让它返回
[12]
。你是如何写向量的?这在任何地方都有文档记录吗?

要继续学习,我建议您查找并查看他们的源代码是否教给您任何东西

至于您关于
vectoro
的具体问题,“”函数(如“投影”)可能会实现您想要的,大致如下

(defn vectoro [s v]
  (core.logic/project [v]
    (core.logic/== s (vector? v)))
有一个core.logic宏可以简化此操作:

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

(run* [q]
  (== q '(1 2))
  (pred q vector?))
=> ()
下面是如何定义
vectoro
function/containt(但要认识到这一点):

project
用于操作逻辑变量的实际/具体值(
LVar
)。然后我们可以使用普通的旧谓词
vector?
,并要求结果为true。这也适用于您的示例程序:

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

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

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