[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : Preorder β
f : α → β
s : Set α
⊢ Monotone (↑toDual ∘ f ∘ ↑ofDual) ↔ Monotone f
[PROOFSTEP]
rw [monotone_toDual_comp_iff, antitone_comp_ofDual_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : Preorder β
f : α → β
s : Set α
⊢ Antitone (↑toDual ∘ f ∘ ↑ofDual) ↔ Antitone f
[PROOFSTEP]
rw [antitone_toDual_comp_iff, monotone_comp_ofDual_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : Preorder β
f : α → β
s : Set α
⊢ MonotoneOn (↑toDual ∘ f ∘ ↑ofDual) s ↔ MonotoneOn f s
[PROOFSTEP]
rw [monotoneOn_toDual_comp_iff, antitoneOn_comp_ofDual_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : Preorder β
f : α → β
s : Set α
⊢ AntitoneOn (↑toDual ∘ f ∘ ↑ofDual) s ↔ AntitoneOn f s
[PROOFSTEP]
rw [antitoneOn_toDual_comp_iff, monotoneOn_comp_ofDual_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : Preorder β
f : α → β
s : Set α
⊢ StrictMono (↑toDual ∘ f ∘ ↑ofDual) ↔ StrictMono f
[PROOFSTEP]
rw [strictMono_toDual_comp_iff, strictAnti_comp_ofDual_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : Preorder β
f : α → β
s : Set α
⊢ StrictAnti (↑toDual ∘ f ∘ ↑ofDual) ↔ StrictAnti f
[PROOFSTEP]
rw [strictAnti_toDual_comp_iff, strictMono_comp_ofDual_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : Preorder β
f : α → β
s : Set α
⊢ StrictMonoOn (↑toDual ∘ f ∘ ↑ofDual) s ↔ StrictMonoOn f s
[PROOFSTEP]
rw [strictMonoOn_toDual_comp_iff, strictAntiOn_comp_ofDual_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : Preorder β
f : α → β
s : Set α
⊢ StrictAntiOn (↑toDual ∘ f ∘ ↑ofDual) s ↔ StrictAntiOn f s
[PROOFSTEP]
rw [strictAntiOn_toDual_comp_iff, strictMonoOn_comp_ofDual_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : LinearOrder α
f : α → β
h : ∀ (x y : α), x < y → f x ≠ f y
⊢ Injective f
[PROOFSTEP]
intro x y hf
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : LinearOrder α
f : α → β
h : ∀ (x y : α), x < y → f x ≠ f y
x y : α
hf : f x = f y
⊢ x = y
[PROOFSTEP]
rcases lt_trichotomy x y with (hxy | rfl | hxy)
[GOAL]
case inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : LinearOrder α
f : α → β
h : ∀ (x y : α), x < y → f x ≠ f y
x y : α
hf : f x = f y
hxy : x < y
⊢ x = y
[PROOFSTEP]
exact absurd hf <| h _ _ hxy
[GOAL]
case inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : LinearOrder α
f : α → β
h : ∀ (x y : α), x < y → f x ≠ f y
x : α
hf : f x = f x
⊢ x = x
[PROOFSTEP]
rfl
[GOAL]
case inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : LinearOrder α
f : α → β
h : ∀ (x y : α), x < y → f x ≠ f y
x y : α
hf : f x = f y
hxy : y < x
⊢ x = y
[PROOFSTEP]
exact absurd hf.symm <| h _ _ hxy
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝² : Preorder α
inst✝¹ : Preorder β
f g : α → β
a : α
hf : StrictMono f
hg : StrictMono g
p : α → Prop
inst✝ : DecidablePred p
hp : ∀ ⦃x y : α⦄, x < y → p y → p x
hfg : ∀ ⦃x y : α⦄, p x → ¬p y → x < y → f x < g y
⊢ StrictMono fun x => if p x then f x else g x
[PROOFSTEP]
intro x y h
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝² : Preorder α
inst✝¹ : Preorder β
f g : α → β
a : α
hf : StrictMono f
hg : StrictMono g
p : α → Prop
inst✝ : DecidablePred p
hp : ∀ ⦃x y : α⦄, x < y → p y → p x
hfg : ∀ ⦃x y : α⦄, p x → ¬p y → x < y → f x < g y
x y : α
h : x < y
⊢ (fun x => if p x then f x else g x) x < (fun x => if p x then f x else g x) y
[PROOFSTEP]
by_cases hy : p y
[GOAL]
case pos
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝² : Preorder α
inst✝¹ : Preorder β
f g : α → β
a : α
hf : StrictMono f
hg : StrictMono g
p : α → Prop
inst✝ : DecidablePred p
hp : ∀ ⦃x y : α⦄, x < y → p y → p x
hfg : ∀ ⦃x y : α⦄, p x → ¬p y → x < y → f x < g y
x y : α
h : x < y
hy : p y
⊢ (fun x => if p x then f x else g x) x < (fun x => if p x then f x else g x) y
[PROOFSTEP]
have hx : p x := hp h hy
[GOAL]
case pos
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝² : Preorder α
inst✝¹ : Preorder β
f g : α → β
a : α
hf : StrictMono f
hg : StrictMono g
p : α → Prop
inst✝ : DecidablePred p
hp : ∀ ⦃x y : α⦄, x < y → p y → p x
hfg : ∀ ⦃x y : α⦄, p x → ¬p y → x < y → f x < g y
x y : α
h : x < y
hy : p y
hx : p x
⊢ (fun x => if p x then f x else g x) x < (fun x => if p x then f x else g x) y
[PROOFSTEP]
simpa [hx, hy] using hf h
[GOAL]
case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝² : Preorder α
inst✝¹ : Preorder β
f g : α → β
a : α
hf : StrictMono f
hg : StrictMono g
p : α → Prop
inst✝ : DecidablePred p
hp : ∀ ⦃x y : α⦄, x < y → p y → p x
hfg : ∀ ⦃x y : α⦄, p x → ¬p y → x < y → f x < g y
x y : α
h : x < y
hy : ¬p y
⊢ (fun x => if p x then f x else g x) x < (fun x => if p x then f x else g x) y
[PROOFSTEP]
by_cases hx : p x
[GOAL]
case pos
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝² : Preorder α
inst✝¹ : Preorder β
f g : α → β
a : α
hf : StrictMono f
hg : StrictMono g
p : α → Prop
inst✝ : DecidablePred p
hp : ∀ ⦃x y : α⦄, x < y → p y → p x
hfg : ∀ ⦃x y : α⦄, p x → ¬p y → x < y → f x < g y
x y : α
h : x < y
hy : ¬p y
hx : p x
⊢ (fun x => if p x then f x else g x) x < (fun x => if p x then f x else g x) y
[PROOFSTEP]
simpa [hx, hy] using hfg hx hy h
[GOAL]
case neg
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝² : Preorder α
inst✝¹ : Preorder β
f g : α → β
a : α
hf : StrictMono f
hg : StrictMono g
p : α → Prop
inst✝ : DecidablePred p
hp : ∀ ⦃x y : α⦄, x < y → p y → p x
hfg : ∀ ⦃x y : α⦄, p x → ¬p y → x < y → f x < g y
x y : α
h : x < y
hy : ¬p y
hx : ¬p x
⊢ (fun x => if p x then f x else g x) x < (fun x => if p x then f x else g x) y
[PROOFSTEP]
simpa [hx, hy] using hg h
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : Preorder β
f : α → β
s : Set α
hf : StrictMonoOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
⊢ a = b → f a = f b
[PROOFSTEP]
rintro rfl
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : Preorder β
f : α → β
s : Set α
hf : StrictMonoOn f s
a : α
ha hb : a ∈ s
⊢ f a = f a
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : Preorder β
f : α → β
s : Set α
hf : StrictMonoOn f s
a b : α
ha : a ∈ s
hb : b ∈ s
⊢ f a < f b ↔ a < b
[PROOFSTEP]
rw [lt_iff_le_not_le, lt_iff_le_not_le, hf.le_iff_le ha hb, hf.le_iff_le hb ha]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y : α
⊢ ¬Monotone f ∧ ¬Antitone f ↔ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
simp_rw [Monotone, Antitone, not_forall, not_le]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y : α
⊢ ((∃ x x_1 h, f x_1 < f x) ∧ ∃ x x_1 h, f x < f x_1) ↔
    ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
refine' Iff.symm ⟨_, _⟩
[GOAL]
case refine'_1
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y : α
⊢ (∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)) →
    (∃ x x_1 h, f x_1 < f x) ∧ ∃ x x_1 h, f x < f x_1
case refine'_2
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y : α
⊢ ((∃ x x_1 h, f x_1 < f x) ∧ ∃ x x_1 h, f x < f x_1) →
    ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{ rintro ⟨a, b, c, hab, hbc, ⟨hfab, hfcb⟩ | ⟨hfba, hfbc⟩⟩
  exacts [⟨⟨_, _, hbc, hfcb⟩, _, _, hab, hfab⟩, ⟨⟨_, _, hab, hfba⟩, _, _, hbc, hfbc⟩]
}
[GOAL]
case refine'_1
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y : α
⊢ (∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)) →
    (∃ x x_1 h, f x_1 < f x) ∧ ∃ x x_1 h, f x < f x_1
[PROOFSTEP]
rintro ⟨a, b, c, hab, hbc, ⟨hfab, hfcb⟩ | ⟨hfba, hfbc⟩⟩
[GOAL]
case refine'_1.intro.intro.intro.intro.intro.inl.intro
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b c : α
hab : a ≤ b
hbc : b ≤ c
hfab : f a < f b
hfcb : f c < f b
⊢ (∃ x x_1 h, f x_1 < f x) ∧ ∃ x x_1 h, f x < f x_1
case refine'_1.intro.intro.intro.intro.intro.inr.intro
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b c : α
hab : a ≤ b
hbc : b ≤ c
hfba : f b < f a
hfbc : f b < f c
⊢ (∃ x x_1 h, f x_1 < f x) ∧ ∃ x x_1 h, f x < f x_1
[PROOFSTEP]
exacts [⟨⟨_, _, hbc, hfcb⟩, _, _, hab, hfab⟩, ⟨⟨_, _, hab, hfba⟩, _, _, hbc, hfbc⟩]
[GOAL]
case refine'_2
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y : α
⊢ ((∃ x x_1 h, f x_1 < f x) ∧ ∃ x x_1 h, f x < f x_1) →
    ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
rintro ⟨⟨a, b, hab, hfba⟩, c, d, hcd, hfcd⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hda | had := le_total d a
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
hda : d ≤ a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{ obtain hfad | hfda := le_total (f a) (f d)
  {exact ⟨c, d, b, hcd, hda.trans hab, Or.inl ⟨hfcd, hfba.trans_le hfad⟩⟩
  }
  {exact ⟨c, a, b, hcd.trans hda, hab, Or.inl ⟨hfcd.trans_le hfda, hfba⟩⟩
  }
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
hda : d ≤ a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hfad | hfda := le_total (f a) (f d)
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inl.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
hda : d ≤ a
hfad : f a ≤ f d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inl.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
hda : d ≤ a
hfda : f d ≤ f a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨c, d, b, hcd, hda.trans hab, Or.inl ⟨hfcd, hfba.trans_le hfad⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inl.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
hda : d ≤ a
hfad : f a ≤ f d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨c, d, b, hcd, hda.trans hab, Or.inl ⟨hfcd, hfba.trans_le hfad⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inl.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
hda : d ≤ a
hfda : f d ≤ f a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨c, a, b, hcd.trans hda, hab, Or.inl ⟨hfcd.trans_le hfda, hfba⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inl.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
hda : d ≤ a
hfda : f d ≤ f a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨c, a, b, hcd.trans hda, hab, Or.inl ⟨hfcd.trans_le hfda, hfba⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hac | hca := le_total a c
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{ obtain hfdb | hfbd := le_or_lt (f d) (f b)
  {exact ⟨a, c, d, hac, hcd, Or.inr ⟨hfcd.trans $ hfdb.trans_lt hfba, hfcd⟩⟩
  }
  obtain hfca | hfac := lt_or_le (f c) (f a)
  {exact ⟨a, c, d, hac, hcd, Or.inr ⟨hfca, hfcd⟩⟩
  }
  obtain hbd | hdb := le_total b d
  {exact ⟨a, b, d, hab, hbd, Or.inr ⟨hfba, hfbd⟩⟩
  }
  {exact ⟨a, d, b, had, hdb, Or.inl ⟨hfac.trans_lt hfcd, hfbd⟩⟩
  }
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hfdb | hfbd := le_or_lt (f d) (f b)
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfdb : f d ≤ f b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨a, c, d, hac, hcd, Or.inr ⟨hfcd.trans $ hfdb.trans_lt hfba, hfcd⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfdb : f d ≤ f b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨a, c, d, hac, hcd, Or.inr ⟨hfcd.trans $ hfdb.trans_lt hfba, hfcd⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hfca | hfac := lt_or_le (f c) (f a)
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfca : f c < f a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfac : f a ≤ f c
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨a, c, d, hac, hcd, Or.inr ⟨hfca, hfcd⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfca : f c < f a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨a, c, d, hac, hcd, Or.inr ⟨hfca, hfcd⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfac : f a ≤ f c
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hbd | hdb := le_total b d
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfac : f a ≤ f c
hbd : b ≤ d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfac : f a ≤ f c
hdb : d ≤ b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨a, b, d, hab, hbd, Or.inr ⟨hfba, hfbd⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfac : f a ≤ f c
hbd : b ≤ d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨a, b, d, hab, hbd, Or.inr ⟨hfba, hfbd⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfac : f a ≤ f c
hdb : d ≤ b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨a, d, b, had, hdb, Or.inl ⟨hfac.trans_lt hfcd, hfbd⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inl.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hac : a ≤ c
hfbd : f b < f d
hfac : f a ≤ f c
hdb : d ≤ b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨a, d, b, had, hdb, Or.inl ⟨hfac.trans_lt hfcd, hfbd⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{ obtain hfdb | hfbd := le_or_lt (f d) (f b)
  {exact ⟨c, a, b, hca, hab, Or.inl ⟨hfcd.trans $ hfdb.trans_lt hfba, hfba⟩⟩
  }
  obtain hfca | hfac := lt_or_le (f c) (f a)
  {exact ⟨c, a, b, hca, hab, Or.inl ⟨hfca, hfba⟩⟩
  }
  obtain hbd | hdb := le_total b d
  {exact ⟨a, b, d, hab, hbd, Or.inr ⟨hfba, hfbd⟩⟩
  }
  {exact ⟨a, d, b, had, hdb, Or.inl ⟨hfac.trans_lt hfcd, hfbd⟩⟩
  }
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hfdb | hfbd := le_or_lt (f d) (f b)
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfdb : f d ≤ f b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨c, a, b, hca, hab, Or.inl ⟨hfcd.trans $ hfdb.trans_lt hfba, hfba⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfdb : f d ≤ f b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨c, a, b, hca, hab, Or.inl ⟨hfcd.trans $ hfdb.trans_lt hfba, hfba⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hfca | hfac := lt_or_le (f c) (f a)
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfca : f c < f a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfac : f a ≤ f c
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨c, a, b, hca, hab, Or.inl ⟨hfca, hfba⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfca : f c < f a
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨c, a, b, hca, hab, Or.inl ⟨hfca, hfba⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfac : f a ≤ f c
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
obtain hbd | hdb := le_total b d
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfac : f a ≤ f c
hbd : b ≤ d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfac : f a ≤ f c
hdb : d ≤ b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨a, b, d, hab, hbd, Or.inr ⟨hfba, hfbd⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inr.inl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfac : f a ≤ f c
hbd : b ≤ d
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨a, b, d, hab, hbd, Or.inr ⟨hfba, hfbd⟩⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfac : f a ≤ f c
hdb : d ≤ b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
{exact ⟨a, d, b, had, hdb, Or.inl ⟨hfac.trans_lt hfcd, hfbd⟩⟩
}
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro.intro.inr.inr.inr.inr.inr
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
hab : a ≤ b
hfba : f b < f a
c d : α
hcd : c ≤ d
hfcd : f c < f d
had : a ≤ d
hca : c ≤ a
hfbd : f b < f d
hfac : f a ≤ f c
hdb : d ≤ b
⊢ ∃ a b c, a ≤ b ∧ b ≤ c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
exact ⟨a, d, b, had, hdb, Or.inl ⟨hfac.trans_lt hfcd, hfbd⟩⟩
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y : α
⊢ ¬Monotone f ∧ ¬Antitone f ↔ ∃ a b c, a < b ∧ b < c ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
simp_rw [not_monotone_not_antitone_iff_exists_le_le, ← and_assoc]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y : α
⊢ (∃ a b c, (a ≤ b ∧ b ≤ c) ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)) ↔
    ∃ a b c, (a < b ∧ b < c) ∧ (f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c)
[PROOFSTEP]
refine' exists₃_congr (fun a b c ↦ and_congr_left $ fun h ↦ (Ne.le_iff_lt _).and $ Ne.le_iff_lt _)
[GOAL]
case refine'_1
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b c : α
h : f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c
⊢ a ≠ b
[PROOFSTEP]
rintro rfl
[GOAL]
case refine'_1
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a c : α
h : f a < f a ∧ f c < f a ∨ f a < f a ∧ f a < f c
⊢ False
[PROOFSTEP]
simp at h
[GOAL]
case refine'_2
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b c : α
h : f a < f b ∧ f c < f b ∨ f b < f a ∧ f b < f c
⊢ b ≠ c
[PROOFSTEP]
rintro rfl
[GOAL]
case refine'_2
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : LinearOrder α
inst✝ : LinearOrder β
f : α → β
s : Set α
x y a b : α
h : f a < f b ∧ f b < f b ∨ f b < f a ∧ f b < f b
⊢ False
[PROOFSTEP]
simp at h
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℕ → β
a : ℕ
h : ∀ (n : ℕ), a ≤ n → r (f n) (f (n + 1))
b c : ℕ
hab : a ≤ b
hbc : b < c
⊢ r (f b) (f c)
[PROOFSTEP]
induction' hbc with k b_lt_k r_b_k
[GOAL]
case refl
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℕ → β
a : ℕ
h : ∀ (n : ℕ), a ≤ n → r (f n) (f (n + 1))
b c : ℕ
hab : a ≤ b
⊢ r (f b) (f (succ b))
case step
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℕ → β
a : ℕ
h : ∀ (n : ℕ), a ≤ n → r (f n) (f (n + 1))
b c : ℕ
hab : a ≤ b
k : ℕ
b_lt_k : Nat.le (succ b) k
r_b_k : r (f b) (f k)
⊢ r (f b) (f (succ k))
[PROOFSTEP]
exacts [h _ hab, _root_.trans r_b_k (h _ (hab.trans_lt b_lt_k).le)]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : NoMaxOrder α
a : α
⊢ ∃ f, StrictMono f ∧ f 0 = a
[PROOFSTEP]
choose g hg using fun x : α ↦ exists_gt x
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝¹ : Preorder α
inst✝ : NoMaxOrder α
a : α
g : α → α
hg : ∀ (x : α), x < g x
⊢ ∃ f, StrictMono f ∧ f 0 = a
[PROOFSTEP]
exact ⟨fun n ↦ Nat.recOn n a fun _ ↦ g, strictMono_nat_of_lt_succ fun n ↦ hg _, rfl⟩
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℤ → β
h : ∀ (n : ℤ), r (f n) (f (n + 1))
a b : ℤ
hab : a < b
⊢ r (f a) (f b)
[PROOFSTEP]
rcases lt.dest hab with ⟨n, rfl⟩
[GOAL]
case intro
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℤ → β
h : ∀ (n : ℤ), r (f n) (f (n + 1))
a : ℤ
n : ℕ
hab : a < a + ↑(Nat.succ n)
⊢ r (f a) (f (a + ↑(Nat.succ n)))
[PROOFSTEP]
clear hab
[GOAL]
case intro
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℤ → β
h : ∀ (n : ℤ), r (f n) (f (n + 1))
a : ℤ
n : ℕ
⊢ r (f a) (f (a + ↑(Nat.succ n)))
[PROOFSTEP]
induction' n with n ihn
[GOAL]
case intro.zero
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℤ → β
h : ∀ (n : ℤ), r (f n) (f (n + 1))
a : ℤ
⊢ r (f a) (f (a + ↑(Nat.succ Nat.zero)))
[PROOFSTEP]
rw [Int.ofNat_one]
[GOAL]
case intro.zero
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℤ → β
h : ∀ (n : ℤ), r (f n) (f (n + 1))
a : ℤ
⊢ r (f a) (f (a + 1))
[PROOFSTEP]
apply h
[GOAL]
case intro.succ
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℤ → β
h : ∀ (n : ℤ), r (f n) (f (n + 1))
a : ℤ
n : ℕ
ihn : r (f a) (f (a + ↑(Nat.succ n)))
⊢ r (f a) (f (a + ↑(Nat.succ (Nat.succ n))))
[PROOFSTEP]
rw [Int.ofNat_succ, ← Int.add_assoc]
[GOAL]
case intro.succ
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r✝ : α → α → Prop
inst✝¹ : Preorder α
r : β → β → Prop
inst✝ : IsTrans β r
f : ℤ → β
h : ∀ (n : ℤ), r (f n) (f (n + 1))
a : ℤ
n : ℕ
ihn : r (f a) (f (a + ↑(Nat.succ n)))
⊢ r (f a) (f (a + ↑(n + 1) + 1))
[PROOFSTEP]
exact _root_.trans ihn (h _)
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
⊢ ∃ f, StrictMono f
[PROOFSTEP]
inhabit α
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
⊢ ∃ f, StrictMono f
[PROOFSTEP]
rcases Nat.exists_strictMono' (default : α) with ⟨f, hf, hf₀⟩
[GOAL]
case intro.intro
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
f : ℕ → α
hf : StrictMono f
hf₀ : f 0 = default
⊢ ∃ f, StrictMono f
[PROOFSTEP]
rcases Nat.exists_strictAnti' (default : α) with ⟨g, hg, hg₀⟩
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
f : ℕ → α
hf : StrictMono f
hf₀ : f 0 = default
g : ℕ → α
hg : StrictAnti g
hg₀ : g 0 = default
⊢ ∃ f, StrictMono f
[PROOFSTEP]
refine' ⟨fun n ↦ Int.casesOn n f fun n ↦ g (n + 1), strictMono_int_of_lt_succ _⟩
[GOAL]
case intro.intro.intro.intro
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
f : ℕ → α
hf : StrictMono f
hf₀ : f 0 = default
g : ℕ → α
hg : StrictAnti g
hg₀ : g 0 = default
⊢ ∀ (n : ℤ), (Int.casesOn n f fun n => g (n + 1)) < Int.casesOn (n + 1) f fun n => g (n + 1)
[PROOFSTEP]
rintro (n | _ | n)
[GOAL]
case intro.intro.intro.intro.ofNat
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
f : ℕ → α
hf : StrictMono f
hf₀ : f 0 = default
g : ℕ → α
hg : StrictAnti g
hg₀ : g 0 = default
n : ℕ
⊢ (Int.casesOn (ofNat n) f fun n => g (n + 1)) < Int.casesOn (ofNat n + 1) f fun n => g (n + 1)
[PROOFSTEP]
exact hf n.lt_succ_self
[GOAL]
case intro.intro.intro.intro.negSucc.zero
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
f : ℕ → α
hf : StrictMono f
hf₀ : f 0 = default
g : ℕ → α
hg : StrictAnti g
hg₀ : g 0 = default
⊢ (Int.casesOn -[Nat.zero+1] f fun n => g (n + 1)) < Int.casesOn (-[Nat.zero+1] + 1) f fun n => g (n + 1)
[PROOFSTEP]
show g 1 < f 0
[GOAL]
case intro.intro.intro.intro.negSucc.zero
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
f : ℕ → α
hf : StrictMono f
hf₀ : f 0 = default
g : ℕ → α
hg : StrictAnti g
hg₀ : g 0 = default
⊢ g 1 < f 0
[PROOFSTEP]
rw [hf₀, ← hg₀]
[GOAL]
case intro.intro.intro.intro.negSucc.zero
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
f : ℕ → α
hf : StrictMono f
hf₀ : f 0 = default
g : ℕ → α
hg : StrictAnti g
hg₀ : g 0 = default
⊢ g 1 < g 0
[PROOFSTEP]
exact hg Nat.zero_lt_one
[GOAL]
case intro.intro.intro.intro.negSucc.succ
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝⁴ inst✝³ : Preorder α
inst✝² : Nonempty α
inst✝¹ : NoMinOrder α
inst✝ : NoMaxOrder α
inhabited_h : Inhabited α
f : ℕ → α
hf : StrictMono f
hf₀ : f 0 = default
g : ℕ → α
hg : StrictAnti g
hg₀ : g 0 = default
n : ℕ
⊢ (Int.casesOn -[Nat.succ n+1] f fun n => g (n + 1)) < Int.casesOn (-[Nat.succ n+1] + 1) f fun n => g (n + 1)
[PROOFSTEP]
exact hg (Nat.lt_succ_self _)
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : Preorder α
f : ℕ → α
hf : Monotone f
n : ℕ
x : α
h1 : f n < x
h2 : x < f (n + 1)
a : ℕ
⊢ f a ≠ x
[PROOFSTEP]
rintro rfl
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : Preorder α
f : ℕ → α
hf : Monotone f
n a : ℕ
h1 : f n < f a
h2 : f a < f (n + 1)
⊢ False
[PROOFSTEP]
exact (hf.reflect_lt h1).not_le (Nat.le_of_lt_succ <| hf.reflect_lt h2)
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : Preorder α
f : ℕ → α
hf : Antitone f
n : ℕ
x : α
h1 : f (n + 1) < x
h2 : x < f n
a : ℕ
⊢ f a ≠ x
[PROOFSTEP]
rintro rfl
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : Preorder α
f : ℕ → α
hf : Antitone f
n a : ℕ
h1 : f (n + 1) < f a
h2 : f a < f n
⊢ False
[PROOFSTEP]
exact (hf.reflect_lt h2).not_le (Nat.le_of_lt_succ <| hf.reflect_lt h1)
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : Preorder α
f : ℤ → α
hf : Monotone f
n : ℤ
x : α
h1 : f n < x
h2 : x < f (n + 1)
a : ℤ
⊢ f a ≠ x
[PROOFSTEP]
rintro rfl
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : Preorder α
f : ℤ → α
hf : Monotone f
n a : ℤ
h1 : f n < f a
h2 : f a < f (n + 1)
⊢ False
[PROOFSTEP]
exact (hf.reflect_lt h1).not_le (Int.le_of_lt_add_one <| hf.reflect_lt h2)
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : Preorder α
f : ℤ → α
hf : Antitone f
n : ℤ
x : α
h1 : f (n + 1) < x
h2 : x < f n
a : ℤ
⊢ f a ≠ x
[PROOFSTEP]
rintro rfl
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝ : Preorder α
f : ℤ → α
hf : Antitone f
n a : ℤ
h1 : f (n + 1) < f a
h2 : f a < f n
⊢ False
[PROOFSTEP]
exact (hf.reflect_lt h2).not_le (Int.le_of_lt_add_one <| hf.reflect_lt h1)
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝³ : PartialOrder α
inst✝² : PartialOrder β
inst✝¹ : Preorder γ
inst✝ : Preorder δ
f : α → γ
g : β → δ
hf : StrictMono f
hg : StrictMono g
a b : α × β
⊢ a < b → Prod.map f g a < Prod.map f g b
[PROOFSTEP]
simp only [Prod.lt_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝³ : PartialOrder α
inst✝² : PartialOrder β
inst✝¹ : Preorder γ
inst✝ : Preorder δ
f : α → γ
g : β → δ
hf : StrictMono f
hg : StrictMono g
a b : α × β
⊢ a.fst < b.fst ∧ a.snd ≤ b.snd ∨ a.fst ≤ b.fst ∧ a.snd < b.snd →
    (Prod.map f g a).fst < (Prod.map f g b).fst ∧ (Prod.map f g a).snd ≤ (Prod.map f g b).snd ∨
      (Prod.map f g a).fst ≤ (Prod.map f g b).fst ∧ (Prod.map f g a).snd < (Prod.map f g b).snd
[PROOFSTEP]
exact Or.imp (And.imp hf.imp hg.monotone.imp) (And.imp hf.monotone.imp hg.imp)
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝³ : PartialOrder α
inst✝² : PartialOrder β
inst✝¹ : Preorder γ
inst✝ : Preorder δ
f : α → γ
g : β → δ
hf : StrictAnti f
hg : StrictAnti g
a b : α × β
⊢ a < b → Prod.map f g b < Prod.map f g a
[PROOFSTEP]
simp only [Prod.lt_iff]
[GOAL]
ι : Type u_1
α : Type u
β : Type v
γ : Type w
δ : Type u_2
π : ι → Type u_3
r : α → α → Prop
inst✝³ : PartialOrder α
inst✝² : PartialOrder β
inst✝¹ : Preorder γ
inst✝ : Preorder δ
f : α → γ
g : β → δ
hf : StrictAnti f
hg : StrictAnti g
a b : α × β
⊢ a.fst < b.fst ∧ a.snd ≤ b.snd ∨ a.fst ≤ b.fst ∧ a.snd < b.snd →
    (Prod.map f g b).fst < (Prod.map f g a).fst ∧ (Prod.map f g b).snd ≤ (Prod.map f g a).snd ∨
      (Prod.map f g b).fst ≤ (Prod.map f g a).fst ∧ (Prod.map f g b).snd < (Prod.map f g a).snd
[PROOFSTEP]
exact Or.imp (And.imp hf.imp hg.antitone.imp) (And.imp hf.antitone.imp hg.imp)


[GOAL]
α : Type ?u.6639
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ WithLowerTopology.instTopologicalSpaceWithLowerTopology = induced (↑WithLowerTopology.ofLower) inst✝¹
[PROOFSTEP]
erw [topology_eq α, induced_id]
[GOAL]
α : Type ?u.6639
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ WithLowerTopology.instTopologicalSpaceWithLowerTopology = generateFrom {s | ∃ a, (Ici a)ᶜ = s}
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ IsOpen s ↔ GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
[PROOFSTEP]
rw [topology_eq α]
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ IsOpen s ↔ GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
h : Set.Finite s
⊢ IsClosed ↑(upperClosure s)
[PROOFSTEP]
simp only [← UpperSet.iInf_Ici, UpperSet.coe_iInf]
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
h : Set.Finite s
⊢ IsClosed (⋃ (i : α) (_ : i ∈ s), ↑(UpperSet.Ici i))
[PROOFSTEP]
exact isClosed_biUnion h fun _ _ => isClosed_Ici
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
h : IsOpen s
⊢ IsLowerSet s
[PROOFSTEP]
replace h := isOpen_iff_generate_Ici_compl.1 h
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
h : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
⊢ IsLowerSet s
[PROOFSTEP]
induction h
[GOAL]
case basic
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s s✝ : Set α
a✝ : s✝ ∈ {t | ∃ a, (Ici a)ᶜ = t}
⊢ IsLowerSet s✝
case univ
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ IsLowerSet univ
case inter
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s s✝ t✝ : Set α
a✝¹ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s✝
a✝ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} t✝
a_ih✝¹ : IsLowerSet s✝
a_ih✝ : IsLowerSet t✝
⊢ IsLowerSet (s✝ ∩ t✝)
case sUnion
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
S✝ : Set (Set α)
a✝ : ∀ (s : Set α), s ∈ S✝ → GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
a_ih✝ : ∀ (s : Set α), s ∈ S✝ → IsLowerSet s
⊢ IsLowerSet (⋃₀ S✝)
[PROOFSTEP]
case basic u h' => obtain ⟨a, rfl⟩ := h'; exact (isUpperSet_Ici a).compl
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s u : Set α
h' : u ∈ {t | ∃ a, (Ici a)ᶜ = t}
⊢ IsLowerSet u
[PROOFSTEP]
case basic u h' => obtain ⟨a, rfl⟩ := h'; exact (isUpperSet_Ici a).compl
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s u : Set α
h' : u ∈ {t | ∃ a, (Ici a)ᶜ = t}
⊢ IsLowerSet u
[PROOFSTEP]
obtain ⟨a, rfl⟩ := h'
[GOAL]
case intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
a : α
⊢ IsLowerSet (Ici a)ᶜ
[PROOFSTEP]
exact (isUpperSet_Ici a).compl
[GOAL]
case univ
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ IsLowerSet univ
case inter
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s s✝ t✝ : Set α
a✝¹ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s✝
a✝ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} t✝
a_ih✝¹ : IsLowerSet s✝
a_ih✝ : IsLowerSet t✝
⊢ IsLowerSet (s✝ ∩ t✝)
case sUnion
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
S✝ : Set (Set α)
a✝ : ∀ (s : Set α), s ∈ S✝ → GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
a_ih✝ : ∀ (s : Set α), s ∈ S✝ → IsLowerSet s
⊢ IsLowerSet (⋃₀ S✝)
[PROOFSTEP]
case univ => exact isLowerSet_univ
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ IsLowerSet univ
[PROOFSTEP]
case univ => exact isLowerSet_univ
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ IsLowerSet univ
[PROOFSTEP]
exact isLowerSet_univ
[GOAL]
case inter
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s s✝ t✝ : Set α
a✝¹ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s✝
a✝ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} t✝
a_ih✝¹ : IsLowerSet s✝
a_ih✝ : IsLowerSet t✝
⊢ IsLowerSet (s✝ ∩ t✝)
case sUnion
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
S✝ : Set (Set α)
a✝ : ∀ (s : Set α), s ∈ S✝ → GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
a_ih✝ : ∀ (s : Set α), s ∈ S✝ → IsLowerSet s
⊢ IsLowerSet (⋃₀ S✝)
[PROOFSTEP]
case inter u v _ _ hu2 hv2 => exact hu2.inter hv2
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s u v : Set α
a✝¹ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} u
a✝ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} v
hu2 : IsLowerSet u
hv2 : IsLowerSet v
⊢ IsLowerSet (u ∩ v)
[PROOFSTEP]
case inter u v _ _ hu2 hv2 => exact hu2.inter hv2
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s u v : Set α
a✝¹ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} u
a✝ : GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} v
hu2 : IsLowerSet u
hv2 : IsLowerSet v
⊢ IsLowerSet (u ∩ v)
[PROOFSTEP]
exact hu2.inter hv2
[GOAL]
case sUnion
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
S✝ : Set (Set α)
a✝ : ∀ (s : Set α), s ∈ S✝ → GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
a_ih✝ : ∀ (s : Set α), s ∈ S✝ → IsLowerSet s
⊢ IsLowerSet (⋃₀ S✝)
[PROOFSTEP]
case sUnion _ _ ih => exact isLowerSet_sUnion ih
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
S✝ : Set (Set α)
a✝ : ∀ (s : Set α), s ∈ S✝ → GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
ih : ∀ (s : Set α), s ∈ S✝ → IsLowerSet s
⊢ IsLowerSet (⋃₀ S✝)
[PROOFSTEP]
case sUnion _ _ ih => exact isLowerSet_sUnion ih
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
S✝ : Set (Set α)
a✝ : ∀ (s : Set α), s ∈ S✝ → GenerateOpen {t | ∃ a, (Ici a)ᶜ = t} s
ih : ∀ (s : Set α), s ∈ S✝ → IsLowerSet s
⊢ IsLowerSet (⋃₀ S✝)
[PROOFSTEP]
exact isLowerSet_sUnion ih
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ IsTopologicalBasis (lowerBasis α)
[PROOFSTEP]
convert isTopologicalBasis_of_subbasis (topology_eq α)
[GOAL]
case h.e'_3
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ lowerBasis α = (fun f => ⋂₀ f) '' {f | Set.Finite f ∧ f ⊆ {s | ∃ a, (Ici a)ᶜ = s}}
[PROOFSTEP]
simp_rw [lowerBasis, coe_upperClosure, compl_iUnion]
[GOAL]
case h.e'_3
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
⊢ {s | ∃ t, Set.Finite t ∧ ⋂ (i : α) (_ : i ∈ t), (Ici i)ᶜ = s} =
    (fun f => ⋂₀ f) '' {f | Set.Finite f ∧ f ⊆ {s | ∃ a, (Ici a)ᶜ = s}}
[PROOFSTEP]
ext s
[GOAL]
case h.e'_3.h
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s✝ s : Set α
⊢ s ∈ {s | ∃ t, Set.Finite t ∧ ⋂ (i : α) (_ : i ∈ t), (Ici i)ᶜ = s} ↔
    s ∈ (fun f => ⋂₀ f) '' {f | Set.Finite f ∧ f ⊆ {s | ∃ a, (Ici a)ᶜ = s}}
[PROOFSTEP]
constructor
[GOAL]
case h.e'_3.h.mp
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s✝ s : Set α
⊢ s ∈ {s | ∃ t, Set.Finite t ∧ ⋂ (i : α) (_ : i ∈ t), (Ici i)ᶜ = s} →
    s ∈ (fun f => ⋂₀ f) '' {f | Set.Finite f ∧ f ⊆ {s | ∃ a, (Ici a)ᶜ = s}}
[PROOFSTEP]
rintro ⟨F, hF, rfl⟩
[GOAL]
case h.e'_3.h.mp.intro.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s F : Set α
hF : Set.Finite F
⊢ ⋂ (i : α) (_ : i ∈ F), (Ici i)ᶜ ∈ (fun f => ⋂₀ f) '' {f | Set.Finite f ∧ f ⊆ {s | ∃ a, (Ici a)ᶜ = s}}
[PROOFSTEP]
refine' ⟨(fun a => (Ici a)ᶜ) '' F, ⟨hF.image _, image_subset_iff.2 fun _ _ => ⟨_, rfl⟩⟩, _⟩
[GOAL]
case h.e'_3.h.mp.intro.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s F : Set α
hF : Set.Finite F
⊢ (fun f => ⋂₀ f) ((fun a => (Ici a)ᶜ) '' F) = ⋂ (i : α) (_ : i ∈ F), (Ici i)ᶜ
[PROOFSTEP]
simp only [sInter_image]
[GOAL]
case h.e'_3.h.mpr
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s✝ s : Set α
⊢ s ∈ (fun f => ⋂₀ f) '' {f | Set.Finite f ∧ f ⊆ {s | ∃ a, (Ici a)ᶜ = s}} →
    s ∈ {s | ∃ t, Set.Finite t ∧ ⋂ (i : α) (_ : i ∈ t), (Ici i)ᶜ = s}
[PROOFSTEP]
rintro ⟨F, ⟨hF, hs⟩, rfl⟩
[GOAL]
case h.e'_3.h.mpr.intro.intro.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
F : Set (Set α)
hF : Set.Finite F
hs : F ⊆ {s | ∃ a, (Ici a)ᶜ = s}
⊢ (fun f => ⋂₀ f) F ∈ {s | ∃ t, Set.Finite t ∧ ⋂ (i : α) (_ : i ∈ t), (Ici i)ᶜ = s}
[PROOFSTEP]
haveI := hF.to_subtype
[GOAL]
case h.e'_3.h.mpr.intro.intro.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
F : Set (Set α)
hF : Set.Finite F
hs : F ⊆ {s | ∃ a, (Ici a)ᶜ = s}
this : Finite ↑F
⊢ (fun f => ⋂₀ f) F ∈ {s | ∃ t, Set.Finite t ∧ ⋂ (i : α) (_ : i ∈ t), (Ici i)ᶜ = s}
[PROOFSTEP]
rw [subset_def, Subtype.forall'] at hs
[GOAL]
case h.e'_3.h.mpr.intro.intro.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
F : Set (Set α)
hF : Set.Finite F
hs : ∀ (x : { a // a ∈ F }), ↑x ∈ {s | ∃ a, (Ici a)ᶜ = s}
this : Finite ↑F
⊢ (fun f => ⋂₀ f) F ∈ {s | ∃ t, Set.Finite t ∧ ⋂ (i : α) (_ : i ∈ t), (Ici i)ᶜ = s}
[PROOFSTEP]
choose f hf using hs
[GOAL]
case h.e'_3.h.mpr.intro.intro.intro
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
F : Set (Set α)
hF : Set.Finite F
this : Finite ↑F
f : { a // a ∈ F } → α
hf : ∀ (x : { a // a ∈ F }), (Ici (f x))ᶜ = ↑x
⊢ (fun f => ⋂₀ f) F ∈ {s | ∃ t, Set.Finite t ∧ ⋂ (i : α) (_ : i ∈ t), (Ici i)ᶜ = s}
[PROOFSTEP]
exact ⟨_, finite_range f, by simp_rw [biInter_range, hf, sInter_eq_iInter]⟩
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
s : Set α
F : Set (Set α)
hF : Set.Finite F
this : Finite ↑F
f : { a // a ∈ F } → α
hf : ∀ (x : { a // a ∈ F }), (Ici (f x))ᶜ = ↑x
⊢ ⋂ (i : α) (_ : i ∈ range f), (Ici i)ᶜ = (fun f => ⋂₀ f) F
[PROOFSTEP]
simp_rw [biInter_range, hf, sInter_eq_iInter]
[GOAL]
α : Type u_2
inst✝³ : Preorder α
inst✝² : TopologicalSpace α
inst✝¹ : LowerTopology α
s : Set α
β : Type u_1
inst✝ : TopologicalSpace β
f : β → α
h : ∀ (a : α), IsClosed (f ⁻¹' Ici a)
⊢ Continuous f
[PROOFSTEP]
obtain rfl := LowerTopology.topology_eq α
[GOAL]
α : Type u_2
inst✝² : Preorder α
s : Set α
β : Type u_1
inst✝¹ : TopologicalSpace β
f : β → α
h : ∀ (a : α), IsClosed (f ⁻¹' Ici a)
inst✝ : LowerTopology α
⊢ Continuous f
[PROOFSTEP]
refine continuous_generateFrom ?_
[GOAL]
α : Type u_2
inst✝² : Preorder α
s : Set α
β : Type u_1
inst✝¹ : TopologicalSpace β
f : β → α
h : ∀ (a : α), IsClosed (f ⁻¹' Ici a)
inst✝ : LowerTopology α
⊢ ∀ (s : Set α), s ∈ {s | ∃ a, (Ici a)ᶜ = s} → IsOpen (f ⁻¹' s)
[PROOFSTEP]
rintro _ ⟨a, rfl⟩
[GOAL]
case intro
α : Type u_2
inst✝² : Preorder α
s : Set α
β : Type u_1
inst✝¹ : TopologicalSpace β
f : β → α
h : ∀ (a : α), IsClosed (f ⁻¹' Ici a)
inst✝ : LowerTopology α
a : α
⊢ IsOpen (f ⁻¹' (Ici a)ᶜ)
[PROOFSTEP]
exact (h a).isOpen_compl
[GOAL]
α : Type ?u.15319
inst✝² : PartialOrder α
inst✝¹ : TopologicalSpace α
inst✝ : LowerTopology α
x y : α
h : Inseparable x y
⊢ Ici x = Ici y
[PROOFSTEP]
simpa only [inseparable_iff_closure_eq, closure_singleton] using h
[GOAL]
α : Type ?u.16169
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : UpperTopology α
s : Set α
⊢ WithUpperTopology.instTopologicalSpaceWithUpperTopology = induced (↑WithUpperTopology.ofUpper) inst✝¹
[PROOFSTEP]
erw [topology_eq α, induced_id]
[GOAL]
α : Type ?u.16169
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : UpperTopology α
s : Set α
⊢ WithUpperTopology.instTopologicalSpaceWithUpperTopology = generateFrom {s | ∃ a, (Iic a)ᶜ = s}
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : UpperTopology α
s : Set α
⊢ IsOpen s ↔ GenerateOpen {t | ∃ a, (Iic a)ᶜ = t} s
[PROOFSTEP]
rw [topology_eq α]
[GOAL]
α : Type u_1
inst✝² : Preorder α
inst✝¹ : TopologicalSpace α
inst✝ : UpperTopology α
s : Set α
⊢ IsOpen s ↔ GenerateOpen {t | ∃ a, (Iic a)ᶜ = t} s
[PROOFSTEP]
rfl
[GOAL]
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
⊢ instTopologicalSpaceProd = generateFrom {s | ∃ a, (Ici a)ᶜ = s}
[PROOFSTEP]
refine' le_antisymm (le_generateFrom _) _
[GOAL]
case refine'_1
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
⊢ ∀ (s : Set (α × β)), s ∈ {s | ∃ a, (Ici a)ᶜ = s} → IsOpen s
[PROOFSTEP]
rintro _ ⟨x, rfl⟩
[GOAL]
case refine'_1.intro
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
x : α × β
⊢ IsOpen (Ici x)ᶜ
[PROOFSTEP]
exact (isClosed_Ici.prod isClosed_Ici).isOpen_compl
[GOAL]
case refine'_2
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
⊢ generateFrom {s | ∃ a, (Ici a)ᶜ = s} ≤ instTopologicalSpaceProd
[PROOFSTEP]
rw [(LowerTopology.isTopologicalBasis.prod LowerTopology.isTopologicalBasis).eq_generateFrom,
  le_generateFrom_iff_subset_isOpen, image2_subset_iff]
[GOAL]
case refine'_2
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
⊢ ∀ (x : Set α),
    x ∈ LowerTopology.lowerBasis α → ∀ (y : Set β), y ∈ LowerTopology.lowerBasis β → x ×ˢ y ∈ {s | IsOpen s}
[PROOFSTEP]
rintro _ ⟨s, hs, rfl⟩ _ ⟨t, ht, rfl⟩
[GOAL]
case refine'_2.intro.intro.intro.intro
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
s : Set α
hs : Set.Finite s
t : Set β
ht : Set.Finite t
⊢ (↑(upperClosure s))ᶜ ×ˢ (↑(upperClosure t))ᶜ ∈ {s | IsOpen s}
[PROOFSTEP]
dsimp
[GOAL]
case refine'_2.intro.intro.intro.intro
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
s : Set α
hs : Set.Finite s
t : Set β
ht : Set.Finite t
⊢ IsOpen ((↑(upperClosure s))ᶜ ×ˢ (↑(upperClosure t))ᶜ)
[PROOFSTEP]
simp_rw [coe_upperClosure, compl_iUnion, prod_eq, preimage_iInter, preimage_compl]
  -- without `let`, `refine` tries to use the product topology and fails
[GOAL]
case refine'_2.intro.intro.intro.intro
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
s : Set α
hs : Set.Finite s
t : Set β
ht : Set.Finite t
⊢ IsOpen ((⋂ (i : α) (_ : i ∈ s), (Prod.fst ⁻¹' Ici i)ᶜ) ∩ ⋂ (i : β) (_ : i ∈ t), (Prod.snd ⁻¹' Ici i)ᶜ)
[PROOFSTEP]
let _ : TopologicalSpace (α × β) := generateFrom {s | ∃ a, (Ici a)ᶜ = s}
[GOAL]
case refine'_2.intro.intro.intro.intro
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
s : Set α
hs : Set.Finite s
t : Set β
ht : Set.Finite t
x✝ : TopologicalSpace (α × β) := generateFrom {s | ∃ a, (Ici a)ᶜ = s}
⊢ IsOpen ((⋂ (i : α) (_ : i ∈ s), (Prod.fst ⁻¹' Ici i)ᶜ) ∩ ⋂ (i : β) (_ : i ∈ t), (Prod.snd ⁻¹' Ici i)ᶜ)
[PROOFSTEP]
refine (isOpen_biInter hs fun a _ => ?_).inter (isOpen_biInter ht fun b _ => ?_)
[GOAL]
case refine'_2.intro.intro.intro.intro.refine_1
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
s : Set α
hs : Set.Finite s
t : Set β
ht : Set.Finite t
x✝¹ : TopologicalSpace (α × β) := generateFrom {s | ∃ a, (Ici a)ᶜ = s}
a : α
x✝ : a ∈ s
⊢ IsOpen (Prod.fst ⁻¹' Ici a)ᶜ
[PROOFSTEP]
exact GenerateOpen.basic _ ⟨(a, ⊥), by simp [Ici_prod_eq, prod_univ]⟩
[GOAL]
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
s : Set α
hs : Set.Finite s
t : Set β
ht : Set.Finite t
x✝¹ : TopologicalSpace (α × β) := generateFrom {s | ∃ a, (Ici a)ᶜ = s}
a : α
x✝ : a ∈ s
⊢ (Ici (a, ⊥))ᶜ = (Prod.fst ⁻¹' Ici a)ᶜ
[PROOFSTEP]
simp [Ici_prod_eq, prod_univ]
[GOAL]
case refine'_2.intro.intro.intro.intro.refine_2
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
s : Set α
hs : Set.Finite s
t : Set β
ht : Set.Finite t
x✝¹ : TopologicalSpace (α × β) := generateFrom {s | ∃ a, (Ici a)ᶜ = s}
b : β
x✝ : b ∈ t
⊢ IsOpen (Prod.snd ⁻¹' Ici b)ᶜ
[PROOFSTEP]
exact GenerateOpen.basic _ ⟨(⊥, b), by simp [Ici_prod_eq, univ_prod]⟩
[GOAL]
α : Type ?u.18877
β : Type ?u.18906
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : LowerTopology α
inst✝⁴ : OrderBot α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : LowerTopology β
inst✝ : OrderBot β
s : Set α
hs : Set.Finite s
t : Set β
ht : Set.Finite t
x✝¹ : TopologicalSpace (α × β) := generateFrom {s | ∃ a, (Ici a)ᶜ = s}
b : β
x✝ : b ∈ t
⊢ (Ici (⊥, b))ᶜ = (Prod.snd ⁻¹' Ici b)ᶜ
[PROOFSTEP]
simp [Ici_prod_eq, univ_prod]
[GOAL]
α : Type ?u.24860
β : Type ?u.24889
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : UpperTopology α
inst✝⁴ : OrderTop α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : UpperTopology β
inst✝ : OrderTop β
⊢ instTopologicalSpaceProd = generateFrom {s | ∃ a, (Iic a)ᶜ = s}
[PROOFSTEP]
suffices : LowerTopology (α × β)ᵒᵈ
[GOAL]
α : Type ?u.24860
β : Type ?u.24889
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : UpperTopology α
inst✝⁴ : OrderTop α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : UpperTopology β
inst✝ : OrderTop β
this : LowerTopology (α × β)ᵒᵈ
⊢ instTopologicalSpaceProd = generateFrom {s | ∃ a, (Iic a)ᶜ = s}
[PROOFSTEP]
exact LowerTopology.topology_eq_lowerTopology (α := (α × β)ᵒᵈ)
[GOAL]
case this
α : Type ?u.24860
β : Type ?u.24889
inst✝⁷ : Preorder α
inst✝⁶ : TopologicalSpace α
inst✝⁵ : UpperTopology α
inst✝⁴ : OrderTop α
inst✝³ : Preorder β
inst✝² : TopologicalSpace β
inst✝¹ : UpperTopology β
inst✝ : OrderTop β
⊢ LowerTopology (α × β)ᵒᵈ
[PROOFSTEP]
exact instLowerTopologyProd (α := αᵒᵈ) (β := βᵒᵈ)
[GOAL]
α : Type u_2
β : Type u_1
inst✝⁵ : CompleteLattice α
inst✝⁴ : CompleteLattice β
inst✝³ : TopologicalSpace α
inst✝² : LowerTopology α
inst✝¹ : TopologicalSpace β
inst✝ : LowerTopology β
f : sInfHom α β
⊢ Continuous ↑f
[PROOFSTEP]
refine LowerTopology.continuous_of_Ici fun b => ?_
[GOAL]
α : Type u_2
β : Type u_1
inst✝⁵ : CompleteLattice α
inst✝⁴ : CompleteLattice β
inst✝³ : TopologicalSpace α
inst✝² : LowerTopology α
inst✝¹ : TopologicalSpace β
inst✝ : LowerTopology β
f : sInfHom α β
b : β
⊢ IsClosed (↑f ⁻¹' Ici b)
[PROOFSTEP]
convert isClosed_Ici (a := sInf <| f ⁻¹' Ici b)
[GOAL]
case h.e'_3
α : Type u_2
β : Type u_1
inst✝⁵ : CompleteLattice α
inst✝⁴ : CompleteLattice β
inst✝³ : TopologicalSpace α
inst✝² : LowerTopology α
inst✝¹ : TopologicalSpace β
inst✝ : LowerTopology β
f : sInfHom α β
b : β
⊢ ↑f ⁻¹' Ici b = Ici (sInf (↑f ⁻¹' Ici b))
[PROOFSTEP]
refine' Subset.antisymm (fun a => sInf_le) fun a ha => le_trans _ <| OrderHomClass.mono (f : α →o β) ha
[GOAL]
case h.e'_3
α : Type u_2
β : Type u_1
inst✝⁵ : CompleteLattice α
inst✝⁴ : CompleteLattice β
inst✝³ : TopologicalSpace α
inst✝² : LowerTopology α
inst✝¹ : TopologicalSpace β
inst✝ : LowerTopology β
f : sInfHom α β
b : β
a : α
ha : a ∈ Ici (sInf (↑f ⁻¹' Ici b))
⊢ b ≤ ↑↑f (sInf (↑f ⁻¹' Ici b))
[PROOFSTEP]
refine' LE.le.trans _ (map_sInf f _).ge
[GOAL]
case h.e'_3
α : Type u_2
β : Type u_1
inst✝⁵ : CompleteLattice α
inst✝⁴ : CompleteLattice β
inst✝³ : TopologicalSpace α
inst✝² : LowerTopology α
inst✝¹ : TopologicalSpace β
inst✝ : LowerTopology β
f : sInfHom α β
b : β
a : α
ha : a ∈ Ici (sInf (↑f ⁻¹' Ici b))
⊢ b ≤ sInf (↑f '' (↑f ⁻¹' Ici b))
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
inst✝¹ : Preorder α
inst✝ : TopologicalSpace α
⊢ UpperTopology αᵒᵈ ↔ LowerTopology α
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
inst✝¹ : Preorder α
inst✝ : TopologicalSpace α
⊢ UpperTopology αᵒᵈ → LowerTopology α
[PROOFSTEP]
apply UpperTopology.instLowerTopologyDual
[GOAL]
case mpr
α : Type u_1
inst✝¹ : Preorder α
inst✝ : TopologicalSpace α
⊢ LowerTopology α → UpperTopology αᵒᵈ
[PROOFSTEP]
apply LowerTopology.instUpperTopologyDual
[GOAL]
α : Type u_1
inst✝¹ : Preorder α
inst✝ : TopologicalSpace α
⊢ LowerTopology αᵒᵈ ↔ UpperTopology α
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
inst✝¹ : Preorder α
inst✝ : TopologicalSpace α
⊢ LowerTopology αᵒᵈ → UpperTopology α
[PROOFSTEP]
apply LowerTopology.instUpperTopologyDual
[GOAL]
case mpr
α : Type u_1
inst✝¹ : Preorder α
inst✝ : TopologicalSpace α
⊢ UpperTopology α → LowerTopology αᵒᵈ
[PROOFSTEP]
apply UpperTopology.instLowerTopologyDual


[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.129, u_1} C
inst✝⁴ : Category.{?u.133, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : Faithful F.toFunctor
X Y : C
eval : Y ⊗ X ⟶ 𝟙_ C
coeval : 𝟙_ C ⟶ X ⊗ Y
inst✝ : ExactPairing (F.obj X) (F.obj Y)
map_eval : F.map eval = inv (LaxMonoidalFunctor.μ F.toLaxMonoidalFunctor Y X) ≫ ε_ (F.obj X) (F.obj Y) ≫ F.ε
map_coeval : F.map coeval = inv F.ε ≫ η_ (F.obj X) (F.obj Y) ≫ LaxMonoidalFunctor.μ F.toLaxMonoidalFunctor X Y
⊢ F.map ((𝟙 Y ⊗ coeval) ≫ (α_ Y X Y).inv ≫ (eval ⊗ 𝟙 Y)) = F.map ((ρ_ Y).hom ≫ (λ_ Y).inv)
[PROOFSTEP]
simp [map_eval, map_coeval, MonoidalFunctor.map_tensor]
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.129, u_1} C
inst✝⁴ : Category.{?u.133, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : Faithful F.toFunctor
X Y : C
eval : Y ⊗ X ⟶ 𝟙_ C
coeval : 𝟙_ C ⟶ X ⊗ Y
inst✝ : ExactPairing (F.obj X) (F.obj Y)
map_eval : F.map eval = inv (LaxMonoidalFunctor.μ F.toLaxMonoidalFunctor Y X) ≫ ε_ (F.obj X) (F.obj Y) ≫ F.ε
map_coeval : F.map coeval = inv F.ε ≫ η_ (F.obj X) (F.obj Y) ≫ LaxMonoidalFunctor.μ F.toLaxMonoidalFunctor X Y
⊢ F.map ((coeval ⊗ 𝟙 X) ≫ (α_ X Y X).hom ≫ (𝟙 X ⊗ eval)) = F.map ((λ_ X).hom ≫ (ρ_ X).inv)
[PROOFSTEP]
simp [map_eval, map_coeval, MonoidalFunctor.map_tensor]
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{?u.23115, u_1} C
inst✝⁵ : Category.{?u.23119, u_2} D
inst✝⁴ : MonoidalCategory C
inst✝³ : MonoidalCategory D
F : MonoidalFunctor C D
inst✝² : Full F.toFunctor
inst✝¹ : Faithful F.toFunctor
X Y : C
inst✝ : ExactPairing (F.obj X) (F.obj Y)
⊢ F.map (F.preimage (inv (LaxMonoidalFunctor.μ F.toLaxMonoidalFunctor Y X) ≫ ε_ (F.obj X) (F.obj Y) ≫ F.ε)) =
    inv (LaxMonoidalFunctor.μ F.toLaxMonoidalFunctor Y X) ≫ ε_ (F.obj X) (F.obj Y) ≫ F.ε
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁶ : Category.{?u.23115, u_1} C
inst✝⁵ : Category.{?u.23119, u_2} D
inst✝⁴ : MonoidalCategory C
inst✝³ : MonoidalCategory D
F : MonoidalFunctor C D
inst✝² : Full F.toFunctor
inst✝¹ : Faithful F.toFunctor
X Y : C
inst✝ : ExactPairing (F.obj X) (F.obj Y)
⊢ F.map (F.preimage (inv F.ε ≫ η_ (F.obj X) (F.obj Y) ≫ LaxMonoidalFunctor.μ F.toLaxMonoidalFunctor X Y)) =
    inv F.ε ≫ η_ (F.obj X) (F.obj Y) ≫ LaxMonoidalFunctor.μ F.toLaxMonoidalFunctor X Y
[PROOFSTEP]
simp
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.27280, u_1} C
inst✝⁴ : Category.{?u.27284, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : IsEquivalence F.toFunctor
X : C
inst✝ : HasLeftDual (F.obj X)
⊢ ExactPairing ((Functor.inv F.toFunctor).obj ᘁ(F.obj X)) X
[PROOFSTEP]
refine @exactPairingOfFullyFaithful _ _ _ _ _ _ F _ _ _ _ ?_
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.27280, u_1} C
inst✝⁴ : Category.{?u.27284, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : IsEquivalence F.toFunctor
X : C
inst✝ : HasLeftDual (F.obj X)
⊢ ExactPairing (F.obj ((Functor.inv F.toFunctor).obj ᘁ(F.obj X))) (F.obj X)
[PROOFSTEP]
refine @exactPairingCongrLeft _ _ _ _ _ _ ?_ (F.toFunctor.asEquivalence.counitIso.app _)
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.27280, u_1} C
inst✝⁴ : Category.{?u.27284, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : IsEquivalence F.toFunctor
X : C
inst✝ : HasLeftDual (F.obj X)
⊢ ExactPairing ((𝟭 D).obj ᘁ(F.obj X)) (F.obj X)
[PROOFSTEP]
dsimp
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.27280, u_1} C
inst✝⁴ : Category.{?u.27284, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : IsEquivalence F.toFunctor
X : C
inst✝ : HasLeftDual (F.obj X)
⊢ ExactPairing (ᘁ(F.obj X)) (F.obj X)
[PROOFSTEP]
infer_instance
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.30444, u_1} C
inst✝⁴ : Category.{?u.30448, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : IsEquivalence F.toFunctor
X : C
inst✝ : HasRightDual (F.obj X)
⊢ ExactPairing X ((Functor.inv F.toFunctor).obj (F.obj X)ᘁ)
[PROOFSTEP]
refine @exactPairingOfFullyFaithful _ _ _ _ _ _ F _ _ _ _ ?_
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.30444, u_1} C
inst✝⁴ : Category.{?u.30448, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : IsEquivalence F.toFunctor
X : C
inst✝ : HasRightDual (F.obj X)
⊢ ExactPairing (F.obj X) (F.obj ((Functor.inv F.toFunctor).obj (F.obj X)ᘁ))
[PROOFSTEP]
refine @exactPairingCongrRight _ _ _ _ _ _ ?_ (F.toFunctor.asEquivalence.counitIso.app _)
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.30444, u_1} C
inst✝⁴ : Category.{?u.30448, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : IsEquivalence F.toFunctor
X : C
inst✝ : HasRightDual (F.obj X)
⊢ ExactPairing (F.obj X) ((𝟭 D).obj (F.obj X)ᘁ)
[PROOFSTEP]
dsimp
[GOAL]
C : Type u_1
D : Type u_2
inst✝⁵ : Category.{?u.30444, u_1} C
inst✝⁴ : Category.{?u.30448, u_2} D
inst✝³ : MonoidalCategory C
inst✝² : MonoidalCategory D
F : MonoidalFunctor C D
inst✝¹ : IsEquivalence F.toFunctor
X : C
inst✝ : HasRightDual (F.obj X)
⊢ ExactPairing (F.obj X) (F.obj X)ᘁ
[PROOFSTEP]
infer_instance


[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b : α
a : α × α
h : a ∈ offDiag s
⊢ ¬Sym2.IsDiag (Quotient.mk (Sym2.Rel.setoid α) a)
[PROOFSTEP]
rw [Sym2.isDiag_iff_proj_eq]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b : α
a : α × α
h : a ∈ offDiag s
⊢ ¬a.fst = a.snd
[PROOFSTEP]
exact (mem_offDiag.1 h).2.2
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ m ∈ Finset.sym2 s ↔ ∀ (a : α), a ∈ m → a ∈ s
[PROOFSTEP]
refine mem_image.trans ⟨?_, fun h ↦ ⟨m.out, mem_product.2 ⟨h _ m.out_fst_mem, h _ m.out_snd_mem⟩, m.out_eq⟩⟩
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ (∃ a, a ∈ s ×ˢ s ∧ Quotient.mk' a = m) → ∀ (a : α), a ∈ m → a ∈ s
[PROOFSTEP]
rintro ⟨⟨a, b⟩, h, rfl⟩
[GOAL]
case intro.mk.intro
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b✝ a b : α
h : (a, b) ∈ s ×ˢ s
⊢ ∀ (a_1 : α), a_1 ∈ Quotient.mk' (a, b) → a_1 ∈ s
[PROOFSTEP]
rw [Quotient.mk', @Sym2.ball _ (fun x ↦ x ∈ s)]
[GOAL]
case intro.mk.intro
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b✝ a b : α
h : (a, b) ∈ s ×ˢ s
⊢ a ∈ s ∧ b ∈ s
[PROOFSTEP]
rwa [mem_product] at h
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ Quotient.mk (Sym2.Rel.setoid α) (a, b) ∈ Finset.sym2 s ↔ a ∈ s ∧ b ∈ s
[PROOFSTEP]
rw [mem_sym2_iff, Sym2.ball]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ Finset.sym2 s = ∅ ↔ s = ∅
[PROOFSTEP]
rw [Finset.sym2, image_eq_empty, product_eq_empty, or_self_iff]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ Finset.Nonempty (Finset.sym2 s) ↔ Finset.Nonempty s
[PROOFSTEP]
rw [Finset.sym2, Nonempty.image_iff, nonempty_product, and_self_iff]
[GOAL]
α : Type u_1
inst✝¹ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
inst✝ : Fintype α
⊢ Finset.sym2 univ = univ
[PROOFSTEP]
ext
[GOAL]
case a
α : Type u_1
inst✝¹ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
inst✝ : Fintype α
a✝ : Sym2 α
⊢ a✝ ∈ Finset.sym2 univ ↔ a✝ ∈ univ
[PROOFSTEP]
simp only [mem_sym2_iff, mem_univ, implies_true]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b : α
m : Sym2 α
a : α
⊢ Finset.sym2 {a} = {Sym2.diag a}
[PROOFSTEP]
rw [Finset.sym2, singleton_product_singleton, image_singleton, Sym2.diag, Quotient.mk']
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ (∀ (b : α), b ∈ Sym2.diag a → b ∈ s) ↔ a ∈ s
[PROOFSTEP]
rw [← mem_sym2_iff]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ Sym2.diag a ∈ Finset.sym2 s ↔ a ∈ s
[PROOFSTEP]
exact mk'_mem_sym2_iff.trans <| and_self_iff _
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ Sym2.diag a ∈ Finset.sym2 s ↔ a ∈ s
[PROOFSTEP]
simp [diag_mem_sym2_mem_iff]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ image Quotient.mk' (diag s) ∪ image Quotient.mk' (offDiag s) = Finset.sym2 s
[PROOFSTEP]
rw [← image_union, diag_union_offDiag]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym2 α
⊢ image Quotient.mk' (s ×ˢ s) = Finset.sym2 s
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m : Sym α n
⊢ m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
[PROOFSTEP]
induction' n with n ih
[GOAL]
case zero
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
m : Sym α Nat.zero
⊢ m ∈ Finset.sym s Nat.zero ↔ ∀ (a : α), a ∈ m → a ∈ s
[PROOFSTEP]
refine' mem_singleton.trans ⟨_, fun _ ↦ Sym.eq_nil_of_card_zero _⟩
[GOAL]
case zero
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
m : Sym α Nat.zero
⊢ m = ∅ → ∀ (a : α), a ∈ m → a ∈ s
[PROOFSTEP]
rintro rfl
[GOAL]
case zero
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m : Sym α n
⊢ ∀ (a : α), a ∈ ∅ → a ∈ s
[PROOFSTEP]
exact fun a ha ↦ (Finset.not_mem_empty _ ha).elim
[GOAL]
case succ
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
m : Sym α (Nat.succ n)
⊢ m ∈ Finset.sym s (Nat.succ n) ↔ ∀ (a : α), a ∈ m → a ∈ s
[PROOFSTEP]
refine' mem_sup.trans ⟨_, fun h ↦ _⟩
[GOAL]
case succ.refine'_1
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
m : Sym α (Nat.succ n)
⊢ (∃ v, v ∈ s ∧ m ∈ image (Sym.cons v) (Finset.sym s n)) → ∀ (a : α), a ∈ m → a ∈ s
[PROOFSTEP]
rintro ⟨a, ha, he⟩ b hb
[GOAL]
case succ.refine'_1.intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b✝ : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
m : Sym α (Nat.succ n)
a : α
ha : a ∈ s
he : m ∈ image (Sym.cons a) (Finset.sym s n)
b : α
hb : b ∈ m
⊢ b ∈ s
[PROOFSTEP]
rw [mem_image] at he
[GOAL]
case succ.refine'_1.intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b✝ : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
m : Sym α (Nat.succ n)
a : α
ha : a ∈ s
he : ∃ a_1, a_1 ∈ Finset.sym s n ∧ a ::ₛ a_1 = m
b : α
hb : b ∈ m
⊢ b ∈ s
[PROOFSTEP]
obtain ⟨m, he, rfl⟩ := he
[GOAL]
case succ.refine'_1.intro.intro.intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b✝ : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
a : α
ha : a ∈ s
b : α
m : Sym α n
he : m ∈ Finset.sym s n
hb : b ∈ a ::ₛ m
⊢ b ∈ s
[PROOFSTEP]
rw [Sym.mem_cons] at hb
[GOAL]
case succ.refine'_1.intro.intro.intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b✝ : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
a : α
ha : a ∈ s
b : α
m : Sym α n
he : m ∈ Finset.sym s n
hb : b = a ∨ b ∈ m
⊢ b ∈ s
[PROOFSTEP]
obtain rfl | hb := hb
[GOAL]
case succ.refine'_1.intro.intro.intro.intro.inl
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b✝ : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
b : α
m : Sym α n
he : m ∈ Finset.sym s n
ha : b ∈ s
⊢ b ∈ s
[PROOFSTEP]
exact ha
[GOAL]
case succ.refine'_1.intro.intro.intro.intro.inr
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b✝ : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
a : α
ha : a ∈ s
b : α
m : Sym α n
he : m ∈ Finset.sym s n
hb : b ∈ m
⊢ b ∈ s
[PROOFSTEP]
exact ih.1 he _ hb
[GOAL]
case succ.refine'_2
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
m : Sym α (Nat.succ n)
h : ∀ (a : α), a ∈ m → a ∈ s
⊢ ∃ v, v ∈ s ∧ m ∈ image (Sym.cons v) (Finset.sym s n)
[PROOFSTEP]
obtain ⟨a, m, rfl⟩ := m.exists_eq_cons_of_succ
[GOAL]
case succ.refine'_2.intro.intro
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a✝ b : α
n✝ : ℕ
m✝ : Sym α n✝
n : ℕ
ih : ∀ {m : Sym α n}, m ∈ Finset.sym s n ↔ ∀ (a : α), a ∈ m → a ∈ s
a : α
m : Sym α n
h : ∀ (a_1 : α), a_1 ∈ a ::ₛ m → a_1 ∈ s
⊢ ∃ v, v ∈ s ∧ a ::ₛ m ∈ image (Sym.cons v) (Finset.sym s n)
[PROOFSTEP]
exact ⟨a, h _ <| Sym.mem_cons_self _ _, mem_image_of_mem _ <| ih.2 fun b hb ↦ h _ <| Sym.mem_cons_of_mem hb⟩
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b✝ : α
n✝ : ℕ
m : Sym α n✝
ha : a ∈ s
n : ℕ
b : α
hb : b ∈ Sym.replicate n a
⊢ b ∈ s
[PROOFSTEP]
rwa [(Sym.mem_replicate.1 hb).2]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m : Sym α n
h : Finset.sym s n = ∅
⊢ s = ∅
[PROOFSTEP]
rw [← not_nonempty_iff_eq_empty] at h ⊢
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m : Sym α n
h : ¬Finset.Nonempty (Finset.sym s n)
⊢ ¬Finset.Nonempty s
[PROOFSTEP]
exact fun hs ↦ h (hs.sym _)
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m : Sym α n
⊢ Finset.sym s n = ∅ ↔ n ≠ 0 ∧ s = ∅
[PROOFSTEP]
cases n
[GOAL]
case zero
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
m : Sym α Nat.zero
⊢ Finset.sym s Nat.zero = ∅ ↔ Nat.zero ≠ 0 ∧ s = ∅
[PROOFSTEP]
exact iff_of_false (singleton_ne_empty _) fun h ↦ (h.1 rfl).elim
[GOAL]
case succ
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n✝ : ℕ
m : Sym α (Nat.succ n✝)
⊢ Finset.sym s (Nat.succ n✝) = ∅ ↔ Nat.succ n✝ ≠ 0 ∧ s = ∅
[PROOFSTEP]
refine ⟨fun h ↦ ⟨Nat.succ_ne_zero _, eq_empty_of_sym_eq_empty h⟩, ?_⟩
[GOAL]
case succ
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n✝ : ℕ
m : Sym α (Nat.succ n✝)
⊢ Nat.succ n✝ ≠ 0 ∧ s = ∅ → Finset.sym s (Nat.succ n✝) = ∅
[PROOFSTEP]
rintro ⟨_, rfl⟩
[GOAL]
case succ.intro
α : Type u_1
inst✝ : DecidableEq α
t : Finset α
a b : α
n✝ : ℕ
m : Sym α (Nat.succ n✝)
left✝ : Nat.succ n✝ ≠ 0
⊢ Finset.sym ∅ (Nat.succ n✝) = ∅
[PROOFSTEP]
exact sym_empty _
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m : Sym α n
⊢ Finset.Nonempty (Finset.sym s n) ↔ n = 0 ∨ Finset.Nonempty s
[PROOFSTEP]
simp_rw [nonempty_iff_ne_empty, Ne.def]
  -- Porting note: using simp_rw does not work here, it does nothing...
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m : Sym α n
⊢ ¬Finset.sym s n = ∅ ↔ n = 0 ∨ ¬s = ∅
[PROOFSTEP]
rwa [sym_eq_empty, not_and_or, not_ne_iff]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s✝ t✝ : Finset α
a b : α
n✝ : ℕ
m : Sym α n✝
s t : Finset α
n : ℕ
⊢ Finset.sym (s ∩ t) n = Finset.sym s n ∩ Finset.sym t n
[PROOFSTEP]
ext m
[GOAL]
case a
α : Type u_1
inst✝ : DecidableEq α
s✝ t✝ : Finset α
a b : α
n✝ : ℕ
m✝ : Sym α n✝
s t : Finset α
n : ℕ
m : Sym α n
⊢ m ∈ Finset.sym (s ∩ t) n ↔ m ∈ Finset.sym s n ∩ Finset.sym t n
[PROOFSTEP]
simp only [mem_inter, mem_sym_iff, imp_and, forall_and]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
m : { x // x ∈ Finset.sym (insert a s) n }
⊢ (Sym.filterNe a ↑m).snd ∈ Finset.sym s (n - ↑(Sym.filterNe a ↑m).fst)
[PROOFSTEP]
convert sym_filterNe_mem a m.2
[GOAL]
case h.e'_5.h.e'_3
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
m : { x // x ∈ Finset.sym (insert a s) n }
⊢ s = erase (insert a s) a
[PROOFSTEP]
rw [erase_insert h]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ (fun m =>
        { fst := (Sym.filterNe a ↑m).fst,
          snd :=
            { val := (Sym.filterNe a ↑m).snd,
              property := (_ : (Sym.filterNe a ↑m).snd ∈ Finset.sym s (n - ↑(Sym.filterNe a ↑m).fst)) } })
      ((fun m =>
          { val := Sym.fill a m.fst ↑m.snd, property := (_ : Sym.fill a m.fst ↑m.snd ∈ Finset.sym (insert a s) n) })
        { fst := i, snd := { val := m, property := hm } }) =
    { fst := i, snd := { val := m, property := hm } }
[PROOFSTEP]
refine' Function.Injective.sigma_map (Function.injective_id) (fun i ↦ _) _
[GOAL]
case refine'_1
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ Fin (n + 1) → Type ?u.22728
case refine'_2
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ (a : Fin (n + 1)) → { x // x ∈ Finset.sym s (n - ↑a) } → ?refine'_1 (id a)
case refine'_3
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i✝ : Fin (n + 1)
m : Sym α (n - ↑i✝)
hm : m ∈ Finset.sym s (n - ↑i✝)
i : Fin (n + 1)
⊢ Function.Injective (?refine'_2 i)
case refine'_4
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ Sigma.map id ?refine'_2
      ((fun m =>
          { fst := (Sym.filterNe a ↑m).fst,
            snd :=
              { val := (Sym.filterNe a ↑m).snd,
                property := (_ : (Sym.filterNe a ↑m).snd ∈ Finset.sym s (n - ↑(Sym.filterNe a ↑m).fst)) } })
        ((fun m =>
            { val := Sym.fill a m.fst ↑m.snd, property := (_ : Sym.fill a m.fst ↑m.snd ∈ Finset.sym (insert a s) n) })
          { fst := i, snd := { val := m, property := hm } })) =
    Sigma.map id ?refine'_2 { fst := i, snd := { val := m, property := hm } }
[PROOFSTEP]
exact fun i ↦ Sym α (n - i)
[GOAL]
case refine'_2
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ (a : Fin (n + 1)) → { x // x ∈ Finset.sym s (n - ↑a) } → Sym α (n - ↑(id a))
case refine'_3
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i✝ : Fin (n + 1)
m : Sym α (n - ↑i✝)
hm : m ∈ Finset.sym s (n - ↑i✝)
i : Fin (n + 1)
⊢ Function.Injective (?refine'_2 i)
case refine'_4
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ Sigma.map id ?refine'_2
      ((fun m =>
          { fst := (Sym.filterNe a ↑m).fst,
            snd :=
              { val := (Sym.filterNe a ↑m).snd,
                property := (_ : (Sym.filterNe a ↑m).snd ∈ Finset.sym s (n - ↑(Sym.filterNe a ↑m).fst)) } })
        ((fun m =>
            { val := Sym.fill a m.fst ↑m.snd, property := (_ : Sym.fill a m.fst ↑m.snd ∈ Finset.sym (insert a s) n) })
          { fst := i, snd := { val := m, property := hm } })) =
    Sigma.map id ?refine'_2 { fst := i, snd := { val := m, property := hm } }
[PROOFSTEP]
swap
[GOAL]
case refine'_3
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i✝ : Fin (n + 1)
m : Sym α (n - ↑i✝)
hm : m ∈ Finset.sym s (n - ↑i✝)
i : Fin (n + 1)
⊢ Function.Injective (?refine'_2 i)
case refine'_2
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ (a : Fin (n + 1)) → { x // x ∈ Finset.sym s (n - ↑a) } → Sym α (n - ↑(id a))
case refine'_4
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ Sigma.map id ?refine'_2
      ((fun m =>
          { fst := (Sym.filterNe a ↑m).fst,
            snd :=
              { val := (Sym.filterNe a ↑m).snd,
                property := (_ : (Sym.filterNe a ↑m).snd ∈ Finset.sym s (n - ↑(Sym.filterNe a ↑m).fst)) } })
        ((fun m =>
            { val := Sym.fill a m.fst ↑m.snd, property := (_ : Sym.fill a m.fst ↑m.snd ∈ Finset.sym (insert a s) n) })
          { fst := i, snd := { val := m, property := hm } })) =
    Sigma.map id ?refine'_2 { fst := i, snd := { val := m, property := hm } }
[PROOFSTEP]
exact Subtype.coe_injective
[GOAL]
case refine'_4
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ Sigma.map id (fun i a => ↑a)
      ((fun m =>
          { fst := (Sym.filterNe a ↑m).fst,
            snd :=
              { val := (Sym.filterNe a ↑m).snd,
                property := (_ : (Sym.filterNe a ↑m).snd ∈ Finset.sym s (n - ↑(Sym.filterNe a ↑m).fst)) } })
        ((fun m =>
            { val := Sym.fill a m.fst ↑m.snd, property := (_ : Sym.fill a m.fst ↑m.snd ∈ Finset.sym (insert a s) n) })
          { fst := i, snd := { val := m, property := hm } })) =
    Sigma.map id (fun i a => ↑a) { fst := i, snd := { val := m, property := hm } }
[PROOFSTEP]
refine Eq.trans ?_ (Sym.filter_ne_fill a _ ?_)
[GOAL]
case refine'_4.refine_1
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ Sigma.map id (fun i a => ↑a)
      ((fun m =>
          { fst := (Sym.filterNe a ↑m).fst,
            snd :=
              { val := (Sym.filterNe a ↑m).snd,
                property := (_ : (Sym.filterNe a ↑m).snd ∈ Finset.sym s (n - ↑(Sym.filterNe a ↑m).fst)) } })
        ((fun m =>
            { val := Sym.fill a m.fst ↑m.snd, property := (_ : Sym.fill a m.fst ↑m.snd ∈ Finset.sym (insert a s) n) })
          { fst := i, snd := { val := m, property := hm } })) =
    Sym.filterNe a
      (Sym.fill a (Sigma.map id (fun i a => ↑a) { fst := i, snd := { val := m, property := hm } }).fst
        (Sigma.map id (fun i a => ↑a) { fst := i, snd := { val := m, property := hm } }).snd)
case refine'_4.refine_2
α : Type u_1
inst✝ : DecidableEq α
s t : Finset α
a b : α
n : ℕ
m✝ : Sym α n
h : ¬a ∈ s
x✝ : (i : Fin (n + 1)) × { x // x ∈ Finset.sym s (n - ↑i) }
i : Fin (n + 1)
m : Sym α (n - ↑i)
hm : m ∈ Finset.sym s (n - ↑i)
⊢ ¬a ∈ (Sigma.map id (fun i a => ↑a) { fst := i, snd := { val := m, property := hm } }).snd
[PROOFSTEP]
exacts [rfl, h ∘ mem_sym_iff.1 hm a]