Les types de données algébriques vous permettent de définir des types de manière récursive. Concrètement, supposons que nous ayons le type de données
datalist=Nil|ConsofN×list
Cela signifie que est le plus petit ensemble généré par les opérateurs N i l et C o n s . On peut formaliser cela en définissant l'opérateur F ( X )listNilConsF(X)
F(X)=={Nil}∪{Cons(n,x)|n∈N∧x∈X}
puis définir commelist
list=⋃i∈NFi(∅)
Un ADT généralisé est ce que nous obtenons lorsque nous définissons un opérateur de type de manière récursive. Par exemple, nous pouvons définir le constructeur de type suivant:
b u s ha = L e a fo fune|N e s to fb u s h ( a × a )
Ce type signifie qu'un élément de est un tuple de a s de longueur 2 n pour certains n , puisque chaque fois que nous entrons dans le constructeur N e s t l'argument type est apparié avec lui-même. Nous pouvons donc définir l'opérateur que nous voulons prendre un point fixe comme:b u s huneune2nnN e s t
F( R ) = λ X.{ L e a f( x )|x ∈ X} ∪ { N e s t ( v )|v ∈ R ( X) }
Un type inductif dans Coq est essentiellement un GADT, où les index de l'opérateur de type ne sont pas limités à d'autres types (comme dans, par exemple, Haskell), mais peuvent également être indexés par des valeurs de la théorie des types. Cela vous permet de donner des types pour les listes indexées en longueur, etc.