Fact-checked by Grok 2 weeks ago

Inductive type

In type theory, an inductive type is a fundamental construct introduced in Per Martin-Löf's intuitionistic type theory, where a type is defined by specifying a set of introduction rules (constructors) that generate its canonical elements and equality rules that identify when two such elements are equal. These types formalize recursively enumerable data structures in a constructive manner, ensuring that every element can be built finitely from the constructors, which supports well-founded recursion and induction principles essential for proofs and computations. Inductive types originated in Martin-Löf's efforts to provide a foundation for intuitionistic mathematics, first outlined in his 1972 notes and elaborated in his 1984 lectures on intuitionistic type theory, where they extend the simply typed lambda calculus with mechanisms for defining infinite sets like the natural numbers (via constructors 0 and succ) without relying on impredicative definitions. For the natural numbers, the formation rule declares as a set, introduction rules provide 0 ∈ ℕ and succ(n) ∈ ℕ for n ∈ ℕ, and elimination rules enable recursive functions, such as the recursor that computes properties holding for 0 and preserved by succ. Common examples include booleans (Bool with true and false), lists (List(A) with nil and cons for any type A), and trees, all of which derive their elimination and computation rules automatically from the constructors. The significance of inductive types lies in their role as a cornerstone for dependent type theories used in proof assistants like Coq and Agda, where they enable the encoding of mathematical objects and programs with strong guarantees of totality and correctness. In these systems, inductive types are restricted to strictly positive occurrences in their definitions to ensure logical consistency and termination of recursion, distinguishing them from coinductive types for infinite structures. Extensions in modern variants, such as homotopy type theory, further refine inductive types to incorporate higher-dimensional structures like paths, enhancing their applicability to univalent foundations of mathematics.

Introduction

Definition

In type theory, particularly in the framework of Martin-Löf's intuitionistic type theory, an inductive type is formally defined through a type declaration that specifies a collection of indexed constructors, each of which introduces terms belonging to the type or a dependent family over it. The syntax typically involves a formation rule declaring the type (or family) T with parameters and indices, followed by introduction rules for each constructor c_i, which map arguments from previously defined types to T. For instance, constructors are required to be strictly positive in T, meaning T appears only in covariant positions within the types of the constructor arguments, ensuring the definition is well-formed and avoids circularity. This syntactic structure generates the type via the constructors, with elimination and computation rules derived automatically to support induction and recursion. Semantically, inductive types are interpreted as the least fixed points of polynomial endofunctors or, equivalently, as initial algebras in a suitable category of types. Given a functor F defined by the constructors (e.g., F(X) = \coprod_{i \in I} \prod_{j=1}^{n_i} A_{i j} \times X^{k_i}, where the A_{i j} are argument types and exponents reflect multiplicities), the inductive type A is the carrier of the initial F-algebra (\alpha: F(A) \to A, A), meaning it is the least solution to the equation A \cong F(A) up to isomorphism, with the unique homomorphism property ensuring universal mapping from any other F-algebra. Categorically, A can be presented as the colimit of the initial chain \emptyset \to F(\emptyset) \to F^2(\emptyset) \to \cdots, where each map is induced by the functor F, and the constructors inject into this colimit, generating all elements as finite iterations from the empty type. Unlike recursive types, which allow arbitrary fixed points (including greatest fixed points for infinite structures) and may permit negative occurrences leading to paradoxes like Russell's in unstratified settings, inductive types enforce strict positivity and well-foundedness, restricting constructions to finite, terminating data and guaranteeing the existence of eliminators without non-termination. This well-foundedness arises from the initial algebra semantics, where elements are built inductively in stages, precluding infinite descending chains and ensuring consistency in constructive type theories.

Historical Development

The origins of inductive types can be traced to early 20th-century set theory, where impredicative definitions played a central role in characterizing ordinals and cardinals. Henri Poincaré, in his 1905 critique of set-theoretic foundations, employed and analyzed impredicative constructions to define infinite collections while cautioning against their potential circularity in generating paradoxes. Similarly, Bertrand Russell, in his 1908 development of type theory, initially relied on impredicative definitions for ordinals and cardinals to address paradoxes in naive set theory, before refining his approach with ramified types to restrict such definitions. In the interwar period, the development shifted toward intuitionistic logic, emphasizing constructive methods. L. E. J. Brouwer introduced choice sequences in the 1920s as a means to construct infinite objects through free choices guided by mathematical intuition, providing a foundational tool for inductive-like processes in intuitionism. Arend Heyting formalized Brouwer's intuitionistic logic in 1930 with a Hilbert-style axiomatic system, which supported the constructive definitions underlying later inductive structures. Per Martin-Löf advanced these ideas in the 1970s by incorporating inductive types into his intuitionistic type theory, designed as a foundation for constructive mathematics. His 1972 notes, "An Intuitionistic Theory of Types," presented inductive definitions as primitive type formers, allowing the systematic construction of data types like natural numbers through recursive rules. Key milestones included Jean-Yves Girard's 1972 introduction of System F, a polymorphic lambda calculus that enabled bounded quantification over types, influencing the expressiveness of inductive definitions in subsequent type theories. Inductive types gained practical adoption in proof assistants during the 1980s, notably in Coq, where Thierry Coquand and Christine Paulin-Mohring integrated them in 1988 to support inductive families and recursive proofs. Post-2010 developments integrated inductive types into (HoTT), enhancing their in univalent . The ": Univalent " formalized higher inductive types, extending traditional inductives to capture homotopy-theoretic structures like circles and spheres directly. Refinements in the have focused on computational implementations and synthetic , with ongoing work in proof assistants like Cubical Agda and support these extensions for verified .

Core Concepts

Constructors

