In mathematics and theoretical computer science, a type theory is the formal presentation of a specific type system. Type theory is the academic study of type systems.
Some type theories serve as alternatives to set theory as a foundation of mathematics. Two influential type theories that have been proposed as foundations are:
Most computerized proof-writing systems use a type theory for their foundation. A common one is Thierry Coquand's Calculus of Inductive Constructions.
See main article: History of type theory. Type theory was created to avoid a paradox in a mathematical equation based on naive set theory and formal logic. Russell's paradox (first described in Gottlob Frege's The Foundations of Arithmetic) is that, without proper axioms, it is possible to define the set of all sets that are not members of themselves; this set both contains itself and does not contain itself. Between 1902 and 1908, Bertrand Russell proposed various solutions to this problem.
By 1908, Russell arrived at a ramified theory of types together with an axiom of reducibility, both of which appeared in Whitehead and Russell's Principia Mathematica published in 1910, 1912, and 1913. This system avoided contradictions suggested in Russell's paradox by creating a hierarchy of types and then assigning each concrete mathematical entity to a specific type. Entities of a given type were built exclusively of subtypes of that type, thus preventing an entity from being defined using itself. This resolution of Russell's paradox is similar to approaches taken in other formal systems, such as Zermelo-Fraenkel set theory.[1]
Type theory is particularly popular in conjunction with Alonzo Church's lambda calculus. One notable early example of type theory is Church's simply typed lambda calculus. Church's theory of types[2] helped the formal system avoid the Kleene–Rosser paradox that afflicted the original untyped lambda calculus. Church demonstrated that it could serve as a foundation of mathematics and it was referred to as a higher-order logic.
In the modern literature, "type theory" refers to a typed system based around lambda calculus. One influential system is Per Martin-Löf's intuitionistic type theory, which was proposed as a foundation for constructive mathematics. Another is Thierry Coquand's calculus of constructions, which is used as the foundation by Coq, Lean, and other computer proof assistants. Type theory is an active area of research, one direction being the development of homotopy type theory.
The first computer proof assistant, called Automath, used type theory to encode mathematics on a computer. Martin-Löf specifically developed intuitionistic type theory to encode all mathematics to serve as a new foundation for mathematics. There is ongoing research into mathematical foundations using homotopy type theory.
Mathematicians working in category theory already had difficulty working with the widely accepted foundation of Zermelo–Fraenkel set theory. This led to proposals such as Lawvere's Elementary Theory of the Category of Sets (ETCS). Homotopy type theory continues in this line using type theory. Researchers are exploring connections between dependent types (especially the identity type) and algebraic topology (specifically homotopy).
See main article: Proof assistant. Much of the current research into type theory is driven by proof checkers, interactive proof assistants, and automated theorem provers. Most of these systems use a type theory as the mathematical foundation for encoding proofs, which is not surprising, given the close connection between type theory and programming languages:
Many type theories are supported by LEGO and Isabelle. Isabelle also supports foundations besides type theories, such as ZFC. Mizar is an example of a proof system that only supports set theory.
Any static program analysis, such as the type checking algorithms in the semantic analysis phase of compiler, has a connection to type theory. A prime example is Agda, a programming language which uses UTT (Luo's Unified Theory of dependent Types) for its type system.
The programming language ML was developed for manipulating type theories (see LCF) and its own type system was heavily influenced by them.
Type theory is also widely used in formal theories of semantics of natural languages,[3] [4] especially Montague grammar[5] and its descendants. In particular, categorial grammars and pregroup grammars extensively use type constructors to define the types (noun, verb, etc.) of words.
The most common construction takes the basic types
e
t
a
b
\langlea,b\rangle
A complex type
\langlea,b\rangle
a
b
\langlee,t\rangle
\langle\langlee,t\rangle,t\rangle
Type theory with records is a formal semantics representation framework, using records to express type theory types. It has been used in natural language processing, principally computational semantics and dialogue systems.[7] [8]
Gregory Bateson introduced a theory of logical types into the social sciences; his notions of double bind and logical levels are based on Russell's theory of types.
\varphi
\varphi
term:type
A term in logic is recursively defined as a constant symbol, variable, or a function application, where a term is applied to another term. Constant symbols could include the natural number
0
true
S
if
0
(S0)
(S(S0))
(iftrue0(S0))
Most type theories have 4 judgments:
T
t
T
T1
T2
t1
t2
T
Judgments may follow from assumptions. For example, one might say "assuming
x
bool
y
nat
(ifxyy)
nat
\vdash
x:bool,y:nat\vdash(rm{if}xyy):nat
If there are no assumptions, there will be nothing to the left of the turnstile.
\vdashS:nat\tonat
The list of assumptions on the left is the context of the judgment. Capital greek letters, such as \Gamma
\Delta
Formal notation for judgments | Description | |
---|---|---|
\Gamma\vdashT | T \Gamma | |
\Gamma\vdasht:T | t T \Gamma | |
\Gamma\vdashT1=T2 | Type T1 T2 \Gamma | |
\Gamma\vdasht1=t2:T | Terms t1 t2 T \Gamma |
Some textbooks use a triple equal sign
\equiv
\Gamma
\Delta
t
T1
T2
To generate a particular judgment in type theory, there must be a rule to generate it, as well as rules to generate all of that rule's required inputs, and so on. The applied rules form a proof tree, where the top-most rules need no assumptions. One example of a rule that does not require any inputs is one that states the type of a constant term. For example, to assert that there is a term
0
nat
See main article: Type inhabitation. Generally, the desired conclusion of a proof in type theory is one of type inhabitation.[12] The decision problem of type inhabitation (abbreviated by
\existst.\Gamma\vdasht:\tau?
Given a context
\Gamma
\tau
t
\tau
\Gamma
A type theory usually has several rules, including ones to:
Also, for each "by rule" type, there are 4 different kinds of rules
For examples of rules, an interested reader may follow Appendix A.2 of the Homotopy Type Theory book, or read Martin-Löf's Intuitionistic Type Theory.[13]
The logical framework of a type theory bears a resemblance to intuitionistic, or constructive, logic. Formally, type theory is often cited as an implementation of the Brouwer–Heyting–Kolmogorov interpretation of intuitionistic logic. Additionally, connections can be made to category theory and computer programs.
When used as a foundation, certain types are interpreted to be propositions (statements that can be proven), and terms inhabiting the type are interpreted to be proofs of that proposition. When some types are interpreted as propositions, there is a set of common types that can be used to connect them to make a Boolean algebra out of types. However, the logic is not classical logic but intuitionistic logic, which is to say it does not have the law of excluded middle nor double negation.
Under this intuitionistic interpretation, there are common types that act as the logical operators:
Logic Name | Logic Notation | Type Notation | Type Name | |
---|---|---|---|---|
True | \top | \top | Unit Type | |
False | \bot | \bot | Empty Type | |
Implication | A\toB | A\toB | Function | |
Not | \negA | A\to\bot | Function to Empty Type | |
And | A\landB | A x B | Product Type | |
Or | A\lorB | A+B | Sum Type | |
For All | \foralla\inA,P(a) | \Pia:A.P(a) | Dependent Product | |
Exists | \existsa\inA,P(a) | \Sigmaa:A.P(a) | Dependent Sum |
Because the law of excluded middle does not hold, there is no term of type
\Pia.A+(A\to\bot)
\PiA.((A\to\bot)\to\bot)\toA
It is possible to include the law of excluded middle and double negation into a type theory, by rule or assumption. However, terms may not compute down to canonical terms and it will interfere with the ability to determine if two terms are judgementally equal to each other.
Per Martin-Löf proposed his intuitionistic type theory as a foundation for constructive mathematics. Constructive mathematics requires when proving "there exists an
x
P(x)
x
P
An example of a non-constructive proof is proof by contradiction. The first step is assuming that
x
x
x
x
Most of the type theories proposed as foundations are constructive, and this includes most of the ones used by proof assistants. It is possible to add non-constructive features to a type theory, by rule or assumption. These include operators on continuations such as call with current continuation. However, these operators tend to break desirable properties such as canonicity and parametricity.
The Curry–Howard correspondence is the observed similarity between logics and programming languages. The implication in logic, "A
\to
The opposition of terms and types can also be viewed as one of implementation and specification. By program synthesis, (the computational counterpart of) type inhabitation can be used to construct (all or parts of) programs from the specification given in the form of type information.[15]
See main article: Type inference.
Many programs that work with type theory (e.g., interactive theorem provers) also do type inferencing. It lets them select the rules that the user intends, with fewer actions by the user.
Main article: Category theory
Although the initial motivation for category theory was far removed from foundationalism, the two fields turned out to have deep connections. As John Lane Bell writes: "In fact categories can themselves be viewed as type theories of a certain kind; this fact alone indicates that type theory is much more closely related to category theory than it is to set theory." In brief, a category can be viewed as a type theory by regarding its objects as types (or sorts), i.e. "Roughly speaking, a category may be thought of as a type theory shorn of its syntax." A number of significant results follow in this way:[16]
The interplay, known as categorical logic, has been a subject of active research since then; see the monograph of Jacobs (1999) for instance.
Homotopy type theory attempts to combine type theory and category theory. It focuses on equalities, especially equalities between types. Homotopy type theory differs from intuitionistic type theory mostly by its handling of the equality type. In 2016 cubical type theory was proposed, which is a homotopy type theory with normalization.[17]
The most basic types are called atoms, and a term whose type is an atom is known as an atomic term. Common atomic terms included in type theories are natural numbers, often notated with the type
nat
true
false
bool
42:nat
true:bool
x:nat
y:bool
In addition to atomic terms, most modern type theories also allow for functions. Function types introduce an arrow symbol, and are defined inductively: If
\sigma
\tau
\sigma\to\tau
\sigma
\tau
Some terms may be declared directly as having a simple type, such as the following term,
add
add:nat\to(nat\tonat)
Strictly speaking, a simple type only allows for one input and one output, so a more faithful reading of the above type is that
add
nat\tonat
add
(nat\tonat)\tonat
add
New function terms may be constructed using lambda expressions, and are called lambda terms. These terms are also defined inductively: a lambda term has the form
(λv.t)
v
t
\sigma\to\tau
\sigma
v
\tau
t
(λx.addxx):nat\tonat
The variable is
x
nat
addxx
nat
nat\tonat
A lambda term is often referred to as an anonymous function because it lacks a name. The concept of anonymous functions appears in many programming languages.
The power of type theories is in specifying how terms may be combined by way of inference rules. Type theories which have functions also have the inference rule of function application: if
t
\sigma\to\tau
s
\sigma
t
s
(ts)
\tau
0:sf{nat}
1:sf{nat}
2:sf{nat}
(add1):sf{nat}\tosf{nat}
((add2)0):sf{nat}
((add1)((add2)0)):sf{nat}
Parentheses indicate the order of operations; however, by convention, function application is left associative, so parentheses can be dropped where appropriate. In the case of the three examples above, all parentheses could be omitted from the first two, and the third may simplified to
add1(add20):sf{nat}
Type theories that allow for lambda terms also include inference rules known as
\beta
η
(λv.t)s → t[v\colon=s]
\beta
(λv.tv) → t
v
t
η
The first reduction describes how to evaluate a lambda term: if a lambda expression
(λv.t)
s
v
t
s
(λv.tv)
t
v
t
t
For example, the following term may be
\beta
(λx.addxx)2 → add22
In type theories that also establish notions of equality for types and terms, there are corresponding inference rules of
\beta
η
The empty type has no terms. The type is usually written
\bot
0
a
a\to\bot
a
The unit type has exactly 1 canonical term. The type is written
\top
1
\ast
a
\top\toa
a
The Boolean type has exactly 2 canonical terms. The type is usually written
sf{bool}
B
2
true
false
Natural numbers are usually implemented in the style of Peano Arithmetic. There is a canonical term
0:nat
S:nat\tonat
Some type theories allow for types of complex terms, such as functions or lists, to depend on the types of its arguments. For example, a type theory could have the dependent type
lista
a
list
U\toU
U
Some theories also permit types to be dependent on terms instead of types. For example, a theory could have the type
vectorn
n
nat
There are foundational issues that can arise from dependent types if a theory is not careful about what dependencies are allowed, such as Girard's Paradox. The logician Henk Barendegt introduced the lambda cube as a framework for studying various restrictions and levels of dependent typing.[18]
(s,t)
x
(s,t)
\sigma x \tau
\sigma
s
\tau
t
first:(\Pi\sigma\tau.\sigma x \tau\to\sigma)
second:(\Pi\sigma\tau.\sigma x \tau\to\tau)
first(s,t)
s
second(s,t)
t
Besides ordered pairs, this type is used for the concepts of logical conjunction and intersection.
The sum type depends on two types, and it is commonly written with the symbol
+
\sqcup
\sigma\sqcup\tau
left:\sigma\to(\sigma\sqcup\tau)
right:\tau\to(\sigma\sqcup\tau)
match:(\Pi\rho.(\sigma\to\rho)\to(\tau\to\rho)\to(\sigma\sqcup\tau)\to\rho)
matchfg(leftx)
fx
matchfg(righty)
gy
The sum type is used for the concepts of logical disjunction and union.
Two common type dependencies, dependent product and dependent sum types, allow for the theory to encode BHK intuitionistic logic by acting as equivalents to universal and existential quantification; this is formalized by Curry–Howard Correspondence. As they also connect to products and sums in set theory, they are often written with the symbols
\Pi
\Sigma
For example, consider a function
append
lista
a
append:(\Pia.lista\toa\tolista)
a
lista
a
lista
Sum types are seen in dependent pairs, where the second type depends on the value of the first term. This arises naturally in computer science where functions may return different types of outputs based on the input. For example, the Boolean type is usually defined with an eliminator function
if
iftruexy
x
iffalsexy
y
bool
TF\colonbool\toU\toU\toU
TFtrue\sigma\tau
\sigma
TFfalse\sigma\tau
\tau
The type of
if
(\Pi\sigma\tau.bool\to\sigma\to\tau\to(\Sigmax:sf{bool}.TFx\sigma\tau))
Following the notion of Curry-Howard Correspondence, the identity type is a type introduced to mirror propositional equivalence, as opposed to the judgmental (syntactic) equivalence that type theory already provides.
An identity type requires two terms of the same type and is written with the symbol
=
x+1
1+x
x+1=1+x
refl
t
reflt
t=t
The complexities of equality in type theory make it an active research topic; homotopy type theory is a notable area of research that mainly deals with equality in type theory.
Inductive types are a general template for creating a large variety of types. In fact, all the types described above and more can be defined using the rules of inductive types. Two methods of generating inductive types are induction-recursion and induction-induction. A method that only uses lambda terms is Scott encoding.
Some proof assistants, such as Coq and Lean, are based on the calculus for inductive constructions, which is a calculus of constructions with inductive types.
The most commonly accepted foundation for mathematics is first-order logic with the language and axioms of Zermelo–Fraenkel set theory with the axiom of choice, abbreviated ZFC. Type theories having sufficient expressibility may also act as a foundation of mathematics. There are a number of differences between these two approaches.
x
x
Proponents of type theory will also point out its connection to constructive mathematics through the BHK interpretation, its connection to logic by the Curry–Howard isomorphism, and its connections to Category theory.
Terms usually belong to a single type. However, there are set theories that define "subtyping".
Computation takes place by repeated application of rules. Many types of theories are strongly normalizing, which means that any order of applying the rules will always end in the same result. However, some are not. In a normalizing type theory, the one-directional computation rules are called "reduction rules", and applying the rules "reduces" the term. If a rule is not one-directional, it is called a "conversion rule".
Some combinations of types are equivalent to other combinations of types. When functions are considered "exponentiation", the combinations of types can be written similarly to algebraic identities.[19] Thus,
{0}+A\congA
{1} x A\congA
{1}+{1}\cong{2}
AB+C\congAB x AC
AB x \cong(AB)C
Most type theories do not have axioms. This is because a type theory is defined by its rules of inference. This is a source of confusion for people familiar with Set Theory, where a theory is defined by both the rules of inference for a logic (such as first-order logic) and axioms about sets.
Sometimes, a type theory will add a few axioms. An axiom is a judgment that is accepted without a derivation using the rules of inference. They are often added to ensure properties that cannot be added cleanly through the rules.
Axioms can cause problems if they introduce terms without a way to compute on those terms. That is, axioms can interfere with the normalizing property of the type theory.[20]
Some commonly encountered axioms are:
The Axiom of Choice does not need to be added to type theory, because in most type theories it can be derived from the rules of inference. This is because of the constructive nature of type theory, where proving that a value exists requires a method to compute the value. The Axiom of Choice is less powerful in type theory than most set theories, because type theory's functions must be computable and, being syntax-driven, the number of terms in a type must be countable. (See .)