Я пытаюсь моделировать отношение порядка между конечным набором задач с использованием основной логики. Это то, что я до сих пор:Как моделировать отношение порядка в 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 или менее значения, но как только я попрошу третий (на этом этапе выполнение должно прекратиться, потому что больше нет значений для попытки) зависает программа.
Почему это висит на этом месте? Я уверен, что это шаг рекурсии, определенный в задаче, но я не уверен, как заставить ее работать.