2

我刚刚阅读了core.logic的入门。到目前为止这是有道理的,但我不知道去哪里了解更多。

假设我想编写自己的约束,有点像membero入门中所示。这被称为vectoro并将事物限制为向量。

(defn vectoro [s] ???)

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

现在我希望它返回[1 2]。你怎么写vectoro?这在任何地方都有记录吗?

4

2 回答 2

4

有一个 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))
=> ()
于 2018-01-10T00:57:37.363 回答
1

为了继续学习,我建议寻找使用 core.logic 的项目,看看他们的源代码是否教会了你任何东西。

至于您关于 的具体问题vectoro,“项目”功能(如“投影”)可能会完成您想要的,类似于

(defn vectoro [s v]
  (core.logic/project [v]
    (core.logic/== s (vector? v)))
于 2018-01-09T01:35:05.473 回答