Theorem: StarOrderedRing.of_le_iff
File: Mathlib/Algebra/Star/Order.lean

tactic: refine ⟨fun h => ?_, ?_⟩
state_before: R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y : R
⊢ x ≤ y ↔ ∃ p ∈ AddSubmonoid.closure (range fun s => star s * s), y = x + p
state_after: case refine_1
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y : R
h : x ≤ y
⊢ ∃ p ∈ AddSubmonoid.closure (range fun s => star s * s), y = x + p

case refine_2
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y : R
⊢ (∃ p ∈ AddSubmonoid.closure (range fun s => star s * s), y = x + p) → x ≤ y

tactic: obtain ⟨p, hp⟩ := (h_le_iff x y).mp h
state_before: case refine_1
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y : R
h : x ≤ y
⊢ ∃ p ∈ AddSubmonoid.closure (range fun s => star s * s), y = x + p
state_after: case refine_1.intro
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y : R
h : x ≤ y
p : R
hp : y = x + star p * p
⊢ ∃ p ∈ AddSubmonoid.closure (range fun s => star s * s), y = x + p

tactic: exact ⟨star p * p, AddSubmonoid.subset_closure ⟨p, rfl⟩, hp⟩
state_before: case refine_1.intro
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y : R
h : x ≤ y
p : R
hp : y = x + star p * p
⊢ ∃ p ∈ AddSubmonoid.closure (range fun s => star s * s), y = x + p
state_after: no goals

tactic: rintro ⟨p, hp, hpxy⟩
state_before: case refine_2
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y : R
⊢ (∃ p ∈ AddSubmonoid.closure (range fun s => star s * s), y = x + p) → x ≤ y
state_after: case refine_2.intro.intro
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
hpxy : y = x + p
⊢ x ≤ y

tactic: revert x y hpxy
state_before: case refine_2.intro.intro
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
x y p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
hpxy : y = x + p
⊢ x ≤ y
state_after: case refine_2.intro.intro
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
⊢ ∀ (x y : R), y = x + p → x ≤ y

tactic: refine AddSubmonoid.closure_induction hp ?_ (fun x y h => add_zero x ▸ h.ge) ?_
state_before: case refine_2.intro.intro
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
⊢ ∀ (x y : R), y = x + p → x ≤ y
state_after: case refine_2.intro.intro.refine_1
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
⊢ ∀ x ∈ range fun s => star s * s, ∀ (x_1 y : R), y = x_1 + x → x_1 ≤ y

case refine_2.intro.intro.refine_2
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
⊢ ∀ (x y : R),
    (∀ (x_1 y : R), y = x_1 + x → x_1 ≤ y) →
      (∀ (x y_1 : R), y_1 = x + y → x ≤ y_1) → ∀ (x_1 y_1 : R), y_1 = x_1 + (x + y) → x_1 ≤ y_1

tactic: rintro _ ⟨s, rfl⟩ x y rfl
state_before: case refine_2.intro.intro.refine_1
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
⊢ ∀ x ∈ range fun s => star s * s, ∀ (x_1 y : R), y = x_1 + x → x_1 ≤ y
state_after: case refine_2.intro.intro.refine_1.intro
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
s x : R
⊢ x ≤ x + (fun s => star s * s) s

tactic: exact (h_le_iff _ _).mpr ⟨s, rfl⟩
state_before: case refine_2.intro.intro.refine_1.intro
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
s x : R
⊢ x ≤ x + (fun s => star s * s) s
state_after: no goals

tactic: rintro a b ha hb x y rfl
state_before: case refine_2.intro.intro.refine_2
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
⊢ ∀ (x y : R),
    (∀ (x_1 y : R), y = x_1 + x → x_1 ≤ y) →
      (∀ (x y_1 : R), y_1 = x + y → x ≤ y_1) → ∀ (x_1 y_1 : R), y_1 = x_1 + (x + y) → x_1 ≤ y_1
state_after: case refine_2.intro.intro.refine_2
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
a b : R
ha : ∀ (x y : R), y = x + a → x ≤ y
hb : ∀ (x y : R), y = x + b → x ≤ y
x : R
⊢ x ≤ x + (a + b)

tactic: rw [← add_assoc]
state_before: case refine_2.intro.intro.refine_2
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
a b : R
ha : ∀ (x y : R), y = x + a → x ≤ y
hb : ∀ (x y : R), y = x + b → x ≤ y
x : R
⊢ x ≤ x + (a + b)
state_after: case refine_2.intro.intro.refine_2
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
a b : R
ha : ∀ (x y : R), y = x + a → x ≤ y
hb : ∀ (x y : R), y = x + b → x ≤ y
x : R
⊢ x ≤ x + a + b

tactic: exact (ha _ _ rfl).trans (hb _ _ rfl)
state_before: case refine_2.intro.intro.refine_2
R : Type u
inst✝² : NonUnitalSemiring R
inst✝¹ : PartialOrder R
inst✝ : StarRing R
h_le_iff : ∀ (x y : R), x ≤ y ↔ ∃ s, y = x + star s * s
p : R
hp : p ∈ AddSubmonoid.closure (range fun s => star s * s)
a b : R
ha : ∀ (x y : R), y = x + a → x ≤ y
hb : ∀ (x y : R), y = x + b → x ≤ y
x : R
⊢ x ≤ x + a + b
state_after: no goals