2012-09-10 12 views
29

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.

+1

FD en core.logic son solo para números naturales y no para vectores, etc. – Ankur

+7

publique su solución como solución :-) – ordnungswidrig

Respuesta

0

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 el dominio está destinado a ser utilizado en los vectores de todas formas, por lo esto podría no ser una solución sino la solución real.

Cuestiones relacionadas