Inductive types are constructed by specifying a collection of constructors, which serve as the primitive means of building inhabitants of the type. Each constructor is a constant with a type that may depend on parameters and previous constructors, allowing the formation of both simple and structured data. In Martin-Löf type theory, the declaration of an inductive type involves listing these constructors alongside the type's formation rule, ensuring that the type is generated as the least fixed point of the specified operations. For non-dependent constructors, the syntax typically takes the form of simple arrows without index dependencies, such as in the boolean type where \mathsf{true} : \mathsf{Bool} and \mathsf{false} : \mathsf{Bool}, providing two nullary constructors that exhaustively cover the type. In contrast, dependent constructors incorporate indices from other types, enabling indexed families; for instance, the vector type \mathsf{Vec}\ A : \mathbb{N} \to \mathsf{Set} has constructors \mathsf{nil} : \mathsf{Vec}\ A\ 0 and \mathsf{cons} : \{n : \mathbb{N}\} \to A \to \mathsf{Vec}\ A\ n \to \mathsf{Vec}\ A\ (\mathsf{suc}\ n), where the length index is preserved and incremented. This dependent structure allows constructors to refine the type based on arguments, supporting precise typing for data like length-indexed lists. A key restriction on constructors is the strict positivity condition, which mandates that the inductive type itself appears only in positive positions within the types of constructor arguments—never negatively (e.g., in the domain of a function type) or at the top level of a constructor's codomain. This condition guarantees well-foundedness by ensuring that the interpretation of the type is the initial algebra of a strictly positive endofunctor, preventing circular or non-terminating definitions and enabling structural induction. For a type like the natural numbers, with constructors \mathsf{zero} : \mathbb{N} and \mathsf{suc} : \mathbb{N} \to \mathbb{N}, positivity holds as \mathbb{N} occurs positively in the successor's argument. Multiple constructors, like those for booleans, satisfy it trivially since no arguments reference the type. The typing rules for constructors comprise formation and introduction judgments. The formation rule declares the inductive type in context: if constructors c_1 : \sigma_1, \dots, c_k : \sigma_k satisfy positivity, then \Gamma \vdash \mathsf{Ind}(c_1 : \sigma_1, \dots, c_k : \sigma_k) : \mathsf{Type}. Introduction rules then allow constructing terms: for each constructor c_i : \sigma_i, if \Gamma \vdash \vec{t} : \vec{\tau} where \vec{\tau} matches the argument types of \sigma_i, then \Gamma \vdash c_i\ \vec{t} : T, with T the formed inductive type. These rules ensure that all inhabitants are generated solely from constructor applications, providing a canonical basis for the type. Elimination principles, such as pattern matching, consume these constructor-based terms but are detailed separately.

Elimination Principles

In Martin-Löf type theory, inductive types are equipped with elimination principles that enable the construction of functions and proofs by structural recursion and induction, reflecting the type's generative constructors. The recursor, often denoted as the elimination rule for the type, takes as input a motive—a dependent type P : T \to \mathcal{U}, where T is the inductive type and \mathcal{U} is a universe—and, for each constructor c_i : \Gamma_i \to T of T, a dependent function specifying how to compute a term of type P(c_i \vec{x_i}) from terms witnessing the premises in P for the arguments \vec{x_i} : \Gamma_i. This yields a term \mathsf{rec}(P, \{ d_i \}_{i}, t) : P(t) for any t : T, where \{ d_i \}_i are the constructor-specific computations. When the motive P : T \to \mathsf{Prop} is propositional, the recursor specializes to the induction principle, allowing proofs of universal statements \forall x : T.\, P(x) by providing base cases for each constructor and a step function preserving the property across constructor applications. This principle ensures that every element of T, generated inductively from the constructors, satisfies P, formalizing structural induction in a dependently typed setting. Implementations like Coq generate such principles automatically as T_\mathsf{ind}, with types ensuring non-dependent induction over propositions unless dependent eliminators are enabled. Dependent elimination extends this framework, as seen in the J-eliminator for identity types \mathsf{Id}_A(x, y), which is itself an inductive type with a single reflexivity constructor \mathsf{refl}_x : \mathsf{Id}_A(x, x). The J-rule takes a motive C(x, y, p) : \mathsf{Id}_A(x, y) \to \mathcal{U} and a base term d(x) : C(x, x, \mathsf{refl}_x), yielding J(d, x, y, p) : C(x, y, p) for any p : \mathsf{Id}_A(x, y); in homotopy type theory, this generalizes to path induction, interpreting identities as paths in a higher-dimensional space. The key computational behavior of these eliminators is captured by the equation \mathsf{elim}(t, \{ b_i \}_i, \{ s_i \}_i) \equiv \mathsf{match}\, t\,\mathsf{with}\, |\, c_i\,\vec{x_i} \to s_i(\vec{x_i}, \{ \mathsf{elim}(x_j, \dots) \}_j), where b_i and s_i denote base and step computations for constructor c_i, enabling recursive definitions via pattern matching. Computation rules, such as beta-reduction, ensure that applying the eliminator to a constructor term directly reduces to the corresponding case computation, guaranteeing confluence and normalization for well-formed recursive functions. In systems like Lean, this is realized through implicit recursor applications in match expressions, with beta-rules reducing them judgmentally.

Basic Examples

Natural Numbers

The natural numbers, often denoted as \mathbb{N} or N, exemplify a basic inductive type in intuitionistic type theory, capturing the Peano axioms through generative constructors that build elements iteratively from a base case. In Per Martin-Löf's framework, the formation rule declares N as a set: N \in \mathbf{Set}. The introduction rules provide the constructors: zero, $0 \in N, and successor, given a \in N then \mathsf{succ}(a) \in N. These rules ensure that every natural number is either zero or the successor of another natural number, with no other elements possible. The elimination principle, known as the recursion rule, enables defining functions on N by specifying a value for the zero case and a step function for successors. Formally, for a type family C(x) over N, with d \in C(0) and a function e : \prod_{x : N} C(x) \to C(\mathsf{succ}(x)), there exists r : \prod_{x : N} C(x) such that r(0) = d and r(\mathsf{succ}(x)) = e(x, r(x)). This recursive structure allows defining arithmetic operations like addition. For instance, addition \mathsf{add}(m, n) fixes m and recurses on n: \mathsf{add}(m, 0) = m and \mathsf{add}(m, \mathsf{succ}(n)) = \mathsf{succ}(\mathsf{add}(m, n)). In proof assistants such as Coq, which implements the Calculus of Inductive Constructions based on Martin-Löf type theory, the natural numbers are encoded as follows:
Inductive nat : Set :=
  | O : nat
  | S : nat -> nat.
Here, O corresponds to zero and S to the successor constructor. Coq automatically generates a recursion combinator nat_rect mirroring the elimination rule, used via the Fixpoint directive for defining recursive functions. For addition, it is implemented as:
Fixpoint add (n m : nat) : nat :=
  match m with
  | O => n
  | S p => S (add n p)
  end.
Multiplication follows similarly via double recursion, though often defined using addition: \mathsf{mul}(m, 0) = 0 and \mathsf{mul}(m, \mathsf{succ}(n)) = \mathsf{add}(m, \mathsf{mul}(m, n)), yielding:
Fixpoint mul (n m : nat) : nat :=
  match m with
  | O => O
  | S p => add n (mul n p)
  end.
The predecessor function, which is partial (undefined on zero), is defined using pattern matching on the constructors:
Definition pred (n : nat) : nat :=
  match n with
  | O => O  (* or raise an error in full definitions *)
  | S O => O
  | S (S p) => S p
  end.
