我正在尝试使用核心逻辑对一组有限任务之间的顺序关系进行建模。这是我到目前为止所拥有的:
(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 个或更少的值,我的代码可以正常工作,但是一旦我要求第 3 个值(此时执行应该停止,因为没有更多值可以尝试),程序就会挂起。
为什么会挂在这个时候?我很确定这是 before 目标中定义的递归步骤,但我不确定如何使它工作。