Suplementar 03/10/2016: Misturei indução-indução e indução-recursão (não a primeira vez que fiz isso!). Minhas desculpas pela bagunça. Eu atualizei a resposta para cobrir os dois.
Acho que as explicações no artigo de Forsberg & Setzer iluminam uma axiomatização finita de definições indutivo-indutivas .
Indução-recursão
Uma definição indutivo-recursiva é aquela em que definimos um tipo e uma família de tipos simultaneamente de uma maneira especial:AB:A→Type
- A é definido como um tipo indutivo.
- B é definido por recursividade em .A
- Fundamentalmente, a definição de pode usar .AB
Sem o terceiro requisito, poderíamos primeiro definir e, em seguida, separadamente .AB
Aqui está um exemplo de bebê. Defina indutivamente para ter os seguintes construtores:A
- a:A
- ℓ:(∑x:AB(x))→A
A família de tipos é definida porB
- B(a)=bool
- B(ℓ(x,f))=nat .
Então, o que está em ? Primeiro de tudo, temos um elemento Por causa disso, existe um tipo que é definido como . Portanto, podemos formar dois novos elementos e em . Agora temos , para que também possamos formar para cada os elementos
e
Podemos continuar assim . A próxima etapa será que, desde
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
existe para cada o elemento
e o elemento
Podemos continuar. Um pouco de pensamento revela que é mais ou menos duas cópias de listas de números naturais, compartilhando uma lista vazia comum. Vou deixar isso como um exercício para descobrir o porquê.m:natℓ(ℓ(ℓ(a,true),n),m):A
ℓ(ℓ(ℓ(a,false),n),m):A
A
Indução-indução
Uma definição indutiva-indutiva também define um tipo e, simultaneamente, uma família de tipos :AB:A→Type
- A é definido indutivamente
- B é definido indutivamente e pode se referir aA
- Fundamentalmente, pode referir-se a .AB
É importante entender a diferença entre indução-recursão e indução-indução. Na indução-recursão definimos , fornecendo equações da forma
onde é um construtor para . Numa definição indutiva-indutivo definimos , fornecendo construtores para formar os elementos de .BB(c(…))=⋯
c(…)ABB
Vamos reformular nosso exemplo anterior como indução-indução. Primeiro, temos o tpye dado indutivamente :A
- a:A
- ℓ:(∑x:AB(x))→A
A família de tipos é definida pelos seguintes construtores:B
- Tru:B(a)
- Fal:B(a)
- se e entãox:Ay:B(x)Zer:B(ℓ(x,y))
- se e e então .x:Ay:B(x)z:B(ℓ(x,y))Suc(z):B(ℓ(x,y))
Como você pode ver, definimos regras para gerar os elementos de que equivale a dizer que é (isomófico para) os booleanos, e é (isomórfico para) os números naturais .BB(a)B(ℓ(x,y))