如何在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))
=> ()
我刚刚阅读了 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))
=> ()