Idris 和 Agda 之间的另一个区别是 Idris 的命题等式是异质的,而 Agda 的命题等式是同质的。
换句话说,Idris 中对平等的假定定义是:
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
Agda 定义中的 l 可以忽略,因为它与 Edwin 在他的回答中提到的宇宙多态性有关。
重要的区别在于 Agda 中的相等类型将 A 的两个元素作为参数,而在 Idris 中,它可以采用两个可能具有不同类型的值。
换句话说,在 Idris 中,人们可以声称具有不同类型的两个事物是相等的(即使它最终成为无法证明的主张),而在 Agda 中,这种陈述本身就是无稽之谈。
这对类型理论具有重要而广泛的影响,特别是在使用同伦类型理论的可行性方面。为此,异构相等是行不通的,因为它需要一个与 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
这句话在齐次等式下是无稽之谈,因为等式的左边有类型Vect (n + (m + o)) a
,右边有类型Vect ((n + m) + o) a
。这是一个具有异质性平等的完全明智的陈述。