Me gustaría escribir un predicado, descendo, que declara que la primera coordenada dada [y, x] desciende a la segunda coordenada dada (imagine la placa con [0 , 0] en la esquina superior izquierda).Predicado para declarar coordenadas descendentes/ascendentes usando dominios finitos
Una aplicación muy simple en Prolog podría tener este aspecto:
descending(B, A) :-
B = [B1,B2],
A = [A1,A2],
B1 is A1 + 1,
B2 is A2 + 1.
que no consigan ejecutar esto en core.logic sin embargo. Ya he probado muchas cosas diferentes (==/= fd/conso/appendo y + fd/+). Una de las cosas que intenté:
(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 acaba de regresar nada cuando se ejecuta como esto:
(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 núcleo. lógica ... cualquier pista apreciada. Gracias por adelantado.
EDIT: encontrado una solución, donde descendo sigue siendo el mismo, pero al ejecutarlo 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 domain
está destinado a ser utilizado en vectores de todos modos, por lo que esto podría no ser una solución, sino la solución real.
FD en core.logic son solo para números naturales y no para vectores, etc. – Ankur
publique su solución como solución :-) – ordnungswidrig