Theorem: CircleDeg1Lift.semiconj_of_group_action_of_forall_translationNumber_eq
File: Mathlib/Dynamics/Circle/RotationNumber/TranslationNumber.lean

tactic: have : ∀ x, BddAbove (range fun g => f₂ g⁻¹ (f₁ g x)) := by
  refine' fun x => ⟨x + 2, _⟩
  rintro _ ⟨g, rfl⟩
  have : τ (f₂ g⁻¹) = -τ (f₂ g) := by
    rw [← MonoidHom.coe_toHomUnits, MonoidHom.map_inv, translationNumber_units_inv,
      MonoidHom.coe_toHomUnits]
  calc
    f₂ g⁻¹ (f₁ g x) ≤ f₂ g⁻¹ (x + τ (f₁ g) + 1) :=
      mono _ (map_lt_add_translationNumber_add_one _ _).le
    _ = f₂ g⁻¹ (x + τ (f₂ g)) + 1 := by rw [h, map_add_one]
    _ ≤ x + τ (f₂ g) + τ (f₂ g⁻¹) + 1 + 1 :=
      add_le_add_right (map_lt_add_translationNumber_add_one _ _).le _
    _ = x + 2 := by simp [this, add_assoc, one_add_one_eq_two]
state_before: f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
⊢ ∃ F, ∀ (g : G), Semiconj ↑F ↑(↑f₁ g) ↑(↑f₂ g)

tactic: set F₁ := toOrderIso.comp f₁.toHomUnits
state_before: f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
⊢ ∃ F, ∀ (g : G), Semiconj ↑F ↑(↑f₁ g) ↑(↑f₂ g)

tactic: set F₂ := toOrderIso.comp f₂.toHomUnits
state_before: f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
F₁ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₁)
⊢ ∃ F, ∀ (g : G), Semiconj ↑F ↑(↑f₁ g) ↑(↑f₂ g)

tactic: have hF₁ : ∀ g, ⇑(F₁ g) = f₁ g := fun _ => rfl
state_before: f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
F₁ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₁)
F₂ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₂)
⊢ ∃ F, ∀ (g : G), Semiconj ↑F ↑(↑f₁ g) ↑(↑f₂ g)

tactic: have hF₂ : ∀ g, ⇑(F₂ g) = f₂ g := fun _ => rfl
state_before: f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
F₁ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₁)
F₂ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₂)
hF₁ : ∀ (g : G), ↑(↑F₁ g) = ↑(↑f₁ g)
⊢ ∃ F, ∀ (g : G), Semiconj ↑F ↑(↑f₁ g) ↑(↑f₂ g)

tactic: refine' ⟨⟨⟨_, fun x y hxy => _⟩, fun x => _⟩, csSup_div_semiconj F₂ F₁ fun x => _⟩ <;>
  simp only [hF₁, hF₂, ← map_inv, coe_mk]
state_before: f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
F₁ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₁)
F₂ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₂)
hF₁ : ∀ (g : G), ↑(↑F₁ g) = ↑(↑f₁ g)
hF₂ : ∀ (g : G), ↑(↑F₂ g) = ↑(↑f₂ g)
⊢ ∃ F, ∀ (g : G), Semiconj ↑F ↑(↑f₁ g) ↑(↑f₂ g)

tactic: refine' fun x => ⟨x + 2, _⟩
state_before: f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
⊢ ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))

tactic: rintro _ ⟨g, rfl⟩
state_before: f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
x : ℝ
⊢ x + 2 ∈ upperBounds (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))

tactic: have : τ (f₂ g⁻¹) = -τ (f₂ g) := by
  rw [← MonoidHom.coe_toHomUnits, MonoidHom.map_inv, translationNumber_units_inv,
    MonoidHom.coe_toHomUnits]
state_before: case intro
f g✝ : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
x : ℝ
g : G
⊢ (fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x)) g ≤ x + 2

tactic: calc
  f₂ g⁻¹ (f₁ g x) ≤ f₂ g⁻¹ (x + τ (f₁ g) + 1) :=
    mono _ (map_lt_add_translationNumber_add_one _ _).le
  _ = f₂ g⁻¹ (x + τ (f₂ g)) + 1 := by rw [h, map_add_one]
  _ ≤ x + τ (f₂ g) + τ (f₂ g⁻¹) + 1 + 1 :=
    add_le_add_right (map_lt_add_translationNumber_add_one _ _).le _
  _ = x + 2 := by simp [this, add_assoc, one_add_one_eq_two]
