Skip to content

Commit 028a1cb

Browse files
committed
Cut some let bindings
1 parent d7ca30b commit 028a1cb

1 file changed

Lines changed: 82 additions & 122 deletions

File tree

libs/contrib/Control/Algebra/Laws.idr

Lines changed: 82 additions & 122 deletions
Original file line numberDiff line numberDiff line change
@@ -56,74 +56,59 @@ groupInverseIsInverseL x =
5656
public export
5757
inverseSquaredIsIdentity : 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.
6968
public export
7069
squareIdCommutative : 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
8883
public export
8984
inverseNeutralIsNeutral : 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
173158
latinSquareProperty : 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.
188172
public export
@@ -196,13 +180,13 @@ uniqueSolutionL : Group t => (a, b, x, y : t) ->
196180
x <+> a = b -> y <+> a = b -> x = y
197181
uniqueSolutionL 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.
208192
public export
@@ -230,77 +214,53 @@ homoInverse x =
230214
public export
231215
multNeutralAbsorbingL : 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
249227
public export
250228
multNeutralAbsorbingR : 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)
268240
public export
269241
multInverseInversesL : 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)
287253
public export
288254
multInverseInversesR : 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
306266
public export

0 commit comments

Comments
 (0)