Clojure core.logic CLP (FD) proyectando variables FD

Estoy trabajando en un algoritmo de empaquetamiento cuadrado ingenuo utilizando la biblioteca CLP (FD) core.logic de Clojure (core.logic versión 0.8.3).

Los cuadrados se representan así:

[[[x11 y11] [x12 y12]] 
 [[x21 y21] [x22 y22] ...]]

con cada cuadrado representado como las coordenadas de sus esquinas superior izquierda e inferior derecha.

Las coordenadas son variables FD, dentro de un cierto intervalo.

Quiero definir el tamaño de una solución como la distancia entre la esquina superior derecha y las esquinas inferior derecha de los cuadrados más cercanos y más lejanos al origen, respectivamente

(defne solution-size-o [size squares]
  ([s sqrs]
    (fresh [closest farthest 
            x11 y11 x22 y22 _1 _2]
    (closest-square   [[x11 y11] _1] sqrs)
    (farthest-square  [_2 [x22 y22]] sqrs)
    (project [x11 y11 x22 y22]
      (let [a (- y22 y11)
            b (- x22 x11)]
        (== s (-> (+ (* a a) (* b b)) Math/sqrt Math/ceil int)))))))

Esto parece funcionar bien con enteros simples:

(run 1 [q]
  (solution-size-o q [[[0 0] [1 1]] [[1 1] [2 2]]]))
=> (3)

E incluso con variables FD totalmente restringidas

(defn constrained-solution-size []
  (run 1 [q] 
    (fresh [size x11 y11 
                 x12 y12 
                 x21 y21 
                 x22 y22 squares]
      (fd/in x11 y11 x12 y12 x21 y21 x22 y22 (fd/interval 0 2))
      (fd/eq 
        (= x11 0) (= y11 0) (= x21 1) (= y21 1)
        (= x12 (+ x11 1)) (= y12 (+ y11 1))
        (= x22 (+ x21 1)) (= y22 (+ y21 1)))
      (== squares [[[x11 y11] [x12 y12]] [[x21 y21] [x22 y22]]])
      (solution-size-o size squares)
      (== q {:squares squares :size size}))))

(constrained-solution-size)
=> ({:squares [[[0 0] [1 1]] [[1 1] [2 2]]], :size 3})

Pero parece romperse cuando los dominios de las variables no están totalmente restringidos. Por ejemplo, si elimino la restricción quey21 = 1, sentidoy11 yy21 tienen más de un valor dejado en sus dominios:

(defn unconstrained-solution-size []
  (run 1 [q] 
    (fresh [size x11 y11 
                 x12 y12 
                 x21 y21 
                 x22 y22 squares]
      (fd/in x11 y11 x12 y12 x21 y21 x22 y22 (fd/interval 0 2))
      (fd/eq 
        (= x11 0) (= y11 0) (= x21 1)
        (= x12 (+ x11 1)) (= y12 (+ y11 1))
        (= x22 (+ x21 1)) (= y22 (+ y21 1)))
      (== squares [[[x11 y11] [x12 y12]] [[x21 y21] [x22 y22]]])
      (solution-size-o size squares)
      (== q {:squares squares :size size}))))

yo obtengo

(unconstrained-solution-size)
=> ClassCastException clojure.core.logic.LVar cannot be cast to java.lang.Number     clojure.lang.Numbers.minus (Numbers.java:135)

Parece queproject solo funciona en variables FD cuando sus dominios están totalmente restringidos. ¿Es así como debería ser? Si es así, ¿alguien tiene alguna sugerencia sobre cómo llevar a cabo una aritmética no relacional en las variables FD?

¡Gracias!

Respuestas a la pregunta(1)

Su respuesta a la pregunta