私は、コアロジックを使用して有限の一連のタスク間の順序関係をモデル化しようとしています。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回目の質問(この時点で実行しようとする値がなくなるため実行を停止する必要があります)が発生するとプログラムがハングします。
なぜこの時点でぶら下がっていますか?私はそれが前の目標で定義された再帰のステップだと確信していますが、それを動作させる方法はわかりません。