This extracts the prior natural number for successors. To prove properties of these operations, Coq generates an induction principle nat_ind for predicates P : \nat \to \Prop: assuming P(0) and \forall n : \nat, P(n) \to P(\mathsf{S}(n)), then \forall n : \nat, P(n). For example, commutativity of addition, \forall m, n : \nat, \mathsf{add}(m, n) = \mathsf{add}(n, m), is established by inducting on n, using the base case \mathsf{add}(m, 0) = m = \mathsf{add}(0, m) and the inductive step \mathsf{add}(m, \mathsf{S}(n)) = \mathsf{S}(\mathsf{add}(m, n)) = \mathsf{S}(\mathsf{add}(n, m)) = \mathsf{add}(\mathsf{S}(n), m), leveraging associativity or prior lemmas. This principle ensures proofs respect the inductive structure, excluding non-natural elements.

Lists

In type theory, the list type serves as a fundamental example of an inductive type representing finite sequences of elements from a given type A. It is defined inductively with two constructors: the empty list \mathsf{nil} : \mathsf{List}\, A, which forms the base case, and the cons operation \mathsf{cons} : A \to \mathsf{List}\, A \to \mathsf{List}\, A, which prepends an element of type A to an existing list. Common operations on lists are defined via structural recursion, leveraging the inductive structure to ensure termination. The length function \mathsf{len} : \mathsf{List}\, A \to \mathbb{N} computes the number of elements, satisfying: \begin{align*} \mathsf{len}(\mathsf{nil}) &= 0, \\ \mathsf{len}(\mathsf{cons}\, x\, xs) &= \mathsf{succ}(\mathsf{len}(xs)). \end{align*} Similarly, the append operation \mathsf{app} : \mathsf{List}\, A \to \mathsf{List}\, A \to \mathsf{List}\, A concatenates two lists, defined by: \begin{align*} \mathsf{app}(\mathsf{nil})\, ys &= ys, \\ \mathsf{app}(\mathsf{cons}\, x\, xs)\, ys &= \mathsf{cons}\, x\, (\mathsf{app}(xs)\, ys). \end{align*} These definitions rely on the elimination principle for lists, which allows recursive computation by cases on the constructors. Higher-order operations like mapping and folding further illustrate the expressive power of lists as nested inductive structures. The map function \mathsf{map} : (A \to B) \to \mathsf{List}\, A \to \mathsf{List}\, B applies a function to each element, with: \mathsf{map}\, f\, (\mathsf{cons}\, x\, xs) = \mathsf{cons}\, (f\, x)\, (\mathsf{map}\, f\, xs), and \mathsf{map}\, f\, \mathsf{nil} = \mathsf{nil}. Folding, particularly the right fold \mathsf{foldr} : (A \to C \to C) \to C \to \mathsf{List}\, A \to C, serves as a general eliminator that reduces a list to a value by accumulating results from the right, with base case \mathsf{foldr}\, f\, e\, \mathsf{nil} = e and step \mathsf{foldr}\, f\, e\, (\mathsf{cons}\, x\, xs) = f\, x\, (\mathsf{foldr}\, f\, e\, xs). Both operations descend the list structure recursively, composing with the constructors to build results. A dependent variant of lists addresses the need for length-indexed collections, forming the type \mathsf{Vec}\, A\, n for vectors of type A with exactly n : \mathbb{N} elements. This is defined inductively as:
  • \mathsf{vnil} : \mathsf{Vec}\, A\, 0, the empty vector,
  • \mathsf{vcons} : A \to \mathsf{Vec}\, A\, n \to \mathsf{Vec}\, A\, (\mathsf{succ}\, n), which extends a vector of length n by one element.
The dependency on n ensures type-level guarantees about size, enabling operations like concatenation that preserve exact lengths. All recursion on lists and vectors terminates due to structural recursion, which requires the recursive calls to target strictly smaller substructures—specifically, descending the "spine" of the list via the tail argument in \mathsf{cons} or \mathsf{vcons}, eventually reaching the \mathsf{nil} or \mathsf{vnil} base case. This aligns with the well-founded order of the inductive definition, preventing infinite descent.

Implementations

W-types and M-types

In Martin-Löf type theory, W-types provide a foundational construction for inductive types, particularly those modeling finite well-founded structures such as trees or accessible elements in a relation. Formally, for a type A and a dependent type family B : A \to \mathsf{Type}, the W-type W(A, B) is formed as a type whose elements are generated by the constructor \mathsf{sup} : \prod_{a : A} (B(a) \to W(A, B)) \to W(A, B). This constructor \mathsf{sup}(a, f) intuitively builds a tree rooted at a \in A with subtrees f(b) for each b \in B(a), ensuring well-foundedness by descending along finite spines. The interpretation of W-types captures accessible elements in well-founded relations or finite branching trees, where every path terminates. A standard example is the natural numbers type \mathbb{N}, which is isomorphic to the W-type over a type C \simeq \mathsf{1} + \mathsf{1} of two constructors (say, zero and successor), with B(\mathsf{inl}\ *) = \mathsf{0} (empty type) and B(\mathsf{inr}\ *) = \mathsf{1} (unit type). Here, zero corresponds to \mathsf{sup}(\mathsf{inl}\ *, \lambda\ () . \mathsf{undefined}) (no branches), and successor \mathsf{succ}(n) to \mathsf{sup}(\mathsf{inr}\ *, \lambda\ * . n), forming a unary spine that encodes the inductive structure of \mathbb{N}. The elimination principle for W-types, known as W-elim or induction, allows defining functions from W(A, B) to a motive C : W(A, B) \to \mathsf{Type} by providing a step function that descends along the tree spine: given h : \prod_{a : A} \prod_{f : B(a) \to W(A, B)} \prod_{g : \prod_{b : B(a)} C(f(b))} C(\mathsf{sup}(a, f)), there exists \mathsf{W\text{-}elim}(h) : \prod_{w : W(A, B)} C(w), with computation rule ensuring respect for constructors by recursing on subtrees. This principle enables proofs by structural induction on the well-founded structure. M-types serve as the dual construction to W-types, modeling coinductive types for potentially infinite structures. For types A and B : A \to \mathsf{Type}, an M-type M(A, B) is equipped with a destructor \mathsf{out} : M(A, B) \to \sum_{a : A} (B(a) \to M(A, B)), allowing observation of roots and branches coinductively. The elimination for M-types involves large eliminations or unique fixed points, dual to W-elim, focusing on coinduction principles for infinite trees. Categorically, W-types correspond to initial algebras for polynomial endofunctors on the category of types (or locally cartesian closed categories), where the functor P(X) = \sum_{a : A} X^{B(a)} admits W(A, B) as its least fixed point \mu P. In duality, M-types are terminal coalgebras for the same functors, \nu P, providing the greatest fixed point for coinductive interpretations. This algebraic perspective unifies inductive types under accessible objects in polynomial monads.

