A Lean Companion to Conceptual Mathematics

Session 11: Ascending to categories of richer structures

1. A category of richer structures: Endomaps of sets

Exercise 1 (p. 153)

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'.carrierf₁ 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'.carrierf₂ 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'.carrierf₃ 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'.carrierf₄ 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

Exercise 2 (p. 158)inductive X | a | b | c def α : X X | X.a => X.c | X.b => X.a | X.c => X.b def : 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 : 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 : , IsIso f := f, IsIso f let f : := f₁, (∀ x .carrier, f₁ x .carrier) f₁ .toEnd = .toEnd f₁ x .carrier, f₁ x .carrierf₁ .toEnd = .toEnd f₁ x .carrier, f₁ x .carrier All goals completed! 🐙 f₁ .toEnd = .toEnd f₁ -- fα = βf x:.t(f₁ .toEnd) x = (.toEnd f₁) x (f₁ .toEnd) X.a = (.toEnd f₁) X.a(f₁ .toEnd) X.b = (.toEnd f₁) X.b(f₁ .toEnd) X.c = (.toEnd f₁) X.c (f₁ .toEnd) X.a = (.toEnd f₁) X.a(f₁ .toEnd) X.b = (.toEnd f₁) X.b(f₁ .toEnd) X.c = (.toEnd f₁) X.c All goals completed! 🐙 let finv : := fun | Y.p => X.c | Y.q => X.b | Y.r => X.a, f: := f₁, (∀ x .carrier, (fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) x .carrier) (fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd = .toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a f: := f₁, x .carrier, (fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) x .carrierf: := f₁, (fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd = .toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a f: := f₁, x .carrier, (fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) x .carrier All goals completed! 🐙 f: := f₁, (fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd = .toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a -- f⁻¹β = αf⁻¹ f: := f₁, y:.t((fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd) y = (.toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) y f: := f₁, ((fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd) Y.p = (.toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) Y.pf: := f₁, ((fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd) Y.q = (.toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) Y.qf: := f₁, ((fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd) Y.r = (.toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) Y.r f: := f₁, ((fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd) Y.p = (.toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) Y.pf: := f₁, ((fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd) Y.q = (.toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) Y.qf: := f₁, ((fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) .toEnd) Y.r = (.toEnd fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a) Y.r All goals completed! 🐙 f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, IsIso f f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, finv f = 𝟙 f finv = 𝟙 f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, finv f = 𝟙 f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, f finv = 𝟙 f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, finv f = 𝟙 -- f⁻¹f = 𝟙 X have h : finv.val f.val = 𝟙 X := f, IsIso f f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, x:.t(finv f) x = 𝟙 X x f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, (finv f) X.a = 𝟙 X X.af: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, (finv f) X.b = 𝟙 X X.bf: := f₁, finv: := 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: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, (finv f) X.a = 𝟙 X X.af: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, (finv f) X.b = 𝟙 X X.bf: := f₁, finv: := 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: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, f finv = 𝟙 -- ff⁻¹ = 𝟙 Y have h : f.val finv.val = 𝟙 Y := f, IsIso f f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, y:.t(f finv) y = 𝟙 Y y f: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, (f finv) Y.p = 𝟙 Y Y.pf: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, (f finv) Y.q = 𝟙 Y Y.qf: := f₁, finv: := 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: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, (f finv) Y.p = 𝟙 Y Y.pf: := f₁, finv: := fun x match x with | Y.p => X.c | Y.q => X.b | Y.r => X.a, (f finv) Y.q = 𝟙 Y Y.qf: := f₁, finv: := 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 : , IsIso f := f, IsIso f let f : := f₂, (∀ x .carrier, f₂ x .carrier) f₂ .toEnd = .toEnd f₂ x .carrier, f₂ x .carrierf₂ .toEnd = .toEnd f₂ x .carrier, f₂ x .carrier All goals completed! 🐙 f₂ .toEnd = .toEnd f₂ -- fα = βf x:.t(f₂ .toEnd) x = (.toEnd f₂) x (f₂ .toEnd) X.a = (.toEnd f₂) X.a(f₂ .toEnd) X.b = (.toEnd f₂) X.b(f₂ .toEnd) X.c = (.toEnd f₂) X.c (f₂ .toEnd) X.a = (.toEnd f₂) X.a(f₂ .toEnd) X.b = (.toEnd f₂) X.b(f₂ .toEnd) X.c = (.toEnd f₂) X.c All goals completed! 🐙 let finv : := fun | Y.p => X.b | Y.q => X.a | Y.r => X.c, f: := f₂, (∀ x .carrier, (fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) x .carrier) (fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd = .toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c f: := f₂, x .carrier, (fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) x .carrierf: := f₂, (fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd = .toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c f: := f₂, x .carrier, (fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) x .carrier All goals completed! 🐙 f: := f₂, (fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd = .toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c -- f⁻¹β = αf⁻¹ f: := f₂, y:.t((fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd) y = (.toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) y f: := f₂, ((fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd) Y.p = (.toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) Y.pf: := f₂, ((fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd) Y.q = (.toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) Y.qf: := f₂, ((fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd) Y.r = (.toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) Y.r f: := f₂, ((fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd) Y.p = (.toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) Y.pf: := f₂, ((fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd) Y.q = (.toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) Y.qf: := f₂, ((fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) .toEnd) Y.r = (.toEnd fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c) Y.r All goals completed! 🐙 f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, IsIso f f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, finv f = 𝟙 f finv = 𝟙 f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, finv f = 𝟙 f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, f finv = 𝟙 f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, finv f = 𝟙 -- f⁻¹f = 𝟙 X have h : finv.val f.val = 𝟙 X := f, IsIso f f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, x:.t(finv f) x = 𝟙 X x f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, (finv f) X.a = 𝟙 X X.af: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, (finv f) X.b = 𝟙 X X.bf: := f₂, finv: := 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: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, (finv f) X.a = 𝟙 X X.af: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, (finv f) X.b = 𝟙 X X.bf: := f₂, finv: := 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: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, f finv = 𝟙 -- ff⁻¹ = 𝟙 Y have h : f.val finv.val = 𝟙 Y := f, IsIso f f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, y:.t(f finv) y = 𝟙 Y y f: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, (f finv) Y.p = 𝟙 Y Y.pf: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, (f finv) Y.q = 𝟙 Y Y.qf: := f₂, finv: := 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: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, (f finv) Y.p = 𝟙 Y Y.pf: := f₂, finv: := fun x match x with | Y.p => X.b | Y.q => X.a | Y.r => X.c, (f finv) Y.q = 𝟙 Y Y.qf: := f₂, finv: := 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 : , IsIso f := f, IsIso f let f : := f₃, (∀ x .carrier, f₃ x .carrier) f₃ .toEnd = .toEnd f₃ x .carrier, f₃ x .carrierf₃ .toEnd = .toEnd f₃ x .carrier, f₃ x .carrier All goals completed! 🐙 f₃ .toEnd = .toEnd f₃ -- fα = βf x:.t(f₃ .toEnd) x = (.toEnd f₃) x (f₃ .toEnd) X.a = (.toEnd f₃) X.a(f₃ .toEnd) X.b = (.toEnd f₃) X.b(f₃ .toEnd) X.c = (.toEnd f₃) X.c (f₃ .toEnd) X.a = (.toEnd f₃) X.a(f₃ .toEnd) X.b = (.toEnd f₃) X.b(f₃ .toEnd) X.c = (.toEnd f₃) X.c All goals completed! 🐙 let finv : := fun | Y.p => X.a | Y.q => X.c | Y.r => X.b, f: := f₃, (∀ x .carrier, (fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) x .carrier) (fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd = .toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b f: := f₃, x .carrier, (fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) x .carrierf: := f₃, (fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd = .toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b f: := f₃, x .carrier, (fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) x .carrier All goals completed! 🐙 f: := f₃, (fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd = .toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b -- f⁻¹β = αf⁻¹ f: := f₃, y:.t((fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd) y = (.toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) y f: := f₃, ((fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd) Y.p = (.toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) Y.pf: := f₃, ((fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd) Y.q = (.toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) Y.qf: := f₃, ((fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd) Y.r = (.toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) Y.r f: := f₃, ((fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd) Y.p = (.toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) Y.pf: := f₃, ((fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd) Y.q = (.toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) Y.qf: := f₃, ((fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) .toEnd) Y.r = (.toEnd fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b) Y.r All goals completed! 🐙 f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, IsIso f f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, finv f = 𝟙 f finv = 𝟙 f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, finv f = 𝟙 f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, f finv = 𝟙 f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, finv f = 𝟙 -- f⁻¹f = 𝟙 X have h : finv.val f.val = 𝟙 X := f, IsIso f f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, x:.t(finv f) x = 𝟙 X x f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, (finv f) X.a = 𝟙 X X.af: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, (finv f) X.b = 𝟙 X X.bf: := f₃, finv: := 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: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, (finv f) X.a = 𝟙 X X.af: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, (finv f) X.b = 𝟙 X X.bf: := f₃, finv: := 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: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, f finv = 𝟙 -- ff⁻¹ = 𝟙 Y have h : f.val finv.val = 𝟙 Y := f, IsIso f f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, y:.t(f finv) y = 𝟙 Y y f: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, (f finv) Y.p = 𝟙 Y Y.pf: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, (f finv) Y.q = 𝟙 Y Y.qf: := f₃, finv: := 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: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, (f finv) Y.p = 𝟙 Y Y.pf: := f₃, finv: := fun x match x with | Y.p => X.a | Y.q => X.c | Y.r => X.b, (f finv) Y.q = 𝟙 Y Y.qf: := f₃, finv: := 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! 🐙
Exercise 3 (p. 159)

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 : 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 : 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 : , IsIso f) := ¬ f, IsIso f f: h✝:IsIso fFalse -- X.x₂ is a fixed point of α ⊚ α ⊚ α, have h₁ : (.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := ¬ f, IsIso f All goals completed! 🐙 -- but β ⊚ β ⊚ β has no fixed points in Y have h₂ : y : Y, (.toEnd .toEnd .toEnd) y y := ¬ f, IsIso f f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)y:Y(.toEnd .toEnd .toEnd) y y f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)(.toEnd .toEnd .toEnd) Y.y₁ Y.y₁f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)(.toEnd .toEnd .toEnd) Y.y₂ Y.y₂f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)(.toEnd .toEnd .toEnd) Y.y₃ Y.y₃f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)(.toEnd .toEnd .toEnd) Y.y₄ Y.y₄ f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)(.toEnd .toEnd .toEnd) Y.y₁ Y.y₁f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)(.toEnd .toEnd .toEnd) Y.y₂ Y.y₂f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)(.toEnd .toEnd .toEnd) Y.y₃ Y.y₃f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)(.toEnd .toEnd .toEnd) Y.y₄ Y.y₄ exact fun h f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)h:(.toEnd .toEnd .toEnd) Y.y₄ = Y.y₄False All goals completed! 🐙 -- Since f ⊚ (α ⊚ α ⊚ α) = (β ⊚ β ⊚ β) ⊚ f, we can derive a -- contradiction have h_contra : f.val ((.toEnd .toEnd .toEnd) X.x₂) = (.toEnd .toEnd .toEnd) (f.val X.x₂) := ¬ f, IsIso f f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)h₂: (y : Y), (.toEnd .toEnd .toEnd) y y := fun y Y.casesOn (motive := fun t y = t (.toEnd .toEnd .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 ((.toEnd .toEnd .toEnd) X.x₂) = (.toEnd .toEnd f .toEnd) X.x₂ f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)h₂: (y : Y), (.toEnd .toEnd .toEnd) y y := fun y Y.casesOn (motive := fun t y = t (.toEnd .toEnd .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 ((.toEnd .toEnd .toEnd) X.x₂) = (.toEnd (f .toEnd) .toEnd) X.x₂ f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)h₂: (y : Y), (.toEnd .toEnd .toEnd) y y := fun y Y.casesOn (motive := fun t y = t (.toEnd .toEnd .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 ((.toEnd .toEnd .toEnd) X.x₂) = (((f .toEnd) .toEnd) .toEnd) X.x₂ All goals completed! 🐙 have : (.toEnd .toEnd .toEnd) (f.val X.x₂) = f.val X.x₂ := ¬ f, IsIso f All goals completed! 🐙 f: h✝:IsIso fh₁:(.toEnd .toEnd .toEnd) X.x₂ = X.x₂ := Eq.refl ((.toEnd .toEnd .toEnd) X.x₂)h₂: (y : Y), (.toEnd .toEnd .toEnd) y y := fun y Y.casesOn (motive := fun t y = t (.toEnd .toEnd .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 ((.toEnd .toEnd .toEnd) X.x₂) = (.toEnd .toEnd .toEnd) (f X.x₂) := Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = _a) (Eq.symm (types_comp_apply (↑f) (.toEnd .toEnd .toEnd) X.x₂)))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = _a X.x₂) (Eq.symm (Category.assoc (↑f) (.toEnd .toEnd) .toEnd)))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = (.toEnd _a) X.x₂) (Eq.symm (Category.assoc (↑f) .toEnd .toEnd)))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = (.toEnd .toEnd _a) X.x₂) (Eq.symm f.property.right))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = (.toEnd _a) X.x₂) (Category.assoc .toEnd (↑f) .toEnd))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = (.toEnd _a .toEnd) X.x₂) (Eq.symm f.property.right))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = _a X.x₂) (Category.assoc .toEnd (f .toEnd) .toEnd))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = (_a .toEnd) X.x₂) (Category.assoc .toEnd (↑f) .toEnd))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = ((_a .toEnd) .toEnd) X.x₂) (Eq.symm f.property.right))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = _a X.x₂) (Eq.symm (Category.assoc .toEnd .toEnd (f .toEnd))))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = _a X.x₂) (Eq.symm (Category.assoc (.toEnd .toEnd) .toEnd f)))) (Eq.mpr (id (congrArg (fun _a f ((.toEnd .toEnd .toEnd) X.x₂) = _a) (types_comp_apply (.toEnd .toEnd .toEnd) (↑f) X.x₂))) (Eq.refl (f ((.toEnd .toEnd .toEnd) X.x₂))))))))))))))this✝:(.toEnd .toEnd .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:(.toEnd .toEnd .toEnd) (f X.x₂) f X.x₂ := h₂ (f X.x₂)False All goals completed! 🐙
Exercise 4 (p. 159)

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 { : SetWithEndomap} (f : ) (g : .t .t) (hg_mtc : b .carrier, g b .carrier) (h : g f.val = 𝟙 .t f.val g = 𝟙 .t) : finv : , finv.val = g := :SetWithEndomap:SetWithEndomapf: g:.t .thg_mtc: b .carrier, g b .carrierh:g f = 𝟙 .t f g = 𝟙 .t finv, finv = g :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .t finv, finv = g use g, :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .t(∀ x .carrier, g x .carrier) g .toEnd = .toEnd g :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .t x .carrier, g x .carrier:SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tg .toEnd = .toEnd g :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .t x .carrier, g x .carrier All goals completed! 🐙 :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tg .toEnd = .toEnd g :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.t(g .toEnd) b = (.toEnd g) b :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.tf ((g .toEnd) b) = f ((.toEnd g) b):SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.tFunction.Injective f :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.tf ((g .toEnd) b) = f ((.toEnd g) b) :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.t.toEnd b = f ((.toEnd g) b) All goals completed! 🐙 :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.tFunction.Injective f intro a₁ :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.ta₁:.ta₂:.tf a₁ = f a₂ a₁ = a₂ :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.ta₁:.ta₂:.thf:f a₁ = f a₂a₁ = a₂ :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.ta₁:.ta₂:.thf:f a₁ = f a₂hgf:g (f a₁) = g (f a₂) := congrArg g hfa₁ = a₂ repeat :SetWithEndomap:SetWithEndomapg:.t .thg_mtc: b .carrier, g b .carrierf:.t .tleft✝: x .carrier, f x .carrierhf_comm:f .toEnd = .toEnd fh:g f, = 𝟙 .t f, g = 𝟙 .tb:.ta₁:.ta₂:.thf:f a₁ = f a₂hgf:𝟙 .t a₁ = 𝟙 .t a₂a₁ = a₂ All goals completed! 🐙
Exercise 5 (p. 159)

{\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 fFalse -- 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_commFalse -- 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 % 3f (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 % 3f (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 % 3f (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 % 3f (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 % 3f (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 % 3f (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 % 3f (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:ℤβ.tb {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 = bb {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 = bb {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 = bb = 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 ab = 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 ab = 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 ab = 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 ab = 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 ab = 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 ab = 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' + 1b = 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:ℤβ.tb {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 % 3b 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 % 3b 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 fFalse -- 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.rightFalse -- 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:ℤβ.tb {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 = bb {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 = bb {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 = b3 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 < 3b {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 < 3b {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 < 3b {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 < 3b {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 < 3b {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 < 3b {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 < 32 {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:ℤβ.tb {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 = 0b 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 = 1b 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 = bb 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 = bf 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 = b2 % 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 = 3False All goals completed! 🐙
Exercise 6 (p. 159)

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! 🐙 }
Exercise 7 (p. 160)

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! 🐙 }
Exercise 8 (p. 160)

(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