cwf.agda 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. module cwf where
  2. open import Nat
  3. open import Base
  4. open import univ
  5. open import help
  6. -- Category with Families
  7. infix 40 _─→_
  8. infixl 50 _,_ _,,_
  9. infixl 70 _∘_ _∙_
  10. infixl 60 _/_ _//_
  11. Con : Set
  12. Con = S
  13. _─→_ : Con -> Con -> Set
  14. Γ ─→ Δ = El (pi Γ (K Δ))
  15. p─→ : {Γ Δ : Con}(σ : Γ ─→ Δ){x y : El Γ} -> x == y -> σ # x == σ # y
  16. p─→ σ {x}{y} x=y =
  17. chain> σ # x
  18. === refS << σ # y by pFun σ x=y
  19. === σ # y by ref<< (σ # y)
  20. where open module C13 = Chain _==_ (ref {_}) (trans {_})
  21. id : {Γ : Con} -> Γ ─→ Γ
  22. id = el < (\x -> x) , (\{x}{y} -> prf x y) >
  23. where
  24. prf : (x y : El _)(x=y : x == y) -> x == refS << y
  25. prf x y x=y =
  26. chain> x
  27. === refS << x by sym (ref<< x)
  28. === refS << y by p<< refS x=y
  29. where open module C0 = Chain _==_ (ref {_}) (trans {_})
  30. _∘_ : {Γ Δ Θ : Con} -> (Δ ─→ Θ) -> (Γ ─→ Δ) -> Γ ─→ Θ
  31. σ ∘ δ = el < (\x -> σ # (δ # x))
  32. , (\{x}{y} -> prf x y)
  33. >
  34. where
  35. prf : (x y : El _)(x=y : x == y) -> σ # (δ # x) == _ << σ # (δ # y)
  36. prf x y x=y =
  37. chain> σ # (δ # x)
  38. === σ # (δ # y) by p─→ σ (p─→ δ x=y)
  39. === _ << σ # (δ # y) by sym (castref _ _)
  40. where open module C1 = Chain _==_ (ref {_}) (trans {_})
  41. Type : Con -> Set
  42. Type Γ = Fam Γ
  43. data _=Ty_ {Γ : Con}(A B : Type Γ) : Set where
  44. eqTy : A =Fam B -> A =Ty B
  45. symTy : {Γ : Con}{A B : Type Γ} -> A =Ty B -> B =Ty A
  46. symTy {Γ}{A}{B} (eqTy A=B) = eqTy (symFam {Γ}{A}{B} A=B)
  47. _/_ : {Γ Δ : Con} -> Type Γ -> (Δ ─→ Γ) -> Type Δ
  48. _/_ {Γ}{Δ} A (el < σ , pσ >) = fam B pB
  49. where
  50. B : El Δ -> S
  51. B x = A ! σ x
  52. σ' : Δ ─→ Γ
  53. σ' = el < σ , (\{x}{y} -> pσ) >
  54. pB : Map _==_ _=S_ B
  55. pB {x}{y} x=y = pFam A (p─→ σ' x=y)
  56. lem-/id : {Γ : Con}{A : Type Γ} -> A / id =Ty A
  57. lem-/id {Γ}{A} = eqTy \x -> refS
  58. data Elem (Γ : Con)(A : Type Γ) : Set where
  59. elem : El (pi Γ A) -> Elem Γ A
  60. _=El'_ : {Γ : Con}{A : Type Γ} -> Elem Γ A -> Elem Γ A -> Set
  61. elem u =El' elem v = u == v
  62. data _=El_ {Γ : Con}{A : Type Γ}(u v : Elem Γ A) : Set where
  63. eqEl : u =El' v -> u =El v
  64. castElem : {Γ : Con}{A B : Type Γ} -> B =Ty A -> Elem Γ A -> Elem Γ B
  65. castElem {Γ}{A}{B} (eqTy B=A) (elem u) = elem (ΓB=ΓA << u)
  66. where
  67. ΓB=ΓA : pi Γ B =S pi Γ A
  68. ΓB=ΓA = eqS < refS , Bx=Acx >
  69. where
  70. Bx=Acx : (x : El Γ) -> B ! x =S A ! (refS << x)
  71. Bx=Acx x =
  72. chain> B ! x
  73. === A ! x by B=A x
  74. === A ! (refS << x) by pFam A (sym (ref<< x))
  75. where open module C2-5 = Chain _=S_ refS transS
  76. _//_ : {Γ Δ : Con}{A : Type Γ} -> Elem Γ A -> (σ : Δ ─→ Γ) -> Elem Δ (A / σ)
  77. _//_ {Γ}{Δ}{A} (elem t) (el < σ , pσ >) =
  78. elem (el < tσ , (\{x}{y} -> prf x y) >)
  79. where
  80. tσ : (x : El Δ) -> El (A ! σ x)
  81. tσ x = t # σ x
  82. σ' : Δ ─→ Γ
  83. σ' = el < σ , (\{x}{y} -> pσ) >
  84. prf : (x y : El Δ)(x=y : x == y) -> t # σ x == _ << t # σ y
  85. prf x y x=y =
  86. chain> t # σ x
  87. === _ << t # σ y by pFun t (p─→ σ' x=y)
  88. === _ << t # σ y by pfi _ _ _
  89. where open module C3 = Chain _==_ (ref {_}) (trans {_})
  90. _,_ : (Γ : Con)(A : Type Γ) -> Con
  91. Γ , A = sigma Γ A
  92. wk : {Γ : Con}{A : Type Γ} -> Γ , A ─→ Γ
  93. wk {Γ}{A} = el < f , (\{x}{y} -> pf x y) >
  94. where
  95. f : El (Γ , A) -> El Γ
  96. f (el < x , _ >) = x
  97. pf : (x y : El (Γ , A))(x=y : x == y) -> f x == _ << f y
  98. pf (el < x , _ >) (el < y , _ >) (eq < x=y , _ >) =
  99. chain> x
  100. === y by x=y
  101. === _ << y by sym (castref _ _)
  102. where open module C4 = Chain _==_ (ref {_}) (trans {_})
  103. vz : {Γ : Con}{A : Type Γ} -> Elem (Γ , A) (A / wk)
  104. vz {Γ}{A} = elem (el < f , (\{x}{y} -> pf x y) >)
  105. where
  106. f : (x : El (Γ , A)) -> El ((A / wk) ! x)
  107. f (el < _ , z >) = z
  108. pf : (x y : El (Γ , A))(x=y : x == y) -> f x == _ << f y
  109. pf (el < _ , x >)(el < _ , y >)(eq < _ , x=y >) =
  110. chain> x
  111. === _ << y by x=y
  112. === _ << y by pfi _ _ _
  113. where open module C5 = Chain _==_ (ref {_}) (trans {_})
  114. _,,_ : {Γ Δ : Con}{A : Type Γ}(σ : Δ ─→ Γ)(u : Elem Δ (A / σ)) -> Δ ─→ Γ , A
  115. _,,_ {Γ}{Δ}{A} (el < σ , pσ >) (elem (el < u , pu >)) = build δ pδ
  116. where
  117. -- We need to generalise to be able to infer the proof of Γ, A =S Γ, A
  118. Ok : (f : El Δ -> El (Γ , A)) -> Set
  119. Ok f = (x y : El Δ)(p : Γ , A =S Γ , A)(x=y : x == y) -> f x == p << f y
  120. build : (f : El Δ -> El (Γ , A)) -> Ok f -> Δ ─→ Γ , A
  121. build f p = el < f , (\{x}{y} -> p x y _) >
  122. δ : El Δ -> El (Γ , A)
  123. δ x = el {Γ , A} < σ x , u x >
  124. pδ : Ok δ
  125. pδ x y (eqS < Γ=Γ , A=A >) x=y =
  126. eq < σx=cσy , ux=ccuy >
  127. where
  128. σx=cσy = trans (pσ x=y) (pfi _ _ _)
  129. ux=ccuy =
  130. chain> u x
  131. === _ << u y by pu x=y
  132. === _ << _ << u y by sym (casttrans _ _ _ _)
  133. where open module C6 = Chain _==_ (ref {_}) (trans {_})
  134. {- TODO: Prove
  135. wk ∘ (σ ,, u) = σ
  136. vz / (σ ,, u) = u
  137. (σ ,, u) ∘ δ = (σ ∘ δ ,, u)
  138. wk ,, vz = id
  139. -}
  140. [_] : {Γ : Con}{A : Type Γ} -> Elem Γ A -> Γ ─→ Γ , A
  141. [_] {Γ}{A} u = id ,, castElem lem-/id u
  142. Π : {Γ : Con}(A : Type Γ)(B : Type (Γ , A)) -> Type Γ
  143. Π {Γ} A B = fam F pF
  144. where
  145. F : El Γ -> S
  146. F x = pi (A ! x) (curryFam B x)
  147. pF : Map _==_ _=S_ F
  148. pF {y}{z} y=z = eqS
  149. < pFam A (sym y=z)
  150. , (\x -> pFam B (eq < y=z
  151. , trans (sym (castref _ _)) (trans<< _ _ _)
  152. >
  153. )
  154. )
  155. >
  156. {- TODO: Prove
  157. (Π A B) / σ = Π (A / σ) (B / (σ / wk ,, vz))
  158. -}
  159. ƛ : {Γ : Con}{A : Type Γ}{B : Type (Γ , A)} -> Elem (Γ , A) B -> Elem Γ (Π A B)
  160. ƛ {Γ}{A}{B} (elem u) = elem (mkFun f pf)
  161. where
  162. f : (x : El Γ) -> El (Π A B ! x)
  163. f x = el < g , (\{x}{y} -> pg) >
  164. where
  165. g : (y : El (A ! x)) -> El (B ! el < x , y >)
  166. g y = u # el < x , y >
  167. pg : {y z : El (A ! x)}(y=z : y == z) -> g y == _ << g z
  168. pg {y}{z} y=z =
  169. chain> u # el < x , y >
  170. === _ << u # el < x , z > by pFun u (eqSnd y=z)
  171. === _ << u # el < x , z > by pfi _ _ _
  172. where open module C7 = Chain _==_ (ref {_}) (trans {_})
  173. pf : IsFun {F = Π A B} f
  174. pf {y}{z} (eqS < Ay=Az , B'=B' >) y=z = eq prf
  175. where
  176. prf : (x : El (A ! y)) -> _ == _
  177. prf x =
  178. chain> u # el < y , x >
  179. === _ << u # el < z , _ << x >
  180. by pFun u (eq < y=z , sym (castref2 _ _ _) >)
  181. === _ << u # el < z , _ << x > by pfi _ _ _
  182. where open module C8 = Chain _==_ (ref {_}) (trans {_})
  183. _∙_ : {Γ : Con}{A : Type Γ}{B : Type (Γ , A)}
  184. (w : Elem Γ (Π A B))(u : Elem Γ A) -> Elem Γ (B / [ u ])
  185. _∙_ {Γ}{A}{B} (elem w) (elem u) = elem (el < f , (\{x}{y} -> pf) >)
  186. where
  187. f : (x : El Γ) -> El ((B / [ elem u ]) ! x)
  188. f x = p u << y
  189. where
  190. y : El (B ! el < x , u # x >)
  191. y = (w # x) # (u # x)
  192. p : (u : El (pi Γ A)) -> (B / [ elem u ]) ! x =S B ! el < x , u # x >
  193. p (el < u , pu >) = pFam B (
  194. chain> el < x , _ << u (refS << x) >
  195. === el < x , _ << _ << u x > by eqSnd (p<< _ (pu (ref<< _)))
  196. === el < x , u x > by eqSnd (castref2 _ _ _)
  197. )
  198. where open module C9 = Chain _==_ (ref {_}) (trans {_})
  199. pf : {x y : El Γ}(x=y : x == y) -> f x == _ << f y
  200. pf {x}{y} x=y =
  201. chain> q1 << (w # x) # (u # x)
  202. === q1 << (q3 << w # y) ## (u # x)
  203. by p<< q1 (p# (pFun w x=y))
  204. === q1 << q4 << (w # y) # (q5 << u # x)
  205. by p<< q1 (distr<<# (w # y) q3)
  206. === q7 << (w # y) # (q5 << u # x)
  207. by sym (trans<< q1 q4 _)
  208. === q7 << q8 << (w # y) # (q5 << q9 << u # y)
  209. by p<< q7 (pFun (w # y) (p<< q5 (pFun u x=y)))
  210. === qA << (w # y) # (q5 << q9 << u # y)
  211. by sym (trans<< q7 q8 _)
  212. === qA << qB << (w # y) # (u # y)
  213. by p<< qA (pFun (w # y) (castref2 q5 q9 _))
  214. === q2 << q6 << (w # y) # (u # y)
  215. by pfi2 qA q2 qB q6 _
  216. where
  217. open module C10 = Chain _==_ (ref {_}) (trans {_})
  218. q1 = _
  219. q2 = _
  220. q3 = _
  221. q4 = _
  222. q5 = _
  223. q6 = _
  224. q7 = _
  225. q8 = _
  226. q9 = _
  227. qA = _
  228. qB = _
  229. infixl 150 _##_
  230. _##_ = _#_ {F = curryFam B x}
  231. {- TODO: Prove
  232. (ƛ v) ∙ u = v // [ u ] (β)
  233. w = ƛ ((w // wk) ∙ vz) (η)
  234. ƛ v // σ = ƛ (v // (σ ∘ wk ,, vz))
  235. w ∙ u // σ = (w // σ) ∙ (u // σ)
  236. -}