伊德里斯与阿格达之间的另一个区别是,伊德里斯的命题平等是异质的,而阿格达的主张平等是同质的。
换句话说,伊德里斯对平等的推定定义是:
data (=) : {a, b : Type} -> a -> b -> Type where
refl : x = x
而在阿格达
data _≡_ {l} {A : Set l} (x : A) : A → Set a where
refl : x ≡ x
阿格达定义中的l可以忽略不计,因为它与埃德温在回答中提到的宇宙多态性有关。
重要的区别在于,Agda中的相等类型将A的两个元素作为参数,而在Idris中,它可以采用两个可能具有不同类型的值。
换句话说,在伊德里斯,人们可以断言具有不同类型的两件事是相等的(即使最终结果是无法证明的断言),而在阿格达,这种说法是胡说八道。
这对类型理论具有重要而广泛的影响,尤其是在同伦类型理论上工作的可行性方面。为此,异构相等只是行不通,因为它需要与HoTT不一致的公理。另一方面,可以用异构等式陈述有用的定理,而这些等式不能用同类等式直接说明。
也许最简单的例子是向量级联的关联性。给定的长度索引列表称为向量,因此定义为:
data Vect : Nat -> Type -> Type where
Nil : Vect 0 a
(::) : a -> Vect n a -> Vect (S n) a
并串联以下类型:
(++) : Vect n a -> Vect m a -> Vect (n + m) a
我们可能想证明:
concatAssoc : (xs : Vect n a) -> (ys : Vect m a) -> (zs : Vect o a) ->
xs ++ (ys ++ zs) = (xs ++ ys) ++ zs
该语句在齐次相等下是无意义的,因为相等的左侧为type Vect (n + (m + o)) a
,右侧为type Vect ((n + m) + o) a
。这是一个非常明智的声明,具有不同的相等性。