Theorem: extremePoints_pi
File: Mathlib/Analysis/Convex/Extreme.lean

tactic: ext x
state_before: 𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x : E
s : (i : ι) → Set (π i)
⊢ extremePoints 𝕜 (pi univ s) = pi univ fun i => extremePoints 𝕜 (s i)

tactic: simp only [mem_extremePoints, mem_pi, mem_univ, true_imp_iff, @forall_and ι]
state_before: case h
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
⊢ x ∈ extremePoints 𝕜 (pi univ s) ↔ x ∈ pi univ fun i => extremePoints 𝕜 (s i)

tactic: refine' and_congr_right fun hx ↦ ⟨fun h i ↦ _, fun h ↦ _⟩
state_before: case h
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
⊢ ((∀ (i : ι), x i ∈ s i) ∧
      ∀ (x₁ : (i : ι) → π i),
        (∀ (i : ι), x₁ i ∈ s i) →
          ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x) ↔
    (∀ (i : ι), x i ∈ s i) ∧
      ∀ (x_1 : ι) (x₁ : π x_1),
        x₁ ∈ s x_1 → ∀ (x₂ : π x_1), x₂ ∈ s x_1 → x x_1 ∈ openSegment 𝕜 x₁ x₂ → x₁ = x x_1 ∧ x₂ = x x_1

tactic: rintro x₁ hx₁ x₂ hx₂ hi
state_before: case h.refine'_1
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
⊢ ∀ (x₁ : π i), x₁ ∈ s i → ∀ (x₂ : π i), x₂ ∈ s i → x i ∈ openSegment 𝕜 x₁ x₂ → x₁ = x i ∧ x₂ = x i

tactic: refine' (h (update x i x₁) _ (update x i x₂) _ _).imp (fun h₁ ↦ by rw [← h₁, update_same])
    fun h₂ ↦ by rw [← h₂, update_same]
state_before: case h.refine'_1
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
⊢ x₁ = x i ∧ x₂ = x i

tactic: rw [← Pi.image_update_openSegment]
state_before: case h.refine'_1.refine'_3
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
⊢ x ∈ openSegment 𝕜 (update x i x₁) (update x i x₂)

tactic: exact ⟨_, hi, update_eq_self _ _⟩
state_before: case h.refine'_1.refine'_3
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
⊢ x ∈ update x i '' openSegment 𝕜 x₁ x₂

tactic: rw [← h₁, update_same]
state_before: 𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
h₁ : update x i x₁ = x
⊢ x₁ = x i

tactic: rw [← h₂, update_same]
state_before: 𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
h₂ : update x i x₂ = x
⊢ x₂ = x i

tactic: rintro j
state_before: case h.refine'_1.refine'_2
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
⊢ ∀ (i_1 : ι), update x i x₂ i_1 ∈ s i_1

case h.refine'_1.refine'_3
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
⊢ x ∈ openSegment 𝕜 (update x i x₁) (update x i x₂)

tactic: obtain rfl | hji := eq_or_ne j i
state_before: case h.refine'_1.refine'_2
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
j : ι
⊢ update x i x₂ j ∈ s j

case h.refine'_1.refine'_3
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
⊢ x ∈ openSegment 𝕜 (update x i x₁) (update x i x₂)

tactic: rwa [update_same]
state_before: case h.refine'_1.refine'_2.inl
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
j : ι
x₁ : π j
hx₁ : x₁ ∈ s j
x₂ : π j
hx₂ : x₂ ∈ s j
hi : x j ∈ openSegment 𝕜 x₁ x₂
⊢ update x j x₂ j ∈ s j

tactic: rw [update_noteq hji]
state_before: case h.refine'_1.refine'_2.inr
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
j : ι
hji : j ≠ i
⊢ update x i x₂ j ∈ s j

tactic: exact hx _
state_before: case h.refine'_1.refine'_2.inr
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x
i : ι
x₁ : π i
hx₁ : x₁ ∈ s i
x₂ : π i
hx₂ : x₂ ∈ s i
hi : x i ∈ openSegment 𝕜 x₁ x₂
j : ι
hji : j ≠ i
⊢ x j ∈ s j

tactic: rintro x₁ hx₁ x₂ hx₂ ⟨a, b, ha, hb, hab, hx'⟩
state_before: case h.refine'_2
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x_1 : ι) (x₁ : π x_1),
    x₁ ∈ s x_1 → ∀ (x₂ : π x_1), x₂ ∈ s x_1 → x x_1 ∈ openSegment 𝕜 x₁ x₂ → x₁ = x x_1 ∧ x₂ = x x_1
⊢ ∀ (x₁ : (i : ι) → π i),
    (∀ (i : ι), x₁ i ∈ s i) →
      ∀ (x₂ : (i : ι) → π i), (∀ (i : ι), x₂ i ∈ s i) → x ∈ openSegment 𝕜 x₁ x₂ → x₁ = x ∧ x₂ = x

tactic: simp_rw [funext_iff, ← forall_and]
state_before: case h.refine'_2.intro.intro.intro.intro.intro
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x_1 : ι) (x₁ : π x_1),
    x₁ ∈ s x_1 → ∀ (x₂ : π x_1), x₂ ∈ s x_1 → x x_1 ∈ openSegment 𝕜 x₁ x₂ → x₁ = x x_1 ∧ x₂ = x x_1
x₁ : (i : ι) → π i
hx₁ : ∀ (i : ι), x₁ i ∈ s i
x₂ : (i : ι) → π i
hx₂ : ∀ (i : ι), x₂ i ∈ s i
a b : 𝕜
ha : 0 < a
hb : 0 < b
hab : a + b = 1
hx' : a • x₁ + b • x₂ = x
⊢ x₁ = x ∧ x₂ = x

tactic: exact fun i ↦ h _ _ (hx₁ _) _ (hx₂ _) ⟨a, b, ha, hb, hab, congr_fun hx' _⟩
state_before: case h.refine'_2.intro.intro.intro.intro.intro
𝕜 : Type u_3
E : Type ?u.22369
F : Type ?u.22372
ι : Type u_2
π : ι → Type u_1
inst✝⁶ : OrderedSemiring 𝕜
inst✝⁵ : AddCommGroup E
inst✝⁴ : AddCommGroup F
inst✝³ : (i : ι) → AddCommGroup (π i)
inst✝² : Module 𝕜 E
inst✝¹ : Module 𝕜 F
inst✝ : (i : ι) → Module 𝕜 (π i)
A B : Set E
x✝ : E
s : (i : ι) → Set (π i)
x : (i : ι) → π i
hx : ∀ (i : ι), x i ∈ s i
h :
  ∀ (x_1 : ι) (x₁ : π x_1),
    x₁ ∈ s x_1 → ∀ (x₂ : π x_1), x₂ ∈ s x_1 → x x_1 ∈ openSegment 𝕜 x₁ x₂ → x₁ = x x_1 ∧ x₂ = x x_1
x₁ : (i : ι) → π i
hx₁ : ∀ (i : ι), x₁ i ∈ s i
x₂ : (i : ι) → π i
hx₂ : ∀ (i : ι), x₂ i ∈ s i
a b : 𝕜
ha : 0 < a
hb : 0 < b
hab : a + b = 1
hx' : a • x₁ + b • x₂ = x
⊢ ∀ (x_1 : ι), x₁ x_1 = x x_1 ∧ x₂ x_1 = x x_1