@@ -56,74 +56,59 @@ groupInverseIsInverseL x =
5656public export
5757inverseSquaredIsIdentity : Group ty => (x : ty) ->
5858 inverse (inverse x) = x
59- -- inverseSquaredIsIdentity x =
60- -- let x' = inverse x in
61- -- uniqueInverse
62- -- x'
63- -- (inverse x')
64- -- x
65- -- (groupInverseIsInverseR x')
66- -- (groupInverseIsInverseR x)
59+ inverseSquaredIsIdentity {ty} x =
60+ uniqueInverse
61+ (inverse x)
62+ (inverse $ inverse x)
63+ x
64+ (groupInverseIsInverseR $ inverse x)
65+ (groupInverseIsInverseR x)
6766
6867||| If every square in a group is identity, the group is commutative.
6968public export
7069squareIdCommutative : Group ty => (x, y : ty) ->
7170 ((a : ty) -> a <+> a = neutral {ty}) ->
7271 x <+> y = y <+> x
73- -- squareIdCommutative x y p =
74- -- let
75- -- xy = x <+> y
76- -- yx = y <+> x
77- -- in
78- -- uniqueInverse xy xy yx (p xy) prop where
79- -- prop : (x <+> y) <+> (y <+> x) = neutral {ty}
80- -- prop =
81- -- rewrite sym $ semigroupOpIsAssociative x y (y <+> x) in
82- -- rewrite semigroupOpIsAssociative y y x in
83- -- rewrite p y in
84- -- rewrite monoidNeutralIsNeutralR x in
85- -- p x
72+ squareIdCommutative x y p =
73+ uniqueInverse (x <+> y) (x <+> y) (y <+> x) (p (x <+> y)) prop where
74+ prop : (x <+> y) <+> (y <+> x) = neutral {ty}
75+ prop =
76+ rewrite sym $ semigroupOpIsAssociative x y (y <+> x) in
77+ rewrite semigroupOpIsAssociative y y x in
78+ rewrite p y in
79+ rewrite monoidNeutralIsNeutralR x in
80+ p x
8681
8782||| -0 = 0
8883public export
8984inverseNeutralIsNeutral : Group ty =>
9085 inverse (neutral {ty}) = neutral {ty}
91- -- inverseNeutralIsNeutral {ty} =
92- -- let e = neutral {ty} in
93- -- rewrite sym $ cong inverse (groupInverseIsInverseL e) in
94- -- rewrite monoidNeutralIsNeutralR $ inverse e in
95- -- inverseSquaredIsIdentity e
86+ inverseNeutralIsNeutral {ty} =
87+ rewrite sym $ cong inverse (groupInverseIsInverseL (neutral {ty})) in
88+ rewrite monoidNeutralIsNeutralR $ inverse (neutral {ty}) in
89+ inverseSquaredIsIdentity (neutral {ty})
9690
97- ||| -(x + y) = -y + -x
98- public export
99- inverseOfSum : Group ty => (l, r : ty) ->
100- inverse (l <+> r) = inverse r <+> inverse l
91+ -- ||| -(x + y) = -y + -x
92+ -- public export
93+ -- inverseOfSum : Group ty => (l, r : ty) ->
94+ -- inverse (l <+> r) = inverse r <+> inverse l
10195-- inverseOfSum {ty} l r =
102- -- let
103- -- e = neutral {ty}
104- -- il = inverse l
105- -- ir = inverse r
106- -- lr = l <+> r
107- -- ilr = inverse lr
108- -- iril = ir <+> il
109- -- ile = il <+> e
110- -- in
11196-- -- expand
112- -- rewrite sym $ monoidNeutralIsNeutralR ilr in
97+ -- rewrite sym $ monoidNeutralIsNeutralR $ inverse $ l <+> r in
11398-- rewrite sym $ groupInverseIsInverseR r in
114- -- rewrite sym $ monoidNeutralIsNeutralL ir in
99+ -- rewrite sym $ monoidNeutralIsNeutralL $ inverse r in
115100-- rewrite sym $ groupInverseIsInverseR l in
116101-- -- shuffle
117- -- rewrite semigroupOpIsAssociative ir il l in
118- -- rewrite sym $ semigroupOpIsAssociative iril l r in
119- -- rewrite sym $ semigroupOpIsAssociative iril lr ilr in
102+ -- rewrite semigroupOpIsAssociative (inverse r) (inverse l) l in
103+ -- rewrite sym $ semigroupOpIsAssociative (inverse r <+> inverse l) l r in
104+ -- rewrite sym $ semigroupOpIsAssociative (inverse r <+> inverse l) (l <+> r) (inverse $ l <+> r) in
120105-- -- contract
121- -- rewrite sym $ monoidNeutralIsNeutralL il in
122- -- rewrite groupInverseIsInverseL lr in
123- -- rewrite sym $ semigroupOpIsAssociative (ir <+> ile) l ile in
124- -- rewrite semigroupOpIsAssociative l il e in
106+ -- rewrite sym $ monoidNeutralIsNeutralL $ inverse l in
107+ -- rewrite groupInverseIsInverseL $ l <+> r in
108+ -- rewrite sym $ semigroupOpIsAssociative (inverse r <+> (inverse l <+> neutral)) l (inverse l <+> neutral) in
109+ -- rewrite semigroupOpIsAssociative l (inverse l) neutral in
125110-- rewrite groupInverseIsInverseL l in
126- -- rewrite monoidNeutralIsNeutralL e in
111+ -- rewrite monoidNeutralIsNeutralL $ the ty neutral in
127112-- Refl
128113
129114||| y = z if x + y = x + z
@@ -173,16 +158,15 @@ public export
173158latinSquareProperty : Group ty => (a, b : ty) ->
174159 ((x : ty ** a <+> x = b),
175160 (y : ty ** y <+> a = b))
176- -- latinSquareProperty a b =
177- -- let a' = inverse a in
178- -- (((a' <+> b) **
179- -- rewrite semigroupOpIsAssociative a a' b in
180- -- rewrite groupInverseIsInverseL a in
181- -- monoidNeutralIsNeutralR b),
182- -- (b <+> a' **
183- -- rewrite sym $ semigroupOpIsAssociative b a' a in
184- -- rewrite groupInverseIsInverseR a in
185- -- monoidNeutralIsNeutralL b))
161+ latinSquareProperty a b =
162+ ((((inverse a) <+> b) **
163+ rewrite semigroupOpIsAssociative a (inverse a) b in
164+ rewrite groupInverseIsInverseL a in
165+ monoidNeutralIsNeutralR b),
166+ (b <+> (inverse a) **
167+ rewrite sym $ semigroupOpIsAssociative b (inverse a) a in
168+ rewrite groupInverseIsInverseR a in
169+ monoidNeutralIsNeutralL b))
186170
187171||| For any a, b, x, the solution to ax = b is unique.
188172public export
@@ -196,13 +180,13 @@ uniqueSolutionL : Group t => (a, b, x, y : t) ->
196180 x <+> a = b -> y <+> a = b -> x = y
197181uniqueSolutionL a b x y p q = cancelRight a x y $ trans p (sym q)
198182
199- ||| -(x + y) = -x + -y
200- public export
201- inverseDistributesOverGroupOp : AbelianGroup ty => (l, r : ty) ->
202- inverse (l <+> r) = inverse l <+> inverse r
203- inverseDistributesOverGroupOp l r =
204- rewrite groupOpIsCommutative (inverse l) (inverse r) in
205- inverseOfSum l r
183+ -- ||| -(x + y) = -x + -y
184+ -- public export
185+ -- inverseDistributesOverGroupOp : AbelianGroup ty => (l, r : ty) ->
186+ -- inverse (l <+> r) = inverse l <+> inverse r
187+ -- inverseDistributesOverGroupOp l r =
188+ -- rewrite groupOpIsCommutative (inverse l) (inverse r) in
189+ -- inverseOfSum l r
206190
207191||| Homomorphism preserves neutral.
208192public export
@@ -230,77 +214,53 @@ homoInverse x =
230214public export
231215multNeutralAbsorbingL : Ring ty => (r : ty) ->
232216 neutral {ty} <.> r = neutral {ty}
233- -- multNeutralAbsorbingL {ty} r =
234- -- let
235- -- e = neutral {ty}
236- -- ir = inverse r
237- -- exr = e <.> r
238- -- iexr = inverse exr
239- -- in
240- -- rewrite sym $ monoidNeutralIsNeutralR exr in
241- -- rewrite sym $ groupInverseIsInverseR exr in
242- -- rewrite sym $ semigroupOpIsAssociative iexr exr ((iexr <+> exr) <.> r) in
243- -- rewrite groupInverseIsInverseR exr in
244- -- rewrite sym $ ringOpIsDistributiveR e e r in
245- -- rewrite monoidNeutralIsNeutralR e in
246- -- groupInverseIsInverseR exr
217+ multNeutralAbsorbingL {ty} r =
218+ rewrite sym $ monoidNeutralIsNeutralR $ neutral <.> r in
219+ rewrite sym $ groupInverseIsInverseR $ neutral <.> r in
220+ rewrite sym $ semigroupOpIsAssociative (inverse $ neutral <.> r) (neutral <.> r) (((inverse $ neutral <.> r) <+> (neutral <.> r)) <.> r) in
221+ rewrite groupInverseIsInverseR $ neutral <.> r in
222+ rewrite sym $ ringOpIsDistributiveR neutral neutral r in
223+ rewrite monoidNeutralIsNeutralR $ the ty neutral in
224+ groupInverseIsInverseR $ neutral <.> r
247225
248226||| x0 = 0
249227public export
250228multNeutralAbsorbingR : Ring ty => (l : ty) ->
251229 l <.> neutral {ty} = neutral {ty}
252- -- multNeutralAbsorbingR {ty} l =
253- -- let
254- -- e = neutral {ty}
255- -- il = inverse l
256- -- lxe = l <.> e
257- -- ilxe = inverse lxe
258- -- in
259- -- rewrite sym $ monoidNeutralIsNeutralL lxe in
260- -- rewrite sym $ groupInverseIsInverseL lxe in
261- -- rewrite semigroupOpIsAssociative (l <.> (lxe <+> ilxe)) lxe ilxe in
262- -- rewrite groupInverseIsInverseL lxe in
263- -- rewrite sym $ ringOpIsDistributiveL l e e in
264- -- rewrite monoidNeutralIsNeutralL e in
265- -- groupInverseIsInverseL lxe
230+ multNeutralAbsorbingR {ty} l =
231+ rewrite sym $ monoidNeutralIsNeutralL $ l <.> neutral in
232+ rewrite sym $ groupInverseIsInverseL $ l <.> neutral in
233+ rewrite semigroupOpIsAssociative (l <.> ((l <.> neutral) <+> (inverse $ l <.> neutral))) (l <.> neutral) (inverse $ l <.> neutral) in
234+ rewrite groupInverseIsInverseL $ l <.> neutral in
235+ rewrite sym $ ringOpIsDistributiveL l neutral neutral in
236+ rewrite monoidNeutralIsNeutralL $ the ty neutral in
237+ groupInverseIsInverseL $ l <.> neutral
266238
267239||| (-x)y = -(xy)
268240public export
269241multInverseInversesL : Ring ty => (l, r : ty) ->
270242 inverse l <.> r = inverse (l <.> r)
271- -- multInverseInversesL l r =
272- -- let
273- -- il = inverse l
274- -- lxr = l <.> r
275- -- ilxr = il <.> r
276- -- i_lxr = inverse lxr
277- -- in
278- -- rewrite sym $ monoidNeutralIsNeutralR ilxr in
279- -- rewrite sym $ groupInverseIsInverseR lxr in
280- -- rewrite sym $ semigroupOpIsAssociative i_lxr lxr ilxr in
281- -- rewrite sym $ ringOpIsDistributiveR l il r in
282- -- rewrite groupInverseIsInverseL l in
283- -- rewrite multNeutralAbsorbingL r in
284- -- monoidNeutralIsNeutralL i_lxr
243+ multInverseInversesL l r =
244+ rewrite sym $ monoidNeutralIsNeutralR $ inverse l <.> r in
245+ rewrite sym $ groupInverseIsInverseR $ l <.> r in
246+ rewrite sym $ semigroupOpIsAssociative (inverse $ l <.> r) (l <.> r) (inverse l <.> r) in
247+ rewrite sym $ ringOpIsDistributiveR l (inverse l) r in
248+ rewrite groupInverseIsInverseL l in
249+ rewrite multNeutralAbsorbingL r in
250+ monoidNeutralIsNeutralL $ inverse $ l <.> r
285251
286252||| x(-y) = -(xy)
287253public export
288254multInverseInversesR : Ring ty => (l, r : ty) ->
289255 l <.> inverse r = inverse (l <.> r)
290- -- multInverseInversesR l r =
291- -- let
292- -- ir = inverse r
293- -- lxr = l <.> r
294- -- lxir = l <.> ir
295- -- ilxr = inverse lxr
296- -- in
297- -- rewrite sym $ monoidNeutralIsNeutralL lxir in
298- -- rewrite sym $ groupInverseIsInverseL lxr in
299- -- rewrite semigroupOpIsAssociative lxir lxr ilxr in
300- -- rewrite sym $ ringOpIsDistributiveL l ir r in
301- -- rewrite groupInverseIsInverseR r in
302- -- rewrite multNeutralAbsorbingR l in
303- -- monoidNeutralIsNeutralR ilxr
256+ multInverseInversesR l r =
257+ rewrite sym $ monoidNeutralIsNeutralL $ l <.> (inverse r) in
258+ rewrite sym $ groupInverseIsInverseL (l <.> r) in
259+ rewrite semigroupOpIsAssociative (l <.> (inverse r)) (l <.> r) (inverse $ l <.> r) in
260+ rewrite sym $ ringOpIsDistributiveL l (inverse r) r in
261+ rewrite groupInverseIsInverseR r in
262+ rewrite multNeutralAbsorbingR l in
263+ monoidNeutralIsNeutralR $ inverse $ l <.> r
304264
305265||| (-x)(-y) = xy
306266public export
0 commit comments