¿Por qué dos puntos denotan que un valor pertenece a un tipo?

19

Pierce (2002) introduce la relación de mecanografía en la página 92 ​​escribiendo:

La relación de escritura para expresiones aritméticas, escrita "t: T", se define mediante un conjunto de reglas de inferencia que asignan tipos a términos

y la nota al pie de página dice que el símbolo se usa a menudo en lugar de:. Mi pregunta es simplemente por qué los teóricos de tipos prefieren usar: over ? Si un tipo es un conjunto de valores, entonces tiene mucho sentido escribir , no se necesita una nueva notación.TtT

¿Es esto similar a cómo algunos escritores de cs prefieren incluso si piensan que es abuso de notación y deberían escribirse ?3n2=O(n2)3n2O(n2)

Björn Lindqvist
fuente
77
El predicado de pertenencia puede ser verdadero o falso, mientras que una declaración de tipeo generalmente se interpreta como una declaración de hechos que se declara verdadera o su verdad se puede derivar por medios puramente sintácticos. Contraste esto con ser un número primo, para el cual no es suficiente ningún método sintáctico de membresía. XX X:X
Musa Al-hassy
44
@ MusaAl-hassy: eso es una tergiversación de lo que está sucediendo. No se declara que sea cierto, ya que eso significaría que puedo "declarar" que " false: int", por ejemplo. Tampoco es el caso que el juicio deba derivarse necesariamente por "medios puramente sintácticos", por ejemplo, en el caso de la teoría interna del tipo de una categoría con familias.
Andrej Bauer
3
Pregunta relacionada en cs.se: ¿Cuál es exactamente la diferencia semántica entre conjunto y tipo?
Lagarto discreto
2
Para agregar al comentario de @ MusaAl-hassy, ​​en la teoría del tipo computacional de Bob Constable, Stuart Allen, Bob Harper, et al., se usa de forma rutinaria para escribir juicios porque es más parecido a un predicado de membresía (vea esta charla, diapositiva 25, para un ejemplo).
xrq
3
¿Seguramente también es un abuso de notación y realmente debería escribirse λ n .3 n 2O ( λ n . N 2 ) ? (Los matemáticos podrían preferir n 3 n 2O ( n n 2 ) .)3n2O(n2)λn.3n2O(λn.n2)n3n2O(nn2)
Oscar Cunningham

Respuestas:

12

Porque lo que está a la derecha del colon no es necesariamente un conjunto y lo que está a la izquierda del colon no es necesariamente un miembro de ese conjunto.

La teoría de tipos comenzó a principios del siglo XX como una aproximación a los fundamentos de las matemáticas. Bertrand Russel descubrió una paradoja en la ingenua teoría de conjuntos, y trabajó en la teoría de tipos como una forma de limitar el poder expresivo de la teoría de conjuntos para evitar esta (y cualquier otra) paradoja. Con los años, Russel y otros han definido muchas teorías de tipos. En algunas teorías de tipos, los tipos son conjuntos con ciertas propiedades, pero en otros, son un tipo diferente de bestia.

En particular, muchas teorías de tipos tienen una formulación sintáctica . Hay reglas que hacen que una cosa tenga un tipo. Cuando las reglas de mecanografía se usan como base para una teoría, es importante distinguir lo que dicen las reglas de mecanografía de lo que se podría inferir aplicando conocimiento externo adicional. Esto es especialmente importante si las reglas de mecanografía son una base para una teoría de prueba: los teoremas basados ​​en la teoría de conjuntos con lógica clásica y el axioma de elección pueden o no mantenerse en una lógica constructiva, por ejemplo. Uno de los trabajos pioneros en este campo es la Iglesia 's Una formulación de la teoría simple de Tipos (1940)

Quizás la forma en que la distinción entre tipos y conjuntos es más evidente es que la regla más básica para los conjuntos, a saber, que dos conjuntos son iguales si tienen los mismos elementos, generalmente no se aplica a los tipos. Vea la respuesta de Andrej Bauer aquí y su respuesta en una pregunta relacionada para algunos ejemplos. Ese segundo hilo tiene otras respuestas que vale la pena leer.

