2016-04-17 9 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))) 

目的のみ(2 <、1 < 2、のように、データベース内の即時の順序関係を指定することです3,4であるが、1 < 3または2 <ではない4)、システムは「before」ゴールと「after」ゴールの組み合わせによるゴールの推移からそれらを推論させる。

2つ以下の値を要求すると、コードが正常に動作しますが、3回目の質問(この時点で実行しようとする値がなくなるため実行を停止する必要があります)が発生するとプログラムがハングします。

なぜこの時点でぶら下がっていますか?私はそれが前の目標で定義された再帰のステップだと確信していますが、それを動作させる方法はわかりません。

答えて

0

あなたはです。閉じる!あなたは、前の目標の再帰ステップにある問題について正しいです。 (before x z)(before-fact x z)に変更してください。あなたが提供するバージョンで

は、そこxまたはyに関連してzの値を接地する一切の文がありませんので、プログラムが何度も繰り返し同じ値を確認するために残されている...

関連する問題