如何在core.logic中建立订单关系模型?

时间:2016-04-17 14:47:48

标签: clojure clojure-core.logic

我正在尝试使用核心逻辑对一组有限任务之间的顺序关系进行建模。这就是我到目前为止所做的:

(def tasks [:t0 :t1 :t2])

(defn tasko [x]
    (membero x tasks))

(db-rel before-fact x y)
(def facts 
  (db 
    [before-fact :t0 :t1]
    [before-fact :t1 :t2]))

(defn before [x y]
  (conde
    [(before-fact x y)]
    [(fresh [z]
      (tasko z)
      (before x z)
      (before z y))]))

(defn after [x y]
  (before y x))

我运行此查询:

(with-db facts 
  (run 3 [q] ; If run with 2, result is correct
    (after q :t0)))

目标是仅在数据库中指定即时订单关系(如,1< 2,2< 3,3< 3< 3< 3< 3< 3< 3> 4),并且系统推断那些来自传递性的关系。目标“之前”结合“之后”目标。

如果我要求2个或更少的值,我的代码工作正常,但是一旦我要求第3个(此时执行应该停止,因为没有更多的值可以尝试)程序挂起。

为什么它挂在这一点上?我很确定这是前一个目标中定义的递归步骤,但我不确定如何使它工作。

1 个答案:

答案 0 :(得分:0)

所以关闭!你在前一个目标的递归步骤中遇到的问题是正确的。将(before x z)更改为(before-fact x z),它应该有效。

在您提供的版本中,没有声明将z的值与xy相关联,因此程序会检查相同的值并且一遍又一遍......