2016-04-17 9 views
0

Ich versuche, eine Reihenfolge Beziehung zwischen einer endlichen Reihe von Aufgaben mit Kern-Logik zu modellieren. Das ist, was ich habe, so weit:Wie modelliere ich eine Bestellbeziehung in 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)) 

Und ich diese Abfrage ausführen:

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

Ziel ist es, nur sofort um die Beziehungen in der Datenbank angeben (wie in, 1 < 2, 2 < 3, 3 < 4, aber nicht 1 < 3 oder 2 < 4) und lassen Sie das System aus der Transitivität des Ziels "vor" kombiniert mit dem "nach" -Ziel ableiten.

Mein Code funktioniert gut, wenn ich nach 2 oder weniger Werten frage, aber sobald ich nach einem dritten frage (an diesem Punkt sollte die Ausführung aufhören, weil es keine weiteren Werte mehr gibt), hängt das Programm.

Warum hängt es an diesem Punkt? Ich bin mir ziemlich sicher, dass es der Rekursionsschritt ist, der im Vorher-Ziel definiert wurde, aber ich bin mir nicht sicher, wie ich es zum Laufen bringen soll.

Antwort

0

Sie sind also schließen! Sie haben Recht, dass das Problem im Rekursionsschritt des Vorher-Ziels liegt. Ändern Sie (before x z) zu (before-fact x z) und es sollte funktionieren.

In der Version, die Sie zur Verfügung stellen, gibt es keine Aussagen über den Wert von z mit Bezug auf x oder y, erden, um das Programm verlassen wird, um die gleichen Werte immer und immer und immer überprüfen ...

Verwandte Themen