Дополнение 2016-10-03: Я перепутал индукцию-индукцию и индукцию-рекурсию (не первый раз, когда я это сделал!). Мои извинения за беспорядок. Я обновил ответ, чтобы покрыть оба.
Я нахожу объяснения в статье Форсберга и Сетцера. Конечная аксиоматизация индуктивно-индуктивных определений освещает.
Индукция-рекурсия
Индуктивно-рекурсивное определение - это определение, в котором мы определяем тип A и семейство типов B:A→Type одновременно особым образом:
- A определяется как индуктивный тип.
- B определяется рекурсии наA .
- Важно отметить , что определение A может использовать B .
Без третьего требования, мы могли бы сначала определить A , а затем отдельно B .
Вот детский пример. Определим A индуктивно, чтобы иметь следующие конструкторы:
- a:A
- ℓ:(∑x:AB(x))→A
Семейство типов B определяется как
- 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
Индукция индукции
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))