2011-12-25 26 views
6

Estoy tratando de crear una función de módulo dentro de haskell usando las funciones primtive recursive. Sé que es posible (porque está en la lista de funciones de ejemplo en wikipedia)módulo de haskell recursión primitiva

Y sé cómo lo haría yo lógicamente también ... ¡Pero simplemente no puedo implementarlo!

IE, la lógica es (no recursividad primtive o Haskell)

function mod(a, b){ 
    while(a > b) 
    a -= b 
    return a; 
} 

Qué puedo definir utilizando la recursividad (de nuevo no Haskel)

function mod(a, b){ 
    if(a < b) return a; 
    return mod(a - b, b); 
} 

Pero me parece que no puede poner en práctica usando funciones recursivas primitivas. Me poco que no puedo hacer es la lógica de un < b

pienso para resolver mi problema realmente necesito algún tipo de lógica definida como (otra vez no Haskel)

reduce(a, b) 
    = a >= b -> a-b 
    otherwise x 

si alguien puede ayúdame con cualquier parte de esto, realmente lo agradecería, gracias

Edit :: Pensé en la posibilidad de definir una función de módulo haciendo uso de la división, es decir, mod (a, b) = a - (a/b) * b, pero como mi función recursiva primitiva para divide se basa en el módulo I no puedo hacerlo jaja

+0

'mod ab | a

+0

@DanBurton Un usuario ya publicó esto antes, pero luego borró su mensaje, ya que no es realmente relevante para el contexto de las funciones recursivas primitivas – AlanFoster

Respuesta

0

La solución a esto es

mod(0, y) 
     = zero(y) 
mod(x, 0) 
     = zero(x) 
mod(x + 1, y) 
     = mult3(succ(mod(x, y)), sign(y), notsign(eq(mod(x, y), diff(y, 1)))) 
1

Eche un vistazo a esto para algunos punteros: http://www.proofwiki.org/wiki/Quotient_and_Remainder_are_Primitive_Recursive

También tenga en cuenta que la definición de wikipedia es algo estrecha. Cualquier función creada por inducción sobre una única estructura de datos finita es primitiva recursiva, aunque lleva un poco mostrar que esto se traduce en las herramientas dadas en wikipedia. Y tenga en cuenta que podemos representar lo natural en el estilo peano clásico. No tiene que hacer esto, por supuesto, pero hace que el razonamiento sobre la inducción sea mucho más natural. Ver el wiki agda para una cita de esta noción de recursividad primitiva: http://wiki.portal.chalmers.se/agda/pmwiki.php?n=ReferenceManual.Totality#Primitiverecursion

La siguiente página tiene también lo que pienso es una exposición algo más claro sobre la recursividad primitiva: http://plato.stanford.edu/entries/recursive-functions/#1.3

+0

gracias, hice mi mejor esfuerzo para implementar eso, pero no estoy seguro de la 'interpolación' 'bits. El enlace dice "Entonces vemos que: rem (n + 1, m) = (rem (n, m) +1) sgn (m) notsgn (χeq (rem (n, m), m-˙1))" Pero, ¿qué conecta (rem (n, m) + 1) y sgn (m) y notsgn()? No hay una función que los conecte a todos juntos? O estoy malentendido este je – AlanFoster