Session 11: Ascending to categories of richer structures
1. A category of richer structures: Endomaps of sets
How many maps can you find? (There are fewer than seven.)
Solution: Exercise 1
Label the elements in the three-element set A as a_1, a_2, a_3 (clockwise starting with any element); label the elements in the set X as x_1 for the element forming the one-element loop and x_2, x_3, x_4 (anticlockwise starting with any element) for the elements forming the three-element cycle, ignoring all other elements.
inductive A
| a₁ | a₂ | a₃
inductive X
| x₁ | x₂ | x₃ | x₄
def A' : SetWithEndomap := {
t := A
carrier := Set.univ
toEnd := fun
| A.a₁ => A.a₂
| A.a₂ => A.a₃
| A.a₃ => A.a₁
toEnd_mem := fun _ ↦ Set.mem_univ _
}
def X' : SetWithEndomap := {
t := X
carrier := Set.univ
toEnd := fun -- a restriction of α to the subset {x₁, x₂, x₃, x₄}
| X.x₁ => X.x₁
| X.x₂ => X.x₃
| X.x₃ => X.x₄
| X.x₄ => X.x₂
toEnd_mem := fun _ ↦ Set.mem_univ _
}
Then there are four structure-preserving maps from A to X, which we call f_1, f_2, f_3, f_4 below.
def f₁ : A ⟶ X
| A.a₁ => X.x₁
| A.a₂ => X.x₁
| A.a₃ => X.x₁
-- f₁ is structure-preserving
example : A' ⟶ X' := ⟨
f₁,
⊢ (∀ x ∈ A'.carrier, f₁ x ∈ X'.carrier) ∧ f₁ ⊚ A'.toEnd = X'.toEnd ⊚ f₁
⊢ ∀ x ∈ A'.carrier, f₁ x ∈ X'.carrier⊢ f₁ ⊚ A'.toEnd = X'.toEnd ⊚ f₁
⊢ ∀ x ∈ A'.carrier, f₁ x ∈ X'.carrier All goals completed! 🐙
⊢ f₁ ⊚ A'.toEnd = X'.toEnd ⊚ f₁ a:A'.t⊢ (f₁ ⊚ A'.toEnd) a = (X'.toEnd ⊚ f₁) a
⊢ (f₁ ⊚ A'.toEnd) A.a₁ = (X'.toEnd ⊚ f₁) A.a₁⊢ (f₁ ⊚ A'.toEnd) A.a₂ = (X'.toEnd ⊚ f₁) A.a₂⊢ (f₁ ⊚ A'.toEnd) A.a₃ = (X'.toEnd ⊚ f₁) A.a₃ ⊢ (f₁ ⊚ A'.toEnd) A.a₁ = (X'.toEnd ⊚ f₁) A.a₁⊢ (f₁ ⊚ A'.toEnd) A.a₂ = (X'.toEnd ⊚ f₁) A.a₂⊢ (f₁ ⊚ A'.toEnd) A.a₃ = (X'.toEnd ⊚ f₁) A.a₃ All goals completed! 🐙
⟩
def f₂ : A ⟶ X
| A.a₁ => X.x₂
| A.a₂ => X.x₃
| A.a₃ => X.x₄
-- f₂ is structure-preserving
example : A' ⟶ X' := ⟨
f₂,
⊢ (∀ x ∈ A'.carrier, f₂ x ∈ X'.carrier) ∧ f₂ ⊚ A'.toEnd = X'.toEnd ⊚ f₂
⊢ ∀ x ∈ A'.carrier, f₂ x ∈ X'.carrier⊢ f₂ ⊚ A'.toEnd = X'.toEnd ⊚ f₂
⊢ ∀ x ∈ A'.carrier, f₂ x ∈ X'.carrier All goals completed! 🐙
⊢ f₂ ⊚ A'.toEnd = X'.toEnd ⊚ f₂ a:A'.t⊢ (f₂ ⊚ A'.toEnd) a = (X'.toEnd ⊚ f₂) a
⊢ (f₂ ⊚ A'.toEnd) A.a₁ = (X'.toEnd ⊚ f₂) A.a₁⊢ (f₂ ⊚ A'.toEnd) A.a₂ = (X'.toEnd ⊚ f₂) A.a₂⊢ (f₂ ⊚ A'.toEnd) A.a₃ = (X'.toEnd ⊚ f₂) A.a₃ ⊢ (f₂ ⊚ A'.toEnd) A.a₁ = (X'.toEnd ⊚ f₂) A.a₁⊢ (f₂ ⊚ A'.toEnd) A.a₂ = (X'.toEnd ⊚ f₂) A.a₂⊢ (f₂ ⊚ A'.toEnd) A.a₃ = (X'.toEnd ⊚ f₂) A.a₃ All goals completed! 🐙
⟩
def f₃ : A ⟶ X
| A.a₁ => X.x₃
| A.a₂ => X.x₄
| A.a₃ => X.x₂
-- f₃ is structure-preserving
example : A' ⟶ X' := ⟨
f₃,
⊢ (∀ x ∈ A'.carrier, f₃ x ∈ X'.carrier) ∧ f₃ ⊚ A'.toEnd = X'.toEnd ⊚ f₃
⊢ ∀ x ∈ A'.carrier, f₃ x ∈ X'.carrier⊢ f₃ ⊚ A'.toEnd = X'.toEnd ⊚ f₃
⊢ ∀ x ∈ A'.carrier, f₃ x ∈ X'.carrier All goals completed! 🐙
⊢ f₃ ⊚ A'.toEnd = X'.toEnd ⊚ f₃ a:A'.t⊢ (f₃ ⊚ A'.toEnd) a = (X'.toEnd ⊚ f₃) a
⊢ (f₃ ⊚ A'.toEnd) A.a₁ = (X'.toEnd ⊚ f₃) A.a₁⊢ (f₃ ⊚ A'.toEnd) A.a₂ = (X'.toEnd ⊚ f₃) A.a₂⊢ (f₃ ⊚ A'.toEnd) A.a₃ = (X'.toEnd ⊚ f₃) A.a₃ ⊢ (f₃ ⊚ A'.toEnd) A.a₁ = (X'.toEnd ⊚ f₃) A.a₁⊢ (f₃ ⊚ A'.toEnd) A.a₂ = (X'.toEnd ⊚ f₃) A.a₂⊢ (f₃ ⊚ A'.toEnd) A.a₃ = (X'.toEnd ⊚ f₃) A.a₃ All goals completed! 🐙
⟩
def f₄ : A ⟶ X
| A.a₁ => X.x₄
| A.a₂ => X.x₂
| A.a₃ => X.x₃
-- f₄ is structure-preserving
example : A' ⟶ X' := ⟨
f₄,
⊢ (∀ x ∈ A'.carrier, f₄ x ∈ X'.carrier) ∧ f₄ ⊚ A'.toEnd = X'.toEnd ⊚ f₄
⊢ ∀ x ∈ A'.carrier, f₄ x ∈ X'.carrier⊢ f₄ ⊚ A'.toEnd = X'.toEnd ⊚ f₄
⊢ ∀ x ∈ A'.carrier, f₄ x ∈ X'.carrier All goals completed! 🐙
⊢ f₄ ⊚ A'.toEnd = X'.toEnd ⊚ f₄ a:A'.t⊢ (f₄ ⊚ A'.toEnd) a = (X'.toEnd ⊚ f₄) a
⊢ (f₄ ⊚ A'.toEnd) A.a₁ = (X'.toEnd ⊚ f₄) A.a₁⊢ (f₄ ⊚ A'.toEnd) A.a₂ = (X'.toEnd ⊚ f₄) A.a₂⊢ (f₄ ⊚ A'.toEnd) A.a₃ = (X'.toEnd ⊚ f₄) A.a₃ ⊢ (f₄ ⊚ A'.toEnd) A.a₁ = (X'.toEnd ⊚ f₄) A.a₁⊢ (f₄ ⊚ A'.toEnd) A.a₂ = (X'.toEnd ⊚ f₄) A.a₂⊢ (f₄ ⊚ A'.toEnd) A.a₃ = (X'.toEnd ⊚ f₄) A.a₃ All goals completed! 🐙
⟩
3. The category of graphs
inductive X
| a | b | c
def α : X ⟶ X
| X.a => X.c
| X.b => X.a
| X.c => X.b
def Xα : SetWithEndomap := {
t := X
carrier := Set.univ
toEnd := α
toEnd_mem := fun _ ↦ Set.mem_univ _
}
inductive Y
| p | q | r
def β : Y ⟶ Y
| Y.p => Y.q
| Y.q => Y.r
| Y.r => Y.p
def Yβ : SetWithEndomap := {
t := Y
carrier := Set.univ
toEnd := β
toEnd_mem := fun _ ↦ Set.mem_univ _
}
Find an isomorphism from X^{↻\alpha} to Y^{↻\beta}. How many such isomorphisms are there?
Hint: You need to find {X \xrightarrow{f} Y} such that {f \alpha = \beta f}, and check that f has an inverse {Y \xrightarrow{f^{-1}} X} (meaning {f^{-1}f = 1_X} and {ff^{-1} = 1_Y}). Then you'll still need to check that f^{-1} is a map in 𝑺↻ (meaning {f^{-1} \beta = \alpha f^{-1}}), but see Exercise 4, below.
Solution: Exercise 2
There are three such isomorphisms, which we call f_1, f_2, f_3 below.
def f₁ : X ⟶ Y
| X.a => Y.r
| X.b => Y.q
| X.c => Y.p
--f₁ is an isomorphism
example : ∃ f : Xα ⟶ Yβ, IsIso f := ⊢ ∃ f, IsIso f
let f : Xα ⟶ Yβ := ⟨
f₁,
⊢ (∀ x ∈ Xα.carrier, f₁ x ∈ Yβ.carrier) ∧ f₁ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₁
⊢ ∀ x ∈ Xα.carrier, f₁ x ∈ Yβ.carrier⊢ f₁ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₁
⊢ ∀ x ∈ Xα.carrier, f₁ x ∈ Yβ.carrier All goals completed! 🐙
⊢ f₁ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₁ -- fα = βf
x:Xα.t⊢ (f₁ ⊚ Xα.toEnd) x = (Yβ.toEnd ⊚ f₁) x
⊢ (f₁ ⊚ Xα.toEnd) X.a = (Yβ.toEnd ⊚ f₁) X.a⊢ (f₁ ⊚ Xα.toEnd) X.b = (Yβ.toEnd ⊚ f₁) X.b⊢ (f₁ ⊚ Xα.toEnd) X.c = (Yβ.toEnd ⊚ f₁) X.c ⊢ (f₁ ⊚ Xα.toEnd) X.a = (Yβ.toEnd ⊚ f₁) X.a⊢ (f₁ ⊚ Xα.toEnd) X.b = (Yβ.toEnd ⊚ f₁) X.b⊢ (f₁ ⊚ Xα.toEnd) X.c = (Yβ.toEnd ⊚ f₁) X.c All goals completed! 🐙
⟩
let finv : Yβ ⟶ Xα := ⟨
fun
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ (∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
x ∈
Xα.carrier) ∧
(fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ ∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
x ∈
Xα.carrierf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ (fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ ∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
x ∈
Xα.carrier All goals completed! 🐙
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ (fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a -- f⁻¹β = αf⁻¹
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩y:Yβ.t⊢ ((fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd)
y =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
y
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd)
Y.p =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
Y.pf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd)
Y.q =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
Y.qf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd)
Y.r =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
Y.r f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd)
Y.p =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
Y.pf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd)
Y.q =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
Y.qf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a) ⊚
Yβ.toEnd)
Y.r =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a)
Y.r All goals completed! 🐙
⟩
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ IsIso f
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ finv ⊚ f = 𝟙 Xα ∧ f ⊚ finv = 𝟙 Yβ
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ finv ⊚ f = 𝟙 Xαf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ f ⊚ finv = 𝟙 Yβ
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ finv ⊚ f = 𝟙 Xα -- f⁻¹f = 𝟙 X
have h : finv.val ⊚ f.val = 𝟙 X := ⊢ ∃ f, IsIso f
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩x:Xα.t⊢ (↑finv ⊚ ↑f) x = 𝟙 X x
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑finv ⊚ ↑f) X.a = 𝟙 X X.af:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑finv ⊚ ↑f) X.b = 𝟙 X X.bf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑finv ⊚ ↑f) X.c = 𝟙 X X.c f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑finv ⊚ ↑f) X.a = 𝟙 X X.af:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑finv ⊚ ↑f) X.b = 𝟙 X X.bf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑finv ⊚ ↑f) X.c = 𝟙 X X.c All goals completed! 🐙
All goals completed! 🐙
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ f ⊚ finv = 𝟙 Yβ -- ff⁻¹ = 𝟙 Y
have h : f.val ⊚ finv.val = 𝟙 Y := ⊢ ∃ f, IsIso f
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩y:Yβ.t⊢ (↑f ⊚ ↑finv) y = 𝟙 Y y
f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.p = 𝟙 Y Y.pf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.q = 𝟙 Y Y.qf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.r = 𝟙 Y Y.r f:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.p = 𝟙 Y Y.pf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.q = 𝟙 Y Y.qf:Xα ⟶ Yβ := ⟨f₁, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.c
| Y.q => X.b
| Y.r => X.a,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.r = 𝟙 Y Y.r All goals completed! 🐙
All goals completed! 🐙
def f₂ : X ⟶ Y
| X.a => Y.q
| X.b => Y.p
| X.c => Y.r
--f₂ is an isomorphism
example : ∃ f : Xα ⟶ Yβ, IsIso f := ⊢ ∃ f, IsIso f
let f : Xα ⟶ Yβ := ⟨
f₂,
⊢ (∀ x ∈ Xα.carrier, f₂ x ∈ Yβ.carrier) ∧ f₂ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₂
⊢ ∀ x ∈ Xα.carrier, f₂ x ∈ Yβ.carrier⊢ f₂ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₂
⊢ ∀ x ∈ Xα.carrier, f₂ x ∈ Yβ.carrier All goals completed! 🐙
⊢ f₂ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₂ -- fα = βf
x:Xα.t⊢ (f₂ ⊚ Xα.toEnd) x = (Yβ.toEnd ⊚ f₂) x
⊢ (f₂ ⊚ Xα.toEnd) X.a = (Yβ.toEnd ⊚ f₂) X.a⊢ (f₂ ⊚ Xα.toEnd) X.b = (Yβ.toEnd ⊚ f₂) X.b⊢ (f₂ ⊚ Xα.toEnd) X.c = (Yβ.toEnd ⊚ f₂) X.c ⊢ (f₂ ⊚ Xα.toEnd) X.a = (Yβ.toEnd ⊚ f₂) X.a⊢ (f₂ ⊚ Xα.toEnd) X.b = (Yβ.toEnd ⊚ f₂) X.b⊢ (f₂ ⊚ Xα.toEnd) X.c = (Yβ.toEnd ⊚ f₂) X.c All goals completed! 🐙
⟩
let finv : Yβ ⟶ Xα := ⟨
fun
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ (∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
x ∈
Xα.carrier) ∧
(fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ ∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
x ∈
Xα.carrierf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ (fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ ∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
x ∈
Xα.carrier All goals completed! 🐙
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ (fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c -- f⁻¹β = αf⁻¹
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩y:Yβ.t⊢ ((fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd)
y =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
y
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd)
Y.p =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
Y.pf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd)
Y.q =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
Y.qf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd)
Y.r =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
Y.r f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd)
Y.p =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
Y.pf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd)
Y.q =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
Y.qf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c) ⊚
Yβ.toEnd)
Y.r =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c)
Y.r All goals completed! 🐙
⟩
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ IsIso f
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ finv ⊚ f = 𝟙 Xα ∧ f ⊚ finv = 𝟙 Yβ
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ finv ⊚ f = 𝟙 Xαf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ f ⊚ finv = 𝟙 Yβ
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ finv ⊚ f = 𝟙 Xα -- f⁻¹f = 𝟙 X
have h : finv.val ⊚ f.val = 𝟙 X := ⊢ ∃ f, IsIso f
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩x:Xα.t⊢ (↑finv ⊚ ↑f) x = 𝟙 X x
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑finv ⊚ ↑f) X.a = 𝟙 X X.af:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑finv ⊚ ↑f) X.b = 𝟙 X X.bf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑finv ⊚ ↑f) X.c = 𝟙 X X.c f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑finv ⊚ ↑f) X.a = 𝟙 X X.af:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑finv ⊚ ↑f) X.b = 𝟙 X X.bf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑finv ⊚ ↑f) X.c = 𝟙 X X.c All goals completed! 🐙
All goals completed! 🐙
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ f ⊚ finv = 𝟙 Yβ -- ff⁻¹ = 𝟙 Y
have h : f.val ⊚ finv.val = 𝟙 Y := ⊢ ∃ f, IsIso f
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩y:Yβ.t⊢ (↑f ⊚ ↑finv) y = 𝟙 Y y
f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.p = 𝟙 Y Y.pf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.q = 𝟙 Y Y.qf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.r = 𝟙 Y Y.r f:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.p = 𝟙 Y Y.pf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.q = 𝟙 Y Y.qf:Xα ⟶ Yβ := ⟨f₂, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.b
| Y.q => X.a
| Y.r => X.c,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.r = 𝟙 Y Y.r All goals completed! 🐙
All goals completed! 🐙
def f₃ : X ⟶ Y
| X.a => Y.p
| X.b => Y.r
| X.c => Y.q
--f₃ is an isomorphism
example : ∃ f : Xα ⟶ Yβ, IsIso f := ⊢ ∃ f, IsIso f
let f : Xα ⟶ Yβ := ⟨
f₃,
⊢ (∀ x ∈ Xα.carrier, f₃ x ∈ Yβ.carrier) ∧ f₃ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₃
⊢ ∀ x ∈ Xα.carrier, f₃ x ∈ Yβ.carrier⊢ f₃ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₃
⊢ ∀ x ∈ Xα.carrier, f₃ x ∈ Yβ.carrier All goals completed! 🐙
⊢ f₃ ⊚ Xα.toEnd = Yβ.toEnd ⊚ f₃ -- fα = βf
x:Xα.t⊢ (f₃ ⊚ Xα.toEnd) x = (Yβ.toEnd ⊚ f₃) x
⊢ (f₃ ⊚ Xα.toEnd) X.a = (Yβ.toEnd ⊚ f₃) X.a⊢ (f₃ ⊚ Xα.toEnd) X.b = (Yβ.toEnd ⊚ f₃) X.b⊢ (f₃ ⊚ Xα.toEnd) X.c = (Yβ.toEnd ⊚ f₃) X.c ⊢ (f₃ ⊚ Xα.toEnd) X.a = (Yβ.toEnd ⊚ f₃) X.a⊢ (f₃ ⊚ Xα.toEnd) X.b = (Yβ.toEnd ⊚ f₃) X.b⊢ (f₃ ⊚ Xα.toEnd) X.c = (Yβ.toEnd ⊚ f₃) X.c All goals completed! 🐙
⟩
let finv : Yβ ⟶ Xα := ⟨
fun
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ (∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
x ∈
Xα.carrier) ∧
(fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ ∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
x ∈
Xα.carrierf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ (fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ ∀ x ∈ Yβ.carrier,
(fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
x ∈
Xα.carrier All goals completed! 🐙
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ (fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd =
Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b -- f⁻¹β = αf⁻¹
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩y:Yβ.t⊢ ((fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd)
y =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
y
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd)
Y.p =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
Y.pf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd)
Y.q =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
Y.qf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd)
Y.r =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
Y.r f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd)
Y.p =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
Y.pf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd)
Y.q =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
Y.qf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩⊢ ((fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b) ⊚
Yβ.toEnd)
Y.r =
(Xα.toEnd ⊚ fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b)
Y.r All goals completed! 🐙
⟩
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ IsIso f
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ finv ⊚ f = 𝟙 Xα ∧ f ⊚ finv = 𝟙 Yβ
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ finv ⊚ f = 𝟙 Xαf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ f ⊚ finv = 𝟙 Yβ
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ finv ⊚ f = 𝟙 Xα -- f⁻¹f = 𝟙 X
have h : finv.val ⊚ f.val = 𝟙 X := ⊢ ∃ f, IsIso f
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩x:Xα.t⊢ (↑finv ⊚ ↑f) x = 𝟙 X x
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑finv ⊚ ↑f) X.a = 𝟙 X X.af:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑finv ⊚ ↑f) X.b = 𝟙 X X.bf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑finv ⊚ ↑f) X.c = 𝟙 X X.c f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑finv ⊚ ↑f) X.a = 𝟙 X X.af:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑finv ⊚ ↑f) X.b = 𝟙 X X.bf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑finv ⊚ ↑f) X.c = 𝟙 X X.c All goals completed! 🐙
All goals completed! 🐙
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ f ⊚ finv = 𝟙 Yβ -- ff⁻¹ = 𝟙 Y
have h : f.val ⊚ finv.val = 𝟙 Y := ⊢ ∃ f, IsIso f
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩y:Yβ.t⊢ (↑f ⊚ ↑finv) y = 𝟙 Y y
f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.p = 𝟙 Y Y.pf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.q = 𝟙 Y Y.qf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.r = 𝟙 Y Y.r f:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.p = 𝟙 Y Y.pf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.q = 𝟙 Y Y.qf:Xα ⟶ Yβ := ⟨f₃, ⋯⟩finv:Yβ ⟶ Xα :=
⟨fun x ↦
match x with
| Y.p => X.a
| Y.q => X.c
| Y.r => X.b,
⋯⟩⊢ (↑f ⊚ ↑finv) Y.r = 𝟙 Y Y.r All goals completed! 🐙
All goals completed! 🐙
Prove that there is no isomorphism (in 𝑺↻)
from
inductive X
| x₁ | x₂ | x₃ | x₄
def α : X ⟶ X
| X.x₁ => X.x₂
| X.x₂ => X.x₃
| X.x₃ => X.x₄
| X.x₄ => X.x₂
def Xα : SetWithEndomap := {
t := X
carrier := Set.univ
toEnd := α
toEnd_mem := fun _ ↦ Set.mem_univ _
}
to
inductive Y
| y₁ | y₂ | y₃ | y₄
def β : Y ⟶ Y
| Y.y₁ => Y.y₂
| Y.y₂ => Y.y₃
| Y.y₃ => Y.y₄
| Y.y₄ => Y.y₁
def Yβ : SetWithEndomap := {
t := Y
carrier := Set.univ
toEnd := β
toEnd_mem := fun _ ↦ Set.mem_univ _
}
Hint: In fact, more is true: there is no map (in 𝑺↻) from X^{↻\alpha} to Y^{↻\beta}.
Solution: Exercise 3
We give a proof by contradiction below.
example : ¬(∃ f : Xα ⟶ Yβ, IsIso f) := ⊢ ¬∃ f, IsIso f
f:Xα ⟶ Yβh✝:IsIso f⊢ False
-- X.x₂ is a fixed point of α ⊚ α ⊚ α,
have h₁ : (Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := ⊢ ¬∃ f, IsIso f All goals completed! 🐙
-- but β ⊚ β ⊚ β has no fixed points in Y
have h₂ : ∀ y : Y, (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y := ⊢ ¬∃ f, IsIso f
f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)y:Y⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y
f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₁ ≠ Y.y₁f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₂ ≠ Y.y₂f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₃ ≠ Y.y₃f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₄ ≠ Y.y₄ f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₁ ≠ Y.y₁f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₂ ≠ Y.y₂f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₃ ≠ Y.y₃f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)⊢ (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₄ ≠ Y.y₄ exact fun h ↦ f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)h:(Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) Y.y₄ = Y.y₄⊢ False All goals completed! 🐙
-- Since f ⊚ (α ⊚ α ⊚ α) = (β ⊚ β ⊚ β) ⊚ f, we can derive a
-- contradiction
have h_contra : f.val ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) =
(Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) (f.val X.x₂) := ⊢ ¬∃ f, IsIso f
f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)h₂:∀ (y : Y), (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y :=
fun y ↦
Y.casesOn (motive := fun t ↦ y = t → (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y) y
(fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h)
(fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (Eq.refl y)⊢ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (Yβ.toEnd ⊚ Yβ.toEnd ⊚ ↑f ⊚ Xα.toEnd) X.x₂
f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)h₂:∀ (y : Y), (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y :=
fun y ↦
Y.casesOn (motive := fun t ↦ y = t → (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y) y
(fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h)
(fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (Eq.refl y)⊢ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (Yβ.toEnd ⊚ (↑f ⊚ Xα.toEnd) ⊚ Xα.toEnd) X.x₂
f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)h₂:∀ (y : Y), (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y :=
fun y ↦
Y.casesOn (motive := fun t ↦ y = t → (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y) y
(fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h)
(fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (Eq.refl y)⊢ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (((↑f ⊚ Xα.toEnd) ⊚ Xα.toEnd) ⊚ Xα.toEnd) X.x₂
All goals completed! 🐙
have : (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) (f.val X.x₂) =
f.val X.x₂ := ⊢ ¬∃ f, IsIso f
All goals completed! 🐙
f:Xα ⟶ Yβh✝:IsIso fh₁:(Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂ = X.x₂ := Eq.refl ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂)h₂:∀ (y : Y), (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y :=
fun y ↦
Y.casesOn (motive := fun t ↦ y = t → (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) y ≠ y) y
(fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h)
(fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (fun h ↦ Eq.symm h ▸ fun h ↦ Y.noConfusion h) (Eq.refl y)h_contra:↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) (↑f X.x₂) :=
Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = _a)
(Eq.symm (types_comp_apply (↑f) (Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) X.x₂))))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = _a X.x₂)
(Eq.symm (Category.assoc (↑f) (Yβ.toEnd ⊚ Yβ.toEnd) Yβ.toEnd))))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (Yβ.toEnd ⊚ _a) X.x₂)
(Eq.symm (Category.assoc (↑f) Yβ.toEnd Yβ.toEnd))))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (Yβ.toEnd ⊚ Yβ.toEnd ⊚ _a) X.x₂)
(Eq.symm f.property.right)))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (Yβ.toEnd ⊚ _a) X.x₂)
(Category.assoc Xα.toEnd (↑f) Yβ.toEnd)))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (Yβ.toEnd ⊚ _a ⊚ Xα.toEnd) X.x₂)
(Eq.symm f.property.right)))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = _a X.x₂)
(Category.assoc Xα.toEnd (↑f ⊚ Xα.toEnd) Yβ.toEnd)))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = (_a ⊚ Xα.toEnd) X.x₂)
(Category.assoc Xα.toEnd (↑f) Yβ.toEnd)))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = ((_a ⊚ Xα.toEnd) ⊚ Xα.toEnd) X.x₂)
(Eq.symm f.property.right)))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = _a X.x₂)
(Eq.symm (Category.assoc Xα.toEnd Xα.toEnd (↑f ⊚ Xα.toEnd)))))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = _a X.x₂)
(Eq.symm (Category.assoc (Xα.toEnd ⊚ Xα.toEnd) Xα.toEnd ↑f))))
(Eq.mpr
(id
(congrArg (fun _a ↦ ↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂) = _a)
(types_comp_apply (Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) (↑f) X.x₂)))
(Eq.refl (↑f ((Xα.toEnd ⊚ Xα.toEnd ⊚ Xα.toEnd) X.x₂))))))))))))))this✝:(Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) (↑f X.x₂) = ↑f X.x₂ :=
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f X.x₂) (Eq.symm h_contra)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a = ↑f X.x₂) h₁)) (Eq.refl (↑f X.x₂)))this:(Yβ.toEnd ⊚ Yβ.toEnd ⊚ Yβ.toEnd) (↑f X.x₂) ≠ ↑f X.x₂ := h₂ (↑f X.x₂)⊢ False
All goals completed! 🐙
Suppose {A^{↻\alpha} \xrightarrow{f} B^{↻\beta}} is a map in 𝑺↻, and that as a map of sets, {A \xrightarrow{f} B} has an inverse {B \xrightarrow{f^{-1}} A}. Show that f^{-1} is automatically a map in 𝑺↻.
Solution: Exercise 4
Let {g = f^{-1}}.
example {Aα Bβ : SetWithEndomap} (f : Aα ⟶ Bβ)
(g : Bβ.t ⟶ Aα.t) (hg_mtc : ∀ b ∈ Bβ.carrier, g b ∈ Aα.carrier)
(h : g ⊚ f.val = 𝟙 Aα.t ∧ f.val ⊚ g = 𝟙 Bβ.t)
: ∃ finv : Bβ ⟶ Aα, finv.val = g := Aα:SetWithEndomapBβ:SetWithEndomapf:Aα ⟶ Bβg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierh:g ⊚ ↑f = 𝟙 Aα.t ∧ ↑f ⊚ g = 𝟙 Bβ.t⊢ ∃ finv, ↑finv = g
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.t⊢ ∃ finv, ↑finv = g
use ⟨
g,
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.t⊢ (∀ x ∈ Bβ.carrier, g x ∈ Aα.carrier) ∧ g ⊚ Bβ.toEnd = Aα.toEnd ⊚ g
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.t⊢ ∀ x ∈ Bβ.carrier, g x ∈ Aα.carrierAα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.t⊢ g ⊚ Bβ.toEnd = Aα.toEnd ⊚ g
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.t⊢ ∀ x ∈ Bβ.carrier, g x ∈ Aα.carrier All goals completed! 🐙
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.t⊢ g ⊚ Bβ.toEnd = Aα.toEnd ⊚ g Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.t⊢ (g ⊚ Bβ.toEnd) b = (Aα.toEnd ⊚ g) b
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.t⊢ f ((g ⊚ Bβ.toEnd) b) = f ((Aα.toEnd ⊚ g) b)Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.t⊢ Function.Injective f
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.t⊢ f ((g ⊚ Bβ.toEnd) b) = f ((Aα.toEnd ⊚ g) b) Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.t⊢ Bβ.toEnd b = f ((Aα.toEnd ⊚ g) b)
All goals completed! 🐙
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.t⊢ Function.Injective f intro a₁ Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.ta₁:Aα.ta₂:Aα.t⊢ f a₁ = f a₂ → a₁ = a₂ Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.ta₁:Aα.ta₂:Aα.thf:f a₁ = f a₂⊢ a₁ = a₂
Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.ta₁:Aα.ta₂:Aα.thf:f a₁ = f a₂hgf:g (f a₁) = g (f a₂) := congrArg g hf⊢ a₁ = a₂
repeat Aα:SetWithEndomapBβ:SetWithEndomapg:Bβ.t ⟶ Aα.thg_mtc:∀ b ∈ Bβ.carrier, g b ∈ Aα.carrierf:Aα.t ⟶ Bβ.tleft✝:∀ x ∈ Aα.carrier, f x ∈ Bβ.carrierhf_comm:f ⊚ Aα.toEnd = Bβ.toEnd ⊚ fh:g ⊚ ↑⟨f, ⋯⟩ = 𝟙 Aα.t ∧ ↑⟨f, ⋯⟩ ⊚ g = 𝟙 Bβ.tb:Bβ.ta₁:Aα.ta₂:Aα.thf:f a₁ = f a₂hgf:𝟙 Aα.t a₁ = 𝟙 Aα.t a₂⊢ a₁ = a₂
All goals completed! 🐙
⟩
{\mathbb{Z} = \{\ldots, -2, -1, 0, 1, 2, 3, \ldots\}} is the set of integers, and \mathbb{Z}^{↻\alpha} and \mathbb{Z}^{↻\beta} are the maps which add 2 and 3: {\alpha(n) = n + 2}, {\beta(n) = n + 3}. Is \mathbb{Z}^{↻\alpha} isomorphic to \mathbb{Z}^{↻\beta}? (If so, find an isomorphism {\mathbb{Z}^{↻\alpha} \xrightarrow{f} \mathbb{Z}^{↻\beta}}; if not, explain how you know they are not isomorphic.)
Solution: Exercise 5
Define the maps \mathbb{Z}^{↻\alpha} and \mathbb{Z}^{↻\beta} as SetWithEndomap structures.
def α := (· + (2 : ℤ))
def β := (· + (3 : ℤ))
abbrev ℤα : SetWithEndomap := {
t := ℤ
carrier := Set.univ
toEnd := α
toEnd_mem := fun _ ↦ Set.mem_univ _
}
abbrev ℤβ : SetWithEndomap := {
t := ℤ
carrier := Set.univ
toEnd := β
toEnd_mem := fun _ ↦ Set.mem_univ _
}
We show that \mathbb{Z}^{↻\alpha} is not isomorphic to \mathbb{Z}^{↻\beta}.
example (f : ℤα ⟶ ℤβ) : ¬(IsIso f) := f:ℤα ⟶ ℤβ⊢ ¬IsIso f
-- Assume f is an isomorphism, and derive a contradiction
f:ℤα ⟶ ℤβhf_iso:IsIso f⊢ False
-- We begin by extracting the structure-preserving property of f
have hf_comm
: ∀ x : ℤ, (f.val ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ f.val) x := f:ℤα ⟶ ℤβ⊢ ¬IsIso f
f:ℤα ⟶ ℤβhf_iso:IsIso fx:ℤ⊢ (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x
All goals completed! 🐙
-- and unfolding the definitions of α and β
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_comm⊢ False
-- The key observation: f.val(x + 2) and f.val(x) have the same
-- remainder when divided by 3
have hf_mod_3_eq : ∀ x : ℤ, f.val (x + 2) ≡ f.val x [ZMOD 3] := f:ℤα ⟶ ℤβ⊢ ¬IsIso f
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commx:ℤ⊢ ↑f (x + 2) ≡ ↑f x [ZMOD 3]
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commx:ℤ⊢ ↑f (x + 2) % 3 = ↑f x % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commx:ℤ⊢ (↑f x + 3) % 3 = ↑f x % 3
All goals completed! 🐙
-- Hence all even numbers map to values with the same remainder mod 3
-- as f.val(0),
have hf_even_congr : ∀ x : ℤ, f.val (2 * x) ≡ f.val 0 [ZMOD 3] := f:ℤα ⟶ ℤβ⊢ ¬IsIso f
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))x:ℤ⊢ ↑f (2 * x) ≡ ↑f 0 [ZMOD 3]
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))x:ℤ⊢ ↑f (2 * x) % 3 = ↑f 0 % 3
induction x with
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))⊢ ↑f (2 * 0) % 3 = ↑f 0 % 3 All goals completed! 🐙
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))x':ℕih:↑f (2 * ↑x') % 3 = ↑f 0 % 3⊢ ↑f (2 * (↑x' + 1)) % 3 = ↑f 0 % 3 All goals completed! 🐙
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))x':ℕih:↑f (2 * -↑x') % 3 = ↑f 0 % 3⊢ ↑f (2 * (-↑x' - 1)) % 3 = ↑f 0 % 3 All goals completed! 🐙
-- and all odd numbers map to values with the same remainder mod 3 as
-- f.val(1)
have hf_odd_congr
: ∀ x : ℤ, f.val (2 * x + 1) ≡ f.val 1 [ZMOD 3] := f:ℤα ⟶ ℤβ⊢ ¬IsIso f
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))x:ℤ⊢ ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3]
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))x:ℤ⊢ ↑f (2 * x + 1) % 3 = ↑f 1 % 3
induction x with
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))⊢ ↑f (2 * 0 + 1) % 3 = ↑f 1 % 3 All goals completed! 🐙
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))x':ℕih:↑f (2 * ↑x' + 1) % 3 = ↑f 1 % 3⊢ ↑f (2 * (↑x' + 1) + 1) % 3 = ↑f 1 % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))x':ℕih:↑f (2 * ↑x' + 1) % 3 = ↑f 1 % 3⊢ ↑f (2 * ↑x' + 2 + 1) % 3 = ↑f 1 % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))x':ℕih:↑f (2 * ↑x' + 1) % 3 = ↑f 1 % 3⊢ ↑f (2 * ↑x' + 1 + 2) % 3 = ↑f 1 % 3
All goals completed! 🐙
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))x':ℕih:↑f (2 * -↑x' + 1) % 3 = ↑f 1 % 3⊢ ↑f (2 * (-↑x' - 1) + 1) % 3 = ↑f 1 % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))x':ℕih:↑f (2 * -↑x' + 1) % 3 = ↑f 1 % 3⊢ ↑f (2 * -↑x' - 2 * 1 + 1 + 2) % 3 = ↑f 1 % 3
have : 2 * (-x' : ℤ) - 2 * 1 + 1 + 2 = 2 * (-x') +1 := f:ℤα ⟶ ℤβ⊢ ¬IsIso f All goals completed! 🐙
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))x':ℕih:↑f (2 * -↑x' + 1) % 3 = ↑f 1 % 3this:2 * -↑x' - 2 * 1 + 1 + 2 = 2 * -↑x' + 1 :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2)) (Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1)) (Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd) (Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2)) (Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr (Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))⊢ ↑f (2 * -↑x' + 1) % 3 = ↑f 1 % 3
All goals completed! 🐙
-- So the image of f.val can have at most two distinct remainders
-- mod 3
have hf_img_set₁ : Set.range (fun x ↦ f.val x % 3) =
{f.val 0 % 3, f.val 1 % 3} := f:ℤα ⟶ ℤβ⊢ ¬IsIso f
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.t⊢ (b ∈ Set.range fun x ↦ ↑f x % 3) ↔ b ∈ {↑f 0 % 3, ↑f 1 % 3}
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.t⊢ (b ∈ Set.range fun x ↦ ↑f x % 3) → b ∈ {↑f 0 % 3, ↑f 1 % 3}f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.t⊢ b ∈ {↑f 0 % 3, ↑f 1 % 3} → b ∈ Set.range fun x ↦ ↑f x % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.t⊢ (b ∈ Set.range fun x ↦ ↑f x % 3) → b ∈ {↑f 0 % 3, ↑f 1 % 3} f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:(fun x ↦ ↑f x % 3) a = b⊢ b ∈ {↑f 0 % 3, ↑f 1 % 3}
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = b⊢ b ∈ {↑f 0 % 3, ↑f 1 % 3}
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = b⊢ b = ↑f 0 % 3 ∨ b = ↑f 1 % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = bha_even:Even a⊢ b = ↑f 0 % 3 ∨ b = ↑f 1 % 3f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = bha_odd:Odd a⊢ b = ↑f 0 % 3 ∨ b = ↑f 1 % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = bha_even:Even a⊢ b = ↑f 0 % 3 ∨ b = ↑f 1 % 3 f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = bha_even:Even a⊢ b = ↑f 0 % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = ba':ℤha_even:a = a' + a'⊢ b = ↑f 0 % 3
All goals completed! 🐙
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = bha_odd:Odd a⊢ b = ↑f 0 % 3 ∨ b = ↑f 1 % 3 f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = bha_odd:Odd a⊢ b = ↑f 1 % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.ta:ℤα.thfa:↑f a % 3 = ba':ℤha_odd:a = 2 * a' + 1⊢ b = ↑f 1 % 3
All goals completed! 🐙
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.t⊢ b ∈ {↑f 0 % 3, ↑f 1 % 3} → b ∈ Set.range fun x ↦ ↑f x % 3 f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.thb:b ∈ {↑f 0 % 3, ↑f 1 % 3}⊢ b ∈ Set.range fun x ↦ ↑f x % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.thb_mem:b = ↑f 0 % 3⊢ b ∈ Set.range fun x ↦ ↑f x % 3f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.thb_mem:b ∈ {↑f 1 % 3}⊢ b ∈ Set.range fun x ↦ ↑f x % 3 f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.thb_mem:b = ↑f 0 % 3⊢ b ∈ Set.range fun x ↦ ↑f x % 3f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.thb_mem:b ∈ {↑f 1 % 3}⊢ b ∈ Set.range fun x ↦ ↑f x % 3 (f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))b:ℤβ.thb_mem:b ∈ {↑f 1 % 3}⊢ ↑f 1 % 3 ∈ Set.range fun x ↦ ↑f x % 3; All goals completed! 🐙)
-- Now, since f is an isomorphism, f.val is bijective
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso f⊢ False
-- and hence surjective,
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.right⊢ False
-- but a surjective function on ℤ must hit all three remainders mod 3
have hf_img_set₂ : Set.range (fun x ↦ f.val x % 3) = {0, 1, 2} := f:ℤα ⟶ ℤβ⊢ ¬IsIso f
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.t⊢ (b ∈ Set.range fun x ↦ ↑f x % 3) ↔ b ∈ {0, 1, 2}
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.t⊢ (b ∈ Set.range fun x ↦ ↑f x % 3) → b ∈ {0, 1, 2}f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.t⊢ b ∈ {0, 1, 2} → b ∈ Set.range fun x ↦ ↑f x % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.t⊢ (b ∈ Set.range fun x ↦ ↑f x % 3) → b ∈ {0, 1, 2} f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.thfa:(fun x ↦ ↑f x % 3) a = b⊢ b ∈ {0, 1, 2}
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.thfa:↑f a % 3 = b⊢ b ∈ {0, 1, 2}
have hf_lbound : 0 ≤ f.val a % 3 := Int.emod_nonneg
(f.val a) (f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.thfa:↑f a % 3 = b⊢ 3 ≠ 0 All goals completed! 🐙 : (3 : ℤ) ≠ 0)
have hf_ubound : f.val a % 3 < 3 := Int.emod_lt_of_pos
(f.val a) (f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.thfa:↑f a % 3 = bhf_lbound:0 ≤ ↑f a % 3 := Int.emod_nonneg (↑f a) (of_decide_eq_true (id (Eq.refl true)))⊢ 0 < 3 All goals completed! 🐙 : (0 < (3 : ℤ)))
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.tk:↑f a % 3 = 0hfa:0 = bhf_lbound:0 ≤ 0hf_ubound:0 < 3⊢ b ∈ {0, 1, 2}f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.tk:↑f a % 3 = 1hfa:1 = bhf_lbound:0 ≤ 1hf_ubound:1 < 3⊢ b ∈ {0, 1, 2}f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.tk:↑f a % 3 = 2hfa:2 = bhf_lbound:0 ≤ 2hf_ubound:2 < 3⊢ b ∈ {0, 1, 2} f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.tk:↑f a % 3 = 0hfa:0 = bhf_lbound:0 ≤ 0hf_ubound:0 < 3⊢ b ∈ {0, 1, 2}f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.tk:↑f a % 3 = 1hfa:1 = bhf_lbound:0 ≤ 1hf_ubound:1 < 3⊢ b ∈ {0, 1, 2}f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.tk:↑f a % 3 = 2hfa:2 = bhf_lbound:0 ≤ 2hf_ubound:2 < 3⊢ b ∈ {0, 1, 2}
(f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.ta:ℤα.tk:↑f a % 3 = 2hfa:2 = bhf_lbound:0 ≤ 2hf_ubound:2 < 3⊢ 2 ∈ {0, 1, 2}; All goals completed! 🐙)
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.t⊢ b ∈ {0, 1, 2} → b ∈ Set.range fun x ↦ ↑f x % 3 f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.thb:b = 0⊢ b ∈ Set.range fun x ↦ ↑f x % 3f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.thb:b = 1⊢ b ∈ Set.range fun x ↦ ↑f x % 3f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.thb:b ∈ {2}⊢ b ∈ Set.range fun x ↦ ↑f x % 3
all_goals
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.thb:b ∈ {2}a:ℤα.thfa:↑f a = b⊢ b ∈ Set.range fun x ↦ ↑f x % 3
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.thb:b ∈ {2}a:ℤα.thfa:↑f a = b⊢ (fun x ↦ ↑f x % 3) a = b
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.thb:b ∈ {2}a:ℤα.thfa:↑f a = b⊢ ↑f a % 3 = b
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.rightb:ℤβ.thb:b ∈ {2}a:ℤα.thfa:↑f a = b⊢ 2 % 3 = 2
All goals completed! 🐙
-- Since we have found that the image of f.val can have at most two
-- distinct elements and must also have exactly three distinct
-- elements, we have a contradiction
have h_card₁
: Set.ncard ({f.val 0 % 3, f.val 1 % 3} : Set ℤ) ≤ 2 := f:ℤα ⟶ ℤβ⊢ ¬IsIso f
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.righthf_img_set₂:(Set.range fun x ↦ ↑f x % 3) = {0, 1, 2} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
have hf_lbound := Int.emod_nonneg (↑f a) (of_decide_eq_true (id (Eq.refl true)));
have hf_ubound := Int.emod_lt_of_pos (↑f a) (of_decide_eq_true (id (Eq.refl true)));
if x : 1 ≤ ↑f a % 3 then
if x : 2 ≤ ↑f a % 3 then
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)) (Eq.refl false))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)) (Eq.refl false))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))))))
(or_true False))
(eq_true True.intro))))
(or_true False))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm
(le_antisymm
(Int.le_sub_one_of_not_le
(Mathlib.Tactic.IntervalCases.of_lt_right hf_ubound
(Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)))))
x))
(Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound
else
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)) (Eq.refl false))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)) (Eq.refl false)))))
(or_false True))
(eq_true True.intro))))
(or_true False))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm (le_antisymm (Int.le_sub_one_of_not_le x) x)) (Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound
else
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)) (Eq.refl false))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)) (Eq.refl false)))))
(or_self False))
(eq_false not_false))))
(or_false True))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm
(le_antisymm (Int.le_sub_one_of_not_le x)
(Mathlib.Tactic.IntervalCases.of_le_left hf_lbound
(Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))))))
(Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound,
mpr := fun a ↦
Or.casesOn a
(fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0)) (Eq.refl (Int.ofNat 0))
(Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))))))
fun h ↦
Or.casesOn h
(fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0))
(Eq.refl (Int.ofNat 1)) (Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))))))
fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0)) (Eq.refl (Int.ofNat 2))
(Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))))) }h:{↑f 0 % 3, ↑f 1 % 3}.ncard ≤ {↑f 1 % 3}.ncard + 1 := Set.ncard_insert_le (↑f 0 % 3) {↑f 1 % 3}⊢ {↑f 0 % 3, ↑f 1 % 3}.ncard ≤ 2
rwa [Set.ncard_singletonf:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.righthf_img_set₂:(Set.range fun x ↦ ↑f x % 3) = {0, 1, 2} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
have hf_lbound := Int.emod_nonneg (↑f a) (of_decide_eq_true (id (Eq.refl true)));
have hf_ubound := Int.emod_lt_of_pos (↑f a) (of_decide_eq_true (id (Eq.refl true)));
if x : 1 ≤ ↑f a % 3 then
if x : 2 ≤ ↑f a % 3 then
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)) (Eq.refl false))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)) (Eq.refl false))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))))))
(or_true False))
(eq_true True.intro))))
(or_true False))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm
(le_antisymm
(Int.le_sub_one_of_not_le
(Mathlib.Tactic.IntervalCases.of_lt_right hf_ubound
(Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)))))
x))
(Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound
else
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)) (Eq.refl false))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)) (Eq.refl false)))))
(or_false True))
(eq_true True.intro))))
(or_true False))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm (le_antisymm (Int.le_sub_one_of_not_le x) x)) (Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound
else
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)) (Eq.refl false))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)) (Eq.refl false)))))
(or_self False))
(eq_false not_false))))
(or_false True))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm
(le_antisymm (Int.le_sub_one_of_not_le x)
(Mathlib.Tactic.IntervalCases.of_le_left hf_lbound
(Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))))))
(Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound,
mpr := fun a ↦
Or.casesOn a
(fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0)) (Eq.refl (Int.ofNat 0))
(Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))))))
fun h ↦
Or.casesOn h
(fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0))
(Eq.refl (Int.ofNat 1)) (Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))))))
fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0)) (Eq.refl (Int.ofNat 2))
(Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))))) }h:{↑f 0 % 3, ↑f 1 % 3}.ncard ≤ 1 + 1⊢ {↑f 0 % 3, ↑f 1 % 3}.ncard ≤ 2 at h
have h_card₂ : Set.ncard ({0, 1, 2} : Set ℤ) = 3 := f:ℤα ⟶ ℤβ⊢ ¬IsIso f All goals completed! 🐙
f:ℤα ⟶ ℤβhf_iso:IsIso fhf_comm:∀ (x : ℤ), (↑f ∘ ℤα.toEnd) x = (ℤβ.toEnd ∘ ↑f) x := fun x ↦ congrFun f.property.right xhf_comm':∀ (x : ℤ), ↑f (x + 2) = ↑f x + 3 := hf_commhf_mod_3_eq:∀ (x : ℤ), ↑f (x + 2) ≡ ↑f x [ZMOD 3] :=
fun x ↦
id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = ↑f x % 3) (hf_comm' x)))
(Decidable.byContradiction fun a ↦ _example._proof_1 f x a))hf_even_congr:∀ (x : ℤ), ↑f (2 * x) ≡ ↑f 0 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true (Eq.trans (congrArg (fun x ↦ ↑f x % 3 = ↑f 0 % 3) (mul_zero 2)) (eq_self (↑f 0 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_mod_3_eq (2 * ↑x'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1)))))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * -↑x' - _a + 2) % 3 = ↑f 0 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (sub_add_cancel (2 * -↑x') 2)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) ih)) (Eq.refl (↑f 0 % 3)))))))hf_odd_congr:∀ (x : ℤ), ↑f (2 * x + 1) ≡ ↑f 1 [ZMOD 3] :=
fun x ↦
id
(Int.induction_on x
(of_eq_true
(Eq.trans
(congrArg (fun x ↦ ↑f x % 3 = ↑f 1 % 3) (Eq.trans (congrArg (fun x ↦ x + 1) (mul_zero 2)) (zero_add 1)))
(eq_self (↑f 1 % 3))))
(fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_add 2 (↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a + 1) % 3 = ↑f 1 % 3) (mul_one 2)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (add_assoc (2 * ↑x') 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f (2 * ↑x' + _a) % 3 = ↑f 1 % 3) (add_comm 2 1)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) (Eq.symm (add_assoc (2 * ↑x') 1 2))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_mod_3_eq (2 * ↑x' + 1))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) ih)) (Eq.refl (↑f 1 % 3)))))))))
fun x' ih ↦
Eq.mpr (id (congrArg (fun _a ↦ ↑f (_a + 1) % 3 = ↑f 1 % 3) (mul_sub 2 (-↑x') 1)))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm (hf_mod_3_eq (2 * -↑x' - 2 * 1 + 1)))))
(have this :=
Mathlib.Tactic.Ring.of_eq
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.sub_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add (Mathlib.Tactic.Ring.mul_one (Nat.rawCast 2))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0)))
(Mathlib.Tactic.Ring.zero_mul (Nat.rawCast 1 + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (Nat.rawCast 2 + 0))))
(Mathlib.Tactic.Ring.sub_pf
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.negOfNat 2)))))
Mathlib.Tactic.Ring.neg_zero)
(Mathlib.Tactic.Ring.add_pf_add_gt (Int.negOfNat 2).rawCast
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 2))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.add_pf_add_overlap
(Mathlib.Meta.NormNum.IsNat.to_raw_eq
(Mathlib.Meta.NormNum.IsInt.to_isNat
(Mathlib.Meta.NormNum.isInt_add (Eq.refl HAdd.hAdd)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Eq.refl (Int.ofNat 1)))))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.add_congr
(Mathlib.Tactic.Ring.mul_congr
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Tactic.Ring.neg_congr (Mathlib.Tactic.Ring.atom_pf ↑x')
(Mathlib.Tactic.Ring.neg_add
(Mathlib.Tactic.Ring.neg_mul (↑x') (Nat.rawCast 1)
(Mathlib.Tactic.Ring.neg_one_mul
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1))
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 1))
(Eq.refl (Int.negOfNat 1))))))
Mathlib.Tactic.Ring.neg_zero))
(Mathlib.Tactic.Ring.add_mul
(Mathlib.Tactic.Ring.mul_add
(Mathlib.Tactic.Ring.mul_pf_right (↑x') (Nat.rawCast 1)
(Mathlib.Meta.NormNum.IsInt.to_raw_eq
(Mathlib.Meta.NormNum.isInt_mul (Eq.refl HMul.hMul)
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.IsNat.of_raw ℤ 2))
(Mathlib.Meta.NormNum.IsInt.of_raw ℤ (Int.negOfNat 1)) (Eq.refl (Int.negOfNat 2)))))
(Mathlib.Tactic.Ring.mul_zero (Nat.rawCast 2))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0)))
(Mathlib.Tactic.Ring.zero_mul (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 1).rawCast + 0))
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))))
(Mathlib.Tactic.Ring.cast_pos (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Tactic.Ring.add_pf_add_gt (Nat.rawCast 1)
(Mathlib.Tactic.Ring.add_pf_add_zero (↑x' ^ Nat.rawCast 1 * (Int.negOfNat 2).rawCast + 0))));
Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) this)) ih)))hf_img_set₁:(Set.range fun x ↦ ↑f x % 3) = {↑f 0 % 3, ↑f 1 % 3} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
Eq.mpr (id (congrArg (fun _a ↦ _a) (propext Set.mem_insert_iff)))
(Eq.mpr (id (congrArg (fun _a ↦ b = ↑f 0 % 3 ∨ _a) (propext Set.mem_singleton_iff)))
(Or.casesOn (Int.even_or_odd a)
(fun ha_even ↦
Or.inl
(Exists.casesOn ha_even fun a' ha_even ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) ha_even))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 0 % 3) (Eq.symm (two_mul a'))))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 0 % 3) (hf_even_congr a'))) (Eq.refl (↑f 0 % 3)))))))
fun ha_odd ↦
Or.inr
(Exists.casesOn ha_odd fun a' ha_odd ↦
Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (Eq.symm hfa)))
(Eq.mpr (id (congrArg (fun _a ↦ ↑f _a % 3 = ↑f 1 % 3) ha_odd))
(Eq.mpr (id (congrArg (fun _a ↦ _a = ↑f 1 % 3) (hf_odd_congr a'))) (Eq.refl (↑f 1 % 3))))))),
mpr := fun hb ↦
Or.casesOn hb
(fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 0))))
fun hb_mem ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ Set.range fun x ↦ ↑f x % 3) hb_mem))
(of_eq_true (Eq.trans Set.mem_range._simp_1 (exists_apply_eq_apply._simp_1 (fun a ↦ ↑f a % 3) 1))) }hf_bij:Function.Bijective ↑f := ConcreteCategory.bijective_of_isIso fhf_surj:Function.Surjective ↑f := hf_bij.righthf_img_set₂:(Set.range fun x ↦ ↑f x % 3) = {0, 1, 2} :=
Set.ext fun b ↦
{
mp := fun a ↦
Exists.casesOn a fun a hfa ↦
have hf_lbound := Int.emod_nonneg (↑f a) (of_decide_eq_true (id (Eq.refl true)));
have hf_ubound := Int.emod_lt_of_pos (↑f a) (of_decide_eq_true (id (Eq.refl true)));
if x : 1 ≤ ↑f a % 3 then
if x : 2 ≤ ↑f a % 3 then
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)) (Eq.refl false))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)) (Eq.refl false))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2))))))
(or_true False))
(eq_true True.intro))))
(or_true False))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm
(le_antisymm
(Int.le_sub_one_of_not_le
(Mathlib.Tactic.IntervalCases.of_lt_right hf_ubound
(Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)))))
x))
(Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound
else
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)) (Eq.refl false))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)) (Eq.refl false)))))
(or_false True))
(eq_true True.intro))))
(or_true False))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm (le_antisymm (Int.le_sub_one_of_not_le x) x)) (Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound
else
Eq.ndrec (motive := fun x ↦ ↑f a % 3 = x → x = b → 0 ≤ x → x < 3 → b ∈ {0, 1, 2})
(fun k hfa hf_lbound hf_ubound ↦
Eq.mpr (id (congrArg (fun _a ↦ _a ∈ {0, 1, 2}) (Eq.symm hfa)))
(of_eq_true
(Eq.trans
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_true
(Mathlib.Meta.NormNum.isNat_eq_true (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))))
(Eq.trans Set.mem_insert_iff._simp_1
(Eq.trans
(Eq.trans
(congr
(congrArg Or
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)) (Eq.refl false))))
(Eq.trans Set.mem_singleton_iff._simp_1
(eq_false
(Mathlib.Meta.NormNum.isNat_eq_false
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)) (Eq.refl false)))))
(or_self False))
(eq_false not_false))))
(or_false True))
(eq_true True.intro)))
(eq_true True.intro))))
(Eq.symm
(le_antisymm (Int.le_sub_one_of_not_le x)
(Mathlib.Tactic.IntervalCases.of_le_left hf_lbound
(Mathlib.Meta.NormNum.IsNat.to_raw_eq (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0))))))
(Eq.refl (↑f a % 3)) hfa hf_lbound hf_ubound,
mpr := fun a ↦
Or.casesOn a
(fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0)) (Eq.refl (Int.ofNat 0))
(Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 0)))))))
fun h ↦
Or.casesOn h
(fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0))
(Eq.refl (Int.ofNat 1)) (Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 1)))))))
fun hb ↦
Exists.casesOn (hf_surj b) fun a hfa ↦
Exists.intro a
(id
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = b) hfa))
(Eq.mpr (id (congrArg (fun _a ↦ _a % 3 = _a) hb))
(Mathlib.Meta.NormNum.isNat_eq_true
(Mathlib.Meta.NormNum.isInt_emod
(Mathlib.Meta.NormNum.IsNat.to_isInt (Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 3)) (Eq.refl (Int.ofNat 0)) (Eq.refl (Int.ofNat 2))
(Eq.refl true))
(Mathlib.Meta.NormNum.isNat_ofNat ℤ (Eq.refl 2)))))) }h_card₁:3 ≤ 2h_card₂:{0, 1, 2}.ncard = 3⊢ False
All goals completed! 🐙
Each of the following graphs is isomorphic to exactly one of the others. Which?
Solution: Exercise 6
We label the arrows in each graph from top to bottom.
inductive A
| a₁ | a₂ | a₃
We label the dots in each graph from left to right.
inductive D
| d₁ | d₂ | d₃
Then the six graphs (a) to (f) are as follows:
def graph_a : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => D.d₂
| A.a₂ => D.d₁
| A.a₃ => D.d₃
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => D.d₃
| A.a₂ => D.d₂
| A.a₃ => D.d₂
toTgt_mem := fun _ ↦ Set.mem_univ _
}
def graph_b : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => D.d₁
| A.a₂ => D.d₂
| A.a₃ => D.d₂,
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => D.d₂
| A.a₂ => D.d₃
| A.a₃ => D.d₁
toTgt_mem := fun _ ↦ Set.mem_univ _
}
def graph_c : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => D.d₁
| A.a₂ => D.d₁
| A.a₃ => D.d₁
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => D.d₃
| A.a₂ => D.d₂
| A.a₃ => D.d₃
toTgt_mem := fun _ ↦ Set.mem_univ _
}
def graph_d : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => D.d₃
| A.a₂ => D.d₁
| A.a₃ => D.d₂
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => D.d₂
| A.a₂ => D.d₂
| A.a₃ => D.d₃
toTgt_mem := fun _ ↦ Set.mem_univ _
}
def graph_e : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => D.d₁
| A.a₂ => D.d₁
| A.a₃ => D.d₃
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => D.d₃
| A.a₂ => D.d₂
| A.a₃ => D.d₁
toTgt_mem := fun _ ↦ Set.mem_univ _
}
def graph_f : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => D.d₁
| A.a₂ => D.d₁
| A.a₃ => D.d₁
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => D.d₂
| A.a₂ => D.d₃
| A.a₃ => D.d₃
toTgt_mem := fun _ ↦ Set.mem_univ _
}
Graph (a) is isomorphic to graph (d).
def f₁ : graph_a ⟶ graph_d := {
val := (
fun -- maps arrows
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun -- maps dots
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃
)
property := ⊢ (∀ x ∈ graph_a.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
x ∈
graph_d.carrierA) ∧
(∀ x ∈ graph_a.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2
x ∈
graph_d.carrierD) ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toSrc =
graph_d.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1 ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt =
graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
⊢ ∀ x ∈ graph_a.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
x ∈
graph_d.carrierA⊢ ∀ x ∈ graph_a.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2
x ∈
graph_d.carrierD⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toSrc =
graph_d.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt =
graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
all_goals
first | ⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt =
graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
| x:graph_a.tA⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt)
x =
(graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
x; ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt)
A.a₁ =
(graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt)
A.a₂ =
(graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt)
A.a₃ =
(graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₃ ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt)
A.a₁ =
(graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt)
A.a₂ =
(graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_a.toTgt)
A.a₃ =
(graph_d.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₃ All goals completed! 🐙
}
def finv₁ : graph_d ⟶ graph_a := {
val := (
fun -- maps arrows
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun -- maps dots
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃
)
property := ⊢ (∀ x ∈ graph_d.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
x ∈
graph_a.carrierA) ∧
(∀ x ∈ graph_d.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2
x ∈
graph_a.carrierD) ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toSrc =
graph_a.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1 ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt =
graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
⊢ ∀ x ∈ graph_d.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
x ∈
graph_a.carrierA⊢ ∀ x ∈ graph_d.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2
x ∈
graph_a.carrierD⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toSrc =
graph_a.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt =
graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
all_goals
first | ⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt =
graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
| x:graph_d.tA⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt)
x =
(graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
x; ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt)
A.a₁ =
(graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt)
A.a₂ =
(graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt)
A.a₃ =
(graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₃ ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt)
A.a₁ =
(graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt)
A.a₂ =
(graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_d.toTgt)
A.a₃ =
(graph_a.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₃ All goals completed! 🐙
}
example : graph_a ≅ graph_d := {
hom := f₁,
inv := finv₁,
hom_inv_id := ⊢ finv₁ ⊚ f₁ = 𝟙 graph_a
have h₁ : (finv₁.val.1 ⊚ f₁.val.1 = 𝟙 graph_a.tA) ∧
(finv₁.val.2 ⊚ f₁.val.2 = 𝟙 graph_a.tD) := ⊢ finv₁ ⊚ f₁ = 𝟙 graph_a
⊢ (↑finv₁).1 ⊚ (↑f₁).1 = 𝟙 graph_a.tA⊢ (↑finv₁).2 ⊚ (↑f₁).2 = 𝟙 graph_a.tD ⊢ (↑finv₁).1 ⊚ (↑f₁).1 = 𝟙 graph_a.tA⊢ (↑finv₁).2 ⊚ (↑f₁).2 = 𝟙 graph_a.tD (x:graph_a.tD⊢ ((↑finv₁).2 ⊚ (↑f₁).2) x = 𝟙 graph_a.tD x; ⊢ ((↑finv₁).2 ⊚ (↑f₁).2) D.d₁ = 𝟙 graph_a.tD D.d₁⊢ ((↑finv₁).2 ⊚ (↑f₁).2) D.d₂ = 𝟙 graph_a.tD D.d₂⊢ ((↑finv₁).2 ⊚ (↑f₁).2) D.d₃ = 𝟙 graph_a.tD D.d₃ ⊢ ((↑finv₁).2 ⊚ (↑f₁).2) D.d₁ = 𝟙 graph_a.tD D.d₁⊢ ((↑finv₁).2 ⊚ (↑f₁).2) D.d₂ = 𝟙 graph_a.tD D.d₂⊢ ((↑finv₁).2 ⊚ (↑f₁).2) D.d₃ = 𝟙 graph_a.tD D.d₃ All goals completed! 🐙)
have h₂ : (finv₁.val.1 ⊚ f₁.val.1, finv₁.val.2 ⊚ f₁.val.2) =
(𝟙 graph_a.tA, 𝟙 graph_a.tD) := ⊢ finv₁ ⊚ f₁ = 𝟙 graph_a
All goals completed! 🐙
All goals completed! 🐙,
inv_hom_id := ⊢ f₁ ⊚ finv₁ = 𝟙 graph_d
have h₁ : (f₁.val.1 ⊚ finv₁.val.1 = 𝟙 graph_d.tA) ∧
(f₁.val.2 ⊚ finv₁.val.2 = 𝟙 graph_d.tD) := ⊢ f₁ ⊚ finv₁ = 𝟙 graph_d
⊢ (↑f₁).1 ⊚ (↑finv₁).1 = 𝟙 graph_d.tA⊢ (↑f₁).2 ⊚ (↑finv₁).2 = 𝟙 graph_d.tD ⊢ (↑f₁).1 ⊚ (↑finv₁).1 = 𝟙 graph_d.tA⊢ (↑f₁).2 ⊚ (↑finv₁).2 = 𝟙 graph_d.tD (x:graph_d.tD⊢ ((↑f₁).2 ⊚ (↑finv₁).2) x = 𝟙 graph_d.tD x; ⊢ ((↑f₁).2 ⊚ (↑finv₁).2) D.d₁ = 𝟙 graph_d.tD D.d₁⊢ ((↑f₁).2 ⊚ (↑finv₁).2) D.d₂ = 𝟙 graph_d.tD D.d₂⊢ ((↑f₁).2 ⊚ (↑finv₁).2) D.d₃ = 𝟙 graph_d.tD D.d₃ ⊢ ((↑f₁).2 ⊚ (↑finv₁).2) D.d₁ = 𝟙 graph_d.tD D.d₁⊢ ((↑f₁).2 ⊚ (↑finv₁).2) D.d₂ = 𝟙 graph_d.tD D.d₂⊢ ((↑f₁).2 ⊚ (↑finv₁).2) D.d₃ = 𝟙 graph_d.tD D.d₃ All goals completed! 🐙)
have h₂ : (f₁.val.1 ⊚ finv₁.val.1, f₁.val.2 ⊚ finv₁.val.2) =
(𝟙 graph_d.tA, 𝟙 graph_d.tD) := ⊢ f₁ ⊚ finv₁ = 𝟙 graph_d
All goals completed! 🐙
All goals completed! 🐙
}
Graph (b) is isomorphic to graph (e).
def f₂ : graph_b ⟶ graph_e := {
val := (
fun -- maps arrows
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun -- maps dots
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂
)
property := ⊢ (∀ x ∈ graph_b.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1
x ∈
graph_e.carrierA) ∧
(∀ x ∈ graph_b.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2
x ∈
graph_e.carrierD) ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toSrc =
graph_e.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1 ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt =
graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1
⊢ ∀ x ∈ graph_b.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1
x ∈
graph_e.carrierA⊢ ∀ x ∈ graph_b.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2
x ∈
graph_e.carrierD⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toSrc =
graph_e.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt =
graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1
all_goals
first | ⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt =
graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1
| x:graph_b.tA⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt)
x =
(graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1)
x; ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt)
A.a₁ =
(graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt)
A.a₂ =
(graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt)
A.a₃ =
(graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1)
A.a₃ ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt)
A.a₁ =
(graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt)
A.a₂ =
(graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).2 ⊚
graph_b.toTgt)
A.a₃ =
(graph_e.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₁
| D.d₃ => D.d₂).1)
A.a₃ All goals completed! 🐙
}
def finv₂ : graph_e ⟶ graph_b := {
val := (
fun -- maps arrows
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun -- maps dots
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁
)
property := ⊢ (∀ x ∈ graph_e.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1
x ∈
graph_b.carrierA) ∧
(∀ x ∈ graph_e.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2
x ∈
graph_b.carrierD) ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toSrc =
graph_b.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1 ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt =
graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1
⊢ ∀ x ∈ graph_e.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1
x ∈
graph_b.carrierA⊢ ∀ x ∈ graph_e.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2
x ∈
graph_b.carrierD⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toSrc =
graph_b.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt =
graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1
all_goals
first | ⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt =
graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1
| x:graph_e.tA⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt)
x =
(graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1)
x; ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt)
A.a₁ =
(graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt)
A.a₂ =
(graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt)
A.a₃ =
(graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1)
A.a₃ ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt)
A.a₁ =
(graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt)
A.a₂ =
(graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).2 ⊚
graph_e.toTgt)
A.a₃ =
(graph_b.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₂
| A.a₃ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₂
| D.d₂ => D.d₃
| D.d₃ => D.d₁).1)
A.a₃ All goals completed! 🐙
}
example : graph_b ≅ graph_e := {
hom := f₂,
inv := finv₂,
hom_inv_id := ⊢ finv₂ ⊚ f₂ = 𝟙 graph_b
have h₁ : (finv₂.val.1 ⊚ f₂.val.1 = 𝟙 graph_b.tA) ∧
(finv₂.val.2 ⊚ f₂.val.2 = 𝟙 graph_b.tD) := ⊢ finv₂ ⊚ f₂ = 𝟙 graph_b
⊢ (↑finv₂).1 ⊚ (↑f₂).1 = 𝟙 graph_b.tA⊢ (↑finv₂).2 ⊚ (↑f₂).2 = 𝟙 graph_b.tD ⊢ (↑finv₂).1 ⊚ (↑f₂).1 = 𝟙 graph_b.tA⊢ (↑finv₂).2 ⊚ (↑f₂).2 = 𝟙 graph_b.tD (x:graph_b.tD⊢ ((↑finv₂).2 ⊚ (↑f₂).2) x = 𝟙 graph_b.tD x; ⊢ ((↑finv₂).2 ⊚ (↑f₂).2) D.d₁ = 𝟙 graph_b.tD D.d₁⊢ ((↑finv₂).2 ⊚ (↑f₂).2) D.d₂ = 𝟙 graph_b.tD D.d₂⊢ ((↑finv₂).2 ⊚ (↑f₂).2) D.d₃ = 𝟙 graph_b.tD D.d₃ ⊢ ((↑finv₂).2 ⊚ (↑f₂).2) D.d₁ = 𝟙 graph_b.tD D.d₁⊢ ((↑finv₂).2 ⊚ (↑f₂).2) D.d₂ = 𝟙 graph_b.tD D.d₂⊢ ((↑finv₂).2 ⊚ (↑f₂).2) D.d₃ = 𝟙 graph_b.tD D.d₃ All goals completed! 🐙)
have h₂ : (finv₂.val.1 ⊚ f₂.val.1, finv₂.val.2 ⊚ f₂.val.2) =
(𝟙 graph_b.tA, 𝟙 graph_b.tD) := ⊢ finv₂ ⊚ f₂ = 𝟙 graph_b
All goals completed! 🐙
All goals completed! 🐙,
inv_hom_id := ⊢ f₂ ⊚ finv₂ = 𝟙 graph_e
have h₁ : (f₂.val.1 ⊚ finv₂.val.1 = 𝟙 graph_e.tA) ∧
(f₂.val.2 ⊚ finv₂.val.2 = 𝟙 graph_e.tD) := ⊢ f₂ ⊚ finv₂ = 𝟙 graph_e
⊢ (↑f₂).1 ⊚ (↑finv₂).1 = 𝟙 graph_e.tA⊢ (↑f₂).2 ⊚ (↑finv₂).2 = 𝟙 graph_e.tD ⊢ (↑f₂).1 ⊚ (↑finv₂).1 = 𝟙 graph_e.tA⊢ (↑f₂).2 ⊚ (↑finv₂).2 = 𝟙 graph_e.tD (x:graph_e.tD⊢ ((↑f₂).2 ⊚ (↑finv₂).2) x = 𝟙 graph_e.tD x; ⊢ ((↑f₂).2 ⊚ (↑finv₂).2) D.d₁ = 𝟙 graph_e.tD D.d₁⊢ ((↑f₂).2 ⊚ (↑finv₂).2) D.d₂ = 𝟙 graph_e.tD D.d₂⊢ ((↑f₂).2 ⊚ (↑finv₂).2) D.d₃ = 𝟙 graph_e.tD D.d₃ ⊢ ((↑f₂).2 ⊚ (↑finv₂).2) D.d₁ = 𝟙 graph_e.tD D.d₁⊢ ((↑f₂).2 ⊚ (↑finv₂).2) D.d₂ = 𝟙 graph_e.tD D.d₂⊢ ((↑f₂).2 ⊚ (↑finv₂).2) D.d₃ = 𝟙 graph_e.tD D.d₃ All goals completed! 🐙)
have h₂ : (f₂.val.1 ⊚ finv₂.val.1, f₂.val.2 ⊚ finv₂.val.2) =
(𝟙 graph_e.tA, 𝟙 graph_e.tD) := ⊢ f₂ ⊚ finv₂ = 𝟙 graph_e
All goals completed! 🐙
All goals completed! 🐙
}
Graph (c) is isomorphic to graph (f).
def f₃ : graph_c ⟶ graph_f := {
val := (
fun -- maps arrows
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun -- maps dots
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃
)
property := ⊢ (∀ x ∈ graph_c.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
x ∈
graph_f.carrierA) ∧
(∀ x ∈ graph_c.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2
x ∈
graph_f.carrierD) ∧
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toSrc =
graph_f.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1 ∧
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt =
graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
⊢ ∀ x ∈ graph_c.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
x ∈
graph_f.carrierA⊢ ∀ x ∈ graph_c.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2
x ∈
graph_f.carrierD⊢ (fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toSrc =
graph_f.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1⊢ (fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt =
graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
all_goals
first | ⊢ (fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt =
graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
| x:graph_c.tA⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt)
x =
(graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
x; ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt)
A.a₁ =
(graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt)
A.a₂ =
(graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt)
A.a₃ =
(graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₃ ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt)
A.a₁ =
(graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt)
A.a₂ =
(graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_c.toTgt)
A.a₃ =
(graph_f.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₃ All goals completed! 🐙
}
def finv₃ : graph_f ⟶ graph_c := {
val := (
fun -- maps arrows
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun -- maps dots
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃
)
property := ⊢ (∀ x ∈ graph_f.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
x ∈
graph_c.carrierA) ∧
(∀ x ∈ graph_f.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2
x ∈
graph_c.carrierD) ∧
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toSrc =
graph_c.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1 ∧
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt =
graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
⊢ ∀ x ∈ graph_f.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
x ∈
graph_c.carrierA⊢ ∀ x ∈ graph_f.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2
x ∈
graph_c.carrierD⊢ (fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toSrc =
graph_c.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1⊢ (fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt =
graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
all_goals
first | ⊢ (fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt =
graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1
| x:graph_f.tA⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt)
x =
(graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
x; ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt)
A.a₁ =
(graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt)
A.a₂ =
(graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt)
A.a₃ =
(graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₃ ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt)
A.a₁ =
(graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt)
A.a₂ =
(graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).2 ⊚
graph_f.toTgt)
A.a₃ =
(graph_c.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₂
| A.a₂ => A.a₁
| A.a₃ => A.a₃,
fun x ↦
match x with
| D.d₁ => D.d₁
| D.d₂ => D.d₂
| D.d₃ => D.d₃).1)
A.a₃ All goals completed! 🐙
}
example : graph_c ≅ graph_f := {
hom := f₃,
inv := finv₃,
hom_inv_id := ⊢ finv₃ ⊚ f₃ = 𝟙 graph_c
have h₁ : (finv₃.val.1 ⊚ f₃.val.1 = 𝟙 graph_c.tA) ∧
(finv₃.val.2 ⊚ f₃.val.2 = 𝟙 graph_c.tD) := ⊢ finv₃ ⊚ f₃ = 𝟙 graph_c
⊢ (↑finv₃).1 ⊚ (↑f₃).1 = 𝟙 graph_c.tA⊢ (↑finv₃).2 ⊚ (↑f₃).2 = 𝟙 graph_c.tD ⊢ (↑finv₃).1 ⊚ (↑f₃).1 = 𝟙 graph_c.tA⊢ (↑finv₃).2 ⊚ (↑f₃).2 = 𝟙 graph_c.tD (x:graph_c.tD⊢ ((↑finv₃).2 ⊚ (↑f₃).2) x = 𝟙 graph_c.tD x; ⊢ ((↑finv₃).2 ⊚ (↑f₃).2) D.d₁ = 𝟙 graph_c.tD D.d₁⊢ ((↑finv₃).2 ⊚ (↑f₃).2) D.d₂ = 𝟙 graph_c.tD D.d₂⊢ ((↑finv₃).2 ⊚ (↑f₃).2) D.d₃ = 𝟙 graph_c.tD D.d₃ ⊢ ((↑finv₃).2 ⊚ (↑f₃).2) D.d₁ = 𝟙 graph_c.tD D.d₁⊢ ((↑finv₃).2 ⊚ (↑f₃).2) D.d₂ = 𝟙 graph_c.tD D.d₂⊢ ((↑finv₃).2 ⊚ (↑f₃).2) D.d₃ = 𝟙 graph_c.tD D.d₃ All goals completed! 🐙)
have h₂ : (finv₃.val.1 ⊚ f₃.val.1, finv₃.val.2 ⊚ f₃.val.2) =
(𝟙 graph_c.tA, 𝟙 graph_c.tD) := ⊢ finv₃ ⊚ f₃ = 𝟙 graph_c
All goals completed! 🐙
All goals completed! 🐙,
inv_hom_id := ⊢ f₃ ⊚ finv₃ = 𝟙 graph_f
have h₁ : (f₃.val.1 ⊚ finv₃.val.1 = 𝟙 graph_f.tA) ∧
(f₃.val.2 ⊚ finv₃.val.2 = 𝟙 graph_f.tD) := ⊢ f₃ ⊚ finv₃ = 𝟙 graph_f
⊢ (↑f₃).1 ⊚ (↑finv₃).1 = 𝟙 graph_f.tA⊢ (↑f₃).2 ⊚ (↑finv₃).2 = 𝟙 graph_f.tD ⊢ (↑f₃).1 ⊚ (↑finv₃).1 = 𝟙 graph_f.tA⊢ (↑f₃).2 ⊚ (↑finv₃).2 = 𝟙 graph_f.tD (x:graph_f.tD⊢ ((↑f₃).2 ⊚ (↑finv₃).2) x = 𝟙 graph_f.tD x; ⊢ ((↑f₃).2 ⊚ (↑finv₃).2) D.d₁ = 𝟙 graph_f.tD D.d₁⊢ ((↑f₃).2 ⊚ (↑finv₃).2) D.d₂ = 𝟙 graph_f.tD D.d₂⊢ ((↑f₃).2 ⊚ (↑finv₃).2) D.d₃ = 𝟙 graph_f.tD D.d₃ ⊢ ((↑f₃).2 ⊚ (↑finv₃).2) D.d₁ = 𝟙 graph_f.tD D.d₁⊢ ((↑f₃).2 ⊚ (↑finv₃).2) D.d₂ = 𝟙 graph_f.tD D.d₂⊢ ((↑f₃).2 ⊚ (↑finv₃).2) D.d₃ = 𝟙 graph_f.tD D.d₃ All goals completed! 🐙)
have h₂ : (f₃.val.1 ⊚ finv₃.val.1, f₃.val.2 ⊚ finv₃.val.2) =
(𝟙 graph_f.tA, 𝟙 graph_f.tD) := ⊢ f₃ ⊚ finv₃ = 𝟙 graph_f
All goals completed! 🐙
All goals completed! 🐙
}
If these two graphs are isomorphic, find an isomorphism between them; if they are not isomorphic, explain how you know they are not.
Solution: Exercise 7
We label the arrows in each graph starting with the arrow at the bottom left and moving clockwise through the four outer arrows (a_1 to a_4) and then vertically upwards through the two inner arrows (a_5 and a_6).
inductive A
| a₁ | a₂ | a₃ | a₄ | a₅ | a₆
We label the dots in each graph starting with the bottom dot and moving clockwise through the four outer dots (d_1 to d_4) and then finishing with the centre dot (d_5).
inductive D
| d₁ | d₂ | d₃ | d₄ | d₅
Then the two graphs are as follows:
def graph_L : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => D.d₁
| A.a₂ => D.d₂
| A.a₃ => D.d₃
| A.a₄ => D.d₄
| A.a₅ => D.d₁
| A.a₆ => D.d₅
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => D.d₂
| A.a₂ => D.d₃
| A.a₃ => D.d₄
| A.a₄ => D.d₁
| A.a₅ => D.d₅
| A.a₆ => D.d₃
toTgt_mem := fun _ ↦ Set.mem_univ _
}
def graph_R : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => D.d₂
| A.a₂ => D.d₃
| A.a₃ => D.d₃
| A.a₄ => D.d₄
| A.a₅ => D.d₁
| A.a₆ => D.d₅
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => D.d₁
| A.a₂ => D.d₂
| A.a₃ => D.d₄
| A.a₄ => D.d₁
| A.a₅ => D.d₅
| A.a₆ => D.d₃
toTgt_mem := fun _ ↦ Set.mem_univ _
}
The two graphs are isomorphic, with an isomorphism between them given by f below.
def f : graph_L ⟶ graph_R := {
val := (
fun -- maps arrows
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁
,
fun -- maps dots
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂
)
property := ⊢ (∀ x ∈ graph_L.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1
x ∈
graph_R.carrierA) ∧
(∀ x ∈ graph_L.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2
x ∈
graph_R.carrierD) ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toSrc =
graph_R.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1 ∧
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt =
graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1
⊢ ∀ x ∈ graph_L.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1
x ∈
graph_R.carrierA⊢ ∀ x ∈ graph_L.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2
x ∈
graph_R.carrierD⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toSrc =
graph_R.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt =
graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1
all_goals
first | ⊢ (fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt =
graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1
| x:graph_L.tA⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
x =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
x; ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₁ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₂ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₃ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₃⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₄ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₄⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₅ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₅⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₆ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₆ ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₁ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₂ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₃ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₃⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₄ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₄⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₅ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₅⊢ ((fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).2 ⊚
graph_L.toTgt)
A.a₆ =
(graph_R.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₃
| A.a₂ => A.a₄
| A.a₃ => A.a₅
| A.a₄ => A.a₆
| A.a₅ => A.a₂
| A.a₆ => A.a₁,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₄
| D.d₃ => D.d₁
| D.d₄ => D.d₅
| D.d₅ => D.d₂).1)
A.a₆ All goals completed! 🐙
}
def finv : graph_R ⟶ graph_L := {
val := (
fun -- maps arrows
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun -- maps dots
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄
)
property := ⊢ (∀ x ∈ graph_R.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1
x ∈
graph_L.carrierA) ∧
(∀ x ∈ graph_R.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2
x ∈
graph_L.carrierD) ∧
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toSrc =
graph_L.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1 ∧
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt =
graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1
⊢ ∀ x ∈ graph_R.carrierA,
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1
x ∈
graph_L.carrierA⊢ ∀ x ∈ graph_R.carrierD,
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2
x ∈
graph_L.carrierD⊢ (fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toSrc =
graph_L.toSrc ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1⊢ (fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt =
graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1
all_goals
first | ⊢ (fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt =
graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1
| x:graph_R.tA⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
x =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
x; ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₁ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₂ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₃ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₃⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₄ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₄⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₅ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₅⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₆ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₆ ⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₁ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₁⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₂ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₂⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₃ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₃⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₄ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₄⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₅ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₅⊢ ((fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).2 ⊚
graph_R.toTgt)
A.a₆ =
(graph_L.toTgt ⊚
(fun x ↦
match x with
| A.a₁ => A.a₆
| A.a₂ => A.a₅
| A.a₃ => A.a₁
| A.a₄ => A.a₂
| A.a₅ => A.a₃
| A.a₆ => A.a₄,
fun x ↦
match x with
| D.d₁ => D.d₃
| D.d₂ => D.d₅
| D.d₃ => D.d₁
| D.d₄ => D.d₂
| D.d₅ => D.d₄).1)
A.a₆ All goals completed! 🐙
}
example : graph_L ≅ graph_R := {
hom := f,
inv := finv,
hom_inv_id := ⊢ finv ⊚ f = 𝟙 graph_L
have h₁ : (finv.val.1 ⊚ f.val.1 = 𝟙 graph_L.tA) ∧
(finv.val.2 ⊚ f.val.2 = 𝟙 graph_L.tD) := ⊢ finv ⊚ f = 𝟙 graph_L
⊢ (↑finv).1 ⊚ (↑f).1 = 𝟙 graph_L.tA⊢ (↑finv).2 ⊚ (↑f).2 = 𝟙 graph_L.tD ⊢ (↑finv).1 ⊚ (↑f).1 = 𝟙 graph_L.tA⊢ (↑finv).2 ⊚ (↑f).2 = 𝟙 graph_L.tD (x:graph_L.tD⊢ ((↑finv).2 ⊚ (↑f).2) x = 𝟙 graph_L.tD x; ⊢ ((↑finv).2 ⊚ (↑f).2) D.d₁ = 𝟙 graph_L.tD D.d₁⊢ ((↑finv).2 ⊚ (↑f).2) D.d₂ = 𝟙 graph_L.tD D.d₂⊢ ((↑finv).2 ⊚ (↑f).2) D.d₃ = 𝟙 graph_L.tD D.d₃⊢ ((↑finv).2 ⊚ (↑f).2) D.d₄ = 𝟙 graph_L.tD D.d₄⊢ ((↑finv).2 ⊚ (↑f).2) D.d₅ = 𝟙 graph_L.tD D.d₅ ⊢ ((↑finv).2 ⊚ (↑f).2) D.d₁ = 𝟙 graph_L.tD D.d₁⊢ ((↑finv).2 ⊚ (↑f).2) D.d₂ = 𝟙 graph_L.tD D.d₂⊢ ((↑finv).2 ⊚ (↑f).2) D.d₃ = 𝟙 graph_L.tD D.d₃⊢ ((↑finv).2 ⊚ (↑f).2) D.d₄ = 𝟙 graph_L.tD D.d₄⊢ ((↑finv).2 ⊚ (↑f).2) D.d₅ = 𝟙 graph_L.tD D.d₅ All goals completed! 🐙)
have h₂ : (finv.val.1 ⊚ f.val.1, finv.val.2 ⊚ f.val.2) =
(𝟙 graph_L.tA, 𝟙 graph_L.tD) := ⊢ finv ⊚ f = 𝟙 graph_L
All goals completed! 🐙
All goals completed! 🐙,
inv_hom_id := ⊢ f ⊚ finv = 𝟙 graph_R
have h₁ : (f.val.1 ⊚ finv.val.1 = 𝟙 graph_R.tA) ∧
(f.val.2 ⊚ finv.val.2 = 𝟙 graph_R.tD) := ⊢ f ⊚ finv = 𝟙 graph_R
⊢ (↑f).1 ⊚ (↑finv).1 = 𝟙 graph_R.tA⊢ (↑f).2 ⊚ (↑finv).2 = 𝟙 graph_R.tD ⊢ (↑f).1 ⊚ (↑finv).1 = 𝟙 graph_R.tA⊢ (↑f).2 ⊚ (↑finv).2 = 𝟙 graph_R.tD (x:graph_R.tD⊢ ((↑f).2 ⊚ (↑finv).2) x = 𝟙 graph_R.tD x; ⊢ ((↑f).2 ⊚ (↑finv).2) D.d₁ = 𝟙 graph_R.tD D.d₁⊢ ((↑f).2 ⊚ (↑finv).2) D.d₂ = 𝟙 graph_R.tD D.d₂⊢ ((↑f).2 ⊚ (↑finv).2) D.d₃ = 𝟙 graph_R.tD D.d₃⊢ ((↑f).2 ⊚ (↑finv).2) D.d₄ = 𝟙 graph_R.tD D.d₄⊢ ((↑f).2 ⊚ (↑finv).2) D.d₅ = 𝟙 graph_R.tD D.d₅ ⊢ ((↑f).2 ⊚ (↑finv).2) D.d₁ = 𝟙 graph_R.tD D.d₁⊢ ((↑f).2 ⊚ (↑finv).2) D.d₂ = 𝟙 graph_R.tD D.d₂⊢ ((↑f).2 ⊚ (↑finv).2) D.d₃ = 𝟙 graph_R.tD D.d₃⊢ ((↑f).2 ⊚ (↑finv).2) D.d₄ = 𝟙 graph_R.tD D.d₄⊢ ((↑f).2 ⊚ (↑finv).2) D.d₅ = 𝟙 graph_R.tD D.d₅ All goals completed! 🐙)
have h₂ : (f.val.1 ⊚ finv.val.1, f.val.2 ⊚ finv.val.2) =
(𝟙 graph_R.tA, 𝟙 graph_R.tD) := ⊢ f ⊚ finv = 𝟙 graph_R
All goals completed! 🐙
All goals completed! 🐙
}
(Impossible journeys) J is the graph
inductive A
| a₁ | a₂ | a₃
abbrev D := Fin 2
def J : IrreflexiveGraph := {
tA := A
carrierA := Set.univ
tD := D
carrierD := Set.univ
toSrc := fun
| A.a₁ => 0
| A.a₂ => 1
| A.a₃ => 1
toSrc_mem := fun _ ↦ Set.mem_univ _
toTgt := fun
| A.a₁ => 0
| A.a₂ => 0
| A.a₃ => 1
toTgt_mem := fun _ ↦ Set.mem_univ _
}
G is any graph, and b and e are dots of G.
variable (G : IrreflexiveGraph)
(b e : G.tD) (hb : b ∈ G.carrierD) (he : e ∈ G.carrierD)
(a) Suppose that {G \xrightarrow{f} J} is a map of graphs with {fb = 0} and {fe = 1}. Show that there is no path in G that begins at b and ends at e.
(b) Conversely, suppose that there is no path in G that begins at b and ends at e. Show that there is a map {G \xrightarrow{f} J} with {fb = 0} and {fe = 1}.
Solution: Exercise 8
TODO Exercise 11.8