Built with doc-gen4, running Lean4. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓to navigate, Ctrl+πŸ–±οΈto focus. On Mac, use Cmdinstead of Ctrl.
import UnitConjecture.GardamGroup
import Mathlib.Algebra.GroupPower.Basic

/-!
## Torsion-freeness of `P`

This file contains a proof that the group `P` defined is in fact torsion-free.

Roughly, the steps are as follows (further details can be found in the corresponding `.md` file):
1. Define a function `sq : P -> K` taking a group element `(q, k)` to its square. This element lies in the kernel as the group `β„€/2 Γ— β„€/2` has exponent `2`.
2. Show that elements in `K`, which are integer triples of the form `(a, b, c)`, do not have torsion. This requires the fact that the group `β„€`, and hence `β„€Β³`, is torsion-free.
3. Show that no element of `P` has order precisely `2`. This is an argument by cases on the `Q` part of a general element of `P`.
4. Finally, show that if an element `g : G` of a group `G` satisfies `g ^ n = (1 : G)`, then it also satisfies `(g ^ 2) ^ n = (1 : G)`.
5. Together, these statements show that `P` is torsion-free.
-/

section TorsionFree

/-!
### Torsion-free groups
-/

/-- The definition of a torsion-free group. -/
class 
TorsionFree: (G : Type u_1) β†’ [inst : Group G] β†’ Type
TorsionFree
(
G: Type ?u.2
G
:
Type _: Type (?u.2+1)
Type _
) [
Group: Type ?u.5 β†’ Type ?u.5
Group
G: Type ?u.2
G
] where /-- A group is *torsion-free* if the only element with non-trivial torsion is the identity element. -/
torsionFree: βˆ€ {G : Type u_1} [inst : Group G] [self : TorsionFree G] (g : G) (n : β„•), g ^ Nat.succ n = 1 β†’ g = 1
torsionFree
: βˆ€
g: G
g
:
G: Type ?u.2
G
, βˆ€ n :
β„•: Type
β„•
,
g: G
g
^ n.
succ: β„• β†’ β„•
succ
=
1: ?m.23
1
β†’
g: G
g
=
1: ?m.3252
1
/-- The definition of torsion-free additive groups. -/ class
AddTorsionFree: {A : Type u_1} β†’ [inst : AddGroup A] β†’ (βˆ€ (a : A) (n : β„•), Nat.succ n β€’ a = 0 β†’ a = 0) β†’ AddTorsionFree A
AddTorsionFree
(
A: Type ?u.3470
A
:
Type _: Type (?u.3470+1)
Type _
) [
AddGroup: Type ?u.3473 β†’ Type ?u.3473
AddGroup
A: Type ?u.3470
A
] where /-- An additive group is *torsion-free* if the only element with non-trivial torsion is the identity element. -/
torsionFree: βˆ€ {A : Type u_1} [inst : AddGroup A] [self : AddTorsionFree A] (a : A) (n : β„•), Nat.succ n β€’ a = 0 β†’ a = 0
torsionFree
: βˆ€
a: A
a
:
A: Type ?u.3470
A
, βˆ€ n :
β„•: Type
β„•
, n.
succ: β„• β†’ β„•
succ
β€’
a: A
a
=
0: ?m.3722
0
β†’
a: A
a
=
0: ?m.4082
0
/-- β„€ is torsion-free, since it is an integral domain. -/ instance :
AddTorsionFree: (A : Type ?u.4392) β†’ [inst : AddGroup A] β†’ Type
AddTorsionFree
β„€: Type
β„€
where torsionFree :=

βˆ€ (a : β„€) (n : β„•), Nat.succ n β€’ a = 0 β†’ a = 0
a: β„€

n: β„•

h: ↑(Nat.succ n) * a = 0


a = 0

βˆ€ (a : β„€) (n : β„•), Nat.succ n β€’ a = 0 β†’ a = 0
a: β„€

n: β„•

h: ↑(Nat.succ n) * a = 0

x✝: ↑(Nat.succ n) = 0 ∨ a = 0


