我刚刚阅读了core.logic的入门。到目前为止这是有道理的,但我不知道去哪里了解更多。
假设我想编写自己的约束,有点像membero
入门中所示。这被称为vectoro
并将事物限制为向量。
(defn vectoro [s] ???)
(run* [q]
(conde
[(== q [1 2])]
[(== q :a)])
(vectoro q))
现在我希望它返回[1 2]
。你怎么写vectoro
?这在任何地方都有记录吗?
我刚刚阅读了core.logic的入门。到目前为止这是有道理的,但我不知道去哪里了解更多。
假设我想编写自己的约束,有点像membero
入门中所示。这被称为vectoro
并将事物限制为向量。
(defn vectoro [s] ???)
(run* [q]
(conde
[(== q [1 2])]
[(== q :a)])
(vectoro q))
现在我希望它返回[1 2]
。你怎么写vectoro
?这在任何地方都有记录吗?
有一个 core.logicpred
宏可以让这变得简单:
(run* [q]
(== q [1 2])
(pred q vector?))
=> ([1 2])
(run* [q]
(== q '(1 2))
(pred q vector?))
=> ()
以下是您定义vectoro
函数/约束的方式(但要意识到这本质上是完全相同的事情pred
):
(defn vectoro [a]
(project [a]
(== true (vector? a))))
project
用于对逻辑变量 ( )的实际/具体值进行操作。LVar
然后我们可以使用普通的旧谓词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 的项目,看看他们的源代码是否教会了你任何东西。
至于您关于 的具体问题vectoro
,“项目”功能(如“投影”)可能会完成您想要的,类似于
(defn vectoro [s v]
(core.logic/project [v]
(core.logic/== s (vector? v)))