Я понимаю, что project
в core.logic не является реляционным.
Однако кажется, что я могу получить реляционное поведение, проецируя в обоих направлениях внутри conda
, например:
(defn lifto-with-inverse
"Lifts a unary function and its inverse into a core.logic relation."
([f g]
(fn [& vs]
(let [[x y] vs]
(conda
[(pred x number?) (project [x] (== y (f x)))]
[(pred y number?) (project [y] (== x (g y)))])))))
(let [inco (lifto-with-inverse inc dec)]
(run* [q] (inco q 3)))
=> 2
Это считается реляционной операцией? Или чего-то еще не хватает, что делает это нереляционным?