¿Por qué se necesitan tipos recursivos como primitivas para pruebas en sistemas de tipos dependientes?


10

Soy relativamente nuevo en teoría de tipos y programación dependiente. He estado estudiando el cálculo de construcciones (CoC) y otros sistemas de tipo puro. Estoy particularmente interesado en usarlo como una representación intermedia de preservación de pruebas para un sistema compilador.

Entiendo que los tipos (co) recursivos son representables , computacionalmente , usando como el único constructor de tipos. Sin embargo, he leído que no se pueden usar para crear pruebas por inducción (¡perdóname, no puedo encontrar dónde ahora!), Por ejemplo, que no podría probar que en CoC simple (aunque se puede escribir como ).0 1 Nat Π ( N : ) . Π ( S : NN ) . Π ( Z : N ) . norteΠ01NatΠ(N:).Π(S:NN).Π(Z:N).N

Supongo que es por eso que construyeron el cálculo de las construcciones inductivas (CIC). ¿Es esto correcto? ¿Pero por qué? No pude encontrar ningún material que explicara por qué tales pruebas no se pueden representar sin usar tipos (co) inductivos como primitivos. Si esto no es cierto, ¿por qué agregarlos como primitivos en CIC?

Respuestas:


7

No soy un experto, pero compartiré lo que entendí hasta ahora con un ejemplo.

Consideremos el tipo booleano en CoC, usando su codificación estándar: Podríamos esperar poder probar Π b : B b = t

B=Πτ:τττtt=λτ:,x:τ,y:τ. xff=λτ:,x:τ,y:τ. y
De hecho, esto se deduce rápidamente del principio de eliminación / inducción dependiente que tenemos, por ejemplo, en 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)

Sin embargo, no podemos esperar que (*) se mantenga en todos los modelos de CoC. Intuitivamente, un valor en debería ser aproximadamente una familia de funciones { f τ } τ que asigna a cada tipo τ un valor en la interpretación de τ τ τ . Pero esto no obliga a f τ a ser uno entre los valores de t t , f f . Podríamos tener, por ejemplo, (informalmente) f N ( n ) ( m ) = n + mB{fτ}τττττfτtt,ff

fN(n)(m)=n+m

tt,ff()B

()()Bind


(λ(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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.