两个领域在阿格达记录一致

时间:2017-06-09 11:26:09

标签: agda category-theory theorem-proving

我想使用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

有任何帮助吗?

1 个答案:

答案 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