我想使用Agda
编写限制集类别。假设局部较小,仿函数就是Set OC和I上的一对地图,就像这样。
sobj : OC → Set c₂
smap : { i j : OC } → (f : I ) → sobj i → sobj j
仿函数的圆锥是一个包含两个字段的记录。使用记录,锥体的可交换性和极限的属性 除了唯一性之外,很容易显示出来。极限的唯一性证明了记录与两个字段的一致性。
在下面的agda代码中,我想证明snat-cong引理。
open import Level
module S where
open import Relation.Binary.Core
open import Function
import Relation.Binary.PropositionalEquality
record snat { c₂ } { I OC : Set c₂ } ( sobj : OC → Set c₂ )
( smap : { i j : OC } → (f : I ) → sobj i → sobj j ) : Set c₂ where
field
snmap : ( i : OC ) → sobj i
sncommute : ( i j : OC ) → ( f : I ) → smap f ( snmap i ) ≡ snmap j
smap0 : { i j : OC } → (f : I ) → sobj i → sobj j
smap0 {i} {j} f x = smap f x
open snat
snat-cong : { c : Level } { I OC : Set c } { SObj : OC → Set c } { SMap : { i j : OC } → (f : I )→ SObj i → SObj j }
( s t : snat SObj SMap )
→ ( ( λ i → snmap s i ) ≡ ( λ i → snmap t i ) )
→ ( ( λ i j f → smap0 s f ( snmap s i ) ≡ snmap s j ) ≡ ( ( λ i j f → smap0 t f ( snmap t i ) ≡ snmap t j ) ) )
→ s ≡ t
snat-cong s t refl refl = {!!}
这非常类似于答案 Equality on dependent record types
所以它应该像
一样工作snat-cong s t refl refl = refl
但它会出现这样的错误。
.sncommute i j f != sncommute t i j f of type
.SMap f (snmap t i) ≡ snmap t j
有任何帮助吗?
答案 0 :(得分:0)
在snat-cong
中,没有任何论据说假设sncommute s
等于sncommute t
。相反,你所说的是sncommute s
的类型等于sncommute t
的类型,但是已经从第一个等式开始了。
表明sncommute
s本身平等的最简单方法是异构平等。所以snat-cong可能看起来像这样:
open import Relation.Binary.HeterogeneousEquality using (_≅_;refl)
snat-cong : {c : Level}
{I OC : Set c}
{sobj : OC → Set c}
{smap : {i j : OC} → (f : I) → sobj i → sobj j}
→ (s t : snat sobj smap)
→ (snmap-≡ : snmap s ≡ snmap t)
→ (sncommute-≅ : sncommute s ≅ sncommute t)
→ s ≡ t
snat-cong _ _ refl refl = refl
如果您想更明确,或想要使用--without-K
,那么您可以使用sncommute-≅
的依赖相等类型:
snat-cong' : {c : Level}
{I OC : Set c}
{sobj : OC → Set c}
{smap : {i j : OC} → (f : I) → sobj i → sobj j}
(s t : snat sobj smap)
→ (snmap-≡ : snmap s ≡ snmap t)
→ (sncommute-≡ : subst (\snmap → ∀ i j f → smap f (snmap i) ≡ snmap j) snmap-≡ (sncommute s) ≡ sncommute t)
→ s ≡ t
snat-cong' _ _ refl refl = refl