Mutually Inductive Types

Mutually inductive types allow for the simultaneous definition of multiple interdependent inductive types, where constructors of one type may reference constructors from another within the same block. This extends the single inductive type mechanism to handle cyclic dependencies between types, enabling the modeling of structures like trees accompanied by auxiliary collections of subtrees. Such definitions are essential in proof assistants for capturing complex recursive data structures without resorting to encodings that obscure the mutual relationships. The syntax for mutual inductive types in systems like Coq uses the Inductive keyword followed by multiple type declarations separated by with clauses, each specifying constructors that may invoke the others. A classic example is the mutual definition of predicates for even and odd natural numbers:
coq
Inductive even odd : nat → Prop :=
| even_0 : even 0
| even_ss : ∀ n, odd n → even (S (S n))
| odd_s : ∀ n, even n → odd (S n).
Here, the constructor even_ss relies on odd, and odd_s relies on even, establishing the interdependence. This definition classifies natural numbers based on parity, where 0 is even, the successor of an even number is odd, and the successor of an odd number is even. For elimination, each mutually inductive type receives its own dedicated recursor, but these recursors are defined simultaneously to account for the interdependencies, allowing proofs to proceed by cases on multiple types at once. The computation rules for these recursors handle the mutual references, ensuring that induction hypotheses from one type are available when eliminating another, similar to single-type elimination but extended across the block. Beyond parity predicates, mutual inductive types model structures like binary trees with auxiliary type support, such as trees and forests of trees. Consider the following definition, where a tree consists of a node with a value and a forest of subtrees, while a forest is either a single leaf or a tree prefixed to another forest:
coq
Inductive tree (A : Set) : Set :=
| node : A → forest A → tree A
with forest (A : Set) : Set :=
| leaf : A → forest A
| cons : tree A → forest A → forest A.
This captures unbounded branching in binary-like tree structures, where forests serve as auxiliary collections referencing trees, useful for representing rose trees or multiway trees. To ensure well-foundedness, mutual inductive definitions require an extended positivity condition: each type in the block must occur only in strictly positive positions within the types of its own constructors and those of all other types in the block. A position is strictly positive if the type appears in the conclusion of implications or not at all in negative contexts like negations or implications' antecedents; violations lead to ill-formed types that could introduce paradoxes. For instance, defining a type that negatively recurses through a mutual partner would be rejected. In Coq, mutual inductive types are directly supported through the Inductive ... with ... syntax, which automatically generates basic elimination principles. However, for more flexible mutual induction schemes, especially in propositions, the Scheme command can be used to derive customized induction principles tailored to the block, such as even_odd_mutind for the parity example. This facilitates proofs over mutually defined structures by providing appropriately interdependent induction hypotheses.

Induction-Recursion

Induction-recursion extends the framework of inductive types by allowing the simultaneous definition of a type A : \Type and a function f : A \to B, where the constructors of A may refer to f in a positive way. This schema, introduced in the context of Martin-Löf intuitionistic type theory, enables the constructors of A to depend on values computed by f, while ensuring the overall definition remains well-founded and productive. A canonical example is the accessibility predicate \Acc : \Nat \to \Prop, which captures well-foundedness with respect to the less-than relation \lt on natural numbers. It is defined inductively alongside an implicit recursive dependency in its constructor:
inductive Acc (n : Nat) : Prop
| acc : (∀ k, k < n → Acc k) → Acc n
Here, the single constructor \acc takes a proof that all smaller naturals are accessible, recursively invoking \Acc itself; this mutual structure ensures \Acc n holds if and only if there are no infinite descending chains below n. The formation rule for an induction-recursive definition requires that the type B and the computation of f depend positively on A, meaning occurrences of A in the types of constructors and in f's defining equations must be strictly positive to guarantee termination and avoid circularities. The elimination principle combines standard induction over A with recursion over f: for a motive C : A \to \Type, one provides cases for the constructors of A (which may use f) and compatibility conditions for how f interacts with those cases, yielding an eliminator that respects both structures. This approach benefits type theory by facilitating the definition of orderings, accessibility judgments, and well-founded relations directly within the type system, enabling concise encodings of termination proofs and recursive predicates without auxiliary definitions. For instance, it underpins well-founded recursion schemes, where functions can be defined by induction on \Acc, ensuring computability for non-structural recursions. In Agda, induction-recursion is supported through mutual inductive definitions, where a datatype and a recursive function (or type family) are declared together in a mutual block; for more complex cases, record types can encapsulate the structure, often requiring postulates for universe levels to maintain consistency.

Induction-Induction

Inductive-inductive types enable the simultaneous definition of a type A : Type and a dependent family B : A \to Type, where constructors for A can depend on elements of B, and constructors for B can depend on elements of A. This mechanism generalizes mutual inductive types, which define multiple non-dependent types together, and indexed inductive types, where constructors for a family depend only on indices from a previously defined type. The interdependence allows for more expressive constructions in dependent type theory, such as formalizing structures where properties or relations are built concurrently with the base type. The syntax for inductive-inductive definitions declares the sorts A and B alongside their constructors, which may reference each other. For example, given a base type X : Type, one might define constructors such as \eta : X \to A, \mathrm{ext} : (a : A) \to B \, a \to A, and \mathrm{inj} : (a : A) \to B \, a \to B \, a, where \mathrm{ext} builds elements of A using prior elements of B, and \mathrm{inj} builds elements of B using elements of A. A concrete application arises in defining setoids, where A is the carrier type and B : A \to A \to Type is the equivalence relation; constructors can introduce elements of A while simultaneously providing proofs in B that establish reflexivity, symmetry, and transitivity as part of the inductive structure, ensuring the relation is built integrally with the type. Elimination principles for inductive-inductive types provide dependent recursors that handle both sorts simultaneously. These eliminators take motives P_A : A \to Type and P_B : (a : A) \to B \, a \to Type, along with methods for each constructor, such as P_\eta : (x : X) \to P_A \, (\eta \, x) and computation rules ensuring the motives respect the mutual dependencies. The rules unfold the structure of both A and B in a single induction, allowing proofs of properties that quantify over elements of A and their associated B-structures. Inductive-inductive types are consistent in cubical type theory, where they can be encoded as limits of "goodness algebras"—a categorical construction that interprets the mutual dependencies without requiring uniqueness of identity proofs, thus aligning with the univalence axiom in homotopy type theory. In contrast, extensional type theories pose implementation challenges, as prior constructions often rely on extensional equality principles like the uniqueness of identity proofs, which can introduce inconsistencies when embedded in intensional settings such as proof assistants like Agda. The nLab entry on inductive-inductive types references ongoing research into higher inductive-inductive types, which extend the framework to include path constructors for modeling higher-dimensional equalities.

