Uzupełnienie 2016-10-03: Zmieszałem indukcję z indukcją z rekurencją (nie pierwszy raz to zrobiłem!). Przepraszam za bałagan. Zaktualizowałem odpowiedź, aby objąć oba te elementy.
Wyjaśnienia znajduję w pracy Forsberga i Setzera. Skończona aksjatyzacja definicji indukcyjno-indukcyjnych jest pouczająca.
Rekursja indukcyjna
Definicja indukcyjno-rekurencyjna to taka, w której definiujemy jednocześnie typ A i rodzinę typów B:A→Type jednocześnie w specjalny sposób:
- A jest zdefiniowany jako typ indukcyjny.
- B jest określona przez rekursję wA .
- Co najważniejsze, definicja A może wykorzystywać B .
Bez trzecie wymaganie może najpierw określić A , a następnie oddzielnie B .
Oto przykład dziecka. Zdefiniuj A indukcyjnie, aby mieć następujące konstruktory:
- a:A
- ℓ:(∑x:AB(x))→A
Rodzina typów B jest zdefiniowana przez
- B(a)=bool
- B(ℓ(x,f))=nat .
Co jest w A ? Przede wszystkim mamy elementu a:A.
Z tego powodu, nie jest to typ B(a) , która jest zdefiniowana jako bool . Można zatem utworzyć dwa nowe elementy ℓ(a,false)
i ℓ(a,true)
w . Teraz mamy B ( ℓ ( a , f aAB(ℓ(a,false))=B(ℓ(a,true))=nat , więc możemy również utworzyć dla każdegon:nat elementy
ℓ(ℓ(a,false),n):A
i
ℓ(ℓ(a,true),n):A
Możemy dalej tak postępować. Następnym etapem będzie, że od
B(ℓ(ℓ(a,true),n))=nat
jest na każdym:nat element
ℓ(ℓ(ℓ(a,true),n),m):A
i element
ℓ(ℓ(ℓ(a,false),n),m):A
Możemy iść dalej. Trochę myślenia ujawnia, żeA to mniej więcej dwie kopie liczb naturalnych, dzielące wspólną pustą listę. Zostawię to jako ćwiczenie, aby dowiedzieć się, dlaczego.
Indukcja-indukcja
Definicja indukcyjno-indukcyjna definiuje również typ A i jednocześnie rodzinę typów B:A→Type :
- A jest zdefiniowane indukcyjnie
- B jest zdefiniowane indukcyjnie i może odnosić się doA
- Co najważniejsze, może odnosić się do B .AB
Ważne jest zrozumienie różnicy między indukcją-rekurencją a indukcją-indukcją. W indukcyjnego rekursji zdefiniować B dostarczając równania postaci
B(c(…))=⋯
gdzie c(…) jest konstruktor A . W definicji indukcyjnego indukcyjnego zdefiniować B dostarczając konstruktorów do formowania elementów B .
Przeformułujmy nasz poprzedni przykład jako indukcję-indukcję. Najpierw mamy indukcyjnie podane tpye A :
- a:A
- ℓ:(∑x:AB(x))→A
Rodzina typów B jest definiowana przez następujące konstruktory:
- Tru:B(a)
- Fal:B(a)
- jeśli x:A i y:B(x) to Zer:B(ℓ(x,y))
- jeśli x:A i y:B(x) i z:B(ℓ(x,y)) to Suc(z):B(ℓ(x,y)) .
Jak widać, podaliśmy zasady generowania elementów B które sprowadzają się do stwierdzenia, że B(a) jest (izomorficzny) do booleanów, a B(ℓ(x,y)) jest (izomorficzny) liczb naturalnych.