如何在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<4,而不是1<3或2<4),并让系统根据目标"之前"与"之后"的传递性来推断这些关系。

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

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

所以很接近!您对before目标的递归步骤中的问题是正确的。将(before x z)更改为(before-fact x z),它应该可以工作。

在您提供的版本中,没有语句使z的值与xy相关,因此程序只能一遍又一遍地检查相同的值。。。

最新更新