Считаются ли проекции в двух направлениях реляционными в core.logic?

Я понимаю, что 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

Это считается реляционной операцией? Или чего-то еще не хватает, что делает это нереляционным?


person mikera    schedule 31.03.2013    source источник


Ответы (1)


Все еще кажется, что в этом случае один из аргументов должен быть обоснован, что делает его нереляционным.

person dnolen    schedule 31.03.2013