Pourquoi les types récursifs sont-ils nécessaires en tant que primitives pour les preuves dans les systèmes de types dépendants?

10

Je suis relativement nouveau dans la théorie des types et la programmation dépendante. J'ai étudié le calcul des constructions (CoC) et d'autres systèmes de type pur. Je suis particulièrement intéressé à l'utiliser comme une représentation intermédiaire préservant les preuves pour un système de compilation.

Je comprends que les types (co) récursifs sont représentables , par calcul , en utilisant comme seul constructeur de type. J'ai lu, cependant, qu'ils ne peuvent pas être utilisés pour construire des preuves par induction (pardonnez-moi, je ne trouve pas où maintenant!), Par exemple, je ne pouvais pas prouver queΠ01 en CoC simple (même si peut être typé comme Π ( N : ) . Π ( S : NN ) . Π ( Z : N ) . N ).NatΠ(N:).Π(S:NN).Π(Z:N).N

Je suppose que c'est pourquoi ils ont construit le calcul des constructions inductives (CIC). Est-ce correct? Mais pourquoi? Je n'ai trouvé aucun document expliquant pourquoi de telles preuves ne peuvent pas être représentées sans utiliser des types (co) inductifs comme primitives. Si ce n'est pas vrai, alors pourquoi les ajouter en tant que primitives dans CIC?

paulotorrens
la source

Réponses:

7

Je ne suis pas un expert, mais je partagerai ce que j'ai compris jusqu'à présent avec un exemple.

Considérons le type booléen dans CoC, en utilisant son encodage standard: On pourrait s'attendre à pouvoir prouver Π b : B b = t

B=Πτ:τττtt=λτ:,x:τ,y:τ. xff=λτ:,x:τ,y:τ. y
En effet, cela découle rapidement du principe d'élimination / induction dépendant que nous avons par exemple dans CiC B i n d : Π P : B P ( t t ) P ( f f ) Π b : B P ( b )
Πb:Bb=ttb=ff()
Bind:ΠP:BP(tt)P(ff)Πb:BP(b)

B{fτ}τττττfτtt,ff

fN(n)(m)=n+m

tt,ff()B

()()Bind

chi
la source
(λ(Nat:).(...))(Π(N:).Π(S:NN).Π(Z:N).N)SZ
paulotorrens
NatS,Znn(T)(ST)(ZT)=ZTTT=Bn(B)(S)(Z)=S(Z)nλT:.if T=B then n
ΠT:TTv(T)(x)=xTT=Nv(N)(x)=x+1