Theorem: HallMarriageTheorem.hall_cond_of_erase
File: Mathlib/Combinatorics/Hall/Finite.lean

tactic: haveI := Classical.decEq ι
state_before: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
ha : ∀ (s : Finset ι), s.Nonempty → s ≠ univ → s.card < (s.biUnion t).card
s' : Finset ↑{x' | x' ≠ x}
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card
state_after: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
ha : ∀ (s : Finset ι), s.Nonempty → s ≠ univ → s.card < (s.biUnion t).card
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card

tactic: specialize ha (s'.image fun z => z.1)
state_before: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
ha : ∀ (s : Finset ι), s.Nonempty → s ≠ univ → s.card < (s.biUnion t).card
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card
state_after: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha :
  (image (fun z => ↑z) s').Nonempty →
    image (fun z => ↑z) s' ≠ univ → (image (fun z => ↑z) s').card < ((image (fun z => ↑z) s').biUnion t).card
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card

tactic: rw [image_nonempty, Finset.card_image_of_injective s' Subtype.coe_injective] at ha
state_before: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha :
  (image (fun z => ↑z) s').Nonempty →
    image (fun z => ↑z) s' ≠ univ → (image (fun z => ↑z) s').card < ((image (fun z => ↑z) s').biUnion t).card
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card
state_after: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card

tactic: by_cases he : s'.Nonempty
state_before: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card
state_after: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card

case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : ¬s'.Nonempty
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card

tactic: have ha' : s'.card < (s'.biUnion fun x => t x).card := by
  convert ha he fun h => by simpa [← h] using mem_univ x using 2
  ext x
  simp only [mem_image, mem_biUnion, exists_prop, SetCoe.exists, exists_and_right,
    exists_eq_right, Subtype.coe_mk]
state_before: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card
state_after: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card

tactic: rw [← erase_biUnion]
state_before: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card
state_after: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
⊢ s'.card ≤ ((s'.biUnion fun x' => t ↑x').erase a).card

tactic: by_cases hb : a ∈ s'.biUnion fun x => t x
state_before: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
⊢ s'.card ≤ ((s'.biUnion fun x' => t ↑x').erase a).card
state_after: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
hb : a ∈ s'.biUnion fun x_1 => t ↑x_1
⊢ s'.card ≤ ((s'.biUnion fun x' => t ↑x').erase a).card

case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
hb : a ∉ s'.biUnion fun x_1 => t ↑x_1
⊢ s'.card ≤ ((s'.biUnion fun x' => t ↑x').erase a).card

tactic: convert ha he fun h => by simpa [← h] using mem_univ x using 2
state_before: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
⊢ s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
state_after: case h.e'_4.h.e'_2
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
⊢ (s'.biUnion fun x_1 => t ↑x_1) = (image (fun z => ↑z) s').biUnion t

tactic: ext x
state_before: case h.e'_4.h.e'_2
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
⊢ (s'.biUnion fun x_1 => t ↑x_1) = (image (fun z => ↑z) s').biUnion t
state_after: case h.e'_4.h.e'_2.a
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x✝ : ι
a : α
s' : Finset ↑{x' | x' ≠ x✝}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
x : α
⊢ (x ∈ s'.biUnion fun x => t ↑x) ↔ x ∈ (image (fun z => ↑z) s').biUnion t

tactic: simp only [mem_image, mem_biUnion, exists_prop, SetCoe.exists, exists_and_right,
  exists_eq_right, Subtype.coe_mk]
state_before: case h.e'_4.h.e'_2.a
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x✝ : ι
a : α
s' : Finset ↑{x' | x' ≠ x✝}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
x : α
⊢ (x ∈ s'.biUnion fun x => t ↑x) ↔ x ∈ (image (fun z => ↑z) s').biUnion t
state_after: no goals

tactic: simpa [← h] using mem_univ x
state_before: ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
h : image (fun z => ↑z) s' = univ
⊢ False
state_after: no goals

tactic: rw [card_erase_of_mem hb]
state_before: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
hb : a ∈ s'.biUnion fun x_1 => t ↑x_1
⊢ s'.card ≤ ((s'.biUnion fun x' => t ↑x').erase a).card
state_after: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
hb : a ∈ s'.biUnion fun x_1 => t ↑x_1
⊢ s'.card ≤ (s'.biUnion fun x_1 => t ↑x_1).card - 1

tactic: exact Nat.le_sub_one_of_lt ha'
state_before: case pos
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
hb : a ∈ s'.biUnion fun x_1 => t ↑x_1
⊢ s'.card ≤ (s'.biUnion fun x_1 => t ↑x_1).card - 1
state_after: no goals

tactic: rw [erase_eq_of_not_mem hb]
state_before: case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
hb : a ∉ s'.biUnion fun x_1 => t ↑x_1
⊢ s'.card ≤ ((s'.biUnion fun x' => t ↑x').erase a).card
state_after: case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
hb : a ∉ s'.biUnion fun x_1 => t ↑x_1
⊢ s'.card ≤ (s'.biUnion fun x_1 => t ↑x_1).card

tactic: exact Nat.le_of_lt ha'
state_before: case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s'.Nonempty
ha' : s'.card < (s'.biUnion fun x_1 => t ↑x_1).card
hb : a ∉ s'.biUnion fun x_1 => t ↑x_1
⊢ s'.card ≤ (s'.biUnion fun x_1 => t ↑x_1).card
state_after: no goals

tactic: rw [nonempty_iff_ne_empty, not_not] at he
state_before: case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : ¬s'.Nonempty
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card
state_after: case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s' = ∅
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card

tactic: subst s'
state_before: case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
s' : Finset ↑{x' | x' ≠ x}
this : DecidableEq ι
ha : s'.Nonempty → image (fun z => ↑z) s' ≠ univ → s'.card < ((image (fun z => ↑z) s').biUnion t).card
he : s' = ∅
⊢ s'.card ≤ (s'.biUnion fun x' => (t ↑x').erase a).card
state_after: case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
this : DecidableEq ι
ha : ∅.Nonempty → image (fun z => ↑z) ∅ ≠ univ → ∅.card < ((image (fun z => ↑z) ∅).biUnion t).card
⊢ ∅.card ≤ (∅.biUnion fun x' => (t ↑x').erase a).card

tactic: simp
state_before: case neg
ι : Type u
α : Type v
inst✝¹ : DecidableEq α
t : ι → Finset α
inst✝ : Fintype ι
x : ι
a : α
this : DecidableEq ι
ha : ∅.Nonempty → image (fun z => ↑z) ∅ ≠ univ → ∅.card < ((image (fun z => ↑z) ∅).biUnion t).card
⊢ ∅.card ≤ (∅.biUnion fun x' => (t ↑x').erase a).card
state_after: no goals