在 Agda 中处理类型的平等时,通常需要使用手动强制类型来强制居民类型,例如
coerce : ∀ {ℓ} {A B : Set ℓ} → A ≡ B → A → B
coerce refl x = x
此处讨论过,有时可以使用重写来避免对术语的显式强制。我想知道这种技术在定义类型时是否也有效。所以我写了一个小例子,其中f,g : A → Set
有两个(扩展地)相等的依赖类型和一个属性p : A → Set
,其中p x
状态每个元素y : f x
都等于每个元素z : g x
,即y ≡ z
. 最后一个等式是错误类型的,正如人们可以预料的那样,y : f x
并且z : g x
不先验地共享相同的类型,但是我希望重写可以允许它。就像是:
open import Relation.Binary.PropositionalEquality
postulate A : Set
postulate B : Set
postulate f : A → Set
postulate g : A → Set
postulate f≡g : ∀ {x} → (f x) ≡ (g x)
p : {x : A} → Set
p {x} rewrite f≡g {x} = (y : f x ) (z : g x) → y ≡ z
但是错误仍然存在,即使重写建议被接受。那么,有没有办法让 Agda 在不使用显式强制的情况下接受这个定义,比如
p {x} = (y : f x ) (z : g x) → (coerce f≡g y) ≡ z
?
谢谢