import algebra.group.basic
universe u
variables {M : Type u} [monoid M]
-- 1ª demostración
-- ===============
example
(h : ∀ x : M, x * x = 1)
: ∀ x y : M, x * y = y * x :=
begin
intros a b,
calc a * b
= (a * b) * 1 : (mul_one (a * b)).symm
... = (a * b) * (a * a) : congr_arg ((*) (a*b)) (h a).symm
... = ((a * b) * a) * a : (mul_assoc (a*b) a a).symm
... = (a * (b * a)) * a : congr_arg (* a) (mul_assoc a b a)
... = (1 * (a * (b * a))) * a : congr_arg (* a) (one_mul (a*(b*a))).symm
... = ((b * b) * (a * (b * a))) * a : congr_arg (* a) (congr_arg (* (a*(b*a))) (h b).symm)
... = (b * (b * (a * (b * a)))) * a : congr_arg (* a) (mul_assoc b b (a*(b*a)))
... = (b * ((b * a) * (b * a))) * a : congr_arg (* a) (congr_arg ((*) b) (mul_assoc b a (b*a)).symm)
... = (b * 1) * a : congr_arg (* a) (congr_arg ((*) b) (h (b*a)))
... = b * a : congr_arg (* a) (mul_one b),
end
-- 2ª demostración
-- ===============
example
(h : ∀ x : M, x * x = 1)
: ∀ x y : M, x * y = y * x :=
begin
intros a b,
calc a * b
= (a * b) * 1 : by simp only [mul_one]
... = (a * b) * (a * a) : by simp only [h]
... = ((a * b) * a) * a : by simp only [mul_assoc]
... = (a * (b * a)) * a : by simp only [mul_assoc]
... = (1 * (a * (b * a))) * a : by simp only [one_mul]
... = ((b * b) * (a * (b * a))) * a : by simp only [h]
... = (b * (b * (a * (b * a)))) * a : by simp only [mul_assoc]
... = (b * ((b * a) * (b * a))) * a : by simp only [mul_assoc]
... = (b * 1) * a : by simp only [h]
... = b * a : by simp only [mul_one]
end
-- 3ª demostración
-- ===============
example
(h : ∀ x : M, x * x = 1)
: ∀ x y : M, x * y = y * x :=
begin
intros a b,
calc a * b
= (a * b) * 1 : by simp
... = (a * b) * (a * a) : by simp [h]
... = ((a * b) * a) * a : by simp [mul_assoc]
... = (a * (b * a)) * a : by simp [mul_assoc]
... = (1 * (a * (b * a))) * a : by simp
... = ((b * b) * (a * (b * a))) * a : by simp [h]
... = (b * (b * (a * (b * a)))) * a : by simp [mul_assoc]
... = (b * ((b * a) * (b * a))) * a : by simp [mul_assoc]
... = (b * 1) * a : by simp [h]
... = b * a : by simp,
end
-- 4ª demostración
-- ===============
example
(h : ∀ x : M, x * x = 1)
: ∀ x y : M, x * y = y * x :=
begin
intros a b,
calc a * b
= (a * b) * (a * a) : by simp [h]
... = (1 * (a * (b * a))) * a : by simp [mul_assoc]
... = ((b * b) * (a * (b * a))) * a : by simp [h]
... = (b * ((b * a) * (b * a))) * a : by simp [mul_assoc]
... = b * a : by simp [h],
end
-- 5ª demostración
-- ===============
example
(h : ∀ x : M, x * x = 1)
: ∀ x y : M, x * y = y * x :=
begin
intros a b,
calc a * b
= ((b * b) * (a * (b * a))) * a : by simp [h, mul_assoc]
... = (b * ((b * a) * (b * a))) * a : by simp [mul_assoc]
... = b * a : by simp [h],
end