03-10-2016 supplementare: ho confuso induzione-induzione e induzione-ricorsione (non la prima volta che l'ho fatto!). Mi scuso per il casino. Ho aggiornato la risposta per coprire entrambi.
Trovo illuminanti le spiegazioni nel documento di Forsberg & Setzer Un'assiomatizzazione finita delle definizioni induttive-induttive .
Induzione-ricorsione
Una definizione induttiva-ricorsiva è una definizione in cui definiamo un tipo UN e una famiglia di tipi B:A→Type contemporaneamente in un modo speciale:
- A è definito come un tipo induttivo.
- B è definito da ricorsioneA .
- Fondamentalmente, la definizione di A può utilizzare B .
Senza il terzo requisito, potremmo definire prima A e poi separatamente B .
Ecco un piccolo esempio. Definire A induttivamente per avere i seguenti costruttori:
- a:A
- ℓ:(∑x:AB(x))→A
La famiglia di tipi B è definita da
- B(a)=bool
- B(ℓ(x,f))=nat
Aa:A.
B(a)boolℓ(a,false)
ℓ(a,true)
AB(ℓ(a,false))=B(ℓ(a,true))=natn:natℓ(ℓ(a,false),n):A
ℓ(ℓ(a,true),n):A
B(ℓ(ℓ(a,true),n))=nat
m:natℓ(ℓ(ℓ(a,true),n),m):A
ℓ(ℓ(ℓ(a,false),n),m):A
A
Induzione induzione
AB:A→Type
- A
- BA
- AB
BB(c(…))=⋯
c(…)ABB
A
- a:A
- ℓ:(∑x:AB(x))→A
B
- Tru:B(a)
- Fal:B(a)
- x:Ay:B(x)Zer:B(ℓ(x,y))
- x:Ay:B(x)z:B(ℓ(x,y))Suc(z):B(ℓ(x,y))
BB(a)B(ℓ(x,y))