No consigo que el verificador de terminación Agda acepte funciones definidas mediante inducción estructural.Terminación de la inducción estructural
Creé lo siguiente como, creo, el ejemplo más simple que presenta este problema. Se rechaza la siguiente definición de size
, aunque siempre recurre a componentes estrictamente más pequeños.
module Tree where
open import Data.Nat
open import Data.List
data Tree : Set where
leaf : Tree
branch : (ts : List Tree) → Tree
size : Tree → ℕ
size leaf = 1
size (branch ts) = suc (sum (map size ts))
¿Existe una solución genérica para este problema? ¿Debo crear un Recursor
para mi tipo de datos? Si es así, ¿cómo hago eso? (Supongo que si hay un ejemplo de cómo se podría definir un Recursor
para List A
, que me daría suficientes pistas?)
Sí, así es como también lo hago cuando uso 'map'. Realmente es desafortunado que el verificador de terminación no pueda entrar en la definición de 'mapa' y ver que todo está bien. – danr