Tipos universales y existenciales

9

Estoy tratando de entender los conceptos de tipos universales y existenciales, pero en todas partes veo intuiciones lógicas u operativas (o implementaciones) (por ejemplo, el libro TAPL de B. Pierce), que, bueno ... es bueno , pero me gustaría ver las definiciones (donde las vemos como conjuntos), y de ellas, derivaciones de algunas leyes, así como justificaciones para nuestras intuiciones.

Entonces, como no puedo encontrar esas definiciones, decidí hacerlo yo mismo y creo que pueden ser razonables:

x . T d e f : =S - t y p e T [ x : = S ]

x.T:=defStypeT[x:=S]
x.T:=defStypeT[x:=S]

Pero, en el libro TAPL mencionado anteriormente, se nos da esta definición (aunque yo lo llamaría una identidad)

x.T:=defy.(x.Ty)y()

Tengo dos problemas con esto:

  1. En el LHS de esperaría que x fuera la única variable libre de T (porque ¿cómo ver un tipo "aún no construido" con algunas variables libres colgando en él?), Pero en el RHS parece que y puede tener algún impacto en T , por lo que es mejor que sea una variable libre en T . Por lo tanto, LHS no puede ser igual a RHS porque los conjuntos de variables libres de T difieren en ambos lados, ¿verdad?()xTyTTT
  2. Incluso sin tener en cuenta la preocupación en el punto 1. - Traté de reescribir RHS usando mis definiciones y ver si puedo obtener mi definición de tipo existencial pero me quedé:
    RHS=S(x.Ty)[y:=S]S=S(RT[x:=R,y:=S]S)S

Ni siquiera se parece remotamente a mi definición. ¿Es posible simplificar la fórmula a la que llegué? Intuitivamente, debido a que hay tipos de funciones, probablemente nunca será igual a mi definición. Pero si no son iguales, ¿son al menos 'isomórficos' en algún sentido? Si no, ¿qué "salió mal"?

engorroso
fuente
1
Hay un error tipográfico en su ecuación (*): debería ser lugar de y . Yy
cody
1
Además, en su última ecuación: puede no aparecer en T ! yT
cody

Respuestas:

9

La teoría de conjuntos te está haciendo daño aquí y cuanto antes te liberes de ella, mejor será para tu comprensión de la informática.

Olvídate de las intersecciones y uniones. La gente tiene la idea de que y son como y , que es el tipo de cosas que la escuela polaca estaba haciendo hace mucho tiempo con álgebras booleanas, pero realmente no es el camino a seguir (definitivamente no en informática).

Te gustaría verlos como conjuntos. Ok, pero luego tenemos que ignorar los problemas de tamaño y pretender que hay un conjunto de todos los conjuntos. (Es posible solucionar los problemas de tamaño pasando a una categoría diferente). El tipo es realmente como el producto cartesiano X . T : = S : S e t T [ X S ] . Es decir, un elemento de X . T es una función f de conjuntos a conjuntos: para cada conjunto S da un elementox.T

X.T:=S:SetT[XS].
X.T fS de tipo T [ x S ] . Por ejemplo, un elemento deX . ( X X ) ( X X ) es una función f que toma un conjunto S y proporciona una función de tipo ( S S ) ( S S ) . Estas son algunas de esas funciones: f 0 ( S ) ( g ) (f(S)T[xS]X.(XX)(XX)fS(SS)(SS) Así que obtenemos uno para cada número natural, y es difícil pensar en otros ejemplos. (Ejercicio: google "Codificación de la iglesia de números naturales".)
f0(S)(g)(x):=xf1(S)(g)(x):=g(x)f2(S)(g)(x):=g(g(x))f3(S)(g)(x):=g(g(g(x)))

X.T:=Y.(X.(TY))Y
YTX.T
X.T:=S:SetT[XS].
X.T (S,a)SaT[XS]X.(X×XX)(S,m)Sm:S×SS

X.TY.(X.(TY))YY

A:=S:SetT[XS]
B:=R:Set(S:Set(T[XS]R))R.
λf:AB
f(S,a)(R)(h):=h(S)(a)
g:BA
g(ϕ):=ϕ(A)(λS.λa.(S,a)).
λS.λa.(S,a)Sa(S,a)fg
g(f(S,a))=f(S,a)(A)(λS.λa.(S,a))=(λS.λa.(S,a)(S)(a)=(S,a).
f(g(ϕ))(R)(h)=h(π1(g(ϕ))(π2(g(ϕ))).
g(ϕ)ϕ(A)(λS.λa.(S,a))

x.ϕ(x)
P:Prop.(x.(ϕ(x)P))P,
PPϕ
Andrej Bauer
fuente
1
Andrej, eres tan rápido como un rayo!
cody
()fg()()
3
fg
@AndrejBauer ¿El sistema subyacente es poco creíble? Y en caso de una respuesta positiva, ¿el isomorfismo es válido para los sistemas predicativos?
Giorgio Mossa
3

Y YYTT

((x.TU0)U0)((x.TU1)U1)
UiU
x.T((x.TU)U)

En palabras:

xT(x)U xT(x)U

Ux

U

SA(S)A()

(R(T[x:=R]))

RT[x:=R]T[x:=R]

cody
fuente
1
Ui
1

Sugiero no renunciar a la intuición operativa. La operativa es primaria, toda la semántica se deriva y no son más que técnicas de prueba para la semántica operativa. Las ideas clave son las siguientes.

Px Pxxλ

  • λx.x.
  • λ(x,y,z).(z,x,y)
  • λx.(x,x)
  • λx.7

Px PxxPxx

λ

Martin Berger
fuente
Un punto de vista interesante (aunque no lo entiendo completamente :)). ¿Entonces la idea es verificar si las leyes derivadas de una visión tan general se mantienen en entornos concretos de sistemas de tipos? ¿Y dónde puedo encontrar algún texto introductorio sobre esto?
engorroso
@socumbersome La mayoría de las implementaciones existentes de polimorfismo no lo hacen del todo bien. De hecho, la cuantificación existencial rara vez se implementa directamente. Me temo que no hay un texto introductorio que describa la dualidad. Lo hemos explicado aquí, pero está escrito para un público especializado.
Martin Berger