Higher Inductive Types

Higher inductive types (HITs) extend ordinary inductive types by permitting constructors that not only generate points of the type but also paths between those points, or even higher-dimensional paths, thereby incorporating nontrivial homotopy structure directly into the type definition. This generalization arises in the context of homotopy type theory (HoTT), where types are interpreted as topological spaces and equalities as paths. For instance, the circle type S^1, a fundamental HIT, is defined by a point constructor \mathsf{base} : S^1 and a path constructor \mathsf{loop} : \mathsf{base} = \mathsf{base}, capturing the homotopy type of a loop space whose fundamental group is the integers. The elimination principles for HITs, often called higher eliminators, generalize the standard recursion and induction rules to account for the path constructors. For the circle, the recursor \mathsf{circle\_rec} : \forall (B : \mathsf{Type}) (b : B) (p : b = b) \to S^1 \to B satisfies \mathsf{circle\_rec}\, B\, b\, p\, \mathsf{base} \equiv b and \mathsf{ap}\, (\mathsf{circle\_rec}\, B\, b\, p)\, \mathsf{loop} \equiv p, while the dependent eliminator \mathsf{circle\_elim} handles families over S^1 by requiring transport along paths generated by constructors. These principles ensure that computations respect the higher equalities, enabling synthetic reasoning about homotopy. In HoTT, HITs facilitate the internal construction of topological notions, such as homotopy colimits and cell complexes, allowing proofs of classical results like the fundamental group of the circle within the type theory itself. Truncations, which collapse higher homotopy groups to yield sets or propositions, and set quotients, which identify elements under equivalence relations via path constructors, are both formalized as HITs. This approach supports univalent foundations, where Voevodsky's univalence axiom—positing that equivalences between types are equivalent to paths—interacts seamlessly with HITs; for example, the proof that the loop space of S^1 is equivalent to \mathbb{Z} relies on univalence to transport structures along paths. Implementations of HITs remain experimental and are primarily supported in proof assistants based on cubical type theory, which provides a computational interpretation of paths via interval types. Cubical Agda, for instance, realizes HITs through primitive path types and higher inductives, enabling the definition and elimination of types like the circle and torus since its 2018 release, with ongoing developments for more general quotients. As of 2025, Coq supports HITs only experimentally via plugins or axiomatic encodings in versions like 8.20, while Lean 4 lacks native cubical type theory or HIT support, relying on libraries for limited homotopy features; full integration with univalence and higher paths continues under active research.

Proof Assistants

In proof assistants based on dependent type theory, inductive types form a cornerstone for defining data structures and enabling structural recursion and induction. Coq, one of the earliest such systems, uses the Inductive keyword to declare inductive types, supporting mutual definitions (multiple interdependent types), nested inductives (constructors containing other inductives), and positivity checks to prevent non-terminating definitions by ensuring recursive occurrences appear only in positive positions. Recursion over these types is defined via the Fixpoint command, which enforces structural descent on arguments. Agda employs a data keyword for defining inductive types, integrating seamless pattern matching for elimination and computation. It supports dependent pattern matching, allowing eliminators to compute even when the motive depends on the inductive value (known as large elimination). For higher inductive types (HITs), Agda's cubical mode extends the core theory with path types and univalence, enabling definitions like the circle or torus via additional path constructors. Advanced recursion schemes beyond standard induction can be postulated as axioms when not derivable. Lean declares inductive types with the inductive keyword, incorporating universe polymorphism to control type levels and prevent inconsistencies like Girard's paradox. Single-constructor inductives are defined using the structure keyword for convenience, akin to records with eta-equality. Lean's elaborator reflection feature allows metaprogramming to customize inductive definitions and tactics at elaboration time. Idris and similar systems like Agda use a data keyword for inductive types, emphasizing totality checking to ensure all functions terminate by analyzing structural recursion and coverage. This prevents non-termination errors at compile time, supporting safe dependent programming. A key challenge in these systems arises with large eliminations in dependent types, where the return type of an eliminator depends on the specific value of the inductive term; this can complicate consistency in impredicative settings (like Coq's Prop universe) and hinder computational behavior, as eliminators may not reduce if the motive is not "small." Lean 4.0, released in 2023, addressed performance bottlenecks in handling large inductive definitions through a rewritten kernel in Lean itself, a new native compiler for faster execution, and optimized reduction strategies, significantly improving scalability for complex proofs.

Extensions and Variations

Equivalence to Initial Algebras

In category theory, an inductive type is semantically interpreted as the carrier of an initial algebra for an endofunctor F on a suitable category \mathcal{C} of types. For instance, the endofunctor for lists over a type A is given by F(X) = 1 + A \times X, where $1 is the unit type and \times denotes the product; the inductive type T (the list type) then comes equipped with a structure map \alpha: F(T) \to T satisfying the initiality condition. This initiality means that for any other F-algebra (B, \beta: F(B) \to B) in \mathcal{C}, there exists a unique algebra homomorphism h: T \to B such that the diagram \begin{tikzcd} F(T) \arrow{r}{\alpha} \arrow{d}{F(h)} & T \arrow{d}{h} \\ F(B) \arrow{r}{\beta} & B \end{tikzcd} commutes. The uniqueness of this homomorphism holds up to isomorphism: any two initial F-algebras are isomorphic via a unique isomorphism that respects the structure maps, ensuring that the inductive type is defined up to canonical equivalence in the category. This property captures the "freest" generation of the type from its constructors, mirroring the inductive definition where elements are built solely from the base cases and inductive steps without extraneous structure. Catamorphisms, or folds over the inductive type, arise directly from this initiality as the unique homomorphisms to arbitrary F-algebras, enabling recursive definitions that traverse the structure in a single pass. In type theory, particularly Martin-Löf type theory and its extensions, this equivalence is realized in categories such as the category of sets (Set) for classical models or, in homotopy type theory (HoTT), in the (\infty,1)-category of types or models like simplicial sets, where initiality is relaxed to homotopy-initiality to account for higher-dimensional paths. The induction principle follows as a free theorem from this universal property: given a family of types over T and a term covering the constructors, the unique homomorphism extends it to all of T, with the key diagram witnessing the compatibility as above. W-types provide a concrete constructive encoding of such initial algebras in intensional type theory.

