0

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

(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 目标中定义的递归步骤,但我不确定如何使它工作。

4

1 回答 1

0

你是如此接近!您对问题出在 before 目标的递归步骤是正确的。更改(before x z)(before-fact x z)它应该可以工作。

在您提供的版本中,没有语句可以确定zxor相关的值y,因此程序需要一遍又一遍地检查相同的值......

于 2016-04-17T17:11:11.323 回答