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))
=> ()