gt22

Untitled

Dec 12th, 2022
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.74 KB | None | 0 0
  1. \import Algebra.Field
  2. \import Algebra.Group
  3. \import Algebra.Monoid
  4. \import Algebra.Pointed
  5. \import Algebra.Ring
  6. \import Data.List
  7. \import Function.Meta
  8. \import Logic
  9. \import Meta
  10. \import Paths
  11. \import Paths.Meta
  12.  
  13. \open AddGroup(toZero, negative_zro)
  14. \open Ring(negative_*-right)
  15. \class VectorSpace (F : Field) \extends AbGroup
  16. | \infixl 7 * : F -> E -> E
  17. | *-compat (a b : F) (v : E) : a * (b * v) = a F.* b * v
  18. | *-ide (v : E) : F.ide * v = v
  19. | *-distrib-vector (a : F) (v u : E) : a * (v + u) = a * v + a * u
  20. | *-distrib-scalar (a b : F) (v : E) : (a F.+ b) * v = a * v + b * v
  21.  
  22. \lemma *-distrib-scalar' {V : VectorSpace} (a b : V.F) (v : V) : (a - b) * v = a * v + negative b * v =>
  23. unfold (-) $ *-distrib-scalar a (negative b) v
  24.  
  25. \lemma zro-* {V : VectorSpace} (v : V) : zro * v = zro =>
  26. inv $ consumeIsZro (ide * v, rewriteF zro-right $ *-distrib-scalar ide zro v)
  27. \where {
  28. \lemma consumeIsZro {G : AddGroup} {z : G} (p : \Sigma (x : G) (x = x + z)) : zro = z \elim p
  29. | (x,p) => rewriteF (negative-left, zro-left) $ rewriteI +-assoc $ pmap (negative x +) p
  30. }
  31.  
  32. \lemma negative-compat' {V : VectorSpace} (v : V) : negative ide * v = negative v =>
  33. \let
  34. | p => *-distrib-scalar' ide ide v
  35. | p' => rewrite (V.F.toZero {ide} {ide} idp, *-ide) p
  36. | p'' => rewrite (inv +-assoc, negative-left, zro-left, zro-right) $ pmap (negative v +) $ inv p' *> zro-* v
  37. \in p''
  38.  
  39. \lemma negative-compat {V : VectorSpace} {a : V.F} {v : V} : negative a * v = a * negative v =>
  40. \let
  41. | q => rewrite (negative_*-right, ide-right) $ *-compat a (negative ide) v
  42. \in inv $ pmap (a *) (inv $ negative-compat' v) *> q
  43.  
  44. \lemma negative_* {V : VectorSpace} {a : V.F} {v : V} : negative (a * v) = a * negative v =>
  45. \let
  46. | p => unfold (-) $ V.toZero {a V.* v} {a * v} idp
  47. | q : zro = (a * v) + a * negative v => rewriteI (*-distrib-vector, inv negative-right) $ inv $ *-zro a
  48. \in AddGroup.cancel-left (a * v) $ p *> q
  49.  
  50. \lemma negative_*' {V : VectorSpace} {a : V.F} {v : V} : negative (a * v) = negative a * v =>
  51. negative_* *> inv negative-compat
  52.  
  53. \lemma *-zro {V : VectorSpace} (a : V.F) : a * zro = zro =>
  54. \let
  55. | p => rewriteF (inv negative-compat) $ pmap (a * ) (inv negative-right) *> *-distrib-vector a zro (negative zro)
  56. \in rewriteF (negative-right, zro-*) $ p *> (inv $ *-distrib-scalar a (negative a) zro)
  57.  
  58. \data LinComb {V : VectorSpace} (xs : List V) (v : V) \elim xs
  59. | nil => lc-nil (v = zro)
  60. | :: x xs => lc-cons (a : V.F) (LinComb xs (v - a * x))
  61. \where {
  62.  
  63. \lemma transport-nil {V : VectorSpace} {v u : V} {e : v = zro} (p : v = u) : transport (LinComb nil) p (lc-nil e) = lc-nil (transport (\lam x => x = V.zro) p e) \elim p
  64. | idp => idp
  65.  
  66. \lemma transport-cons {V : VectorSpace} {vs : List V} {x v u : V} {a : V.F} {t : LinComb vs (v - a * x)} (p : v = u) : transport (LinComb (x :: vs)) p (lc-cons a t) = lc-cons a (transport (\lam e => LinComb vs (e - a * x)) p t) \elim p
  67. | idp => idp
  68.  
  69. \lemma lc-cons-ext {V : VectorSpace} {vs : List V} {x v : V} {a a' : V.F}
  70. {t : LinComb vs (v - a * x)} {t' : LinComb vs (v - a' * x)}
  71. (p : a' = a) (q : t = transport (\lam s => LinComb vs (v - s * x)) p t')
  72. : lc-cons a t = lc-cons a' t' \elim p
  73. | idp => pmap (lc-cons a) q
  74.  
  75. \func extend {V : VectorSpace} (vs : List V) (v u : V) (p : LinComb vs u) : LinComb (v :: vs) u =>
  76. lc-cons zro (unfold (-) $ rewrite (zro-*, negative_zro, zro-right) p)
  77.  
  78. \func lin-+ {V : VectorSpace} {vs : List V} {u w : V} (p : LinComb vs u) (q : LinComb vs w) : LinComb vs (u + w) \elim vs, p, q
  79. | nil, lc-nil p, lc-nil q => lc-nil $ pmap2 (+) p q *> zro-right
  80. | :: v vs, lc-cons a p, lc-cons b q => lc-cons (a + b) (rewriteI arith-helper $ lin-+ p q)
  81. \where {
  82. \lemma arith-helper {V : VectorSpace} {a b : V.F} {v u w : V}
  83. : u - a * v + (w - b * v) = u + w - (a + b) * v =>
  84. \let a' => V.F.negative a | b' => V.F.negative b \in
  85. (u - a * v) + (w - b * v) ==< unfold (-) (repeat (rewrite (negative_*, inv negative-compat)) idp) >==
  86. (u + a' * v) + (w + b' * v) ==< inv +-assoc >==
  87. ((u + a' * v) + w) + b' * v ==< pmap (`+ _) +-assoc >==
  88. (u + (a' * v + w)) + b' * v ==< pmap (`+ _) (pmap (_ +) +-comm) >==
  89. (u + (w + a' * v)) + b' * v ==< inv (pmap (`+ _) +-assoc) >==
  90. ((u + w) + a' * v) + b' * v ==< +-assoc >==
  91. (u + w) + (a' * v + b' * v) ==< inv (pmap (_ +) (*-distrib-scalar a' b' v)) >==
  92. u + w + (a' + b') * v ==< pmap (_ +) (pmap (`* _) negative_+' *> inv negative_*') >==
  93. u + w - (a + b) * v `qed
  94. }
  95.  
  96. \lemma lin-+-assoc {V : VectorSpace} {vs : List V} {u w l : V} (p : LinComb vs u) (q : LinComb vs w) (k : LinComb vs l) : p `lin-+` (q `lin-+` k) = transport (LinComb vs) +-assoc ((p `lin-+` q) `lin-+` k) \elim vs, p, q, k
  97. | nil, lc-nil p, lc-nil q, lc-nil k => rewrite transport-nil $ pmap lc-nil $ Path.inProp _ _
  98. | :: v vs, lc-cons a p, lc-cons b q, lc-cons c k => rewrite transport-cons $ lc-cons-ext +-assoc {?}
  99.  
  100. \func negative_+' {G : AbGroup} {a b : G} : G.negative a G.+ G.negative b = G.negative (a G.+ b) =>
  101. (unfold (-) $ G.+-comm) *> inv G.negative_+
  102.  
  103. \func lin-* {V : VectorSpace} {vs : List V} {u : V} (a : V.F) (p : LinComb vs u) : LinComb vs (a * u) \elim vs, p
  104. | nil, lc-nil idp => lc-nil $ *-zro a
  105. | :: v vs, lc-cons b p => lc-cons (a V.F.* b) (rewriteF (*-distrib-vector, negative_*, *-compat, inv negative_*) $ lin-* a p)
  106.  
  107. \func negative {V : VectorSpace} {vs : List V} {u : V} (p : LinComb vs u) : LinComb vs (V.negative u) \elim vs, p
  108. | nil, lc-nil p => lc-nil $ pmap V.negative p *> negative_zro
  109. | :: v vs, lc-cons a p => lc-cons (V.F.negative a) (rewriteF (inv negative_+', negative_*') $ negative p)
  110.  
  111. \func trans {V : VectorSpace} {vs ws : List V} (p : \Pi (k : Fin (length ws)) -> LinComb vs (ws !! k)) {u : V} (q : LinComb ws u) : LinComb vs u \elim vs, ws, q
  112. | nil, nil, lc-nil idp => lc-nil idp
  113. | nil, :: w ws, lc-cons a q =>
  114. \let
  115. | (lc-nil p') => p 0
  116. \in rewriteF (p', *-zro, negative_zro, zro-right) $ unfold (-) $ trans (\lam k => p (suc k)) q
  117. | :: v vs, nil, q => extend vs v u $ trans (\lam k => \case k) q
  118. | :: v vs, :: w ws, lc-cons a q => rewriteF (inv +-assoc, +-comm, inv +-assoc, negative-left, zro-left)
  119. $ lin-+ (lin-* a $ p 0) $ trans (\lam k => p (suc k)) q
  120. }
  121.  
  122. \data TrivialComp {V : VectorSpace} {xs : List V} {v : V} (p : LinComb xs v) \elim xs, p
  123. | nil, lc-nil _ => nil-trivial
  124. | :: x xs, lc-cons a p => cons-trivial (zro = a) (TrivialComp p)
  125. \where {
  126. \func pmap3 {A B C D : \Type} (f : A -> B -> C -> D) {a a' : A} (p : a = a') {b b' : B} (q : b = b') {c c' : C} (r : c = c') : f a b c = f a' b' c' =>
  127. path (\lam i => f (p @ i) (q @ i) (r @ i))
  128.  
  129. \lemma singleTrivial {V : VectorSpace} {xs : List V} {v : V} {a b : LinComb xs v} (p : TrivialComp a) (q : TrivialComp b) : a = b
  130. \elim xs, a, b, p, q
  131. | nil, lc-nil p, lc-nil q, nil-trivial, nil-trivial => pmap lc-nil $ Path.inProp p q
  132. | :: x xs, lc-cons n a, lc-cons m b, cons-trivial idp p, cons-trivial idp q =>
  133. pmap (lc-cons zro) (singleTrivial p q)
  134. }
  135.  
  136. \func makeTrivialComp {V : VectorSpace} (xs : List V) : \Sigma (p : LinComb xs zro) (TrivialComp p) =>
  137. makeTrivialComp' xs idp
  138. \where {
  139. \func makeTrivialComp' {V : VectorSpace} (xs : List V) {v : V} (e : v = zro) : \Sigma (p : LinComb xs v) (TrivialComp p) \elim xs
  140. | nil => (lc-nil e, nil-trivial)
  141. | :: x xs =>
  142. \let
  143. | k : v - zro * x = zro => rewrite e $ zro-left *> pmap negative (zro-* x) *> negative_zro
  144. | (p, q) => makeTrivialComp' xs k
  145. \in (lc-cons zro p, cons-trivial idp q)
  146. }
  147.  
  148. \func LinIndep {V : VectorSpace} (vs : List V) => \Pi (p : LinComb vs zro) -> TrivialComp p
  149. \where {
  150. \func uniqueness {V : VectorSpace} (vs : List V) : LinIndep vs <-> (\Pi {x : V} (p q : LinComb vs x) -> p = q) =>
  151. (
  152. \lam l {x} p q =>
  153. \let
  154. | (p', k) => reduceComp p q
  155. | (q', k') => reduceComp q q
  156. | pq : p' = q' => TrivialComp.singleTrivial (l p') (l q')
  157. \in k *> rewrite pq idp *> inv k',
  158. \lam f p => \let (z, q) => makeTrivialComp vs \in rewrite (f p z) q
  159. )
  160.  
  161. \func reduceComp {V : VectorSpace} {vs : List V} {v : V} (p : LinComb vs v) (q : LinComb vs v)
  162. : \Sigma (x : LinComb vs zro) (p = transport (LinComb vs) zro-left (LinComb.lin-+ x q))
  163. => {?} -- (transport (LinComb vs) negative-right (LinComb.lin-+ p (LinComb.negative q)), reduceComp' p q)
  164. \where {
  165. \func reduceComp' {V : VectorSpace} {vs : List V} {v u : V} (p : LinComb vs v) (q : LinComb vs u)
  166. : p = transport (LinComb vs) arith-helper
  167. (LinComb.lin-+ (LinComb.lin-+ p (LinComb.negative q)) q) \elim vs, p, q
  168. | nil, lc-nil p, lc-nil q => {?} -- rewrite helper $ pmap lc-nil (Path.inProp _ _)
  169. | :: x vs, lc-cons a p, lc-cons b q => {?} -- rewrite helper' $ lc-cons-ext arith-helper {?}
  170.  
  171. \lemma arith-helper {F : AbGroup} {a b : F} : a F.+ negative b F.+ b = a
  172. => F.+-assoc *> pmap (a F.+) F.negative-left *> F.zro-right
  173. }
  174. }
  175.  
  176. \func LinDep {V : VectorSpace} (vs : List V) => \Sigma (p : LinComb vs zro) (Not $ TrivialComp p)
  177.  
  178. \func DepIndep {V : VectorSpace} (vs : List V) (p : LinIndep vs) (q : LinDep vs) : Empty =>
  179. \let (l, q') => q | p' => p l \in q' p'
  180.  
  181. --\func zrp-dep {V : VectorSpace} : LinDep (zro :: nil) =>
  182. -- (lc-cons ide zro (rewrite *-zro $ inv zro-left) (lc-nil idp), \lam t => \case t \with {
  183. -- | cons-trivial p _ => zro/=ide p
  184. -- })
  185.  
  186. \func Spans {V : VectorSpace} (vs : List V) => \Pi (x : V) -> LinComb vs x
  187.  
  188. \func Basis {V : VectorSpace} (vs : List V) =>
  189. \Pi (x : V) -> \Sigma (p : LinComb vs x) (\Pi (q : LinComb vs x) -> p = q)
  190. \where {
  191. \func spans {V : VectorSpace} (vs : List V) (b : Basis vs) : Spans vs => \lam x => (b x).1
  192.  
  193. \func indep {V : VectorSpace} (vs : List V) (b : Basis vs) : LinIndep vs => \lam p => {?}
  194.  
  195. \func Basis-maximal-indep {V : VectorSpace} (vs : List V) => \Sigma (LinIndep vs) (\Pi (v : V) -> LinDep (v :: vs))
  196. \where {
  197. \func fromBasis {V : VectorSpace} (vs : List V) : Basis vs -> Basis-maximal-indep vs => \lam b => (
  198. \lam p => {?},
  199. \lam v => {?}
  200. )
  201. }
  202. }
  203.  
  204. \data BasisComb {V : VectorSpace} {xs : List V} (b : Basis xs) (v : V)
  205. | basis (LinComb xs v)
  206. \where {
  207. \use \level isProp {V : VectorSpace} {xs : List V} {b : Basis xs} {v : V} (p q : BasisComb b v) : p = q \elim p, q
  208. | basis p, basis q => pmap basis $ (inv $ (b v).2 p) *> (b v).2 q
  209. }
  210.  
  211.  
Advertisement
Add Comment
Please, Sign In to add comment