2016-04-17 3 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 с относительно x или y, поэтому программа остается снова и снова и снова проверить те же значения ...

 Смежные вопросы

  • Нет связанных вопросов^_^