a = 0
a: β„€

n: β„•

h: ↑(Nat.succ n) * a = 0

hyp: ↑(Nat.succ n) = 0


inl
a = 0
a: β„€

n: β„•

h: ↑(Nat.succ n) * a = 0

a_eq✝: Nat.succ n = 0


inl
a = 0
a: β„€

n: β„•

h: ↑(Nat.succ n) * a = 0

a_eq✝: Nat.succ n = 0


inl
a = 0
a: β„€

n: β„•

h: ↑(Nat.succ n) * a = 0

hyp: ↑(Nat.succ n) = 0


inl
a = 0

Goals accomplished! πŸ™
a: β„€

n: β„•

h: ↑(Nat.succ n) * a = 0

x✝: ↑(Nat.succ n) = 0 ∨ a = 0


a = 0
a: β„€

n: β„•

h: ↑(Nat.succ n) * a = 0

h✝: a = 0


inr
a = 0

Goals accomplished! πŸ™
/-- The product of torsion-free additive groups is torsion-free. -/
instance: {A : Type u_1} β†’ {B : Type u_2} β†’ [inst : AddGroup A] β†’ [inst_1 : AddGroup B] β†’ [inst_2 : AddTorsionFree A] β†’ [inst_3 : AddTorsionFree B] β†’ AddTorsionFree (A Γ— B)
instance
{
A: Type ?u.6137
A
B: Type ?u.6140
B
:
Type _: Type (?u.6140+1)
Type _
} [
AddGroup: Type ?u.6143 β†’ Type ?u.6143
AddGroup
A: Type ?u.6137
A
] [
AddGroup: Type ?u.6146 β†’ Type ?u.6146
AddGroup
B: Type ?u.6140
B
] [
AddTorsionFree: (A : Type ?u.6149) β†’ [inst : AddGroup A] β†’ Type
AddTorsionFree
A: Type ?u.6137
A
] [
AddTorsionFree: (A : Type ?u.6158) β†’ [inst : AddGroup A] β†’ Type
AddTorsionFree
B: Type ?u.6140
B
] :
AddTorsionFree: (A : Type ?u.6167) β†’ [inst : AddGroup A] β†’ Type
AddTorsionFree
(
A: Type ?u.6137
A
Γ—
B: Type ?u.6140
B
) where torsionFree :=
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B


βˆ€ (a : A Γ— B) (n : β„•), Nat.succ n β€’ a = 0 β†’ a = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•


Nat.succ n β€’ (a, b) = 0 β†’ (a, b) = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B


βˆ€ (a : A Γ— B) (n : β„•), Nat.succ n β€’ a = 0 β†’ a = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•


Nat.succ n β€’ (a, b) = 0 β†’ (a, b) = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•


(Nat.succ n β€’ a, Nat.succ n β€’ b) = 0 β†’ (a, b) = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•


Nat.succ n β€’ (a, b) = 0 β†’ (a, b) = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•


(Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst ∧ (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd β†’ (a, b) = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•


Nat.succ n β€’ (a, b) = 0 β†’ (a, b) = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•


(Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst ∧ (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd β†’ (a, b).fst = 0.fst ∧ (a, b).snd = 0.snd
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•


(Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst ∧ (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd β†’ (a, b).fst = 0.fst ∧ (a, b).snd = 0.snd
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B


βˆ€ (a : A Γ— B) (n : β„•), Nat.succ n β€’ a = 0 β†’ a = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


(a, b).fst = 0.fst ∧ (a, b).snd = 0.snd
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


(a, b).fst = 0.fst ∧ (a, b).snd = 0.snd
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B


βˆ€ (a : A Γ— B) (n : β„•), Nat.succ n β€’ a = 0 β†’ a = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_1
(a, b).fst = 0.fst
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_2
(a, b).snd = 0.snd
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


(a, b).fst = 0.fst ∧ (a, b).snd = 0.snd
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_1
(a, b).fst = 0.fst
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_2
(a, b).snd = 0.snd
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


(a, b).fst = 0.fst ∧ (a, b).snd = 0.snd
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_1
(a, b).fst = 0.fst
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_2.a
Nat.succ ?refine'_2.n β€’ (a, b).snd = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_2.n
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_2.a
Nat.succ ?refine'_2.n β€’ (a, b).snd = 0
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_2.n
A: Type ?u.6137

B: Type ?u.6140

inst✝³: AddGroup A

inst✝²: AddGroup B

inst✝¹: AddTorsionFree A

inst✝: AddTorsionFree B

a: A

b: B

n: β„•

left✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).fst = 0.fst

right✝: (Nat.succ n β€’ a, Nat.succ n β€’ b).snd = 0.snd


refine'_2
(a, b).snd = 0.snd

Goals accomplished! πŸ™

Goals accomplished! πŸ™
end TorsionFree /-! ### **Step 1:** Defining the square of an element of `P`. -/ /-- The function taking an element of `P` to its square, which lies in the kernel `K`. -/ @[aesop norm unfold (rule_sets [P]), reducible] def
P.sq: P β†’ K
P.sq
:
P: Type
P
β†’
K: Type
K
| ((p, q, r),
.e: Q
.e
) => (p + p, q + q, r + r) | ((_, q, _),
.b: Fin 2 Γ— Fin 2
.b
) => (
0: ?m.7842
0
, q + q +
1: ?m.7863
1
,
0: ?m.7921
0
) | ((p, _, _),
.a: Fin 2 Γ— Fin 2
.a
) => (p + p +
1: ?m.7987
1
,
0: ?m.8064
0
,
0: ?m.8067
0
) | ((_, _, r),
.c: Fin 2 Γ— Fin 2
.c
) => (
0: ?m.8126
0
,
0: ?m.8133
0
, r + r +
1: ?m.8142
1
) open P /-- A proof that the function `sq` indeed takes an element of `P` to its square in `K`. -/ @[aesop norm apply (rule_sets [P]), simp] theorem
sq_square: βˆ€ (g : P), g * g = (P.sq g, Q.e)
sq_square
: βˆ€
g: P
g
:
P: Type
P
,
g: P
g
*
g: P
g
= (
P.sq: P β†’ K
P.sq
g: P
g
,
.e: Q
.e
) | ((p, q, r),
x: Q
x
) => match
x: Q
x
with |
.e: Q
.e
|
.a: Q
.a
|
.b: Q
.b
|
.c: Fin 2 Γ— Fin 2
.c
=>
p, q, r: β„€

x: Q


((p, q, r), Q.b) * ((p, q, r), Q.b) = (P.sq ((p, q, r), Q.b), Q.e)

Goals accomplished! πŸ™
/-! ### **Step 2:** Proving that `K` (= `β„€Β³`) is torsion-free. -/ /-- The kernel `β„€Β³` is torsion-free. -/ instance
K.torsionFree: AddTorsionFree K
K.torsionFree
:
AddTorsionFree: (A : Type ?u.213865) β†’ [inst : AddGroup A] β†’ Type
AddTorsionFree
K: Type
K
:=
inferInstance: {Ξ± : Sort ?u.213891} β†’ [i : Ξ±] β†’ Ξ±
inferInstance
/-! ### **Step 3:** Showing that no element of `P` has order precisely two. -/ namespace Int /-! Some basic lemmas about integers needed to prove facts about `P`. -/ lemma
add_twice_eq_mul_two: βˆ€ {a : β„€}, a + a = a * 2
add_twice_eq_mul_two
{a :
β„€: Type
β„€
} : a + a = a *
2: ?m.214172
2
:=

a + a = a * 2

a + a = a * 2

a + a = a * 2

Goals accomplished! πŸ™

a + a = a * (1 + 1)

a + a = a * 2

a + a = a * 1 + a * 1

a + a = a * 2

a + a = a + a

Goals accomplished! πŸ™
attribute [local simp]
add_twice_eq_mul_two: βˆ€ {a : β„€}, a + a = a * 2
add_twice_eq_mul_two
/-- No odd integer is zero. -/ lemma
odd_ne_zero: βˆ€ (a : β„€), Β¬a + a + 1 = 0
odd_ne_zero
: βˆ€ a :
β„€: Type
β„€
, Β¬(a + a +
1: ?m.214792
1
=
0: ?m.214808
0
) :=

βˆ€ (a : β„€), Β¬a + a + 1 = 0
a: β„€

h: a + a + 1 = 0



βˆ€ (a : β„€), Β¬a + a + 1 = 0
a: β„€

h: a + a + 1 = 0

this: (a + a + 1) % 2 = 0 % 2



βˆ€ (a : β„€), Β¬a + a + 1 = 0

Goals accomplished! πŸ™
/-- If the sum of an integer with itself is zero, then the integer is itself zero. -/ lemma
zero_of_twice_zero: βˆ€ (a : β„€), a + a = 0 β†’ a = 0
zero_of_twice_zero
: βˆ€ a :
β„€: Type
β„€
, a + a =
0: ?m.215464
0
β†’ a =
0: ?m.215528
0
:=

βˆ€ (a : β„€), a + a = 0 β†’ a = 0

Goals accomplished! πŸ™
end Int /-- The only element of `P` with order dividing `2` is the identity. -/ theorem
square_free: βˆ€ {g : P}, g * g = 1 β†’ g = 1
square_free
: βˆ€ {
g: P
g
:
P: Type
P
},
g: P
g
*
g: P
g
= (
1: ?m.217135
1
:
P: Type
P
) β†’
g: P
g
= (
1: ?m.217994
1
:
P: Type
P
) | ((p, q, r),
x: Q
x
) =>
p, q, r: β„€

x: Q


((p, q, r), x) * ((p, q, r), x) = 1 β†’ ((p, q, r), x) = 1
p, q, r: β„€

x: Q


((p, q, r), x) * ((p, q, r), x) = 1 β†’ ((p, q, r), x) = 1
p, q, r: β„€

x: Q


((p, q, r), Q.e) * ((p, q, r), Q.e) = 1 β†’ ((p, q, r), Q.e) = 1
p, q, r: β„€

x: Q


((p, q, r), x) * ((p, q, r), x) = 1 β†’ ((p, q, r), x) = 1

Goals accomplished! πŸ™
p, q, r: β„€

x: Q


((p, q, r), x) * ((p, q, r), x) = 1 β†’ ((p, q, r), x) = 1
p, q, r: β„€

x: Q


((p, q, r), Q.a) * ((p, q, r), Q.a) = 1 β†’ ((p, q, r), Q.a) = 1
p, q, r: β„€

x: Q


((p, q, r), x) * ((p, q, r), x) = 1 β†’ ((p, q, r), x) = 1

Goals accomplished! πŸ™
/-! ### **Step 4:** Showing that if the `n`-th power of a group element is trivial, then so is that of its square. -/ /-- If `g` is a torsion element of a group, then so is `g ^ 2`. -/ lemma
torsion_implies_square_torsion: βˆ€ {G : Type u_1} [inst : Group G] (g : G) (n : β„•), g ^ n = 1 β†’ (g ^ 2) ^ n = 1
torsion_implies_square_torsion
{
G: Type ?u.440141
G
:
Type _: Type (?u.440141+1)
Type _
} [
Group: Type ?u.440144 β†’ Type ?u.440144
Group
G: Type ?u.440141
G
] (
g: G
g
:
G: Type ?u.440141
G
) (n :
β„•: Type
β„•
) (
g_tor: g ^ n = 1
g_tor
:
g: G
g
^ n =
1: ?m.440156
1
) : (
g: G
g
^
2: ?m.443392
2
) ^ n =
1: ?m.443406
1
:= calc (
g: G
g
^
2: ?m.446805
2
) ^ n =
g: G
g
^ (
2: ?m.446825
2
* n) :=
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


(g ^ 2) ^ n = g ^ (2 * n)
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


(g ^ 2) ^ n = g ^ (2 * n)
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


g ^ (2 * n) = g ^ (2 * n)

Goals accomplished! πŸ™
_: ?m.449771
_
=
g: G
g
^ (n *
2: ?m.449780
2
) :=
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


g ^ (2 * n) = g ^ (n * 2)
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


g ^ (2 * n) = g ^ (n * 2)
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


g ^ (n * 2) = g ^ (n * 2)

Goals accomplished! πŸ™
_: ?m.452595
_
= (
g: G
g
^ n) ^
2: ?m.452604
2
:=
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


g ^ (n * 2) = (g ^ n) ^ 2
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


g ^ (n * 2) = (g ^ n) ^ 2
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


(g ^ n) ^ 2 = (g ^ n) ^ 2

Goals accomplished! πŸ™
_: ?m.455631
_
= (
1: ?m.455638
1
:
G: Type u_1
G
) ^
2: ?m.455856
2
:=
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


(g ^ n) ^ 2 = 1 ^ 2
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


(g ^ n) ^ 2 = 1 ^ 2
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


(g ^ n) ^ 2 = (g ^ n) ^ 2

Goals accomplished! πŸ™
_: ?m.456069
_
= (
1: ?m.456073
1
:
G: Type u_1
G
) :=
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


1 ^ 2 = 1
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


1 ^ 2 = 1
G: Type u_1

inst✝: Group G

g: G

n: β„•

g_tor: g ^ n = 1


1 = 1

Goals accomplished! πŸ™
/-! ### **Step 5:** Putting the facts together. -/ /-- `P` is torsion-free. -/ instance
P.torsionFree: TorsionFree P
P.torsionFree
:
TorsionFree: (G : Type ?u.459254) β†’ [inst : Group G] β†’ Type
TorsionFree
P: Type
P
where torsionFree :=

βˆ€ (g : P) (n : β„•), g ^ Nat.succ n = 1 β†’ g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1


g = 1

βˆ€ (g : P) (n : β„•), g ^ Nat.succ n = 1 β†’ g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: (g ^ 2) ^ Nat.succ n = ((0, 0, 0), Q.e)


g = 1

βˆ€ (g : P) (n : β„•), g ^ Nat.succ n = 1 β†’ g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: (g ^ 2) ^ Nat.succ n = ((0, 0, 0), Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: (g * g) ^ Nat.succ n = ((0, 0, 0), Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: (g ^ 2) ^ Nat.succ n = ((0, 0, 0), Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: (sq g, Q.e) ^ Nat.succ n = ((0, 0, 0), Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: (g ^ 2) ^ Nat.succ n = ((0, 0, 0), Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: (Nat.succ n β€’ sq g, 0) = ((0, 0, 0), Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: (g ^ 2) ^ Nat.succ n = ((0, 0, 0), Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e


g = 1

βˆ€ (g : P) (n : β„•), g ^ Nat.succ n = 1 β†’ g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e

s_tor: Nat.succ n β€’ sq g = 0


g = 1

βˆ€ (g : P) (n : β„•), g ^ Nat.succ n = 1 β†’ g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e

s_tor: Nat.succ n β€’ sq g = 0

square_zero: (sq g, Q.e) = (0, Q.e)


g = 1

βˆ€ (g : P) (n : β„•), g ^ Nat.succ n = 1 β†’ g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e

s_tor: Nat.succ n β€’ sq g = 0

square_zero: (sq g, Q.e) = (0, Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e

s_tor: Nat.succ n β€’ sq g = 0

square_zero: g * g = (0, Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e

s_tor: Nat.succ n β€’ sq g = 0

square_zero: g * g = (0, Q.e)


g = 1
g: P

n: β„•

g_tor: g ^ Nat.succ n = 1

square_tor: Nat.succ n β€’ sq g = (0, 0, 0) ∧ 0 = Q.e

s_tor: Nat.succ n β€’ sq g = 0

square_zero: g * g = (0, Q.e)


g = 1

βˆ€ (g : P) (n : β„•), g ^ Nat.succ n = 1 β†’ g = 1

Goals accomplished! πŸ™