[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
μ ν : Measure α
κ : { x // x ∈ kernel α β }
⊢ Measure.bind (μ + ν) ↑κ = Measure.bind μ ↑κ + Measure.bind ν ↑κ
[PROOFSTEP]
ext1 s hs
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
μ ν : Measure α
κ : { x // x ∈ kernel α β }
s : Set β
hs : MeasurableSet s
⊢ ↑↑(Measure.bind (μ + ν) ↑κ) s = ↑↑(Measure.bind μ ↑κ + Measure.bind ν ↑κ) s
[PROOFSTEP]
rw [Measure.bind_apply hs (kernel.measurable _), lintegral_add_measure, Measure.coe_add, Pi.add_apply,
  Measure.bind_apply hs (kernel.measurable _), Measure.bind_apply hs (kernel.measurable _)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ : { x // x ∈ kernel α β }
μ : Measure α
r : ℝ≥0∞
⊢ Measure.bind (r • μ) ↑κ = r • Measure.bind μ ↑κ
[PROOFSTEP]
ext1 s hs
[GOAL]
case h
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ : { x // x ∈ kernel α β }
μ : Measure α
r : ℝ≥0∞
s : Set β
hs : MeasurableSet s
⊢ ↑↑(Measure.bind (r • μ) ↑κ) s = ↑↑(r • Measure.bind μ ↑κ) s
[PROOFSTEP]
rw [Measure.bind_apply hs (kernel.measurable _), lintegral_smul_measure, Measure.coe_smul, Pi.smul_apply,
  Measure.bind_apply hs (kernel.measurable _), smul_eq_mul]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ : { x // x ∈ kernel α β }
μ : Measure α
⊢ const α (Measure.bind μ ↑κ) = κ ∘ₖ const α μ
[PROOFSTEP]
ext a s hs
[GOAL]
case h.h
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ : { x // x ∈ kernel α β }
μ : Measure α
a : α
s : Set β
hs : MeasurableSet s
⊢ ↑↑(↑(const α (Measure.bind μ ↑κ)) a) s = ↑↑(↑(κ ∘ₖ const α μ) a) s
[PROOFSTEP]
simp_rw [comp_apply' _ _ _ hs, const_apply, Measure.bind_apply hs (kernel.measurable _)]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ : { x // x ∈ kernel α β }
μ : Measure α
a : α
⊢ ↑(κ ∘ₖ const α μ) a = Measure.bind μ ↑κ
[PROOFSTEP]
rw [← const_apply (μ.bind κ) a, const_bind_eq_comp_const κ μ]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ η : { x // x ∈ kernel α α }
μ : Measure α
hκ : Invariant κ μ
⊢ κ ∘ₖ const α μ = const α μ
[PROOFSTEP]
rw [← const_bind_eq_comp_const κ μ, hκ.def]
[GOAL]
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ η : { x // x ∈ kernel α α }
μ : Measure α
inst✝ : IsSFiniteKernel κ
hκ : Invariant κ μ
hη : Invariant η μ
⊢ Invariant (κ ∘ₖ η) μ
[PROOFSTEP]
cases' isEmpty_or_nonempty α with _ hα
[GOAL]
case inl
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ η : { x // x ∈ kernel α α }
μ : Measure α
inst✝ : IsSFiniteKernel κ
hκ : Invariant κ μ
hη : Invariant η μ
h✝ : IsEmpty α
⊢ Invariant (κ ∘ₖ η) μ
[PROOFSTEP]
exact Subsingleton.elim _ _
[GOAL]
case inr
α : Type u_1
β : Type u_2
γ : Type u_3
mα : MeasurableSpace α
mβ : MeasurableSpace β
mγ : MeasurableSpace γ
κ η : { x // x ∈ kernel α α }
μ : Measure α
inst✝ : IsSFiniteKernel κ
hκ : Invariant κ μ
hη : Invariant η μ
hα : Nonempty α
⊢ Invariant (κ ∘ₖ η) μ
[PROOFSTEP]
simp_rw [Invariant, ← comp_const_apply_eq_bind (κ ∘ₖ η) μ hα.some, comp_assoc, hη.comp_const, hκ.comp_const,
  const_apply]


[GOAL]
α : Type u_1
k : ℕ
A : Finset ℕ
h₁ : ∀ {x : ℕ}, x ∈ A → x < k
⊢ Finset.sum A (Nat.pow 2) < 2 ^ k
[PROOFSTEP]
apply lt_of_le_of_lt (sum_le_sum_of_subset fun t => mem_range.2 ∘ h₁)
[GOAL]
α : Type u_1
k : ℕ
A : Finset ℕ
h₁ : ∀ {x : ℕ}, x ∈ A → x < k
⊢ ∑ x in range k, Nat.pow 2 x < 2 ^ k
[PROOFSTEP]
have z := geom_sum_mul_add 1 k
[GOAL]
α : Type u_1
k : ℕ
A : Finset ℕ
h₁ : ∀ {x : ℕ}, x ∈ A → x < k
z : (∑ i in range k, (1 + 1) ^ i) * 1 + 1 = (1 + 1) ^ k
⊢ ∑ x in range k, Nat.pow 2 x < 2 ^ k
[PROOFSTEP]
rw [mul_one, one_add_one_eq_two] at z
[GOAL]
α : Type u_1
k : ℕ
A : Finset ℕ
h₁ : ∀ {x : ℕ}, x ∈ A → x < k
z : ∑ i in range k, 2 ^ i + 1 = 2 ^ k
⊢ ∑ x in range k, Nat.pow 2 x < 2 ^ k
[PROOFSTEP]
rw [← z]
[GOAL]
α : Type u_1
k : ℕ
A : Finset ℕ
h₁ : ∀ {x : ℕ}, x ∈ A → x < k
z : ∑ i in range k, 2 ^ i + 1 = 2 ^ k
⊢ ∑ x in range k, Nat.pow 2 x < ∑ i in range k, 2 ^ i + 1
[PROOFSTEP]
apply Nat.lt_succ_self
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
⊢ toColex (image f A) < toColex (image f B) ↔ toColex A < toColex B
[PROOFSTEP]
simp only [Colex.lt_def, not_exists, mem_image, exists_prop, not_and]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
⊢ (∃ k,
      (∀ {x : β}, k < x → ((∃ a, a ∈ A ∧ f a = x) ↔ ∃ a, a ∈ B ∧ f a = x)) ∧
        (∀ (x : α), x ∈ A → ¬f x = k) ∧ ∃ a, a ∈ B ∧ f a = k) ↔
    ∃ k, (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
⊢ (∃ k,
      (∀ {x : β}, k < x → ((∃ a, a ∈ A ∧ f a = x) ↔ ∃ a, a ∈ B ∧ f a = x)) ∧
        (∀ (x : α), x ∈ A → ¬f x = k) ∧ ∃ a, a ∈ B ∧ f a = k) →
    ∃ k, (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
rintro ⟨k, z, q, k', _, rfl⟩
[GOAL]
case mp.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k' : α
left✝ : k' ∈ B
z : ∀ {x : β}, f k' < x → ((∃ a, a ∈ A ∧ f a = x) ↔ ∃ a, a ∈ B ∧ f a = x)
q : ∀ (x : α), x ∈ A → ¬f x = f k'
⊢ ∃ k, (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
exact ⟨k', @fun x hx => by simpa [h₁.injective.eq_iff] using z (h₁ hx), fun t => q _ t rfl, ‹k' ∈ B›⟩
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k' : α
left✝ : k' ∈ B
z : ∀ {x : β}, f k' < x → ((∃ a, a ∈ A ∧ f a = x) ↔ ∃ a, a ∈ B ∧ f a = x)
q : ∀ (x : α), x ∈ A → ¬f x = f k'
x : α
hx : k' < x
⊢ x ∈ A ↔ x ∈ B
[PROOFSTEP]
simpa [h₁.injective.eq_iff] using z (h₁ hx)
[GOAL]
case mpr
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
⊢ (∃ k, (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B) →
    ∃ k,
      (∀ {x : β}, k < x → ((∃ a, a ∈ A ∧ f a = x) ↔ ∃ a, a ∈ B ∧ f a = x)) ∧
        (∀ (x : α), x ∈ A → ¬f x = k) ∧ ∃ a, a ∈ B ∧ f a = k
[PROOFSTEP]
rintro ⟨k, z, ka, _⟩
[GOAL]
case mpr.intro.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
⊢ ∃ k,
    (∀ {x : β}, k < x → ((∃ a, a ∈ A ∧ f a = x) ↔ ∃ a, a ∈ B ∧ f a = x)) ∧
      (∀ (x : α), x ∈ A → ¬f x = k) ∧ ∃ a, a ∈ B ∧ f a = k
[PROOFSTEP]
refine' ⟨f k, @fun x hx => _, _, k, ‹k ∈ B›, rfl⟩
[GOAL]
case mpr.intro.intro.intro.refine'_1
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x : β
hx : f k < x
⊢ (∃ a, a ∈ A ∧ f a = x) ↔ ∃ a, a ∈ B ∧ f a = x
[PROOFSTEP]
constructor
[GOAL]
case mpr.intro.intro.intro.refine'_1.mp
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x : β
hx : f k < x
⊢ (∃ a, a ∈ A ∧ f a = x) → ∃ a, a ∈ B ∧ f a = x
case mpr.intro.intro.intro.refine'_1.mpr
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x : β
hx : f k < x
⊢ (∃ a, a ∈ B ∧ f a = x) → ∃ a, a ∈ A ∧ f a = x
[PROOFSTEP]
any_goals
  rintro ⟨x', hx', rfl⟩
  refine' ⟨x', _, rfl⟩
  first
  | rwa [← z _]
  | rwa [z _]
  rwa [StrictMono.lt_iff_lt h₁] at hx
[GOAL]
case mpr.intro.intro.intro.refine'_1.mp
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x : β
hx : f k < x
⊢ (∃ a, a ∈ A ∧ f a = x) → ∃ a, a ∈ B ∧ f a = x
[PROOFSTEP]
rintro ⟨x', hx', rfl⟩
[GOAL]
case mpr.intro.intro.intro.refine'_1.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ A
hx : f k < f x'
⊢ ∃ a, a ∈ B ∧ f a = f x'
[PROOFSTEP]
refine' ⟨x', _, rfl⟩
[GOAL]
case mpr.intro.intro.intro.refine'_1.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ A
hx : f k < f x'
⊢ x' ∈ B
[PROOFSTEP]
first
| rwa [← z _]
| rwa [z _]
[GOAL]
case mpr.intro.intro.intro.refine'_1.mp.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ A
hx : f k < f x'
⊢ x' ∈ B
[PROOFSTEP]
rwa [← z _]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ A
hx : f k < f x'
⊢ k < x'
[PROOFSTEP]
rwa [StrictMono.lt_iff_lt h₁] at hx
[GOAL]
case mpr.intro.intro.intro.refine'_1.mpr
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x : β
hx : f k < x
⊢ (∃ a, a ∈ B ∧ f a = x) → ∃ a, a ∈ A ∧ f a = x
[PROOFSTEP]
rintro ⟨x', hx', rfl⟩
[GOAL]
case mpr.intro.intro.intro.refine'_1.mpr.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ B
hx : f k < f x'
⊢ ∃ a, a ∈ A ∧ f a = f x'
[PROOFSTEP]
refine' ⟨x', _, rfl⟩
[GOAL]
case mpr.intro.intro.intro.refine'_1.mpr.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ B
hx : f k < f x'
⊢ x' ∈ A
[PROOFSTEP]
first
| rwa [← z _]
| rwa [z _]
[GOAL]
case mpr.intro.intro.intro.refine'_1.mpr.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ B
hx : f k < f x'
⊢ x' ∈ A
[PROOFSTEP]
rwa [← z _]
[GOAL]
case mpr.intro.intro.intro.refine'_1.mpr.intro.intro
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ B
hx : f k < f x'
⊢ x' ∈ A
[PROOFSTEP]
rwa [z _]
[GOAL]
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
x' : α
hx' : x' ∈ B
hx : f k < f x'
⊢ k < x'
[PROOFSTEP]
rwa [StrictMono.lt_iff_lt h₁] at hx
[GOAL]
case mpr.intro.intro.intro.refine'_2
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
⊢ ∀ (x : α), x ∈ A → ¬f x = f k
[PROOFSTEP]
simp only [h₁.injective, Function.Injective.eq_iff]
[GOAL]
case mpr.intro.intro.intro.refine'_2
α : Type u_1
β : Type u_2
inst✝² : LinearOrder α
inst✝¹ : DecidableEq β
inst✝ : Preorder β
f : α → β
h₁ : StrictMono f
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
ka : ¬k ∈ A
right✝ : k ∈ B
⊢ ∀ (x : α), x ∈ A → ¬x = k
[PROOFSTEP]
exact fun x hx => ne_of_mem_of_not_mem hx ka
[GOAL]
α : Type u_1
n : ℕ
A B : Finset (Fin n)
⊢ toColex (image (fun i => ↑i) A) < toColex (image (fun i => ↑i) B) ↔ toColex A < toColex B
[PROOFSTEP]
refine' Colex.hom_lt_iff _ _ _
[GOAL]
α : Type u_1
n : ℕ
A B : Finset (Fin n)
⊢ StrictMono fun i => ↑i
[PROOFSTEP]
exact (fun x y k => k)
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
⊢ a < b → b < c → a < c
[PROOFSTEP]
rintro ⟨k₁, k₁z, notinA, inB⟩ ⟨k₂, k₂z, notinB, inC⟩
[GOAL]
case intro.intro.intro.intro.intro.intro
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
⊢ a < c
[PROOFSTEP]
cases' lt_or_gt_of_ne (ne_of_mem_of_not_mem inB notinB) with h h
[GOAL]
case intro.intro.intro.intro.intro.intro.inl
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ < k₂
⊢ a < c
[PROOFSTEP]
refine' ⟨k₂, @fun x hx => _, _, inC⟩
[GOAL]
case intro.intro.intro.intro.intro.intro.inl.refine'_1
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ < k₂
x : α
hx : k₂ < x
⊢ x ∈ a ↔ x ∈ c
case intro.intro.intro.intro.intro.intro.inl.refine'_2
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ < k₂
⊢ ¬k₂ ∈ a
[PROOFSTEP]
rw [← k₂z hx]
[GOAL]
case intro.intro.intro.intro.intro.intro.inl.refine'_1
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ < k₂
x : α
hx : k₂ < x
⊢ x ∈ a ↔ x ∈ b
case intro.intro.intro.intro.intro.intro.inl.refine'_2
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ < k₂
⊢ ¬k₂ ∈ a
[PROOFSTEP]
apply k₁z (Trans.trans h hx)
[GOAL]
case intro.intro.intro.intro.intro.intro.inl.refine'_2
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ < k₂
⊢ ¬k₂ ∈ a
[PROOFSTEP]
rwa [k₁z h]
[GOAL]
case intro.intro.intro.intro.intro.intro.inr
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ > k₂
⊢ a < c
[PROOFSTEP]
refine' ⟨k₁, @fun x hx => _, notinA, by rwa [← k₂z h]⟩
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ > k₂
⊢ k₁ ∈ c
[PROOFSTEP]
rwa [← k₂z h]
[GOAL]
case intro.intro.intro.intro.intro.intro.inr
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ > k₂
x : α
hx : k₁ < x
⊢ x ∈ a ↔ x ∈ c
[PROOFSTEP]
rw [k₁z hx]
[GOAL]
case intro.intro.intro.intro.intro.intro.inr
α : Type u_1
inst✝ : LinearOrder α
a b c : Colex α
k₁ : α
k₁z : ∀ {x : α}, k₁ < x → (x ∈ a ↔ x ∈ b)
notinA : ¬k₁ ∈ a
inB : k₁ ∈ b
k₂ : α
k₂z : ∀ {x : α}, k₂ < x → (x ∈ b ↔ x ∈ c)
notinB : ¬k₂ ∈ b
inC : k₂ ∈ c
h : k₁ > k₂
x : α
hx : k₁ < x
⊢ x ∈ b ↔ x ∈ c
[PROOFSTEP]
apply k₂z (Trans.trans h hx)
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
⊢ A < B ∨ A = B ∨ B < A
[PROOFSTEP]
by_cases h₁ : A = B
[GOAL]
case pos
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : A = B
⊢ A < B ∨ A = B ∨ B < A
[PROOFSTEP]
tauto
[GOAL]
case neg
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
⊢ A < B ∨ A = B ∨ B < A
[PROOFSTEP]
have h : Finset.Nonempty (A \ B ∪ B \ A) := by
  rw [nonempty_iff_ne_empty]
  intro a
  simp only [union_eq_empty_iff, sdiff_eq_empty_iff_subset] at a
  apply h₁ (Subset.antisymm a.1 a.2)
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
⊢ Finset.Nonempty (A \ B ∪ B \ A)
[PROOFSTEP]
rw [nonempty_iff_ne_empty]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
⊢ A \ B ∪ B \ A ≠ ∅
[PROOFSTEP]
intro a
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
a : A \ B ∪ B \ A = ∅
⊢ False
[PROOFSTEP]
simp only [union_eq_empty_iff, sdiff_eq_empty_iff_subset] at a
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
a : A ⊆ B ∧ B ⊆ A
⊢ False
[PROOFSTEP]
apply h₁ (Subset.antisymm a.1 a.2)
[GOAL]
case neg
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
⊢ A < B ∨ A = B ∨ B < A
[PROOFSTEP]
rcases exists_max_image (A \ B ∪ B \ A) id h with ⟨k, ⟨hk, z⟩⟩
[GOAL]
case neg.intro.intro
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ A \ B ∪ B \ A
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
⊢ A < B ∨ A = B ∨ B < A
[PROOFSTEP]
simp only [mem_union, mem_sdiff] at hk
[GOAL]
case neg.intro.intro
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
hk : k ∈ A ∧ ¬k ∈ B ∨ k ∈ B ∧ ¬k ∈ A
⊢ A < B ∨ A = B ∨ B < A
[PROOFSTEP]
cases' hk with hk hk
[GOAL]
case neg.intro.intro.inl
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
hk : k ∈ A ∧ ¬k ∈ B
⊢ A < B ∨ A = B ∨ B < A
[PROOFSTEP]
right
[GOAL]
case neg.intro.intro.inl.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
hk : k ∈ A ∧ ¬k ∈ B
⊢ A = B ∨ B < A
[PROOFSTEP]
right
[GOAL]
case neg.intro.intro.inl.h.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
hk : k ∈ A ∧ ¬k ∈ B
⊢ B < A
[PROOFSTEP]
refine' ⟨k, @fun t th => _, hk.2, hk.1⟩
[GOAL]
case neg.intro.intro.inl.h.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
hk : k ∈ A ∧ ¬k ∈ B
t : α
th : k < t
⊢ t ∈ B ↔ t ∈ A
[PROOFSTEP]
specialize z t
[GOAL]
case neg.intro.intro.inl.h.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ A ∧ ¬k ∈ B
t : α
th : k < t
z : t ∈ A \ B ∪ B \ A → id t ≤ id k
⊢ t ∈ B ↔ t ∈ A
[PROOFSTEP]
by_contra h₂
[GOAL]
case neg.intro.intro.inl.h.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ A ∧ ¬k ∈ B
t : α
th : k < t
z : t ∈ A \ B ∪ B \ A → id t ≤ id k
h₂ : ¬(t ∈ B ↔ t ∈ A)
⊢ False
[PROOFSTEP]
simp only [mem_union, mem_sdiff, id.def] at z
[GOAL]
case neg.intro.intro.inl.h.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ A ∧ ¬k ∈ B
t : α
th : k < t
h₂ : ¬(t ∈ B ↔ t ∈ A)
z : t ∈ A ∧ ¬t ∈ B ∨ t ∈ B ∧ ¬t ∈ A → t ≤ k
⊢ False
[PROOFSTEP]
rw [not_iff, iff_iff_and_or_not_and_not, not_not, and_comm] at h₂
[GOAL]
case neg.intro.intro.inl.h.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ A ∧ ¬k ∈ B
t : α
th : k < t
h₂ : t ∈ A ∧ ¬t ∈ B ∨ t ∈ B ∧ ¬t ∈ A
z : t ∈ A ∧ ¬t ∈ B ∨ t ∈ B ∧ ¬t ∈ A → t ≤ k
⊢ False
[PROOFSTEP]
apply not_le_of_lt th (z h₂)
[GOAL]
case neg.intro.intro.inr
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
hk : k ∈ B ∧ ¬k ∈ A
⊢ A < B ∨ A = B ∨ B < A
[PROOFSTEP]
left
[GOAL]
case neg.intro.intro.inr.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
hk : k ∈ B ∧ ¬k ∈ A
⊢ A < B
[PROOFSTEP]
refine' ⟨k, @fun t th => _, hk.2, hk.1⟩
[GOAL]
case neg.intro.intro.inr.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
z : ∀ (x' : α), x' ∈ A \ B ∪ B \ A → id x' ≤ id k
hk : k ∈ B ∧ ¬k ∈ A
t : α
th : k < t
⊢ t ∈ A ↔ t ∈ B
[PROOFSTEP]
specialize z t
[GOAL]
case neg.intro.intro.inr.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ B ∧ ¬k ∈ A
t : α
th : k < t
z : t ∈ A \ B ∪ B \ A → id t ≤ id k
⊢ t ∈ A ↔ t ∈ B
[PROOFSTEP]
by_contra h₃
[GOAL]
case neg.intro.intro.inr.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ B ∧ ¬k ∈ A
t : α
th : k < t
z : t ∈ A \ B ∪ B \ A → id t ≤ id k
h₃ : ¬(t ∈ A ↔ t ∈ B)
⊢ False
[PROOFSTEP]
simp only [mem_union, mem_sdiff, id.def] at z
[GOAL]
case neg.intro.intro.inr.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ B ∧ ¬k ∈ A
t : α
th : k < t
h₃ : ¬(t ∈ A ↔ t ∈ B)
z : t ∈ A ∧ ¬t ∈ B ∨ t ∈ B ∧ ¬t ∈ A → t ≤ k
⊢ False
[PROOFSTEP]
rw [not_iff, iff_iff_and_or_not_and_not, not_not, and_comm, or_comm] at h₃
[GOAL]
case neg.intro.intro.inr.h
α : Type u_1
inst✝ : LinearOrder α
A B : Colex α
h₁ : ¬A = B
h : Finset.Nonempty (A \ B ∪ B \ A)
k : α
hk : k ∈ B ∧ ¬k ∈ A
t : α
th : k < t
h₃ : t ∈ A ∧ ¬t ∈ B ∨ t ∈ B ∧ ¬t ∈ A
z : t ∈ A ∧ ¬t ∈ B ∨ t ∈ B ∧ ¬t ∈ A → t ≤ k
⊢ False
[PROOFSTEP]
apply not_le_of_lt th (z h₃)
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A✝ B✝ : Colex α
A B : Finset α
⊢ toColex A < toColex B ↔ ∃ k, k ∈ B ∧ (∀ (x : α), x ∈ A ∪ B → k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A
[PROOFSTEP]
rw [Colex.lt_def]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A✝ B✝ : Colex α
A B : Finset α
⊢ (∃ k, (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B) ↔
    ∃ k, k ∈ B ∧ (∀ (x : α), x ∈ A ∪ B → k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A
[PROOFSTEP]
apply exists_congr
[GOAL]
case h
α : Type u_1
inst✝ : LinearOrder α
A✝ B✝ : Colex α
A B : Finset α
⊢ ∀ (a : α),
    (∀ {x : α}, a < x → (x ∈ A ↔ x ∈ B)) ∧ ¬a ∈ A ∧ a ∈ B ↔
      a ∈ B ∧ (∀ (x : α), x ∈ A ∪ B → a < x → (x ∈ A ↔ x ∈ B)) ∧ ¬a ∈ A
[PROOFSTEP]
simp only [mem_union, exists_prop, or_imp, and_comm (a := _ ∈ B), and_assoc]
[GOAL]
case h
α : Type u_1
inst✝ : LinearOrder α
A✝ B✝ : Colex α
A B : Finset α
⊢ ∀ (a : α),
    (∀ {x : α}, a < x → (x ∈ A ↔ x ∈ B)) ∧ ¬a ∈ A ∧ a ∈ B ↔
      (∀ (x : α), (x ∈ A → a < x → (x ∈ A ↔ x ∈ B)) ∧ (x ∈ B → a < x → (x ∈ A ↔ x ∈ B))) ∧ ¬a ∈ A ∧ a ∈ B
[PROOFSTEP]
intro k
[GOAL]
case h
α : Type u_1
inst✝ : LinearOrder α
A✝ B✝ : Colex α
A B : Finset α
k : α
⊢ (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B ↔
    (∀ (x : α), (x ∈ A → k < x → (x ∈ A ↔ x ∈ B)) ∧ (x ∈ B → k < x → (x ∈ A ↔ x ∈ B))) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
refine' and_congr_left' (forall_congr' _)
[GOAL]
case h
α : Type u_1
inst✝ : LinearOrder α
A✝ B✝ : Colex α
A B : Finset α
k : α
⊢ ∀ (a : α), k < a → (a ∈ A ↔ a ∈ B) ↔ (a ∈ A → k < a → (a ∈ A ↔ a ∈ B)) ∧ (a ∈ B → k < a → (a ∈ A ↔ a ∈ B))
[PROOFSTEP]
tauto
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
A B : Colex α
⊢ A < B ↔ A ≤ B ∧ ¬B ≤ A
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
A B : Colex α
⊢ A < B → A ≤ B ∧ ¬B ≤ A
[PROOFSTEP]
intro t
[GOAL]
case mp
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
A B : Colex α
t : A < B
⊢ A ≤ B ∧ ¬B ≤ A
[PROOFSTEP]
refine' ⟨Or.inl t, _⟩
[GOAL]
case mp
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
A B : Colex α
t : A < B
⊢ ¬B ≤ A
[PROOFSTEP]
rintro (i | rfl)
[GOAL]
case mp.inl
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
A B : Colex α
t : A < B
i : B < A
⊢ False
[PROOFSTEP]
apply asymm_of _ t i
[GOAL]
case mp.inr
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
B : Colex α
t : B < B
⊢ False
[PROOFSTEP]
apply irrefl _ t
[GOAL]
case mpr
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
A B : Colex α
⊢ A ≤ B ∧ ¬B ≤ A → A < B
[PROOFSTEP]
rintro ⟨h₁ | rfl, h₂⟩
[GOAL]
case mpr.intro.inl
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
A B : Colex α
h₂ : ¬B ≤ A
h₁ : A < B
⊢ A < B
[PROOFSTEP]
apply h₁
[GOAL]
case mpr.intro.inr
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
A : Colex α
h₂ : ¬A ≤ A
⊢ A < A
[PROOFSTEP]
apply h₂.elim (Or.inr rfl)
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
⊢ DecidableRel fun x x_1 => x ≤ x_1
[PROOFSTEP]
letI : DecidableEq (Finset.Colex α) := inferInstanceAs (DecidableEq (Finset α))
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
src✝¹ : LT (Colex α) := instLT
src✝ : LE (Colex α) := instLE
this : DecidableEq (Colex α) := inferInstanceAs (DecidableEq (Finset α))
⊢ DecidableRel fun x x_1 => x ≤ x_1
[PROOFSTEP]
exact fun A B => inferInstanceAs (Decidable (A < B ∨ A = B))
[GOAL]
α : Type u_1
β : Type u_2
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
h₁ : StrictMono f
A B : Finset α
⊢ toColex (image f A) ≤ toColex (image f B) ↔ toColex A ≤ toColex B
[PROOFSTEP]
rw [le_iff_le_iff_lt_iff_lt, hom_lt_iff h₁]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
t : α
h₁ : toColex A < toColex B
h₂ : ∀ (x : α), x ∈ B → x < t
⊢ ∀ (x : α), x ∈ A → x < t
[PROOFSTEP]
rw [Colex.lt_def] at h₁
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
t : α
h₁ : ∃ k, (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
h₂ : ∀ (x : α), x ∈ B → x < t
⊢ ∀ (x : α), x ∈ A → x < t
[PROOFSTEP]
rcases h₁ with ⟨k, z, _, _⟩
[GOAL]
case intro.intro.intro
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
t : α
h₂ : ∀ (x : α), x ∈ B → x < t
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
left✝ : ¬k ∈ A
right✝ : k ∈ B
⊢ ∀ (x : α), x ∈ A → x < t
[PROOFSTEP]
intro x hx
[GOAL]
case intro.intro.intro
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
t : α
h₂ : ∀ (x : α), x ∈ B → x < t
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
left✝ : ¬k ∈ A
right✝ : k ∈ B
x : α
hx : x ∈ A
⊢ x < t
[PROOFSTEP]
apply lt_of_not_ge
[GOAL]
case intro.intro.intro.h
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
t : α
h₂ : ∀ (x : α), x ∈ B → x < t
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
left✝ : ¬k ∈ A
right✝ : k ∈ B
x : α
hx : x ∈ A
⊢ ¬x ≥ t
[PROOFSTEP]
intro a
[GOAL]
case intro.intro.intro.h
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
t : α
h₂ : ∀ (x : α), x ∈ B → x < t
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
left✝ : ¬k ∈ A
right✝ : k ∈ B
x : α
hx : x ∈ A
a : x ≥ t
⊢ False
[PROOFSTEP]
refine' not_lt_of_ge a (h₂ x _)
[GOAL]
case intro.intro.intro.h
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
t : α
h₂ : ∀ (x : α), x ∈ B → x < t
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
left✝ : ¬k ∈ A
right✝ : k ∈ B
x : α
hx : x ∈ A
a : x ≥ t
⊢ x ∈ B
[PROOFSTEP]
rwa [← z]
[GOAL]
case intro.intro.intro.h
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
t : α
h₂ : ∀ (x : α), x ∈ B → x < t
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
left✝ : ¬k ∈ A
right✝ : k ∈ B
x : α
hx : x ∈ A
a : x ≥ t
⊢ k < x
[PROOFSTEP]
apply lt_of_lt_of_le (h₂ k ‹_›) a
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
⊢ toColex s < toColex {r} ↔ ∀ (x : α), x ∈ s → x < r
[PROOFSTEP]
simp only [lt_def, mem_singleton, ← and_assoc, exists_eq_right]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
⊢ (∀ {x : α}, r < x → (x ∈ s ↔ x = r)) ∧ ¬r ∈ s ↔ ∀ (x : α), x ∈ s → x < r
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
⊢ (∀ {x : α}, r < x → (x ∈ s ↔ x = r)) ∧ ¬r ∈ s → ∀ (x : α), x ∈ s → x < r
[PROOFSTEP]
intro t x hx
[GOAL]
case mp
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
t : (∀ {x : α}, r < x → (x ∈ s ↔ x = r)) ∧ ¬r ∈ s
x : α
hx : x ∈ s
⊢ x < r
[PROOFSTEP]
rw [← not_le]
[GOAL]
case mp
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
t : (∀ {x : α}, r < x → (x ∈ s ↔ x = r)) ∧ ¬r ∈ s
x : α
hx : x ∈ s
⊢ ¬r ≤ x
[PROOFSTEP]
intro h
[GOAL]
case mp
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
t : (∀ {x : α}, r < x → (x ∈ s ↔ x = r)) ∧ ¬r ∈ s
x : α
hx : x ∈ s
h : r ≤ x
⊢ False
[PROOFSTEP]
rcases lt_or_eq_of_le h with (h₁ | rfl)
[GOAL]
case mp.inl
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
t : (∀ {x : α}, r < x → (x ∈ s ↔ x = r)) ∧ ¬r ∈ s
x : α
hx : x ∈ s
h : r ≤ x
h₁ : r < x
⊢ False
[PROOFSTEP]
exact ne_of_irrefl h₁ ((t.1 h₁).1 hx).symm
[GOAL]
case mp.inr
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
t : (∀ {x : α}, r < x → (x ∈ s ↔ x = r)) ∧ ¬r ∈ s
hx : r ∈ s
h : r ≤ r
⊢ False
[PROOFSTEP]
exact t.2 hx
[GOAL]
case mpr
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
⊢ (∀ (x : α), x ∈ s → x < r) → (∀ {x : α}, r < x → (x ∈ s ↔ x = r)) ∧ ¬r ∈ s
[PROOFSTEP]
exact fun h => ⟨fun {z} hz => ⟨fun i => (asymm hz (h _ i)).elim, fun i => (hz.ne' i).elim⟩, by simpa using h r⟩
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
h : ∀ (x : α), x ∈ s → x < r
⊢ ¬r ∈ s
[PROOFSTEP]
simpa using h r
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
⊢ toColex {r} ≤ toColex s ↔ ∃ x, x ∈ s ∧ r ≤ x
[PROOFSTEP]
simp only [← not_lt]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
r : α
s : Finset α
⊢ ¬toColex s < toColex {r} ↔ ∃ x, x ∈ s ∧ ¬x < r
[PROOFSTEP]
simp [lt_singleton_iff_mem_lt]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
r s : α
⊢ toColex {r} < toColex {s} ↔ r < s
[PROOFSTEP]
simp [lt_singleton_iff_mem_lt]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
r s : α
⊢ toColex {r} ≤ toColex {s} ↔ r ≤ s
[PROOFSTEP]
rw [le_iff_le_iff_lt_iff_lt, singleton_lt_iff_lt]
[GOAL]
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
⊢ toColex (A \ B) < toColex (B \ A) ↔ toColex A < toColex B
[PROOFSTEP]
rw [Colex.lt_def, Colex.lt_def]
[GOAL]
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
⊢ (∃ k, (∀ {x : α}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)) ∧ ¬k ∈ A \ B ∧ k ∈ B \ A) ↔
    ∃ k, (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
apply exists_congr
[GOAL]
case h
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
⊢ ∀ (a : α),
    (∀ {x : α}, a < x → (x ∈ A \ B ↔ x ∈ B \ A)) ∧ ¬a ∈ A \ B ∧ a ∈ B \ A ↔
      (∀ {x : α}, a < x → (x ∈ A ↔ x ∈ B)) ∧ ¬a ∈ A ∧ a ∈ B
[PROOFSTEP]
intro k
[GOAL]
case h
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
⊢ (∀ {x : α}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)) ∧ ¬k ∈ A \ B ∧ k ∈ B \ A ↔
    (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
simp only [mem_sdiff, not_and, not_not]
[GOAL]
case h
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
⊢ (∀ {x : α}, k < x → (x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A)) ∧ (k ∈ A → k ∈ B) ∧ k ∈ B ∧ ¬k ∈ A ↔
    (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
constructor
[GOAL]
case h.mp
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
⊢ (∀ {x : α}, k < x → (x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A)) ∧ (k ∈ A → k ∈ B) ∧ k ∈ B ∧ ¬k ∈ A →
    (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
rintro ⟨z, kAB, kB, kA⟩
[GOAL]
case h.mp.intro.intro.intro
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A)
kAB : k ∈ A → k ∈ B
kB : k ∈ B
kA : ¬k ∈ A
⊢ (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B
[PROOFSTEP]
refine' ⟨_, kA, kB⟩
[GOAL]
case h.mp.intro.intro.intro
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A)
kAB : k ∈ A → k ∈ B
kB : k ∈ B
kA : ¬k ∈ A
⊢ ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
[PROOFSTEP]
intro x hx
[GOAL]
case h.mp.intro.intro.intro
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A)
kAB : k ∈ A → k ∈ B
kB : k ∈ B
kA : ¬k ∈ A
x : α
hx : k < x
⊢ x ∈ A ↔ x ∈ B
[PROOFSTEP]
specialize z hx
[GOAL]
case h.mp.intro.intro.intro
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
kAB : k ∈ A → k ∈ B
kB : k ∈ B
kA : ¬k ∈ A
x : α
hx : k < x
z : x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A
⊢ x ∈ A ↔ x ∈ B
[PROOFSTEP]
tauto
[GOAL]
case h.mpr
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
⊢ (∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)) ∧ ¬k ∈ A ∧ k ∈ B →
    (∀ {x : α}, k < x → (x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A)) ∧ (k ∈ A → k ∈ B) ∧ k ∈ B ∧ ¬k ∈ A
[PROOFSTEP]
rintro ⟨z, kA, kB⟩
[GOAL]
case h.mpr.intro.intro
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
kA : ¬k ∈ A
kB : k ∈ B
⊢ (∀ {x : α}, k < x → (x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A)) ∧ (k ∈ A → k ∈ B) ∧ k ∈ B ∧ ¬k ∈ A
[PROOFSTEP]
refine' ⟨_, fun _ => kB, kB, kA⟩
[GOAL]
case h.mpr.intro.intro
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
kA : ¬k ∈ A
kB : k ∈ B
⊢ ∀ {x : α}, k < x → (x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A)
[PROOFSTEP]
intro x hx
[GOAL]
case h.mpr.intro.intro
α : Type u_1
inst✝¹ : LT α
inst✝ : DecidableEq α
A B : Finset α
k : α
z : ∀ {x : α}, k < x → (x ∈ A ↔ x ∈ B)
kA : ¬k ∈ A
kB : k ∈ B
x : α
hx : k < x
⊢ x ∈ A ∧ ¬x ∈ B ↔ x ∈ B ∧ ¬x ∈ A
[PROOFSTEP]
rw [z hx]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
⊢ toColex (A \ B) ≤ toColex (B \ A) ↔ toColex A ≤ toColex B
[PROOFSTEP]
rw [le_iff_le_iff_lt_iff_lt, sdiff_lt_sdiff_iff_lt]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A : Finset α
hA : Finset.Nonempty A
⊢ toColex ∅ < toColex A
[PROOFSTEP]
rw [Colex.lt_def]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A : Finset α
hA : Finset.Nonempty A
⊢ ∃ k, (∀ {x : α}, k < x → (x ∈ ∅ ↔ x ∈ A)) ∧ ¬k ∈ ∅ ∧ k ∈ A
[PROOFSTEP]
refine' ⟨max' _ hA, _, by simp, max'_mem _ _⟩
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A : Finset α
hA : Finset.Nonempty A
⊢ ¬max' A hA ∈ ∅
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A : Finset α
hA : Finset.Nonempty A
⊢ ∀ {x : α}, max' A hA < x → (x ∈ ∅ ↔ x ∈ A)
[PROOFSTEP]
simp only [false_iff_iff, not_mem_empty]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A : Finset α
hA : Finset.Nonempty A
⊢ ∀ {x : α}, max' A hA < x → ¬x ∈ A
[PROOFSTEP]
intro x hx t
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A : Finset α
hA : Finset.Nonempty A
x : α
hx : max' A hA < x
t : x ∈ A
⊢ False
[PROOFSTEP]
apply not_le_of_lt hx (le_max' _ _ t)
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
h : A ⊂ B
⊢ toColex A < toColex B
[PROOFSTEP]
rw [← sdiff_lt_sdiff_iff_lt, sdiff_eq_empty_iff_subset.2 h.1]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
h : A ⊂ B
⊢ toColex ∅ < toColex (B \ A)
[PROOFSTEP]
exact empty_toColex_lt (by simpa [Finset.Nonempty] using exists_of_ssubset h)
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
h : A ⊂ B
⊢ Finset.Nonempty (B \ A)
[PROOFSTEP]
simpa [Finset.Nonempty] using exists_of_ssubset h
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A : Finset α
⊢ toColex ∅ ≤ toColex A
[PROOFSTEP]
rcases A.eq_empty_or_nonempty with (rfl | hA)
[GOAL]
case inl
α : Type u_1
inst✝ : LinearOrder α
⊢ toColex ∅ ≤ toColex ∅
[PROOFSTEP]
simp
[GOAL]
case inr
α : Type u_1
inst✝ : LinearOrder α
A : Finset α
hA : Finset.Nonempty A
⊢ toColex ∅ ≤ toColex A
[PROOFSTEP]
apply (empty_toColex_lt hA).le
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
h : A ⊆ B
⊢ toColex A ≤ toColex B
[PROOFSTEP]
rw [← sdiff_le_sdiff_iff_le, sdiff_eq_empty_iff_subset.2 h]
[GOAL]
α : Type u_1
inst✝ : LinearOrder α
A B : Finset α
h : A ⊆ B
⊢ toColex ∅ ≤ toColex (B \ A)
[PROOFSTEP]
apply empty_toColex_le
[GOAL]
α : Type u_1
A B : Finset ℕ
⊢ ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i ↔ toColex A < toColex B
[PROOFSTEP]
have z : ∀ A B : Finset ℕ, A.toColex < B.toColex → ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i :=
  by
  intro A B
  rw [← sdiff_lt_sdiff_iff_lt, Colex.lt_def]
  rintro ⟨k, z, kA, kB⟩
  rw [← sdiff_union_inter A B]
  conv_rhs => rw [← sdiff_union_inter B A]
  rw [sum_union (disjoint_sdiff_inter _ _), sum_union (disjoint_sdiff_inter _ _), inter_comm, add_lt_add_iff_right]
  apply lt_of_lt_of_le (@Nat.sum_two_pow_lt k (A \ B) _)
  · apply single_le_sum (fun _ _ => Nat.zero_le _) kB
  intro x hx
  apply lt_of_le_of_ne (le_of_not_lt _)
  · apply ne_of_mem_of_not_mem hx kA
  intro kx
  have := (z kx).1 hx
  rw [mem_sdiff] at this hx
  exact hx.2 this.1
[GOAL]
α : Type u_1
A B : Finset ℕ
⊢ ∀ (A B : Finset ℕ), toColex A < toColex B → ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i
[PROOFSTEP]
intro A B
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
⊢ toColex A < toColex B → ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i
[PROOFSTEP]
rw [← sdiff_lt_sdiff_iff_lt, Colex.lt_def]
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
⊢ (∃ k, (∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)) ∧ ¬k ∈ A \ B ∧ k ∈ B \ A) → ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i
[PROOFSTEP]
rintro ⟨k, z, kA, kB⟩
[GOAL]
case intro.intro.intro
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
⊢ ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i
[PROOFSTEP]
rw [← sdiff_union_inter A B]
[GOAL]
case intro.intro.intro
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
⊢ ∑ i in A \ B ∪ A ∩ B, 2 ^ i < ∑ i in B, 2 ^ i
[PROOFSTEP]
conv_rhs => rw [← sdiff_union_inter B A]
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
| ∑ i in B, 2 ^ i
[PROOFSTEP]
rw [← sdiff_union_inter B A]
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
| ∑ i in B, 2 ^ i
[PROOFSTEP]
rw [← sdiff_union_inter B A]
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
| ∑ i in B, 2 ^ i
[PROOFSTEP]
rw [← sdiff_union_inter B A]
[GOAL]
case intro.intro.intro
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
⊢ ∑ i in A \ B ∪ A ∩ B, 2 ^ i < ∑ i in B \ A ∪ B ∩ A, 2 ^ i
[PROOFSTEP]
rw [sum_union (disjoint_sdiff_inter _ _), sum_union (disjoint_sdiff_inter _ _), inter_comm, add_lt_add_iff_right]
[GOAL]
case intro.intro.intro
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
⊢ ∑ x in A \ B, 2 ^ x < ∑ x in B \ A, 2 ^ x
[PROOFSTEP]
apply lt_of_lt_of_le (@Nat.sum_two_pow_lt k (A \ B) _)
[GOAL]
case intro.intro.intro
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
⊢ 2 ^ k ≤ ∑ x in B \ A, 2 ^ x
[PROOFSTEP]
apply single_le_sum (fun _ _ => Nat.zero_le _) kB
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
⊢ ∀ {x : ℕ}, x ∈ A \ B → x < k
[PROOFSTEP]
intro x hx
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
x : ℕ
hx : x ∈ A \ B
⊢ x < k
[PROOFSTEP]
apply lt_of_le_of_ne (le_of_not_lt _)
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
x : ℕ
hx : x ∈ A \ B
⊢ x ≠ k
[PROOFSTEP]
apply ne_of_mem_of_not_mem hx kA
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
x : ℕ
hx : x ∈ A \ B
⊢ ¬k < x
[PROOFSTEP]
intro kx
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
x : ℕ
hx : x ∈ A \ B
kx : k < x
⊢ False
[PROOFSTEP]
have := (z kx).1 hx
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
x : ℕ
hx : x ∈ A \ B
kx : k < x
this : x ∈ B \ A
⊢ False
[PROOFSTEP]
rw [mem_sdiff] at this hx
[GOAL]
α : Type u_1
A✝ B✝ A B : Finset ℕ
k : ℕ
z : ∀ {x : ℕ}, k < x → (x ∈ A \ B ↔ x ∈ B \ A)
kA : ¬k ∈ A \ B
kB : k ∈ B \ A
x : ℕ
hx : x ∈ A ∧ ¬x ∈ B
kx : k < x
this : x ∈ B ∧ ¬x ∈ A
⊢ False
[PROOFSTEP]
exact hx.2 this.1
[GOAL]
α : Type u_1
A B : Finset ℕ
z : ∀ (A B : Finset ℕ), toColex A < toColex B → ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i
⊢ ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i ↔ toColex A < toColex B
[PROOFSTEP]
refine' ⟨fun h => (lt_trichotomy A B).resolve_right fun h₁ => h₁.elim _ (not_lt_of_gt h ∘ z _ _), z A B⟩
[GOAL]
α : Type u_1
A B : Finset ℕ
z : ∀ (A B : Finset ℕ), toColex A < toColex B → ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i
h : ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i
h₁ : A = B ∨ B < A
⊢ A = B → False
[PROOFSTEP]
rintro rfl
[GOAL]
α : Type u_1
A : Finset ℕ
z : ∀ (A B : Finset ℕ), toColex A < toColex B → ∑ i in A, 2 ^ i < ∑ i in B, 2 ^ i
h : ∑ i in A, 2 ^ i < ∑ i in A, 2 ^ i
h₁ : A = A ∨ A < A
⊢ False
[PROOFSTEP]
apply irrefl _ h
[GOAL]
α : Type u_1
A B : Finset ℕ
⊢ ∑ i in A, 2 ^ i ≤ ∑ i in B, 2 ^ i ↔ toColex A ≤ toColex B
[PROOFSTEP]
rw [le_iff_le_iff_lt_iff_lt, sum_two_pow_lt_iff_lt]


[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
⊢ LinearMap.range (ContinuousLinearMap.prod f' φ') ≠ ⊤
[PROOFSTEP]
intro htop
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
htop : LinearMap.range (ContinuousLinearMap.prod f' φ') = ⊤
⊢ False
[PROOFSTEP]
set fφ := fun x => (f x, φ x)
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
htop : LinearMap.range (ContinuousLinearMap.prod f' φ') = ⊤
fφ : E → F × ℝ := fun x => (f x, φ x)
⊢ False
[PROOFSTEP]
have A : map φ (𝓝[f ⁻¹' {f x₀}] x₀) = 𝓝 (φ x₀) :=
  by
  change map (Prod.snd ∘ fφ) (𝓝[fφ ⁻¹' {p | p.1 = f x₀}] x₀) = 𝓝 (φ x₀)
  rw [← map_map, nhdsWithin, map_inf_principal_preimage, (hf'.prod hφ').map_nhds_eq_of_surj htop]
  exact map_snd_nhdsWithin _
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
htop : LinearMap.range (ContinuousLinearMap.prod f' φ') = ⊤
fφ : E → F × ℝ := fun x => (f x, φ x)
⊢ map φ (𝓝[f ⁻¹' {f x₀}] x₀) = 𝓝 (φ x₀)
[PROOFSTEP]
change map (Prod.snd ∘ fφ) (𝓝[fφ ⁻¹' {p | p.1 = f x₀}] x₀) = 𝓝 (φ x₀)
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
htop : LinearMap.range (ContinuousLinearMap.prod f' φ') = ⊤
fφ : E → F × ℝ := fun x => (f x, φ x)
⊢ map (Prod.snd ∘ fφ) (𝓝[fφ ⁻¹' {p | p.fst = f x₀}] x₀) = 𝓝 (φ x₀)
[PROOFSTEP]
rw [← map_map, nhdsWithin, map_inf_principal_preimage, (hf'.prod hφ').map_nhds_eq_of_surj htop]
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
htop : LinearMap.range (ContinuousLinearMap.prod f' φ') = ⊤
fφ : E → F × ℝ := fun x => (f x, φ x)
⊢ map Prod.snd (𝓝 (f x₀, φ x₀) ⊓ 𝓟 {p | p.fst = f x₀}) = 𝓝 (φ x₀)
[PROOFSTEP]
exact map_snd_nhdsWithin _
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
htop : LinearMap.range (ContinuousLinearMap.prod f' φ') = ⊤
fφ : E → F × ℝ := fun x => (f x, φ x)
A : map φ (𝓝[f ⁻¹' {f x₀}] x₀) = 𝓝 (φ x₀)
⊢ False
[PROOFSTEP]
exact hextr.not_nhds_le_map A.ge
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
[PROOFSTEP]
rcases Submodule.exists_le_ker_of_lt_top _ (lt_top_iff_ne_top.2 <| hextr.range_ne_top_of_hasStrictFDerivAt hf' hφ') with
  ⟨Λ', h0, hΛ'⟩
[GOAL]
case intro.intro
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ' : F × ℝ →ₗ[ℝ] ℝ
h0 : Λ' ≠ 0
hΛ' : LinearMap.range (ContinuousLinearMap.prod f' φ') ≤ LinearMap.ker Λ'
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
[PROOFSTEP]
set e : ((F →ₗ[ℝ] ℝ) × ℝ) ≃ₗ[ℝ] F × ℝ →ₗ[ℝ] ℝ :=
  ((LinearEquiv.refl ℝ (F →ₗ[ℝ] ℝ)).prod (LinearMap.ringLmapEquivSelf ℝ ℝ ℝ).symm).trans (LinearMap.coprodEquiv ℝ)
[GOAL]
case intro.intro
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ' : F × ℝ →ₗ[ℝ] ℝ
h0 : Λ' ≠ 0
hΛ' : LinearMap.range (ContinuousLinearMap.prod f' φ') ≤ LinearMap.ker Λ'
e : ((F →ₗ[ℝ] ℝ) × ℝ) ≃ₗ[ℝ] F × ℝ →ₗ[ℝ] ℝ :=
  LinearEquiv.trans
    (LinearEquiv.prod (LinearEquiv.refl ℝ (F →ₗ[ℝ] ℝ)) (LinearEquiv.symm (LinearMap.ringLmapEquivSelf ℝ ℝ ℝ)))
    (LinearMap.coprodEquiv ℝ)
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
[PROOFSTEP]
rcases e.surjective Λ' with ⟨⟨Λ, Λ₀⟩, rfl⟩
[GOAL]
case intro.intro.intro.mk
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
e : ((F →ₗ[ℝ] ℝ) × ℝ) ≃ₗ[ℝ] F × ℝ →ₗ[ℝ] ℝ :=
  LinearEquiv.trans
    (LinearEquiv.prod (LinearEquiv.refl ℝ (F →ₗ[ℝ] ℝ)) (LinearEquiv.symm (LinearMap.ringLmapEquivSelf ℝ ℝ ℝ)))
    (LinearMap.coprodEquiv ℝ)
Λ : F →ₗ[ℝ] ℝ
Λ₀ : ℝ
h0 : ↑e (Λ, Λ₀) ≠ 0
hΛ' : LinearMap.range (ContinuousLinearMap.prod f' φ') ≤ LinearMap.ker (↑e (Λ, Λ₀))
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
[PROOFSTEP]
refine' ⟨Λ, Λ₀, e.map_ne_zero_iff.1 h0, fun x => _⟩
[GOAL]
case intro.intro.intro.mk
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
e : ((F →ₗ[ℝ] ℝ) × ℝ) ≃ₗ[ℝ] F × ℝ →ₗ[ℝ] ℝ :=
  LinearEquiv.trans
    (LinearEquiv.prod (LinearEquiv.refl ℝ (F →ₗ[ℝ] ℝ)) (LinearEquiv.symm (LinearMap.ringLmapEquivSelf ℝ ℝ ℝ)))
    (LinearMap.coprodEquiv ℝ)
Λ : F →ₗ[ℝ] ℝ
Λ₀ : ℝ
h0 : ↑e (Λ, Λ₀) ≠ 0
hΛ' : LinearMap.range (ContinuousLinearMap.prod f' φ') ≤ LinearMap.ker (↑e (Λ, Λ₀))
x : E
⊢ ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
[PROOFSTEP]
convert LinearMap.congr_fun (LinearMap.range_le_ker_iff.1 hΛ') x using 1
  -- squeezed `simp [mul_comm]` to speed up elaboration
[GOAL]
case h.e'_2
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f : E → F
φ : E → ℝ
x₀ : E
f' : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
e : ((F →ₗ[ℝ] ℝ) × ℝ) ≃ₗ[ℝ] F × ℝ →ₗ[ℝ] ℝ :=
  LinearEquiv.trans
    (LinearEquiv.prod (LinearEquiv.refl ℝ (F →ₗ[ℝ] ℝ)) (LinearEquiv.symm (LinearMap.ringLmapEquivSelf ℝ ℝ ℝ)))
    (LinearMap.coprodEquiv ℝ)
Λ : F →ₗ[ℝ] ℝ
Λ₀ : ℝ
h0 : ↑e (Λ, Λ₀) ≠ 0
hΛ' : LinearMap.range (ContinuousLinearMap.prod f' φ') ≤ LinearMap.ker (↑e (Λ, Λ₀))
x : E
⊢ ↑Λ (↑f' x) + Λ₀ • ↑φ' x = ↑(LinearMap.comp (↑e (Λ, Λ₀)) ↑(ContinuousLinearMap.prod f' φ')) x
[PROOFSTEP]
simp only [smul_eq_mul, LinearEquiv.trans_apply, LinearEquiv.prod_apply, LinearEquiv.refl_apply,
  LinearMap.ringLmapEquivSelf_symm_apply, LinearMap.coprodEquiv_apply, ContinuousLinearMap.coe_prod,
  LinearMap.coprod_comp_prod, LinearMap.add_apply, LinearMap.coe_comp, ContinuousLinearMap.coe_coe, Function.comp_apply,
  LinearMap.coe_smulRight, LinearMap.one_apply, mul_comm]
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
⊢ ∃ a b, (a, b) ≠ 0 ∧ a • f' + b • φ' = 0
[PROOFSTEP]
obtain ⟨Λ, Λ₀, hΛ, hfΛ⟩ := hextr.exists_linear_map_of_hasStrictFDerivAt hf' hφ'
[GOAL]
case intro.intro.intro
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
⊢ ∃ a b, (a, b) ≠ 0 ∧ a • f' + b • φ' = 0
[PROOFSTEP]
refine' ⟨Λ 1, Λ₀, _, _⟩
[GOAL]
case intro.intro.intro.refine'_1
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
⊢ (↑Λ 1, Λ₀) ≠ 0
[PROOFSTEP]
contrapose! hΛ
[GOAL]
case intro.intro.intro.refine'_1
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
hΛ : (↑Λ 1, Λ₀) = 0
⊢ (Λ, Λ₀) = 0
[PROOFSTEP]
simp only [Prod.mk_eq_zero] at hΛ ⊢
[GOAL]
case intro.intro.intro.refine'_1
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
hΛ : ↑Λ 1 = 0 ∧ Λ₀ = 0
⊢ Λ = 0 ∧ Λ₀ = 0
[PROOFSTEP]
refine' ⟨LinearMap.ext fun x => _, hΛ.2⟩
[GOAL]
case intro.intro.intro.refine'_1
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
hΛ : ↑Λ 1 = 0 ∧ Λ₀ = 0
x : ℝ
⊢ ↑Λ x = ↑0 x
[PROOFSTEP]
simpa [hΛ.1] using Λ.map_smul x 1
[GOAL]
case intro.intro.intro.refine'_2
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
⊢ ↑Λ 1 • f' + Λ₀ • φ' = 0
[PROOFSTEP]
ext x
[GOAL]
case intro.intro.intro.refine'_2.h
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
x : E
⊢ ↑(↑Λ 1 • f' + Λ₀ • φ') x = ↑0 x
[PROOFSTEP]
have H₁ : Λ (f' x) = f' x * Λ 1 := by simpa only [mul_one, Algebra.id.smul_eq_mul] using Λ.map_smul (f' x) 1
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
x : E
⊢ ↑Λ (↑f' x) = ↑f' x * ↑Λ 1
[PROOFSTEP]
simpa only [mul_one, Algebra.id.smul_eq_mul] using Λ.map_smul (f' x) 1
[GOAL]
case intro.intro.intro.refine'_2.h
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
x : E
H₁ : ↑Λ (↑f' x) = ↑f' x * ↑Λ 1
⊢ ↑(↑Λ 1 • f' + Λ₀ • φ') x = ↑0 x
[PROOFSTEP]
have H₂ : f' x * Λ 1 + Λ₀ * φ' x = 0 := by simpa only [Algebra.id.smul_eq_mul, H₁] using hfΛ x
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
x : E
H₁ : ↑Λ (↑f' x) = ↑f' x * ↑Λ 1
⊢ ↑f' x * ↑Λ 1 + Λ₀ * ↑φ' x = 0
[PROOFSTEP]
simpa only [Algebra.id.smul_eq_mul, H₁] using hfΛ x
[GOAL]
case intro.intro.intro.refine'_2.h
E : Type u_1
F : Type u_2
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace ℝ E
inst✝³ : CompleteSpace E
inst✝² : NormedAddCommGroup F
inst✝¹ : NormedSpace ℝ F
inst✝ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
f : E → ℝ
f' : E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | f x = f x₀} x₀
hf' : HasStrictFDerivAt f f' x₀
hφ' : HasStrictFDerivAt φ φ' x₀
Λ : Module.Dual ℝ ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hfΛ : ∀ (x : E), ↑Λ (↑f' x) + Λ₀ • ↑φ' x = 0
x : E
H₁ : ↑Λ (↑f' x) = ↑f' x * ↑Λ 1
H₂ : ↑f' x * ↑Λ 1 + Λ₀ * ↑φ' x = 0
⊢ ↑(↑Λ 1 • f' + Λ₀ • φ') x = ↑0 x
[PROOFSTEP]
simpa [mul_comm] using H₂
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
[PROOFSTEP]
letI := Classical.decEq ι
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
this : DecidableEq ι := Classical.decEq ι
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
[PROOFSTEP]
replace hextr : IsLocalExtrOn φ {x | (fun i => f i x) = fun i => f i x₀} x₀
[GOAL]
case hextr
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
this : DecidableEq ι := Classical.decEq ι
⊢ IsLocalExtrOn φ {x | (fun i => f i x) = fun i => f i x₀} x₀
[PROOFSTEP]
simpa only [Function.funext_iff] using hextr
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
this : DecidableEq ι := Classical.decEq ι
hextr : IsLocalExtrOn φ {x | (fun i => f i x) = fun i => f i x₀} x₀
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
[PROOFSTEP]
rcases hextr.exists_linear_map_of_hasStrictFDerivAt (hasStrictFDerivAt_pi.2 fun i => hf' i) hφ' with ⟨Λ, Λ₀, h0, hsum⟩
[GOAL]
case intro.intro.intro
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
this : DecidableEq ι := Classical.decEq ι
hextr : IsLocalExtrOn φ {x | (fun i => f i x) = fun i => f i x₀} x₀
Λ : Module.Dual ℝ (ι → ℝ)
Λ₀ : ℝ
h0 : (Λ, Λ₀) ≠ 0
hsum : ∀ (x : E), ↑Λ (↑(ContinuousLinearMap.pi fun i => f' i) x) + Λ₀ • ↑φ' x = 0
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
[PROOFSTEP]
rcases(LinearEquiv.piRing ℝ ℝ ι ℝ).symm.surjective Λ with ⟨Λ, rfl⟩
[GOAL]
case intro.intro.intro.intro
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
this : DecidableEq ι := Classical.decEq ι
hextr : IsLocalExtrOn φ {x | (fun i => f i x) = fun i => f i x₀} x₀
Λ₀ : ℝ
Λ : ι → ℝ
h0 : (↑(LinearEquiv.symm (LinearEquiv.piRing ℝ ℝ ι ℝ)) Λ, Λ₀) ≠ 0
hsum :
  ∀ (x : E),
    ↑(↑(LinearEquiv.symm (LinearEquiv.piRing ℝ ℝ ι ℝ)) Λ) (↑(ContinuousLinearMap.pi fun i => f' i) x) + Λ₀ • ↑φ' x = 0
⊢ ∃ Λ Λ₀, (Λ, Λ₀) ≠ 0 ∧ ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
[PROOFSTEP]
refine' ⟨Λ, Λ₀, _, _⟩
[GOAL]
case intro.intro.intro.intro.refine'_1
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
this : DecidableEq ι := Classical.decEq ι
hextr : IsLocalExtrOn φ {x | (fun i => f i x) = fun i => f i x₀} x₀
Λ₀ : ℝ
Λ : ι → ℝ
h0 : (↑(LinearEquiv.symm (LinearEquiv.piRing ℝ ℝ ι ℝ)) Λ, Λ₀) ≠ 0
hsum :
  ∀ (x : E),
    ↑(↑(LinearEquiv.symm (LinearEquiv.piRing ℝ ℝ ι ℝ)) Λ) (↑(ContinuousLinearMap.pi fun i => f' i) x) + Λ₀ • ↑φ' x = 0
⊢ (Λ, Λ₀) ≠ 0
[PROOFSTEP]
simpa only [Ne.def, Prod.ext_iff, LinearEquiv.map_eq_zero_iff, Prod.fst_zero] using h0
[GOAL]
case intro.intro.intro.intro.refine'_2
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
this : DecidableEq ι := Classical.decEq ι
hextr : IsLocalExtrOn φ {x | (fun i => f i x) = fun i => f i x₀} x₀
Λ₀ : ℝ
Λ : ι → ℝ
h0 : (↑(LinearEquiv.symm (LinearEquiv.piRing ℝ ℝ ι ℝ)) Λ, Λ₀) ≠ 0
hsum :
  ∀ (x : E),
    ↑(↑(LinearEquiv.symm (LinearEquiv.piRing ℝ ℝ ι ℝ)) Λ) (↑(ContinuousLinearMap.pi fun i => f' i) x) + Λ₀ • ↑φ' x = 0
⊢ ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
[PROOFSTEP]
ext x
[GOAL]
case intro.intro.intro.intro.refine'_2.h
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Fintype ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
this : DecidableEq ι := Classical.decEq ι
hextr : IsLocalExtrOn φ {x | (fun i => f i x) = fun i => f i x₀} x₀
Λ₀ : ℝ
Λ : ι → ℝ
h0 : (↑(LinearEquiv.symm (LinearEquiv.piRing ℝ ℝ ι ℝ)) Λ, Λ₀) ≠ 0
hsum :
  ∀ (x : E),
    ↑(↑(LinearEquiv.symm (LinearEquiv.piRing ℝ ℝ ι ℝ)) Λ) (↑(ContinuousLinearMap.pi fun i => f' i) x) + Λ₀ • ↑φ' x = 0
x : E
⊢ ↑(∑ i : ι, Λ i • f' i + Λ₀ • φ') x = ↑0 x
[PROOFSTEP]
simpa [mul_comm] using hsum x
[GOAL]
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Finite ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
⊢ ¬LinearIndependent ℝ (Option.elim' φ' f')
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Finite ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
val✝ : Fintype ι
⊢ ¬LinearIndependent ℝ (Option.elim' φ' f')
[PROOFSTEP]
rw [Fintype.linearIndependent_iff]
[GOAL]
case intro
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Finite ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
val✝ : Fintype ι
⊢ ¬∀ (g : Option ι → ℝ), ∑ i : Option ι, g i • Option.elim' φ' f' i = 0 → ∀ (i : Option ι), g i = 0
[PROOFSTEP]
push_neg
[GOAL]
case intro
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Finite ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
val✝ : Fintype ι
⊢ ∃ g, ∑ i : Option ι, g i • Option.elim' φ' f' i = 0 ∧ ∃ i, g i ≠ 0
[PROOFSTEP]
rcases hextr.exists_multipliers_of_hasStrictFDerivAt hf' hφ' with ⟨Λ, Λ₀, hΛ, hΛf⟩
[GOAL]
case intro.intro.intro.intro
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Finite ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
val✝ : Fintype ι
Λ : ι → ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hΛf : ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
⊢ ∃ g, ∑ i : Option ι, g i • Option.elim' φ' f' i = 0 ∧ ∃ i, g i ≠ 0
[PROOFSTEP]
refine' ⟨Option.elim' Λ₀ Λ, _, _⟩
[GOAL]
case intro.intro.intro.intro.refine'_1
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Finite ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
val✝ : Fintype ι
Λ : ι → ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hΛf : ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
⊢ ∑ i : Option ι, Option.elim' Λ₀ Λ i • Option.elim' φ' f' i = 0
[PROOFSTEP]
simpa [add_comm] using hΛf
[GOAL]
case intro.intro.intro.intro.refine'_2
E : Type u_1
F : Type u_2
inst✝⁶ : NormedAddCommGroup E
inst✝⁵ : NormedSpace ℝ E
inst✝⁴ : CompleteSpace E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace ℝ F
inst✝¹ : CompleteSpace F
f✝ : E → F
φ : E → ℝ
x₀ : E
f'✝ : E →L[ℝ] F
φ' : E →L[ℝ] ℝ
ι : Type u_3
inst✝ : Finite ι
f : ι → E → ℝ
f' : ι → E →L[ℝ] ℝ
hextr : IsLocalExtrOn φ {x | ∀ (i : ι), f i x = f i x₀} x₀
hf' : ∀ (i : ι), HasStrictFDerivAt (f i) (f' i) x₀
hφ' : HasStrictFDerivAt φ φ' x₀
val✝ : Fintype ι
Λ : ι → ℝ
Λ₀ : ℝ
hΛ : (Λ, Λ₀) ≠ 0
hΛf : ∑ i : ι, Λ i • f' i + Λ₀ • φ' = 0
⊢ ∃ i, Option.elim' Λ₀ Λ i ≠ 0
[PROOFSTEP]
simpa only [Function.funext_iff, not_and_or, or_comm, Option.exists, Prod.mk_eq_zero, Ne.def, not_forall] using hΛ


[GOAL]
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cone (F ⋙ Pi.eval C i)
j j' : J
f : j ⟶ j'
⊢ ((Functor.const J).obj fun i => (c i).pt).map f ≫ (fun j i => NatTrans.app (c i).π j) j' =
    (fun j i => NatTrans.app (c i).π j) j ≫ F.map f
[PROOFSTEP]
funext i
[GOAL]
case h
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cone (F ⋙ Pi.eval C i)
j j' : J
f : j ⟶ j'
i : I
⊢ (((Functor.const J).obj fun i => (c i).pt).map f ≫ (fun j i => NatTrans.app (c i).π j) j') i =
    ((fun j i => NatTrans.app (c i).π j) j ≫ F.map f) i
[PROOFSTEP]
exact (c i).π.naturality f
[GOAL]
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cocone (F ⋙ Pi.eval C i)
j j' : J
f : j ⟶ j'
⊢ F.map f ≫ (fun j i => NatTrans.app (c i).ι j) j' =
    (fun j i => NatTrans.app (c i).ι j) j ≫ ((Functor.const J).obj fun i => (c i).pt).map f
[PROOFSTEP]
funext i
[GOAL]
case h
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cocone (F ⋙ Pi.eval C i)
j j' : J
f : j ⟶ j'
i : I
⊢ (F.map f ≫ (fun j i => NatTrans.app (c i).ι j) j') i =
    ((fun j i => NatTrans.app (c i).ι j) j ≫ ((Functor.const J).obj fun i => (c i).pt).map f) i
[PROOFSTEP]
exact (c i).ι.naturality f
[GOAL]
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cone (F ⋙ Pi.eval C i)
P : (i : I) → IsLimit (c i)
s : Cone F
j : J
⊢ (fun s i => IsLimit.lift (P i) (coneCompEval s i)) s ≫ NatTrans.app (coneOfConeCompEval c).π j = NatTrans.app s.π j
[PROOFSTEP]
funext i
[GOAL]
case h
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cone (F ⋙ Pi.eval C i)
P : (i : I) → IsLimit (c i)
s : Cone F
j : J
i : I
⊢ ((fun s i => IsLimit.lift (P i) (coneCompEval s i)) s ≫ NatTrans.app (coneOfConeCompEval c).π j) i =
    NatTrans.app s.π j i
[PROOFSTEP]
exact (P i).fac (coneCompEval s i) j
[GOAL]
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cone (F ⋙ Pi.eval C i)
P : (i : I) → IsLimit (c i)
s : Cone F
m : s.pt ⟶ (coneOfConeCompEval c).pt
w : ∀ (j : J), m ≫ NatTrans.app (coneOfConeCompEval c).π j = NatTrans.app s.π j
⊢ m = (fun s i => IsLimit.lift (P i) (coneCompEval s i)) s
[PROOFSTEP]
funext i
[GOAL]
case h
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cone (F ⋙ Pi.eval C i)
P : (i : I) → IsLimit (c i)
s : Cone F
m : s.pt ⟶ (coneOfConeCompEval c).pt
w : ∀ (j : J), m ≫ NatTrans.app (coneOfConeCompEval c).π j = NatTrans.app s.π j
i : I
⊢ m i = (fun s i => IsLimit.lift (P i) (coneCompEval s i)) s i
[PROOFSTEP]
exact (P i).uniq (coneCompEval s i) (m i) fun j => congr_fun (w j) i
[GOAL]
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cocone (F ⋙ Pi.eval C i)
P : (i : I) → IsColimit (c i)
s : Cocone F
j : J
⊢ NatTrans.app (coconeOfCoconeCompEval c).ι j ≫ (fun s i => IsColimit.desc (P i) (coconeCompEval s i)) s =
    NatTrans.app s.ι j
[PROOFSTEP]
funext i
[GOAL]
case h
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cocone (F ⋙ Pi.eval C i)
P : (i : I) → IsColimit (c i)
s : Cocone F
j : J
i : I
⊢ (NatTrans.app (coconeOfCoconeCompEval c).ι j ≫ (fun s i => IsColimit.desc (P i) (coconeCompEval s i)) s) i =
    NatTrans.app s.ι j i
[PROOFSTEP]
exact (P i).fac (coconeCompEval s i) j
[GOAL]
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cocone (F ⋙ Pi.eval C i)
P : (i : I) → IsColimit (c i)
s : Cocone F
m : (coconeOfCoconeCompEval c).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (coconeOfCoconeCompEval c).ι j ≫ m = NatTrans.app s.ι j
⊢ m = (fun s i => IsColimit.desc (P i) (coconeCompEval s i)) s
[PROOFSTEP]
funext i
[GOAL]
case h
I : Type v₁
C : I → Type u₁
inst✝¹ : (i : I) → Category.{v₁, u₁} (C i)
J : Type v₁
inst✝ : SmallCategory J
F : J ⥤ ((i : I) → C i)
c : (i : I) → Cocone (F ⋙ Pi.eval C i)
P : (i : I) → IsColimit (c i)
s : Cocone F
m : (coconeOfCoconeCompEval c).pt ⟶ s.pt
w : ∀ (j : J), NatTrans.app (coconeOfCoconeCompEval c).ι j ≫ m = NatTrans.app s.ι j
i : I
⊢ m i = (fun s i => IsColimit.desc (P i) (coconeCompEval s i)) s i
[PROOFSTEP]
exact (P i).uniq (coconeCompEval s i) (m i) fun j => congr_fun (w j) i


[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g✝ : ι → α
a a₁ a₂ : α
g : κ → α
e : ι → κ
he : Injective e
hs : ∀ (c : κ), ¬c ∈ Set.range e → 0 ≤ g c
h : ∀ (i : ι), f i ≤ g (e i)
hf : HasSum f a₁
hg : HasSum g a₂
⊢ a₁ ≤ a₂
[PROOFSTEP]
rw [← hasSum_extend_zero he] at hf
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g✝ : ι → α
a a₁ a₂ : α
g : κ → α
e : ι → κ
he : Injective e
hs : ∀ (c : κ), ¬c ∈ Set.range e → 0 ≤ g c
h : ∀ (i : ι), f i ≤ g (e i)
hf : HasSum (extend e f 0) a₁
hg : HasSum g a₂
⊢ a₁ ≤ a₂
[PROOFSTEP]
refine hasSum_le (fun c => ?_) hf hg
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g✝ : ι → α
a a₁ a₂ : α
g : κ → α
e : ι → κ
he : Injective e
hs : ∀ (c : κ), ¬c ∈ Set.range e → 0 ≤ g c
h : ∀ (i : ι), f i ≤ g (e i)
hf : HasSum (extend e f 0) a₁
hg : HasSum g a₂
c : κ
⊢ extend e f 0 c ≤ g c
[PROOFSTEP]
obtain ⟨i, rfl⟩ | h := em (c ∈ Set.range e)
[GOAL]
case inl.intro
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g✝ : ι → α
a a₁ a₂ : α
g : κ → α
e : ι → κ
he : Injective e
hs : ∀ (c : κ), ¬c ∈ Set.range e → 0 ≤ g c
h : ∀ (i : ι), f i ≤ g (e i)
hf : HasSum (extend e f 0) a₁
hg : HasSum g a₂
i : ι
⊢ extend e f 0 (e i) ≤ g (e i)
[PROOFSTEP]
rw [he.extend_apply]
[GOAL]
case inl.intro
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g✝ : ι → α
a a₁ a₂ : α
g : κ → α
e : ι → κ
he : Injective e
hs : ∀ (c : κ), ¬c ∈ Set.range e → 0 ≤ g c
h : ∀ (i : ι), f i ≤ g (e i)
hf : HasSum (extend e f 0) a₁
hg : HasSum g a₂
i : ι
⊢ f i ≤ g (e i)
[PROOFSTEP]
exact h _
[GOAL]
case inr
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g✝ : ι → α
a a₁ a₂ : α
g : κ → α
e : ι → κ
he : Injective e
hs : ∀ (c : κ), ¬c ∈ Set.range e → 0 ≤ g c
h✝ : ∀ (i : ι), f i ≤ g (e i)
hf : HasSum (extend e f 0) a₁
hg : HasSum g a₂
c : κ
h : ¬c ∈ Set.range e
⊢ extend e f 0 c ≤ g c
[PROOFSTEP]
rw [extend_apply' _ _ _ h]
[GOAL]
case inr
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g✝ : ι → α
a a₁ a₂ : α
g : κ → α
e : ι → κ
he : Injective e
hs : ∀ (c : κ), ¬c ∈ Set.range e → 0 ≤ g c
h✝ : ∀ (i : ι), f i ≤ g (e i)
hf : HasSum (extend e f 0) a₁
hg : HasSum g a₂
c : κ
h : ¬c ∈ Set.range e
⊢ OfNat.ofNat 0 c ≤ g c
[PROOFSTEP]
exact hs _ h
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
hf : HasSum f a
i : ι
hb : ∀ (j : ι), j ≠ i → 0 ≤ f j
⊢ ∀ (i_1 : ι), ¬i_1 ∈ {i} → 0 ≤ f i_1
[PROOFSTEP]
simpa
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
ha₂ : 0 ≤ a₂
h : ∀ (s : Finset ι), ∑ i in s, f i ≤ a₂
⊢ ∑' (i : ι), f i ≤ a₂
[PROOFSTEP]
by_cases hf : Summable f
[GOAL]
case pos
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
ha₂ : 0 ≤ a₂
h : ∀ (s : Finset ι), ∑ i in s, f i ≤ a₂
hf : Summable f
⊢ ∑' (i : ι), f i ≤ a₂
[PROOFSTEP]
exact tsum_le_of_sum_le hf h
[GOAL]
case neg
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
ha₂ : 0 ≤ a₂
h : ∀ (s : Finset ι), ∑ i in s, f i ≤ a₂
hf : ¬Summable f
⊢ ∑' (i : ι), f i ≤ a₂
[PROOFSTEP]
rw [tsum_eq_zero_of_not_summable hf]
[GOAL]
case neg
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
ha₂ : 0 ≤ a₂
h : ∀ (s : Finset ι), ∑ i in s, f i ≤ a₂
hf : ¬Summable f
⊢ 0 ≤ a₂
[PROOFSTEP]
exact ha₂
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
h : ∀ (i : ι), 0 ≤ g i
⊢ 0 ≤ ∑' (i : ι), g i
[PROOFSTEP]
by_cases hg : Summable g
[GOAL]
case pos
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
h : ∀ (i : ι), 0 ≤ g i
hg : Summable g
⊢ 0 ≤ ∑' (i : ι), g i
[PROOFSTEP]
exact hg.hasSum.nonneg h
[GOAL]
case neg
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
h : ∀ (i : ι), 0 ≤ g i
hg : ¬Summable g
⊢ 0 ≤ ∑' (i : ι), g i
[PROOFSTEP]
rw [tsum_eq_zero_of_not_summable hg]
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
h : ∀ (i : ι), f i ≤ 0
⊢ ∑' (i : ι), f i ≤ 0
[PROOFSTEP]
by_cases hf : Summable f
[GOAL]
case pos
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
h : ∀ (i : ι), f i ≤ 0
hf : Summable f
⊢ ∑' (i : ι), f i ≤ 0
[PROOFSTEP]
exact hf.hasSum.nonpos h
[GOAL]
case neg
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
h : ∀ (i : ι), f i ≤ 0
hf : ¬Summable f
⊢ ∑' (i : ι), f i ≤ 0
[PROOFSTEP]
rw [tsum_eq_zero_of_not_summable hf]
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
hf : ∀ (i : ι), 0 ≤ f i
⊢ HasSum f 0 ↔ f = 0
[PROOFSTEP]
refine' ⟨fun hf' => _, _⟩
[GOAL]
case refine'_1
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
hf : ∀ (i : ι), 0 ≤ f i
hf' : HasSum f 0
⊢ f = 0
[PROOFSTEP]
ext i
[GOAL]
case refine'_1.h
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
hf : ∀ (i : ι), 0 ≤ f i
hf' : HasSum f 0
i : ι
⊢ f i = OfNat.ofNat 0 i
[PROOFSTEP]
exact (hf i).antisymm' (le_hasSum hf' _ fun j _ => hf j)
[GOAL]
case refine'_2
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f g : ι → α
a a₁ a₂ : α
hf : ∀ (i : ι), 0 ≤ f i
⊢ f = 0 → HasSum f 0
[PROOFSTEP]
rintro rfl
[GOAL]
case refine'_2
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : OrderedAddCommMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
g : ι → α
a a₁ a₂ : α
hf : ∀ (i : ι), 0 ≤ OfNat.ofNat 0 i
⊢ HasSum 0 0
[PROOFSTEP]
exact hasSum_zero
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : OrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalAddGroup α
inst✝ : OrderClosedTopology α
f g : ι → α
a₁ a₂ : α
i : ι
h : f ≤ g
hi : f i < g i
hf : HasSum f a₁
hg : HasSum g a₂
⊢ a₁ < a₂
[PROOFSTEP]
have : update f i 0 ≤ update g i 0 := update_le_update_iff.mpr ⟨rfl.le, fun i _ => h i⟩
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : OrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalAddGroup α
inst✝ : OrderClosedTopology α
f g : ι → α
a₁ a₂ : α
i : ι
h : f ≤ g
hi : f i < g i
hf : HasSum f a₁
hg : HasSum g a₂
this : update f i 0 ≤ update g i 0
⊢ a₁ < a₂
[PROOFSTEP]
have : 0 - f i + a₁ ≤ 0 - g i + a₂ := hasSum_le this (hf.update i 0) (hg.update i 0)
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : OrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalAddGroup α
inst✝ : OrderClosedTopology α
f g : ι → α
a₁ a₂ : α
i : ι
h : f ≤ g
hi : f i < g i
hf : HasSum f a₁
hg : HasSum g a₂
this✝ : update f i 0 ≤ update g i 0
this : 0 - f i + a₁ ≤ 0 - g i + a₂
⊢ a₁ < a₂
[PROOFSTEP]
simpa only [zero_sub, add_neg_cancel_left] using add_lt_add_of_lt_of_le hi this
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : OrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalAddGroup α
inst✝ : OrderClosedTopology α
f g : ι → α
a₁ a₂ : α
i✝ : ι
hsum : Summable g
hg : ∀ (i : ι), 0 ≤ g i
i : ι
hi : 0 < g i
⊢ 0 < ∑' (i : ι), g i
[PROOFSTEP]
rw [← tsum_zero]
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : OrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalAddGroup α
inst✝ : OrderClosedTopology α
f g : ι → α
a₁ a₂ : α
i✝ : ι
hsum : Summable g
hg : ∀ (i : ι), 0 ≤ g i
i : ι
hi : 0 < g i
⊢ ∑' (x : ?m.47496), 0 < ∑' (i : ι), g i
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : OrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : TopologicalAddGroup α
inst✝ : OrderClosedTopology α
f g : ι → α
a₁ a₂ : α
i✝ : ι
hsum : Summable g
hg : ∀ (i : ι), 0 ≤ g i
i : ι
hi : 0 < g i
⊢ Type ?u.47494
[PROOFSTEP]
exact tsum_lt_tsum hg hi summable_zero hsum
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : CanonicallyOrderedAddMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f : ι → α
a : α
hf : Summable f
⊢ ∑' (i : ι), f i = 0 ↔ ∀ (x : ι), f x = 0
[PROOFSTEP]
rw [← hasSum_zero_iff, hf.hasSum_iff]
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝² : CanonicallyOrderedAddMonoid α
inst✝¹ : TopologicalSpace α
inst✝ : OrderClosedTopology α
f : ι → α
a : α
hf : Summable f
⊢ ∑' (i : ι), f i ≠ 0 ↔ ∃ x, f x ≠ 0
[PROOFSTEP]
rw [Ne.def, tsum_eq_zero_iff hf, not_forall]
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : UniformSpace α
inst✝¹ : UniformAddGroup α
inst✝ : CompleteSpace α
f : ι → α
s : Set ι := {x | 0 ≤ f x}
h1 : ∀ (x : ↑s), |f ↑x| = f ↑x
h2 : ∀ (x : ↑sᶜ), |f ↑x| = -f ↑x
⊢ ((Summable fun x => |f ↑x|) ∧ Summable fun x => |f ↑x|) ↔ (Summable fun x => f ↑x) ∧ Summable fun x => -f ↑x
[PROOFSTEP]
simp only [h1, h2]
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : UniformSpace α
inst✝¹ : UniformAddGroup α
inst✝ : CompleteSpace α
f : ι → α
s : Set ι := {x | 0 ≤ f x}
h1 : ∀ (x : ↑s), |f ↑x| = f ↑x
h2 : ∀ (x : ↑sᶜ), |f ↑x| = -f ↑x
⊢ ((Summable fun x => f ↑x) ∧ Summable fun x => -f ↑x) ↔ Summable f
[PROOFSTEP]
simp only [summable_neg_iff, summable_subtype_and_compl]
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : Archimedean α
inst✝ : OrderClosedTopology α
b : α
hb : 0 < b
hf : Summable fun x => b
⊢ Finite ι
[PROOFSTEP]
have H : ∀ s : Finset ι, s.card • b ≤ ∑' _ : ι, b := fun s => by
  simpa using sum_le_hasSum s (fun a _ => hb.le) hf.hasSum
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : Archimedean α
inst✝ : OrderClosedTopology α
b : α
hb : 0 < b
hf : Summable fun x => b
s : Finset ι
⊢ card s • b ≤ ∑' (x : ι), b
[PROOFSTEP]
simpa using sum_le_hasSum s (fun a _ => hb.le) hf.hasSum
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : Archimedean α
inst✝ : OrderClosedTopology α
b : α
hb : 0 < b
hf : Summable fun x => b
H : ∀ (s : Finset ι), card s • b ≤ ∑' (x : ι), b
⊢ Finite ι
[PROOFSTEP]
obtain ⟨n, hn⟩ := Archimedean.arch (∑' _ : ι, b) hb
[GOAL]
case intro
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : Archimedean α
inst✝ : OrderClosedTopology α
b : α
hb : 0 < b
hf : Summable fun x => b
H : ∀ (s : Finset ι), card s • b ≤ ∑' (x : ι), b
n : ℕ
hn : ∑' (x : ι), b ≤ n • b
⊢ Finite ι
[PROOFSTEP]
have : ∀ s : Finset ι, s.card ≤ n := fun s => by simpa [nsmul_le_nsmul_iff hb] using (H s).trans hn
[GOAL]
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : Archimedean α
inst✝ : OrderClosedTopology α
b : α
hb : 0 < b
hf : Summable fun x => b
H : ∀ (s : Finset ι), card s • b ≤ ∑' (x : ι), b
n : ℕ
hn : ∑' (x : ι), b ≤ n • b
s : Finset ι
⊢ card s ≤ n
[PROOFSTEP]
simpa [nsmul_le_nsmul_iff hb] using (H s).trans hn
[GOAL]
case intro
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : Archimedean α
inst✝ : OrderClosedTopology α
b : α
hb : 0 < b
hf : Summable fun x => b
H : ∀ (s : Finset ι), card s • b ≤ ∑' (x : ι), b
n : ℕ
hn : ∑' (x : ι), b ≤ n • b
this : ∀ (s : Finset ι), card s ≤ n
⊢ Finite ι
[PROOFSTEP]
have : Fintype ι := fintypeOfFinsetCardLe n this
[GOAL]
case intro
ι : Type u_1
κ : Type u_2
α : Type u_3
inst✝³ : LinearOrderedAddCommGroup α
inst✝² : TopologicalSpace α
inst✝¹ : Archimedean α
inst✝ : OrderClosedTopology α
b : α
hb : 0 < b
hf : Summable fun x => b
H : ∀ (s : Finset ι), card s • b ≤ ∑' (x : ι), b
n : ℕ
hn : ∑' (x : ι), b ≤ n • b
this✝ : ∀ (s : Finset ι), card s ≤ n
this : Fintype ι
⊢ Finite ι
[PROOFSTEP]
infer_instance


[GOAL]
⊢ 1 = ‖↑reClm 1‖
[PROOFSTEP]
simp
[GOAL]
⊢ ‖1‖ ≤ 1
[PROOFSTEP]
simp
[GOAL]
⊢ 1 = ‖↑imClm I‖
[PROOFSTEP]
simp
[GOAL]
⊢ ‖I‖ ≤ 1
[PROOFSTEP]
simp