En un cálculo con tipo, decir que los tipos son conjuntos es, de hecho, dar una semántica a los tipos. Darle a un cálculo una semántica de tipo teórico no es trivial. Por ejemplo, suponga que está definiendo un lenguaje con funciones. ¿Qué conjunto es un tipo de función? Las funciones totales están determinadas por su gráfica, como se nos enseña en la teoría de conjuntos 101. Pero ¿qué pasa con las funciones parciales? ¿Desea dar a todas las funciones no terminantes la misma semántica? No puede interpretar los tipos como conjuntos para un cálculo que permite funciones recursivas hasta que haya respondido esa pregunta. Darle a los lenguajes de programación o cálculos una semántica denotacional fue un problema difícil a principios de los años setenta. El artículo fundamental aquí es Hacia una semántica matemática para lenguajes de computadora (1971) porDana Scott y Christopher Strachey . El wikibook de Haskell tiene una buena presentación del tema.

Como escribí anteriormente, una segunda parte de la respuesta es que, incluso si ha logrado darles a los tipos una semántica de conjunto teórico, lo que está a la izquierda del colon no siempre es un elemento del conjunto. Los valores tienen tipos, pero también lo hacen otras cosas, como expresiones y variables . Por ejemplo, una expresión en un lenguaje de programación escrito tiene un tipo incluso si no termina. Es posible que esté dispuesto a confundir integery Z , pero (x := 0; while true; do x := x + 1; x)no es un elemento de Z .

No sé cuándo surgió la notación de colon para los tipos. Ahora es estándar en semántica y común en lenguajes de programación, pero ni Russel ni Church lo usaron. Algol no lo usó, pero el lenguaje fuertemente inspirado en Algol que Pascal hizo en 1971. Sin embargo, sospecho que no fue el primero, porque muchos documentos teóricos de principios de la década de 1970 usan la notación, pero no sé de un uso anterior Curiosamente, esto fue poco después de que los conceptos de tipos de programación y de lógica se unificaron, como lo demuestra Simon Martini en Varios tipos de tipos en lenguajes de programación , lo que se llamó un "tipo" en lenguajes de programación hasta la década de 1960 provino de la lengua vernácula uso de la palabra y no de la teoría de tipos.

Gilles 'SO- deja de ser malvado'
fuente
37

La razón principal para preferir la notación de dos puntos t:T a la relación de membresía tT es que la relación de membresía puede ser engañosa porque los tipos no son (solo) colecciones .

[ Complementario: Debo señalar que históricamente la teoría de tipos se escribió usando . La concepción del tipo de Martin-Löf estaba destinada a capturar conjuntos de manera constructiva, y Russell y Whitehead ya usaban ϵ para la membresía de la clase. Sería interesante rastrear el momento en que : hizo más frecuente que .]

Un tipo describe un cierto tipo de construcción, es decir, cómo hacer objetos con una determinada estructura, cómo usarlos y qué ecuaciones tienen sobre ellos.

Por ejemplo, un tipo de producto A×B tiene reglas de introducción que explican cómo hacer pares ordenados, y reglas de eliminación explicando que podemos proyectar el primer y el segundo componente de cualquier elemento de A×B . La definición de A×B no no comienza con las palabras "la colección de todos ..." y tampoco dice en ninguna parte nada por el estilo "todos los elementos de A×B son pares" (pero que sigue de la definición que cada elemento de A×B es proposicionalmenteigual a un par). En contraste, la definición teórica de conjuntos de X×Y se establece como "el conjunto de todos los pares ordenados ...".

La notación t:T significa el hecho de que t tiene la estructura descrita por T .

Un tipo T no se debe confundirse con su extensión , que es la colección de todos los objetos de tipo T . Un tipo no está determinado por su extensión, al igual que un grupo no está determinado por su conjunto de portadores. Además, puede suceder que dos tipos tengan la misma extensión, pero son diferentes, por ejemplo:

  1. El tipo de todos los primos pares mayores que dos: Σ(n:N).isprime(n)×iseven(n)×(n>2) .
  2. El tipo de todos los números primos impares menores que dos: Σ(n:N).isprime(n)×isodd(n)×(n<2) .

