2016-04-17 41 views
0

我正在嘗試使用核心邏輯對一組有限的任務之間的順序關係進行建模。這是我到目前爲止有:如何在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或更少的值,但一旦我要求第三個(此時執行應停止,因爲沒有更多值嘗試)程序掛起。

爲什麼它掛在這一點?我很確定這是在之前的目標中定義的遞歸步驟,但我不確定如何使其工作。

回答

0

你是所以關閉!你對前面目標的遞歸步驟中的問題是正確的。將(before x z)更改爲(before-fact x z),它應該可以工作。

在你提供的版本,沒有語句地面z與有關xy值,所以程序是留給一遍又一遍又一遍檢查相同的價值觀...