Relation to Recursion Schemes

Inductive types in type theory provide a formal basis for defining recursive functions through their elimination principles, which in turn give rise to structured recursion schemes. These schemes systematize common patterns of recursion and corecursion over inductive data structures, enabling modular and composable definitions in both proof assistants and functional programming languages. Key recursion schemes, such as catamorphisms, anamorphisms, and paramorphisms, are derived from these elimination rules using principles like parametricity and free theorems, ensuring type-safe and efficient implementations. A catamorphism, also known as a fold, is a fundamental recursion scheme that reduces an inductive type to a single value by applying an algebra that handles each constructor. It destructs the structure recursively, combining subresults according to the algebra's operations. For instance, the sum of elements in a list, defined as an inductive type with nil and cons constructors, can be computed via a catamorphism using 0 as the base for nil and addition as the combiner for cons: in pseudocode, sum [] = 0; sum (x:xs) = x + sum xs. This generalizes to arbitrary inductive types, such as trees, where the algebra specifies how to aggregate node values and subtrees. Catamorphisms correspond to homomorphisms from the initial algebra of the inductive type to another algebra, leveraging the universal property of initiality. An anamorphism, or unfold, is the dual scheme for constructing finite inductive structures from a seed value using a coalgebra that generates elements until a base condition is met. Unlike corecursive unfolds for infinite coinductive types, anamorphisms terminate, producing well-founded inductive values. For example, generating a finite list by repeatedly applying a function to an initial element until a predicate holds, such as unfold p f b where p decides termination and f produces the next head and seed. This scheme builds structures bottom-up, complementing catamorphisms in compositions like hylomorphisms, which combine unfold and fold for efficient processing. Anamorphisms arise from the elimination principles by reversing the direction of recursion, again grounded in categorical duality. Paramorphisms extend catamorphisms by providing access to both the recursive results of immediate subterms and the original subterms themselves during computation. This allows recursion patterns that depend on structural information beyond just aggregated values, such as preserving sibling relationships in trees. For binary trees, a paramorphism might compute node depths while referencing original subtrees to track sibling positions: the algebra receives a node value, the paramorphic result of the left subtree, the original left subtree, the paramorphic result of the right subtree, and the original right subtree. A classic example on lists is factorial, where fac [] = 1; fac (n:ns) = n * fac ns, but rephrased to pass the original list segment: fac [] = 1; fac (n:ns) = n * (fac ns, ns), enabling patterns like primitive recursion that inspect direct substructures. Paramorphisms are particularly useful for traversals requiring contextual awareness, derived from elimination principles via adjusted fixed-point constructions. In general, recursion schemes like these are systematically derived from the elimination principles of inductive types using free theorems from parametric polymorphism, which guarantee that polymorphic functions behave relationally and enable fusion laws for optimization. For example, catamorphisms and anamorphisms can be fused to eliminate intermediate structures, improving efficiency without changing semantics. This theoretical foundation supports practical implementations, as seen in Haskell where algebraic data types (ADTs) model inductive types, and libraries provide generic combinators for these schemes, promoting reusable recursive code over ad-hoc recursion. The influence of these schemes on Haskell stems from early work formalizing them for functional languages, enabling patterns like generic folds over custom ADTs.

Coinductive Types

Coinductive types serve as the dual to inductive types, modeling potentially infinite data structures through the lens of final coalgebras for endofunctors on a category, typically the category of sets or types. In this framework, a coinductive type is the greatest fixed point of a functor F, satisfying an equation of the form \nu X = F(X), where elements are introduced via constructors that may be applied indefinitely without termination. For instance, the coinductive type of lists over a type A, denoted \mathsf{coList}\, A, is defined as the final coalgebra for the functor F(X) = 1 + A \times X, with constructors \mathsf{coNil} : \mathsf{coList}\, A and \mathsf{coCons} : A \to \mathsf{coList}\, A \to \mathsf{coList}\, A, allowing the construction of infinite sequences. The elimination principle for coinductive types relies on co-recursion, where functions are defined by specifying their behavior under observations or destructors that "unfold" the structure productively. For streams, typical observations include \mathsf{head} : \mathsf{Stream}\, A \to A and \mathsf{tail} : \mathsf{Stream}\, A \to \mathsf{Stream}\, A, enabling definitions like the infinite repetition of an element a via \mathsf{corec}\, (\lambda x.\, (a, x)). To ensure productivity—meaning the computation yields observable output indefinitely without divergence—co-recursive definitions must satisfy a guardedness condition: every recursive call must be protected by a coinductive constructor in the output. In the context of Martin-Löf type theory, coinductive types relate to M-types, which are the large (or terminal) versions of coalgebras and contrast with the small (or initial) W-types used for inductive constructions. M-types capture coinductive structures like infinite trees or processes, where the emphasis is on behavioral equivalence rather than structural generation. Representative examples of coinductive types include infinite streams of elements, as in \mathsf{Stream}\, A = \nu X.\, A \times X, which model unending sequences, and infinite processes in concurrency, such as labeled transition systems. Equality for such types is established via bisimulation, a coinductive relation that equates structures if they can match each other's transitions indefinitely; for streams s and t, bisimilarity holds if \mathsf{head}\, s = \mathsf{head}\, t and s and t are bisimilar after applying \mathsf{tail}. In proof assistants, coinductive types are supported through dedicated mechanisms: Coq uses the \mathsf{CoInductive} keyword to declare types like streams, paired with co-recursive definitions enforced by guardedness checks. Agda employs coinductive records or the \mathsf{corec} combinator for constructing inhabitants, with productivity ensured via sized types or copattern matching that decomposes values by projections like head and tail.

Observational Equivalence

