Un tipo es una propiedad de los cálculos. Es lo que escribes en el lado derecho de un colon.
Déjame elaborar sobre eso. Tenga en cuenta que la terminología no es completamente estándar: algunos artículos o libros pueden usar palabras diferentes para ciertos conceptos.
Un término es un elemento de una sintaxis abstracta que pretende representar el cálculo. Intuitivamente, es un árbol de análisis. Formalmente, es un árbol finito donde los nodos pertenecen a algún alfabeto. Un cálculo sin tipo define una sintaxis para los términos. Por ejemplo, el cálculo lambda (sin tipo) contiene términos (escritos , N , etc.) creados a partir de tres tipos de nodos:MN
- variables, de aridad 0 (una colección numerable de las mismas), escritas , y , etc .;xy
- aplicación de una variable, de aridad 1 (una colección numerable de la misma, con una biyección a variables), escrita , etc .;λx.M
- aplicación, de arity 2, escrita .MN
Un término es una construcción sintáctica. Una semántica relaciona los términos con los cálculos. Hay muchos tipos de semántica, la más común es operacional (que describe cómo los términos se pueden transformar en otros términos) o denotacional (que describe los términos mediante una transformación en otro espacio, generalmente construido a partir de la teoría de conjuntos).
Un tipo es una propiedad de los términos. Un sistema de tipos para un cálculo sin tipo describe qué términos tienen qué tipos. Matemáticamente, en el núcleo, un sistema de tipos es una relación entre términos y tipos. Más exactamente, un sistema de tipos es una familia de tales relaciones, indexadas por contextos ; típicamente, un contexto proporciona al menos tipos para variables (es decir, un contexto es una función parcial de variables a tipos), de modo que un término solo puede tener un tipo en contextos que proporcionan un tipo para todas sus variables libres. El tipo de objeto matemático de un tipo depende del sistema de tipos.
Algunos sistemas de tipos se describen con tipos como conjuntos, utilizando nociones de teoría de conjuntos como intersección, unión y comprensión. Esto tiene la ventaja de descansar sobre bases matemáticas familiares. Una limitación de este enfoque es que no permite razonar sobre tipos equivalentes.
Muchos sistemas de tipos describen los tipos mismos como términos en un cálculo de tipos. Dependiendo del tipo de sistema, estos pueden ser los mismos términos o términos diferentes. Usaré el término base de la frase para referirme a un término del cálculo que describe el cálculo. Por ejemplo, el cálculo lambda de tipo simple usa el siguiente cálculo de tipos (escrito , etc.):τ
- tipos base, de aridad 0 (una colección finita o numerable de los mismos), escritos , B , etc .;AB
- función, de aridad 2, escrita .τ0→τ1
La relación entre términos y tipos que define el cálculo lambda simplemente tipado generalmente se define mediante reglas de tipeo . Las reglas de escritura no son la única forma de definir un sistema de tipos, pero son comunes. Funcionan bien para sistemas de tipo composicional, es decir, sistemas de tipo donde el tipo (s) de un término se construye a partir de los tipos de subterms. Las reglas de escritura definen inductivamente un sistema de escritura: cada regla de escritura es un axioma que establece que para cualquier instanciación de las fórmulas por encima de la regla horizontal, la fórmula debajo de la regla también es verdadera. Consulte ¿Cómo leer las reglas de escritura? para más detalles. ¿Existe un cálculo lambda tipificado completo de Turing? También puede ser de interés.
Para el cálculo lambda simplemente tipado, el juicio de tipeo significa que M tiene el tipo τ en el contexto Γ . He omitido la definición formal de contextos.
x : τ ∈ ΓΓ⊢M:τMτΓ
x:τ∈ΓΓ⊢x:τ(Γ)Γ,x:τ0⊢M:τ1Γ⊢λx.M:τ0→τ1(→I)Γ⊢M:τ0→τ1Γ⊢N:τ0Γ⊢MN:τ1(→E)
For example, if A and B are based types, then λx.λy.xy has the type (A→B)→A→B in any context (from bottom to top, apply (→I) twice, then (→E), and finally (Γ) on each branch).
It is possible to interpret the types of the simply typed lambda calculus as sets. This amounts to giving a denotational semantics for the types. A good denotational semantics for the base terms would assign to each base term a member of the denotation of all of its types.
Intuitionistic type theory (also known as Martin-Löf type theory) is more complex that simply typed lambda calculus, as it has many more elements in the calculus of types (and also adds a few constants to the base terms). But the core principles are the same. An important feature of Martin-Löf type theory is that types can contain base terms (they are dependent types): the universe of base terms and the universe of types are the same, though they can be distinguished by simple syntactic rules (usually known as sorting, i.e. assigning sorts to terms, in rewriting theory).
There are type systems that go further and completely mix types and base terms, so that there is no distinction between the two. Such type systems are said to be higher-order. In such calculi, types have types — a type can appear on the left-hand side of the :. The calculus of construction is the paradigm of higher-order dependent types. The lambda cube (also known as Barendregt cube) classifies type systems in terms of whether they allow terms to depend on types (polymorphism — some base terms contain types as subterms), types to depend on terms (dependent types), or types to depend on types (type operators — the calculus of types has a notion of computation).
Most type systems have been given set-theoretical semantics, to tie them with the usual foundations of mathematics.
How are programming languages and foundations of mathematics related? and
What is the difference between the semantic and syntactic views of function types? may be of interest here. There has also been work on using type theory as a foundation of mathematics — set theory is the historic foundation, but it is not the only possible choice. Homotopy type theory is an important milestone in this direction: it describes the semantics of intentional intuitionistic type theory in terms of homotopy theory and constructs set theory in this framework.
I recommend Benjamin Pierce's books Types and Programming Languages and Advances Topics in Types and Programming Languages. They are accessible to any undergraduate with no prerequisite other than basic familiarity with formal mathematical reasoning. TAPL describes many type systems; dependent types are the subject of chapter 2 of ATTAPL.