2016-09-03 2 views
1

Я был озадачен проблемой моделирования в течение некоторого времени, и я должен признаться, я понятия не имею, как я мог «правильно» решить его в core.logic.Поиск дерева в Clojure core.logic

Очень легко указать: учитывая дерево (ациклический однонаправленный ориентированный граф) и вершину в нем, как вы используете core.logic, чтобы определить цель, которая позволяет lvar быть любой достижимой вершиной из данной вершины?

Я начал с чем-то как можно более простым:

(defrel vertex x) 
(defrel child) 
(def facts 
    (pldb/db 
    [vertex 'a] 
    [vertex 'b] [child 'a 'b] 
    [vertex 'c] [child 'b 'c] 
    [vertex 'd] [child 'c 'd])) 

Учитывая эту конфигурацию, я ставлю на определение цели которая позволяет lvar принимать значения в [ «а» Ь «с» г ]. Это просто, чтобы получить достижимые вершины с «1 хопом»:

(defn reachableo 
    [a] 
    (fresh [q] 
    (child a q))) 

и вы можете добавить переменные для 2 хмеля и так далее, но ... это может быть обобщенно? Я думал, чтобы определить список lvar с чем-то вроде

(let [vars (repeatedly lvar)] 
    (map #(child (nth vars %) (nth vars (inc %))) 
     (-> vars count dec range)) 
    (all 
    ...)) 

но несколько попыток позже, я должен признаться, я не уверен, что это правильный путь.

ответ

0
(pldb/db-rel vertex x) 
(pldb/db-rel child parent child) 
(def facts 
    (pldb/db 
    [vertex 'a] 
    [vertex 'b] [child 'a 'b] 
    [vertex 'c] [child 'b 'c] 
    [vertex 'd] [child 'c 'd])) 

Рекурсивный цель:

(defn reachable° [from to] 
    (l/fresh [v] 
    (l/conde 
     [(child from to)] 
     [(child from v) (reachable° v to)]))) 

Тестирование

=> (pldb/with-db facts 
    (vec (l/run* [to] (reachable° 'a to)))) 
[b c d] 
0

спасибо за вашу помощь!

На самом деле я получил

(defn order-relationo 
    "Abstract the general pattern of a order relation in a logic, relational way." 
    [relation x y] 
    (conde 
    [(relation x y)] 
    [(fresh [z] 
     (relation x z) 
     (order-relationo relation z y))])) 

(def kino 
    "A goal where the two inputs x and y share kinship: x is an ancestor of y and 
    y a descandant of x." 
    (partial order-relationo child)) 

Я задал этот вопрос, потому что это было давно я не практиковал логику программирования, но теперь я чувствую, что это снова приходит ^^

Во всяком случае, спасибо за ваш ответ, который дает мне дополнительную точку зрения.

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