clojure prolog logic clojure-core.logic

clojure - Predicado para declarar coordenadas descendentes/ascendentes utilizando dominios finitos



prolog logic (1)

Encontré una solución alternativa, donde descendo permanece igual, pero cuando lo ejecutamos no usamos un dominio:

(l/run* [q] (l/fresh [a] (l/membero a [[0 0] [1 0] [0 1] [1 1]]) (l/membero q [[0 0] [1 0] [0 1] [1 1]]) (descendo a q))) => ([1 1])

No estoy seguro de si el dominio está destinado a ser usado en vectores de todos modos, por lo que esto podría no ser una solución sino la solución real.

Me gustaría escribir un predicado, descendo, que declara que la primera coordenada dada [y, x] está descendiendo a la segunda coordenada dada (imagine el tablero con [0, 0] en la esquina superior izquierda).

Una implementación muy simple en Prolog podría verse así:

descending(B, A) :- B = [B1,B2], A = [A1,A2], B1 is A1 + 1, B2 is A2 + 1.

Aunque no puedo implementar esto en core.logic. Ya he probado muchas cosas diferentes (== / = fd / conso / appendo y + fd / +). Una de las cosas que probé:

(defn descendo [b a] (l/fresh [b1 b2 a1 a2] (l/== b [b1 b2]) (l/== a [a1 a2]) (l/+fd b1 1 a1) (l/+fd b2 1 a2)))

La mayoría de ellos simplemente no devuelven nada cuando los ejecutan así

(l/run* [q] (l/fresh [a] (l/infd a (l/domain [0 0] [1 0] [0 1] [1 1])) (descendo a [0 0]) (l/== q a))) => () ; expected output: ([1 1])

Tengo la sensación de que pensar demasiado en Prolog no es bueno cuando se usa core.logic ... cualquier sugerencia que se aprecie. Gracias por adelantado.

EDITAR: Encontré una solución alternativa, donde descendo permanece igual, pero cuando lo ejecutamos no usamos un dominio:

(l/run* [q] (l/fresh [a] (l/membero a [[0 0] [1 0] [0 1] [1 1]]) (l/membero q [[0 0] [1 0] [0 1] [1 1]]) (descendo a q))) => ([1 1])

No estoy seguro de si el domain está destinado a ser usado en vectores de todos modos, por lo que esto podría no ser una solución sino la solución real.