In Martin-Löf type theory, definitional equality for terms inhabiting inductive types is determined by normalization: two terms are definitionally equal if they reduce to the same normal form through the theory's computation rules, such as beta-reduction applied to the eliminators (or recursors) of inductive types. This judgmental equality ensures that computations, like pattern matching on constructors, unfold directly in the type checker without requiring propositional proofs. For example, applying an eliminator to a constructor term beta-reduces to the corresponding motive computation, establishing equality definitionally. Propositional equality for terms of inductive types is captured by the identity type Id_A(x, y), an inductive family over A that classifies proofs of equality between x and y. The identity type features a reflexivity constructor \mathsf{refl}_x : Id_A(x, x), and its propositional properties—such as transitivity, symmetry, and congruence—are established via the induction principle for Id_A, which allows defining functions on identities by specifying behavior on \mathsf{refl}. This setup treats equality as a type whose inhabitants are proofs, enabling higher-level reasoning about inductive structures without conflating it with definitional equality. Observational equivalence for inductive types arises from convertibility under the computational rules, where two terms are equivalent if one can be transformed into the other via reductions like beta and, conditionally, eta expansions. For record-like inductive types (e.g., products or simple datatypes), eta-conversion often holds definitionally: a term equals the record formed by projecting its components. However, for general inductive types, such as those with non-trivial structure like lists or trees, eta does not hold definitionally in standard Martin-Löf type theory, requiring propositional proofs instead. This distinction preserves the intensional nature of the theory, avoiding over-equating terms that differ syntactically but behave similarly observationally. In homotopy type theory (HoTT), propositional equalities on inductive types are modeled as paths in a higher-dimensional space, where transport along a path p : Id_A(x, y) corresponds to higher paths ensuring computational coherence. The univalence axiom further implies function extensionality: two functions f, g : A \to B are path-equal if there exists a homotopy witnessing Id_A(a, a') \to Id_B(f(a), g(a')) for all a, a' \in A, enabling pointwise equality to lift to functions on inductive types. This provides a richer notion of equivalence for inductive structures, aligning observational behavior with homotopy levels. A key challenge in Martin-Löf type theory arises with extensionality: adding equality reflection, which collapses propositional equalities into definitional ones, leads to extensional collapse, where the type hierarchy flattens and type checking becomes undecidable. In extensional variants, propositional and judgmental equalities coincide, but this sacrifices computational guarantees for inductive types. Cubical models address this by interpreting equalities computationally via interval types and cubes, preserving univalence and extensionality without collapse; developments post-2020 have refined these for higher inductive types and parametricity.

References

  1. [1]
    [PDF] Intuitionistic Type Theory
    Intuitionistic Type Theory. Per Martin-Löf. Notes by Giovanni Sambin of a series of lectures given in Padua, June 1980. Page 2. Page 3. Contents. Introductory ...
  2. [2]
    [PDF] Martin-Löf's Type Theory
    The type theory described in this chapter has been developed by Martin-Löf with the original aim of being a clari cation of constructive mathematics. Unlike ...
  3. [3]
    [1201.3898] Inductive types in homotopy type theory - arXiv
    Jan 18, 2012 · This paper investigates inductive types in homotopy type theory, including modified rules for types of well-founded trees, and their ...
  4. [4]
    [PDF] Inductive Families Peter Dybjer November 26, 1997 Abstract A ...
    Nov 26, 1997 · Abstract. A general formulation of inductive and recursive definitions in Martin-Liof's type theory is presented.
  5. [5]
    inductive type in nLab
    ### Summary of Inductive Types from nLab
  6. [6]
    [PDF] Inductive Sets and Families in Martin-Liof's Type Theory
    Inductive Sets and Families in Martin-Liof's Type Theory and Their Set-Theoretic Semantics. Peter Dybjer. Chalmers University of Technology. Abstract.
  7. [7]
    Type Theory - Stanford Encyclopedia of Philosophy
    Feb 8, 2006 · Martin-Löf's introduction of a type of all types comes from the identification of the concept of propositions and types, suggested by the ...
  8. [8]
    On the Origin and Development of Brouwer's Concept of Choice ...
    This chapter discusses the development of the notion of choice sequences in Brouwer's (published and unpublished) work. There seems to have been two basic ...
  9. [9]
    The Turn to Heyting's Formalized Logic and Arithmetic
    Gödel (1932) showed that Heyting's system for intuitionistic propositional logic cannot be conceived of as a finitely many-valued logic.
  10. [10]
    [PDF] An Intuitionistic Theory of Types
    The theory of types with which we shall be concerned is intended to be a full scale system for formalizing intuitionistic mathematics as developed, for example ...
  11. [11]
    [PDF] PROOFS AND TYPES - Paul Taylor
    This little book comes from a short graduate course on typed λ-calculus given at the Université Paris VII in the autumn term of 1986–7.
  12. [12]
    [PDF] The Evolution of Inductive Definitions in Type Theory (a Retrospective)
    Oct 22, 2011 · Coquand and Paulin ”Inductively defined types” (COLOG-88). (inductive types, implementation had inductive families). Paulin-Mohring ”Inductive ...
  13. [13]
    The HoTT Book | Homotopy Type Theory
    Homotopy type theory offers a new “univalent” foundation of mathematics, in which a central role is played by Voevodsky's univalence axiom and higher inductive ...
  14. [14]
    Intuitionistic Type Theory - Stanford Encyclopedia of Philosophy
    Feb 12, 2016 · Russell developed type theory in response to his discovery of a paradox in naive set theory. In his ramified type theory mathematical objects ...
  15. [15]
    [PDF] Inductive Data Type Systems - Frédéric Blanqui
    Assumption 1: We assume that >I is well-founded and that all inductive types are strictly positive. To spell out the strict-positivity condition, assume that an ...
  16. [16]
    identity type in nLab
    ### Summary of J-eliminator, Dependent Elimination for Identity Types, and Path Induction in HoTT from https://ncatlab.org/nlab/show/identity+type
  17. [17]
    7. Inductive Types - Lean
    Inductively defined types can live in any type universe, including the bottom-most one, Prop . In fact, this is exactly how the logical connectives are defined.
  18. [18]
    [PDF] Type Theory & Functional Programming - Kent Academic Repository
    6.7.1 map and fold. Two of the most useful operations over lists are map and fold. map ap- plies a function to every element of a list, and has the primitive ...<|control11|><|separator|>
  19. [19]
    2. Dependent types — Logic in computer science lecture notes
    Vectors¶. The dependent version of lists are the vectors, which are like lists whose size is stored in the type, hence vectors form a dependent type: infixr ...
  20. [20]
    [PDF] Wellfounded Trees and Dependent Polynomial Functors - l'IRIF
    In a locally cartesian closed category, W-types are defined as the initial algebras for endofunctors of a special kind, the polynomial functors. The purpose of ...
  21. [21]
    W-type in nLab
    Jul 2, 2025 · In intensional type theory, a 𝒲 \mathcal{W} -type is only an initial algebra with respect to propositional equality, not definitional equality.Idea · Definition · Examples · Properties
  22. [22]
    M-type in nLab
    Jun 13, 2025 · The notion of M-type is the formal dual of that of W-type: a certain coinductive type. The categorical semantics of an M M -type is a terminal ...
  23. [23]
  24. [24]
  25. [25]
    [PDF] A Tutorial on [Co-]Inductive Types in Coq
    Yet another example of mutually dependent types are the predicates even and odd on natural numbers: Inductive even. : nat→Prop := evenO : even O |. evenS ...
  26. [26]
    Induction–recursion and initial algebras - ScienceDirect.com
    Dec 15, 2003 · Induction–recursion is a powerful definition method in intuitionistic type theory. It extends (generalized) inductive definitions.
  27. [27]
    inductive-recursive type in nLab
    Oct 5, 2023 · In type theory, an inductive-recursive type mutually defines types, where A is defined inductively and B recursively on A, and A can use B.Idea · Example · References
  28. [28]
    8. Induction and Recursion — Theorem Proving in ... - Lean
    Lean provides natural ways of defining recursive functions, performing pattern matching, and writing inductive proofs.
  29. [29]
    [PDF] Modelling General Recursion in Type Theory - Inria
    Jul 8, 2002 · founded recursion principle derived from the accessibility predicate Acc (see ... inductive-recursive definitions [Dyb00]. This method was ...
  30. [30]
    [PDF] Induction-Recursion and Initial lgebras - Page has been moved
    Induction-recursion is a powerful definition method in intuitionistic type theory. It extends (generalized) inductive definitions and allows us to de- fine all ...
  31. [31]
  32. [32]
    Mutual Recursion — Agda 2.9.0 documentation
    Agda offers multiple ways to write mutually-defined data types, record types and functions. The last two are more expressive than the first one.
  33. [33]
    Inductive-recursive types | PLS Lab
    Inductive-recursive types are types where the inductive type and a function inducting on that type are mutually defined at the same time.
  34. [34]
    inductive-inductive type in nLab
    Feb 10, 2023 · In type theory, induction-induction is a principle for mutually defining types of the form A : Type , and B : A → Type.
  35. [35]
    Constructing Inductive-Inductive Types in Cubical Type Theory
    Apr 5, 2019 · Constructing Inductive-Inductive Types in Cubical Type Theory. Conference paper; Open Access; First Online: 05 April 2019. pp 295–312; Cite this ...
  36. [36]
  37. [37]
    Cubical — Agda 2.6.1 documentation
    The Cubical mode extends Agda with a variety of features from Cubical Type Theory. In particular, computational univalence and higher inductive types.
  38. [38]
    Cubical — Agda 2.9.0 documentation
    The Cubical mode extends Agda with a variety of features from Cubical Type Theory. In particular, it adds computational univalence and higher inductive types.<|control11|><|separator|>
  39. [39]
    [PDF] The Lean 4 Theorem Prover and Programming Language (System ...
    Lean 4 is a reimplementation of the Lean theorem prover in Lean itself4. It is an extensible theorem prover and an efficient programming language. The new ...
  40. [40]
    [1504.05531] Homotopy-initial algebras in type theory - arXiv
    Apr 21, 2015 · We investigate inductive types in type theory, using the insights provided by homotopy type theory and univalent foundations of mathematics. We ...
  41. [41]
    (PDF) Functional Programming with Bananas, Lenses, Envelopes ...
    Aug 7, 2025 · Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire ... Defining data types as initial algebras, or dually as final co-algebras ...
  42. [42]
  43. [43]
  44. [44]
    catamorphism in nLab
    Dec 15, 2022 · Catamorphism is a fold over an inductive data type, a unique homomorphism from an initial algebra to an F-algebra, and a fold over the type.
  45. [45]
    recursion-schemes - Hackage - Haskell
    Jun 12, 2024 · A recursion-scheme is a function like cata which implements a common recursion pattern. It is a higher-order recursive function which takes a non-recursive ...Maintainer's Corner · Recursion-Schemes · Other Recursive TypesMissing: paramorphism | Show results with:paramorphism
  46. [46]
    coinductive type in nLab
    May 14, 2025 · Idea. The notion of coinductive types is dual to that of inductive types. 2. Examples. Examples of coinductive types include:.
  47. [47]
    [PDF] Realization of Coinductive Types - CS@Cornell
    Final F-coalgebras for endofunctors F on Set are useful in defining semantics of coinductive datatypes.
  48. [48]
    Coinduction — Agda 2.9.0 documentation
    As opposed to inductive record types, we have to introduce the keyword coinductive before defining the fields that constitute the record.
  49. [49]
    Coinductive - Adam Chlipala
    Coinductive types in Coq support lazy data structures, like streams, using co-recursive definitions, and are defined by changing 'Inductive' to 'CoInductive'.
  50. [50]
    [PDF] Wellfounded Recursion with Copatterns
    Jun 25, 2013 · Programs about streams are defined in terms of the observations head and tail. Our previous work left the question of termination of recursive.
  51. [51]
    Coinductive types and corecursive functions - Rocq Prover
    As of Coq 8.9, it is now advised to use negative coinductive types rather than their positive counterparts. See also. Primitive Projections for more information ...
  52. [52]
    [PDF] non-wellfounded trees in homotopy type theory - GitHub Pages
    In this work, we show instead that coinductive types in the form of M-types can be derived from certain inductive types. (More precisely, only one specific W- ...
  53. [53]
    [PDF] An Introduction to Bisimulation and Coinduction
    widely used in concurrency theory. ∗ to define equality on processes (fundamental !!) ∗ to prove equalities. ∗ to justify algebraic laws.
  54. [54]
    eta-conversion in nLab
    Apr 11, 2024 · In type theory, η \eta -conversion is a conversion rule for “computation” which is “dual” to beta-conversion.For function types · For product types · For unit types · Implementation
  55. [55]
    ETA-RULES IN MARTIN-LÖF TYPE THEORY | Bulletin of Symbolic ...
    Jul 22, 2019 · The eta rule for a set A says that an arbitrary element of A is judgementally identical to an element of constructor form.
  56. [56]
    [PDF] Well-definedness and Observational Equivalence for Inductive ...
    Abstract. In this paper, we investigate well-definedness and observational equivalence for programs of mixed inductive and coinductive types.
  57. [57]
    Another proof that univalence implies function extensionality
    Feb 17, 2014 · The fact, due to Voevodsky, that univalence implies function extensionality, has always been a bit mysterious to me—the proofs that I have ...
  58. [58]
    Cubical Type Theory: a constructive interpretation of the univalence ...
    Nov 7, 2016 · This paper presents a type theory in which it is possible to directly manipulate n-dimensional cubes (points, lines, squares, cubes, etc.)
  59. [59]
    [PDF] Syntax and Models of Cartesian Cubical Type Theory
    In this paper, we define a formal Cartesian cubical type theory that abstracts from the computational semantics, along with a machine-verified Cartesian cubical ...