Los tipos de datos algebraicos le permiten definir tipos de forma recursiva. Concretamente, supongamos que tenemos el tipo de datos
datalist=Nil|ConsofN×list
Lo que esto significa es que es el conjunto más pequeño generado por los operadores y . Podemos formalizar esto definiendo el operadorN i l C o n s F ( X )listNilConsF(X)
F(X)=={Nil}∪{Cons(n,x)|n∈N∧x∈X}
y luego definiendo comolist
list=⋃i∈NFi(∅)
Un ADT generalizado es lo que obtenemos cuando definimos un operador de tipo recursivamente. Por ejemplo, podríamos definir el siguiente tipo de constructor:
busha=Leafofa|Nestofbush(a×a)
Este tipo significa que un elemento de es una tupla de s de longitud para alguna , ya que cada vez que entramos en el constructor el argumento de tipo se empareja consigo mismo . Entonces podemos definir el operador del que queremos tomar un punto fijo como:a 2 n n N e s tbushaa2nnNest
F(R)=λX.{Leaf(x)|x∈X}∪{Nest(v)|v∈R(X)}
Un tipo inductivo en Coq es esencialmente un GADT, donde los índices del operador de tipo no están restringidos a otros tipos (como en, por ejemplo, Haskell), sino que también pueden indexarse por valores de la teoría de tipos. Esto le permite dar tipos para listas indexadas por longitud, etc.