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