Une autre différence entre Idris et Agda est que l'égalité propositionnelle d'Idris est hétérogène, alors que celle d'Agda est homogène.
En d'autres termes, la définition putative de l'égalité dans Idris serait :
data (=) : {a, b : Type} -> a -> b -> Type where
refl : x = x
alors qu'en Agda, c'est
data __ {l} {A : Set l} (x : A) : A Set a where
refl : x x
Le l de la définition d'Agda peut être ignoré, car il a trait au polymorphisme de l'univers qu'Edwin mentionne dans sa réponse.
La différence importante est que le type égalité en Agda prend deux éléments de A comme arguments, alors qu'en Idris il peut prendre deux valeurs avec potentiellement différents types.
En d'autres termes, en Idris, on peut affirmer que deux choses de types différents sont égales (même si cette affirmation n'est pas prouvable), alors qu'en Agda, cette affirmation est absurde.
Cela a des conséquences importantes et de grande portée pour la théorie des types, notamment en ce qui concerne la possibilité de travailler avec la théorie des types de l'homotopie. Pour cela, l'égalité hétérogène ne fonctionnera tout simplement pas car elle nécessite un axiome qui est incompatible avec la théorie des types d'homotopie. D'autre part, il est possible d'énoncer des théorèmes utiles avec l'égalité hétérogène qui ne peuvent pas être énoncés directement avec l'égalité homogène.
L'exemple le plus simple est peut-être l'associativité de la concaténation de vecteurs. Étant donné des listes indexées par la longueur appelées vecteurs définis ainsi :
data Vect : Nat -> Type -> Type where
Nil : Vect 0 a
(::) : a -> Vect n a -> Vect (S n) a
et la concaténation avec le type suivant :
(++) : Vect n a -> Vect m a -> Vect (n + m) a
nous pourrions vouloir le prouver :
concatAssoc : (xs : Vect n a) -> (ys : Vect m a) -> (zs : Vect o a) ->
xs ++ (ys ++ zs) = (xs ++ ys) ++ zs
Cette affirmation est un non-sens en vertu de l'égalité homogène, car le côté gauche de l'égalité a le type Vect (n + (m + o)) a
et le côté droit a le type Vect ((n + m) + o) a
. C'est une déclaration parfaitement sensée avec une égalité hétérogène.
1 votes
Vous pouvez également jeter un coup d'œil à coq, la syntaxe n'est pas très éloignée de haskell et les classes de types sont faciles à utiliser :)
4 votes
Pour mémoire : Agda dispose aussi aujourd'hui de notations monadiques et applicatives.