state_before: case intro
f g✝ : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
x : ℝ
g : G
this : τ (↑f₂ g⁻¹) = -τ (↑f₂ g)
⊢ (fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x)) g ≤ x + 2

tactic: rw [← MonoidHom.coe_toHomUnits, MonoidHom.map_inv, translationNumber_units_inv,
  MonoidHom.coe_toHomUnits]
state_before: f g✝ : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
x : ℝ
g : G
⊢ τ (↑f₂ g⁻¹) = -τ (↑f₂ g)

tactic: rw [h, map_add_one]
state_before: f g✝ : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
x : ℝ
g : G
this : τ (↑f₂ g⁻¹) = -τ (↑f₂ g)
⊢ ↑(↑f₂ g⁻¹) (x + τ (↑f₁ g) + 1) = ↑(↑f₂ g⁻¹) (x + τ (↑f₂ g)) + 1

tactic: simp [this, add_assoc, one_add_one_eq_two]
state_before: f g✝ : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
x : ℝ
g : G
this : τ (↑f₂ g⁻¹) = -τ (↑f₂ g)
⊢ x + τ (↑f₂ g) + τ (↑f₂ g⁻¹) + 1 + 1 = x + 2

tactic: exact ciSup_mono (this y) fun g => mono _ (mono _ hxy)
state_before: case refine'_1
f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
F₁ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₁)
F₂ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₂)
hF₁ : ∀ (g : G), ↑(↑F₁ g) = ↑(↑f₁ g)
hF₂ : ∀ (g : G), ↑(↑F₂ g) = ↑(↑f₂ g)
x y : ℝ
hxy : x ≤ y
⊢ sSup (range fun g' => ↑(↑f₂ g'⁻¹) (↑(↑f₁ g') x)) ≤ sSup (range fun g' => ↑(↑f₂ g'⁻¹) (↑(↑f₁ g') y))

tactic: simp only [map_add_one]
state_before: case refine'_2
f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
F₁ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₁)
F₂ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₂)
hF₁ : ∀ (g : G), ↑(↑F₁ g) = ↑(↑f₁ g)
hF₂ : ∀ (g : G), ↑(↑F₂ g) = ↑(↑f₂ g)
x : ℝ
⊢ sSup (range fun g' => ↑(↑f₂ g'⁻¹) (↑(↑f₁ g') (x + 1))) = sSup (range fun g' => ↑(↑f₂ g'⁻¹) (↑(↑f₁ g') x)) + 1

tactic: exact (Monotone.map_ciSup_of_continuousAt (continuousAt_id.add continuousAt_const)
  (monotone_id.add_const (1 : ℝ)) (this x)).symm
state_before: case refine'_2
f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
F₁ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₁)
F₂ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₂)
hF₁ : ∀ (g : G), ↑(↑F₁ g) = ↑(↑f₁ g)
hF₂ : ∀ (g : G), ↑(↑F₂ g) = ↑(↑f₂ g)
x : ℝ
⊢ sSup (range fun g' => ↑(↑f₂ g'⁻¹) (↑(↑f₁ g') x) + 1) = sSup (range fun g' => ↑(↑f₂ g'⁻¹) (↑(↑f₁ g') x)) + 1

tactic: exact this x
state_before: case refine'_3
f g : CircleDeg1Lift
G : Type u_1
inst✝ : Group G
f₁ f₂ : G →* CircleDeg1Lift
h : ∀ (g : G), τ (↑f₁ g) = τ (↑f₂ g)
this : ∀ (x : ℝ), BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))
F₁ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₁)
F₂ : G →* ℝ ≃o ℝ := MonoidHom.comp toOrderIso (MonoidHom.toHomUnits f₂)
hF₁ : ∀ (g : G), ↑(↑F₁ g) = ↑(↑f₁ g)
hF₂ : ∀ (g : G), ↑(↑F₂ g) = ↑(↑f₂ g)
x : ℝ
⊢ BddAbove (range fun g => ↑(↑f₂ g⁻¹) (↑(↑f₁ g) x))