TT.agda 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. {-# OPTIONS --allow-unsolved-metas --no-termination-check #-}
  2. module TT where
  3. module Prelude where
  4. -- Props ------------------------------------------------------------------
  5. data True : Set where
  6. tt : True
  7. data False : Set where
  8. postulate
  9. falseE : (A : Set) -> False -> A
  10. infix 3 _/\_
  11. data _/\_ (P Q : Set) : Set where
  12. andI : P -> Q -> P /\ Q
  13. -- Zero and One -----------------------------------------------------------
  14. data Zero : Set where
  15. data One : Set where
  16. unit : One
  17. -- Natural numbers --------------------------------------------------------
  18. data Nat : Set where
  19. zero : Nat
  20. suc : Nat -> Nat
  21. _+_ : Nat -> Nat -> Nat
  22. zero + m = m
  23. suc n + m = suc (n + m)
  24. module NatEq where
  25. infix 5 _==_
  26. _==_ : Nat -> Nat -> Set
  27. zero == zero = True
  28. suc n == suc m = n == m
  29. _ == _ = False
  30. rewriteEq : (C : Nat -> Set){m n : Nat} -> m == n -> C n -> C m
  31. rewriteEq C {zero} {zero} _ x = x
  32. rewriteEq C {suc _} {suc _} eq x = rewriteEq (\z -> C (suc z)) eq x
  33. rewriteEq C {zero} {suc _} () _
  34. rewriteEq C {suc _} {zero} () _
  35. module Chain {A : Set}(_==_ : A -> A -> Set)
  36. (_trans_ : {x y z : A} -> x == y -> y == z -> x == z)
  37. where
  38. infixl 4 _=-=_
  39. infixl 4 _===_
  40. infixr 8 _since_
  41. _=-=_ : (x : A){y : A} -> x == y -> x == y
  42. x =-= xy = xy
  43. _===_ : {x y z : A} -> x == y -> y == z -> x == z
  44. xy === yz = xy trans yz
  45. _since_ : {x : A}(y : A) -> x == y -> x == y
  46. y since xy = xy
  47. module Fin where
  48. open Prelude
  49. -- Finite sets ------------------------------------------------------------
  50. data Suc (A : Set) : Set where
  51. fzero' : Suc A
  52. fsuc' : A -> Suc A
  53. mutual
  54. data Fin (n : Nat) : Set where
  55. finI : Fin' n -> Fin n
  56. Fin' : Nat -> Set
  57. Fin' zero = Zero
  58. Fin' (suc n) = Suc (Fin n)
  59. fzero : {n : Nat} -> Fin (suc n)
  60. fzero = finI fzero'
  61. fsuc : {n : Nat} -> Fin n -> Fin (suc n)
  62. fsuc i = finI (fsuc' i)
  63. finE : {n : Nat} -> Fin n -> Fin' n
  64. finE (finI i) = i
  65. module FinEq where
  66. infix 5 _==_
  67. _==_ : {n : Nat} -> Fin n -> Fin n -> Set
  68. _==_ {suc _} (finI fzero' ) (finI fzero' ) = True
  69. _==_ {suc _} (finI (fsuc' i)) (finI (fsuc' j)) = i == j
  70. _==_ _ _ = False
  71. rewriteEq : {n : Nat}(C : Fin n -> Set){i j : Fin n} -> i == j -> C j -> C i
  72. rewriteEq {suc _} C {finI fzero' } {finI fzero' } eq x = x
  73. rewriteEq {suc _} C {finI (fsuc' i)} {finI (fsuc' j)} eq x = rewriteEq (\z -> C (fsuc z)) eq x
  74. rewriteEq {suc _} C {finI (fsuc' _)} {finI fzero' } () _
  75. rewriteEq {suc _} C {finI fzero' } {finI (fsuc' _)} () _
  76. rewriteEq {zero} C {finI ()} {_} _ _
  77. module Vec where
  78. open Prelude
  79. open Fin
  80. infixr 15 _::_
  81. -- Vectors ----------------------------------------------------------------
  82. data Nil : Set where
  83. nil' : Nil
  84. data Cons (A As : Set) : Set where
  85. cons' : A -> As -> Cons A As
  86. mutual
  87. data Vec (A : Set)(n : Nat) : Set where
  88. vecI : Vec' A n -> Vec A n
  89. Vec' : Set -> Nat -> Set
  90. Vec' A zero = Nil
  91. Vec' A (suc n) = Cons A (Vec A n)
  92. nil : {A : Set} -> Vec A zero
  93. nil = vecI nil'
  94. _::_ : {A : Set}{n : Nat} -> A -> Vec A n -> Vec A (suc n)
  95. x :: xs = vecI (cons' x xs)
  96. vecE : {A : Set}{n : Nat} -> Vec A n -> Vec' A n
  97. vecE (vecI xs) = xs
  98. vec : {A : Set}(n : Nat) -> A -> Vec A n
  99. vec zero _ = nil
  100. vec (suc n) x = x :: vec n x
  101. map : {n : Nat}{A B : Set} -> (A -> B) -> Vec A n -> Vec B n
  102. map {zero} f (vecI nil') = nil
  103. map {suc n} f (vecI (cons' x xs)) = f x :: map f xs
  104. _!_ : {n : Nat}{A : Set} -> Vec A n -> Fin n -> A
  105. _!_ {zero } _ (finI ())
  106. _!_ {suc n} (vecI (cons' x _ )) (finI fzero') = x
  107. _!_ {suc n} (vecI (cons' _ xs)) (finI (fsuc' i)) = xs ! i
  108. tabulate : {n : Nat}{A : Set} -> (Fin n -> A) -> Vec A n
  109. tabulate {zero} f = nil
  110. tabulate {suc n} f = f fzero :: tabulate (\x -> f (fsuc x))
  111. module Untyped where
  112. open Prelude
  113. open Fin
  114. open Vec
  115. Name = Nat
  116. data Expr (n : Nat) : Set where
  117. eVar : Fin n -> Expr n
  118. eApp : Expr n -> Expr n -> Expr n
  119. eLam : Expr (suc n) -> Expr n
  120. eSet : Expr n
  121. eEl : Expr n
  122. ePi : Expr n
  123. eCon : Name -> Expr n
  124. module ExprEq where
  125. infix 5 _==_
  126. _==_ : {n : Nat} -> Expr n -> Expr n -> Set
  127. eVar i == eVar j = FinEq._==_ i j
  128. eApp e1 e2 == eApp e3 e4 = e1 == e3 /\ e2 == e4
  129. eLam e1 == eLam e2 = e1 == e2
  130. eSet == eSet = True
  131. eEl == eEl = True
  132. ePi == ePi = True
  133. eCon f == eCon g = NatEq._==_ f g
  134. _ == _ = False
  135. rewriteEq : {n : Nat}(C : Expr n -> Set){r s : Expr n} -> r == s -> C s -> C r
  136. rewriteEq C {eVar i } {eVar j } eq x = FinEq.rewriteEq (\z -> C (eVar z)) eq x
  137. rewriteEq C {eLam e1 } {eLam e2 } eq x = rewriteEq (\z -> C (eLam z)) eq x
  138. rewriteEq C {eSet } {eSet } eq x = x
  139. rewriteEq C {eEl } {eEl } eq x = x
  140. rewriteEq C {ePi } {ePi } eq x = x
  141. rewriteEq C {eCon f } {eCon g } eq x = NatEq.rewriteEq (\z -> C (eCon z)) eq x
  142. rewriteEq C {eApp e1 e2} {eApp e3 e4} (andI eq13 eq24) x =
  143. rewriteEq (\z -> C (eApp z e2)) eq13 (
  144. rewriteEq (\z -> C (eApp e3 z)) eq24 x
  145. )
  146. rewriteEq C {eVar _} {eLam _ } () _
  147. rewriteEq C {eVar _} {eSet } () _
  148. rewriteEq C {eVar _} {eEl } () _
  149. rewriteEq C {eVar _} {eCon _ } () _
  150. rewriteEq C {eVar _} {ePi } () _
  151. rewriteEq C {eVar _} {eApp _ _} () _
  152. rewriteEq C {eLam _} {eVar _ } () _
  153. rewriteEq C {eLam _} {eSet } () _
  154. rewriteEq C {eLam _} {eEl } () _
  155. rewriteEq C {eLam _} {eCon _ } () _
  156. rewriteEq C {eLam _} {ePi } () _
  157. rewriteEq C {eLam _} {eApp _ _} () _
  158. rewriteEq C {eSet } {eLam _ } () _
  159. rewriteEq C {eSet } {eVar _ } () _
  160. rewriteEq C {eSet } {eEl } () _
  161. rewriteEq C {eSet } {eCon _ } () _
  162. rewriteEq C {eSet } {ePi } () _
  163. rewriteEq C {eSet } {eApp _ _} () _
  164. rewriteEq C {eEl } {eLam _ } () _
  165. rewriteEq C {eEl } {eSet } () _
  166. rewriteEq C {eEl } {eVar _ } () _
  167. rewriteEq C {eEl } {eCon _ } () _
  168. rewriteEq C {eEl } {ePi } () _
  169. rewriteEq C {eEl } {eApp _ _} () _
  170. rewriteEq C {eCon _} {eLam _ } () _
  171. rewriteEq C {eCon _} {eSet } () _
  172. rewriteEq C {eCon _} {eEl } () _
  173. rewriteEq C {eCon _} {eVar _ } () _
  174. rewriteEq C {eCon _} {ePi } () _
  175. rewriteEq C {eCon _} {eApp _ _} () _
  176. rewriteEq C {ePi } {eLam _ } () _
  177. rewriteEq C {ePi } {eSet } () _
  178. rewriteEq C {ePi } {eEl } () _
  179. rewriteEq C {ePi } {eCon _ } () _
  180. rewriteEq C {ePi } {eVar _ } () _
  181. rewriteEq C {ePi } {eApp _ _} () _
  182. rewriteEq C {eApp _ _} {eLam _ } () _
  183. rewriteEq C {eApp _ _} {eSet } () _
  184. rewriteEq C {eApp _ _} {eEl } () _
  185. rewriteEq C {eApp _ _} {eCon _ } () _
  186. rewriteEq C {eApp _ _} {ePi } () _
  187. rewriteEq C {eApp _ _} {eVar _ } () _
  188. module Typed where
  189. open Prelude
  190. open Fin
  191. open Vec
  192. infixl 15 _&_
  193. infix 13 _!!_
  194. infix 5 _==_
  195. -- Contexts ---------------------------------------------------------------
  196. data CSuc (n : Nat) : Set
  197. Context' : Nat -> Set
  198. Context' zero = Nil
  199. Context' (suc n) = CSuc n
  200. data Context (n : Nat) : Set
  201. data Type {n : Nat}(Γ : Context n) : Set
  202. data CSuc n where
  203. ext : (Γ : Context n) -> Type Γ -> Context' (suc n)
  204. data Context n where
  205. ctxI : Context' n -> Context n
  206. -- Types ------------------------------------------------------------------
  207. _&_ : {n : Nat}(Γ : Context n) -> Type Γ -> Context (suc n)
  208. data Term {n : Nat}(Γ : Context n)(A : Type Γ) : Set
  209. data Type {n} Γ where
  210. SET : Type Γ
  211. Pi : (A : Type Γ) -> Type (Γ & A) -> Type Γ
  212. El : Term Γ SET -> Type Γ
  213. Γ & A = ctxI (ext Γ A)
  214. -- Variables --------------------------------------------------------------
  215. data VarSuc {n : Nat}(Γ : Context n)(B : Type Γ)(A : Type (Γ & B)) : Set
  216. Var' : {n : Nat}(Γ : Context n) -> Type Γ -> Set
  217. Var' {zero} Γ A = Zero
  218. Var' {suc n} (ctxI (ext Γ B)) A = VarSuc Γ B A
  219. _==_ : {n : Nat}{Γ : Context n} -> Type Γ -> Type Γ -> Set
  220. data Ren {n m : Nat}(Γ : Context n)(Δ : Context m) : Set
  221. rename : {n m : Nat}{Γ : Context n}{Δ : Context m} -> Ren Γ Δ -> Type Γ -> Type Δ
  222. upR : {n : Nat}{Γ : Context n}{A : Type Γ} -> Ren Γ (Γ & A)
  223. data Var {n : Nat}(Γ : Context n)(A : Type Γ) : Set
  224. data VarSuc {n} Γ B A where
  225. vzero_ : A == rename upR B -> Var' (Γ & B) A
  226. vsuc_ : (C : Type Γ) -> A == rename upR C -> Var Γ C -> Var' (Γ & B) A
  227. data Var {n} Γ A where
  228. varI : Var' Γ A -> Var Γ A
  229. -- Terms ------------------------------------------------------------------
  230. data Sub {n m : Nat}(Γ : Context n)(Δ : Context m) : Set
  231. subst : {n m : Nat}{Γ : Context n}{Δ : Context m} -> Sub Γ Δ -> Type Γ -> Type Δ
  232. down : {n : Nat}{Γ : Context n}{A : Type Γ} -> Term Γ A -> Sub (Γ & A) Γ
  233. data Term {n} Γ A where
  234. var : (x : Var Γ A) -> Term Γ A
  235. app : {B : Type Γ}{C : Type (Γ & B)} -> Term Γ (Pi B C) -> (t : Term Γ B) ->
  236. A == subst (down t) C -> Term Γ A
  237. lam : {B : Type Γ}{C : Type (Γ & B)} -> Term (Γ & B) C -> A == Pi B C -> Term Γ A
  238. -- Context manipulation ---------------------------------------------------
  239. ∅ : Context zero
  240. ∅ = ctxI nil'
  241. _!!_ : {n : Nat}(Γ : Context n) -> Fin n -> Type Γ
  242. _!!_ {zero} _ (finI ())
  243. _!!_ {suc _} (ctxI (ext Γ A)) (finI fzero') = rename upR A
  244. _!!_ {suc _} (ctxI (ext Γ A)) (finI (fsuc' i)) = rename upR (Γ !! i)
  245. -- Renamings --------------------------------------------------------------
  246. data ConsRen {n m : Nat}(Γ : Context n)(A : Type Γ)(Δ : Context m) : Set
  247. Ren' : {n m : Nat} -> Context n -> Context m -> Set
  248. Ren' {zero} {m} (ctxI nil') Δ = Nil
  249. Ren' {suc n} {m} (ctxI (ext Γ A)) Δ = ConsRen Γ A Δ
  250. data ConsRen {n m} Γ A Δ where
  251. extRen' : (ρ : Ren Γ Δ) -> Var Δ (rename ρ A) -> Ren' (Γ & A) Δ
  252. data Ren {n m} Γ Δ where
  253. renI : Ren' Γ Δ -> Ren Γ Δ
  254. -- Performing renamings ---------------------------------------------------
  255. rename' : {n m : Nat}{Γ : Context n}{Δ : Context m} -> Ren Γ Δ -> Type Γ -> Type Δ
  256. rename ρ SET = SET
  257. rename ρ A = rename' ρ A
  258. liftR : {n m : Nat}{Γ : Context n}{A : Type Γ}{Δ : Context m} ->
  259. (ρ : Ren Γ Δ) -> Ren (Γ & A) (Δ & rename ρ A)
  260. renameTerm : {n m : Nat}{Γ : Context n}{Δ : Context m}{A : Type Γ}
  261. (ρ : Ren Γ Δ) -> Term Γ A -> Term Δ (rename ρ A)
  262. rename' ρ SET = SET
  263. rename' ρ (Pi A B) = Pi (rename ρ A) (rename (liftR ρ) B)
  264. rename' ρ (El t) = El (renameTerm ρ t)
  265. lookupR : {n m : Nat}{Γ : Context n}{A : Type Γ}{Δ : Context m}
  266. (ρ : Ren Γ Δ)(x : Var Γ A) -> Var Δ (rename ρ A)
  267. cong : {n m : Nat}{Γ : Context n}{Δ : Context m}(f : Type Γ -> Type Δ)
  268. {A B : Type Γ} -> A == B -> f A == f B
  269. _trans_ : {n : Nat}{Γ : Context n}{A B C : Type Γ} -> A == B -> B == C -> A == C
  270. renameSubstCommute :
  271. {n m : Nat}{Γ : Context n}{Δ : Context m}{A : Type Γ}{B : Type (Γ & A)}
  272. {ρ : Ren Γ Δ}{t : Term Γ A} ->
  273. rename ρ (subst (down t) B) == subst (down (renameTerm ρ t)) (rename (liftR ρ) B)
  274. renameTerm ρ (var x) = var (lookupR ρ x)
  275. renameTerm {_}{_}{_}{_}{A} ρ (app{_}{C} s t eq) =
  276. app (renameTerm ρ s) (renameTerm ρ t)
  277. (cong (rename ρ) eq trans renameSubstCommute)
  278. renameTerm ρ (lam t eq) = lam (renameTerm (liftR ρ) t) (cong (rename ρ) eq)
  279. lookupR {zero} _ (varI ())
  280. lookupR {suc n} {_} {ctxI (ext Γ B)} {A} {Δ}
  281. (renI (extRen' ρ z)) (varI (vzero_ eq)) = {!!}
  282. lookupR {suc n} {_} {ctxI (ext Γ B)} {A} {Δ}
  283. (renI (extRen' ρ z)) (varI (vsuc_ C eq x)) = {!!}
  284. -- Building renamings -----------------------------------------------------
  285. extRen : {n m : Nat}{Γ : Context n}{A : Type Γ}{Δ : Context m}
  286. (ρ : Ren Γ Δ) -> Var Δ (rename ρ A) -> Ren (Γ & A) Δ
  287. extRen ρ x = renI (extRen' ρ x)
  288. _coR_ : {n m p : Nat}{Γ : Context n}{Δ : Context m}{Θ : Context p} -> Ren Δ Θ -> Ren Γ Δ -> Ren Γ Θ
  289. liftR {_}{_}{_}{A} ρ = extRen (upR coR ρ) (varI {!!})
  290. idR : {n : Nat} {Γ : Context n} -> Ren Γ Γ
  291. idR = {!!}
  292. _coR_ = {!!}
  293. upR = {!!}
  294. -- Substitutions ----------------------------------------------------------
  295. data ConsSub {n m : Nat}(Γ : Context n)(A : Type Γ)(Δ : Context m) : Set
  296. Sub' : {n m : Nat} -> Context n -> Context m -> Set
  297. Sub' {zero} {m} (ctxI nil') Δ = Nil
  298. Sub' {suc n} {m} (ctxI (ext Γ A)) Δ = ConsSub Γ A Δ
  299. data ConsSub {n m} Γ A Δ where
  300. extSub' : (σ : Sub Γ Δ) -> Term Δ (subst σ A) -> Sub' (Γ & A) Δ
  301. data Sub {n m} Γ Δ where
  302. subI : Sub' Γ Δ -> Sub Γ Δ
  303. -- Performing substitution ------------------------------------------------
  304. subst' : {n m : Nat}{Γ : Context n}{Δ : Context m} -> Sub Γ Δ -> Type Γ -> Type Δ
  305. subst σ SET = SET
  306. subst σ A = subst' σ A
  307. liftS : {n m : Nat}{Γ : Context n}{A : Type Γ}{Δ : Context m} ->
  308. (σ : Sub Γ Δ) -> Sub (Γ & A) (Δ & subst σ A)
  309. substTerm : {n m : Nat}{Γ : Context n}{Δ : Context m}{A : Type Γ} ->
  310. (σ : Sub Γ Δ) -> Term Γ A -> Term Δ (subst σ A)
  311. subst' σ (Pi A B) = Pi (subst σ A) (subst (liftS σ) B)
  312. subst' σ (El t) = El (substTerm σ t)
  313. subst' σ SET = SET
  314. substTerm σ (var x) = {!!}
  315. substTerm σ (app s t eq) = {!!}
  316. substTerm σ (lam t eq) = {!!}
  317. -- Building substitutions -------------------------------------------------
  318. liftS {_}{_}{_}{A} σ = {!!} -- extSub (upS ∘ σ) (var fzero (substCompose upS σ A))
  319. -- Works with hidden args to substCompose when inlined in subst
  320. -- but not here. Weird.
  321. topS : {n : Nat}{Γ : Context n} -> Sub ∅ Γ
  322. topS = subI nil'
  323. extSub : {n m : Nat}{Γ : Context n}{A : Type Γ}{Δ : Context m}
  324. (σ : Sub Γ Δ) -> Term Δ (subst σ A) -> Sub (Γ & A) Δ
  325. extSub σ t = subI (extSub' σ t)
  326. idS : {n : Nat}{Γ : Context n} -> Sub Γ Γ
  327. idS {zero} {ctxI nil'} = topS
  328. idS {suc _} {ctxI (ext Γ A)} = {!!} -- extSub upS (var fzero refl)
  329. convert : {n : Nat}{Γ : Context n}{A B : Type Γ} -> A == B -> Term Γ B -> Term Γ A
  330. _∘_ : {n m p : Nat}{Γ : Context n}{Δ : Context m}{Θ : Context p} -> Sub Δ Θ -> Sub Γ Δ -> Sub Γ Θ
  331. substCompose : {n m p : Nat}{Γ : Context n}{Δ : Context m}{Θ : Context p}
  332. (σ : Sub Δ Θ)(δ : Sub Γ Δ)(A : Type Γ) ->
  333. subst (σ ∘ δ) A == subst σ (subst δ A)
  334. _∘_ {zero} {_}{_} {ctxI nil'} _ _ = topS
  335. _∘_ {suc _}{_}{_} {ctxI (ext Γ A)} σ (subI (extSub' δ t)) =
  336. extSub (σ ∘ δ) (convert (substCompose σ δ A) (substTerm σ t))
  337. upS : {n : Nat}{Γ : Context n}{A : Type Γ} -> Sub Γ (Γ & A)
  338. upS = {!!}
  339. substId : {n : Nat}{Γ : Context n}{A : Type Γ} -> subst idS A == A
  340. down t = extSub idS (convert substId t)
  341. -- Convertibility ---------------------------------------------------------
  342. A == B = {!!}
  343. refl : {n : Nat}{Γ : Context n}{A : Type Γ} -> A == A
  344. refl = {!!}
  345. cong f eq = {!!}
  346. ab trans bc = {!!}
  347. convert eq t = {!!}
  348. -- Properties -------------------------------------------------------------
  349. renameId : {n : Nat}{Γ : Context n}{A : Type Γ} -> rename idR A == A
  350. renameId = {!!}
  351. renameCompose : {n m p : Nat}{Γ : Context n}{Δ : Context m}{Θ : Context p}
  352. (σ : Ren Δ Θ)(δ : Ren Γ Δ)(A : Type Γ) ->
  353. rename (σ coR δ) A == rename σ (rename δ A)
  354. renameCompose σ δ A = {!!}
  355. substId = {!!}
  356. substCompose σ δ A = {!!}
  357. renameSubstCommute = {!!}