2024-11-22 10:36:51 -08:00
|
|
|
@include logic.pg
|
2024-11-20 07:37:57 -08:00
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
section Magma
|
2024-11-20 07:37:57 -08:00
|
|
|
|
2025-01-05 11:15:41 -08:00
|
|
|
variable (G H : ★);
|
|
|
|
|
def binop (A : ★) := A → A → A;
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
def = := eq G;
|
|
|
|
|
infixl 1 =;
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2025-01-05 11:15:41 -08:00
|
|
|
def ~ := eq H;
|
|
|
|
|
infixl 1 ~;
|
|
|
|
|
|
|
|
|
|
variable (* : binop G);
|
2024-12-22 13:16:32 -08:00
|
|
|
infixl 20 *;
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2025-01-05 11:15:41 -08:00
|
|
|
variable (+ : binop H);
|
|
|
|
|
infixl 20 +;
|
|
|
|
|
|
|
|
|
|
variable (f : G → H);
|
|
|
|
|
hypothesis (f_homo : forall (a b : G), f (a * b) ~ f a * f b);
|
|
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
def *> (a b : G) := b * a;
|
|
|
|
|
infixl 20 *>;
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2024-12-13 22:45:37 -08:00
|
|
|
section Semigroup
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2025-01-05 11:15:41 -08:00
|
|
|
hypothesis (assocG : forall (a b c : G), a * (b * c) = a * b * c);
|
|
|
|
|
hypothesis (assocH : forall (a b c : H), a + (b + c) ~ a + b + c);
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
def assoc_op (a b c : G) : a *> (b *> c) = a *> b *> c :=
|
2025-01-05 11:15:41 -08:00
|
|
|
eq_sym G (a *> b *> c) (a *> (b *> c)) (assocG c b a);
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
section Monoid
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
variable (e : G);
|
2025-01-05 11:15:41 -08:00
|
|
|
variable (eH : H);
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2025-01-05 11:15:41 -08:00
|
|
|
hypothesis (id_lG : forall (a : G), e * a = a);
|
|
|
|
|
hypothesis (id_rG : forall (a : G), a * e = a);
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2025-01-05 11:15:41 -08:00
|
|
|
hypothesis (id_lH : forall (a : H), e * a = a);
|
|
|
|
|
hypothesis (id_rH : forall (a : H), a * e = a);
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2025-01-05 11:15:41 -08:00
|
|
|
def id_l_op : forall (a : G), e *> a = a := id_rG;
|
|
|
|
|
def id_r_op : forall (a : G), a *> e = a := id_lG;
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2025-01-05 11:15:41 -08:00
|
|
|
def left_id_unique (a : G) (H : forall (b : G), a * b = b) : a = e :=
|
|
|
|
|
eq_trans G a (a * e) e (eq_sym G (a * e) a (id_rG a)) (H e);
|
|
|
|
|
|
|
|
|
|
def right_id_unique (a : G) (H : forall (b : G), b * a = b) : a = e := #left_id_unique G (*>) e id_lG a H;
|
2024-12-06 15:59:22 -08:00
|
|
|
|
|
|
|
|
section Group
|
|
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
variable (i : G → G);
|
2025-01-05 11:15:41 -08:00
|
|
|
hypothesis (inv_lG : forall (a : G), i a * a = e);
|
|
|
|
|
hypothesis (inv_rG : forall (a : G), a * i a = e);
|
|
|
|
|
|
|
|
|
|
variable (j : H → H);
|
|
|
|
|
hypothesis (inv_lH : forall (a : H), j a * a ~ eH);
|
|
|
|
|
hypothesis (inv_rH : forall (a : H), a * j a ~ eH);
|
2024-12-06 15:59:22 -08:00
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
def left_inv_unique (a b : G) (h : b * a = e) : b = i a :=
|
|
|
|
|
eq_trans G b (b * e) (i a)
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_sym G (b * e) b (id_rG b))
|
2024-12-10 20:31:53 -08:00
|
|
|
(eq_trans G (b * e) (b * (a * i a)) (i a)
|
2024-12-10 23:36:34 -08:00
|
|
|
(eq_cong G G e (a * i a) ((*) b)
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_sym G (a * i a) e (inv_rG a)))
|
2024-12-10 20:31:53 -08:00
|
|
|
(eq_trans G (b * (a * i a)) (b * a * i a) (i a)
|
2025-01-05 11:15:41 -08:00
|
|
|
(assocG b a (i a))
|
2024-12-10 20:31:53 -08:00
|
|
|
(eq_trans G (b * a * i a) (e * i a) (i a)
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_cong G G (b * a) e ([z : G] z * i a) h)
|
2025-01-05 11:15:41 -08:00
|
|
|
(id_lG (i a)))));
|
2024-12-22 13:16:32 -08:00
|
|
|
|
|
|
|
|
def right_inv_unique (a b : G) (h : a * b = e) : b = i a :=
|
2025-01-05 11:15:41 -08:00
|
|
|
#left_inv_unique G (*>) assoc_op e id_rG id_lG i inv_lG a b h;
|
|
|
|
|
|
2024-12-22 13:16:32 -08:00
|
|
|
def inverse_involutive (a : G) : i (i a) = a :=
|
2025-01-05 11:15:41 -08:00
|
|
|
eq_sym G a (i (i a)) (right_inv_unique (i a) a (inv_lG a));
|
2024-12-22 13:16:32 -08:00
|
|
|
|
|
|
|
|
def shoes_and_socks (a b : G) : i (a * b) = i b * i a :=
|
|
|
|
|
eq_sym G (i b * i a) (i (a * b))
|
|
|
|
|
(right_inv_unique (a * b) (i b * i a)
|
|
|
|
|
(let
|
|
|
|
|
(under_ai (x y : G) (h : x = y) := eq_cong G G x y ([z : G] z * (i a)) h)
|
|
|
|
|
in
|
|
|
|
|
eq_trans G (a * b * (i b * i a)) (a * b * i b * i a) e
|
2025-01-05 11:15:41 -08:00
|
|
|
(assocG (a * b) (i b) (i a))
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (a * b * i b * i a) (a * (b * i b) * i a) e
|
2025-01-05 11:15:41 -08:00
|
|
|
(under_ai (a * b * i b) (a * (b * i b)) (eq_sym G (a * (b * i b)) (a * b * i b) (assocG a b (i b))))
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (a * (b * i b) * i a) (a * e * i a) e
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_cong G G (b * i b) e (fun (x : G) => (a * x * i a)) (inv_rG b))
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (a * e * i a) (a * i a) e
|
2025-01-05 11:15:41 -08:00
|
|
|
(under_ai (a * e) a (id_rG a))
|
|
|
|
|
(inv_rG a))))
|
2024-12-22 13:16:32 -08:00
|
|
|
end));
|
|
|
|
|
|
|
|
|
|
def cancel_l (a b c : G) (h : a * b = a * c) : b = c :=
|
|
|
|
|
eq_trans G b (e * b) c
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_sym G (e * b) b (id_lG b))
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (e * b) (i a * a * b) c
|
|
|
|
|
(eq_cong G G e (i a * a) ([x : G] x * b)
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_sym G (i a * a) e (inv_lG a)))
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (i a * a * b) (i a * (a * b)) c
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_sym G (i a * (a * b)) (i a * a * b) (assocG (i a) a b))
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (i a * (a * b)) (i a * (a * c)) c
|
|
|
|
|
(eq_cong G G (a * b) (a * c) ((*) (i a)) h)
|
|
|
|
|
(eq_trans G (i a * (a * c)) (i a * a * c) c
|
2025-01-05 11:15:41 -08:00
|
|
|
(assocG (i a) a c)
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (i a * a * c) (e * c) c
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_cong G G (i a * a) e ([x : G] x * c) (inv_lG a))
|
|
|
|
|
(id_lG c))))));
|
2024-12-22 13:16:32 -08:00
|
|
|
|
|
|
|
|
def cancel_r (a b c : G) (h : b * a = c * a) : b = c :=
|
2025-01-05 11:15:41 -08:00
|
|
|
#cancel_l G (*>) assoc_op e id_rG i inv_rG a b c h;
|
2024-12-22 13:16:32 -08:00
|
|
|
|
|
|
|
|
def abelian : ★ := forall (a b : G), a * b = b * a;
|
|
|
|
|
|
|
|
|
|
def left_right_cancel : (forall (x y z : G), x * y = z * x → y = z) → abelian :=
|
|
|
|
|
fun (h : forall (x y z : G), x * y = z * x → y = z) (a b : G) =>
|
|
|
|
|
h (i a) (a * b) (b * a)
|
|
|
|
|
(eq_trans G (i a * (a * b)) (i a * a * b) (b * a * i a)
|
2025-01-05 11:15:41 -08:00
|
|
|
(assocG (i a) a b)
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (i a * a * b) (e * b) (b * a * i a)
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_cong G G (i a * a) e ([x : G] x * b) (inv_lG a))
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (e * b) b (b * a * i a)
|
2025-01-05 11:15:41 -08:00
|
|
|
(id_lG b)
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G b (b * e) (b * a * i a)
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_sym G (b * e) b (id_rG b))
|
2024-12-22 13:16:32 -08:00
|
|
|
(eq_trans G (b * e) (b * (a * i a)) (b * a * i a)
|
2025-01-05 11:15:41 -08:00
|
|
|
(eq_cong G G e (a * i a) ((*) b) (eq_sym G (a * i a) e (inv_rG a)))
|
|
|
|
|
(assocG b a (i a)))))));
|
2024-12-22 13:16:32 -08:00
|
|
|
|
|
|
|
|
def inv_distrib_abelian : (forall (a b : G), i (a * b) = i a * i b) → abelian :=
|
|
|
|
|
fun (h : forall (a b : G), i (a * b) = i a * i b) (a b : G) =>
|
|
|
|
|
eq_trans G (a * b) (i (i a) * b) (b * a)
|
|
|
|
|
(eq_cong G G a (i (i a)) ([x : G] x * b) (eq_sym G (i (i a)) a (inverse_involutive a)))
|
|
|
|
|
(eq_trans G (i (i a) * b) (i (i a) * i (i b)) (b * a)
|
|
|
|
|
(eq_cong G G b (i (i b)) ((*) (i (i a))) (eq_sym G (i (i b)) b (inverse_involutive b)))
|
|
|
|
|
(eq_trans G (i (i a) * i (i b)) (i (i b * i a)) (b * a)
|
|
|
|
|
(eq_sym G (i (i b * i a)) (i (i a) * i (i b)) (shoes_and_socks (i b) (i a)))
|
|
|
|
|
(eq_trans G (i (i b * i a)) (i (i b) * i (i a)) (b * a)
|
|
|
|
|
(h (i b) (i a))
|
|
|
|
|
(eq_trans G (i (i b) * i (i a)) (b * i (i a)) (b * a)
|
|
|
|
|
(eq_cong G G (i (i b)) b ([x : G] x * i (i a)) (inverse_involutive b))
|
|
|
|
|
(eq_cong G G (i (i a)) a ((*) b) (inverse_involutive a))))));
|
|
|
|
|
|
|
|
|
|
def order_two (a : G) : a * a = e → a = i a := right_inv_unique a a;
|
|
|
|
|
|
|
|
|
|
def all_order_two_abelian : (forall (a : G), a * a = e) → abelian :=
|
|
|
|
|
fun (h : forall (a : G), a * a = e) =>
|
|
|
|
|
inv_distrib_abelian (fun (a b : G) =>
|
|
|
|
|
(eq_trans G (i (a * b)) (a * b) (i a * i b)
|
|
|
|
|
(eq_sym G (a * b) (i (a * b)) (order_two (a * b) (h (a * b))))
|
|
|
|
|
(eq_trans G (a * b) (a * i b) (i a * i b)
|
|
|
|
|
(eq_cong G G b (i b) ((*) a) (order_two b (h b)))
|
|
|
|
|
(eq_cong G G a (i a) ([x : G] x * i b) (order_two a (h a))))));
|
2024-12-13 22:45:37 -08:00
|
|
|
|
2024-12-06 15:59:22 -08:00
|
|
|
end Group
|
2024-12-22 13:16:32 -08:00
|
|
|
end Monoid
|
|
|
|
|
end Semigroup
|
|
|
|
|
end Magma
|