Non riesco a ottenere che il controllo di terminazione di Agda accetti le funzioni definite mediante induzione strutturale.Terminazione dell'induzione strutturale
Ho creato il seguente esempio, a mio avviso, più semplice che mostra questo problema. La seguente definizione di size
viene rifiutata, anche se ricorre sempre su componenti strettamente più piccoli.
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))
Esiste una soluzione generica a questo problema? Devo creare un Recursor
per il mio tipo di dati? Se sì, come faccio? (Immagino che se ci fosse un esempio di come definire uno Recursor
per List A
, mi darebbe abbastanza suggerimenti?)
Sì, questo è come lo faccio anche quando uso 'mappa'. È davvero spiacevole che il controllore della terminazione non possa entrare nella definizione di 'mappa' e vedere che tutto va bene. – danr