que tiene un tipo de datosDemostrando la igualdad de las corrientes
data N a = N a [N a]
de rosales y la instancia Aplicativo
instance Applicative N where
pure a = N a (repeat (pure a))
(N f xs) <*> (N a ys) = N (f a) (zipWith (<*>) xs ys)
y la necesidad de demostrar las leyes aplicativos para ello. Sin embargo, pure crea árboles infinitamente profundos e infinitamente ramificados. Así, por ejemplo, para demostrar la ley homomorfismo
pure f <*> pure a = pure (f a)
pensé que demuestra la igualdad
zipWith (<*>) (repeat (pure f)) (repeat (pure a)) = repeat (pure (f a))
por la aproximación (más o menos) lema funcionaría. Sin embargo, mis intentos conducen a "círculos viciosos" en el paso inductivo. En particular, la reducción de
approx (n + 1) (zipWith (<*>) (repeat (pure f)) (repeat (pure a))
da
(pure f <*> pure a) : approx n (repeat (pure (f a)))
donde aprox es la función de aproximación. ¿Cómo puedo probar la igualdad sin una prueba coinductiva explícita?
¿Por qué quieres para probarlo sin necesidad de utilizar coinduction? Así como la inducción es el método de prueba natural para datos como listas/árboles finitos, la coinducción es el método de prueba natural para codata, como las corrientes o sus "árboles infinitamente profundos e infinitamente ramificados". –
En particular, porque la prueba funciona en el nivel de "sintaxis del programa". Una prueba de bisimilaridad no lo hace. – danportin
esto parece un buen candidato para el sitio cstheory stackexchange, especialmente si lo declaró en términos ligeramente más generales/formales. – sclv