La extensión de ambos está vacía, pero no son del mismo tipo.

Existen otras diferencias entre el tipo teórico : y el conjunto teórico . Un objeto a en la teoría de conjuntos existe independientemente de a qué conjuntos pertenece, y puede pertenecer a varios conjuntos. En contraste, la mayoría de las teorías de tipo satisfacen singularidad de escribir: si t:T y t:U entonces TU . O para decirlo de otra manera, una construcción teórica de tipo t tiene precisamente un tipo T , y de hecho no hay forma de tener solo un objeto t sin su tipo (determinado de forma única).

Otra diferencia es que en la teoría de conjuntos podemos negar el hecho de que aA por la escritura ¬(aA) o aA . Esto no es posible en la teoría de tipos, porque t:T es un juicio que puede derivarse usando las reglas de la teoría de tipos, pero no hay nada en la teoría de tipos que nos permita afirmar que algo no se ha derivado. Cuando un niño hace algo con bloques LEGO, corren orgullosamente hacia sus padres para mostrarles la construcción, pero nunca corren hacia sus padres para mostrarles lo que no hicieron.

Andrej Bauer
fuente
1
Andrej, gran respuesta. ¿Conoces el origen histórico de la notación de colon?
Andreas Rossberg
Por desgracia, no lo hago. La teoría de tipo de Church usaba subíndices, es decir, para una variable de tipo α . Russell y Whitehead usaron ϵ para la relación de pertenencia a una clase. Algol 68 pone tipos delante de nombres de variables. La teoría del tipo Martin-Löf de 1972 usa , y también la versión de 1984 , pero la [versión de 1994] usa dos puntos. xααϵ
Andrej Bauer
1
¿Entonces su argumento es que un tipo es como un grupo? Eso tiene sentido, pero la notación es común en álgebra abstracta. gG
Björn Lindqvist
2
@ BjörnLindqvist: No creo que esta respuesta sea la historia completa. Incluso en matemáticas estándar que utilizamos " " para denotar que f es una función de S a T . ¿Por qué no usamos " f ( S T ) " o algo así? Bueno, simplemente no lo hicimos. Por supuesto, hay una buena razón para evitar el uso de " " en una presentación de ciertos tipos de teorías de tipos, simplemente porque no queremos que las personas a quienes se les enseñe ZFC piensen que son conjuntos de ZFC, lo que obviamente no es caso. Pero eso no significa que el colon aún no lo haya hecho.f:STfSTf(ST)ha sido ampliamente utilizado mucho antes de que la teoría de tipos se hiciera popular.
user21820
1
@ user21820 "¿Por qué no usamos ?" Solo especulando: porque los matemáticos nunca pensaron en S T como un conjunto. Para la historia de esta notación ver aquí . Dudo que el colon de f : S T haya sido la inspiración para los teóricos de tipos. Es más probable que los teóricos de tipos de colon tengan que ver con el hecho de que no es un carácter ASCII. f(ST)STf:ST
Michael
5

Björn

Probablemente haya una referencia anterior, pero por un lado, los dos puntos se usaron en el lenguaje de programación Pascal:

First Google hit for Pascal

Bjørn Kjos-Hanssen
fuente
2
¿No había ningún lenguaje de programación anterior que usara :?
Andrej Bauer
@AndrejBauer, de hecho, escribí "Probablemente haya una referencia anterior pero ..." para evitar ese hecho probable.
Bjørn Kjos-Hanssen
@AndrejBauer Algol no lo hizo. ¿Fue :utilizado en documentos teóricos antes de los años setenta?
Gilles 'SO- deja de ser malvado'
1
Fortran tiene REAL :: xpero no sé si esto sucedió antes que Pascal.
Michael
1
@Michael Fortran llegó antes que Pascal (ca. 1955 vs. ca. 1970), pero creo que esta sintaxis específica se introdujo solo en Fortran 90, mucho más tarde que Pascal. Ver, por ejemplo, aquí fortranwiki.org/fortran/show/Modernizing+Old+Fortran
Federico Poloni