Theorem: Set.Intersecting.exists_card_eq
File: Mathlib/Combinatorics/SetFamily/Intersecting.lean

Proof steps:
state_before: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
hs : (↑s).Intersecting
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
hs : (↑s).Intersecting
this : 2 * s.card ≤ Fintype.card α
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
tactic: have := hs.card_le
state_before: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
hs : (↑s).Intersecting
this : 2 * s.card ≤ Fintype.card α
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
hs : (↑s).Intersecting
this : s.card ≤ Fintype.card α / 2
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
tactic: rw [mul_comm, ← Nat.le_div_iff_mul_le' Nat.two_pos] at this
state_before: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
hs : (↑s).Intersecting
this : s.card ≤ Fintype.card α / 2
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
this : s.card ≤ Fintype.card α / 2
⊢ (↑s).Intersecting → ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
tactic: revert hs
state_before: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
this : s.card ≤ Fintype.card α / 2
⊢ (↑s).Intersecting → ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
this : s.card ≤ Fintype.card α / 2
⊢ ∀ (t₁ : Finset α),
    (∀ {t₂ : Finset α},
        t₂.card ≤ Fintype.card α / 2 →
          t₁ ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting) →
      t₁.card ≤ Fintype.card α / 2 → (↑t₁).Intersecting → ∃ t, t₁ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
tactic: refine s.strongDownwardInductionOn ?_ this
state_before: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s : Finset α
this : s.card ≤ Fintype.card α / 2
⊢ ∀ (t₁ : Finset α),
    (∀ {t₂ : Finset α},
        t₂.card ≤ Fintype.card α / 2 →
          t₁ ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting) →
      t₁.card ≤ Fintype.card α / 2 → (↑t₁).Intersecting → ∃ t, t₁ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
tactic: rintro s ih _hcard hs
state_before: α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: case pos
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
h : ∀ (t : Finset α), (↑t).Intersecting → s ⊆ t → s = t
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting

case neg
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
h : ¬∀ (t : Finset α), (↑t).Intersecting → s ⊆ t → s = t
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
tactic: by_cases h : ∀ t : Finset α, (t : Set α).Intersecting → s ⊆ t → s = t
state_before: case neg
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
h : ¬∀ (t : Finset α), (↑t).Intersecting → s ⊆ t → s = t
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: case neg
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
h : ∃ t, (↑t).Intersecting ∧ s ⊆ t ∧ s ≠ t
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
tactic: push_neg at h
state_before: case neg
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
h : ∃ t, (↑t).Intersecting ∧ s ⊆ t ∧ s ≠ t
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: case neg.intro.intro
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
t : Finset α
ht : (↑t).Intersecting
hst : s ⊆ t ∧ s ≠ t
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
tactic: obtain ⟨t, ht, hst⟩ := h
state_before: case neg.intro.intro
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
t : Finset α
ht : (↑t).Intersecting
hst : s ⊆ t ∧ s ≠ t
⊢ ∃ t, s ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
state_after: case neg.intro.intro
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
t : Finset α
ht : (↑t).Intersecting
hst : s ⊆ t ∧ s ≠ t
⊢ t.card ≤ Fintype.card α / 2
tactic: refine (ih ?_ (_root_.ssubset_iff_subset_ne.2 hst) ht).imp fun u => And.imp_left hst.1.trans
state_before: case neg.intro.intro
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
t : Finset α
ht : (↑t).Intersecting
hst : s ⊆ t ∧ s ≠ t
⊢ t.card ≤ Fintype.card α / 2
state_after: case neg.intro.intro
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
t : Finset α
ht : (↑t).Intersecting
hst : s ⊆ t ∧ s ≠ t
⊢ 2 * t.card ≤ Fintype.card α
tactic: rw [Nat.le_div_iff_mul_le' Nat.two_pos, mul_comm]
state_before: case neg.intro.intro
α : Type u_1
inst✝² : BooleanAlgebra α
inst✝¹ : Nontrivial α
inst✝ : Fintype α
s✝ : Finset α
this : s✝.card ≤ Fintype.card α / 2
s : Finset α
ih :
  ∀ {t₂ : Finset α},
    t₂.card ≤ Fintype.card α / 2 →
      s ⊂ t₂ → (↑t₂).Intersecting → ∃ t, t₂ ⊆ t ∧ 2 * t.card = Fintype.card α ∧ (↑t).Intersecting
_hcard : s.card ≤ Fintype.card α / 2
hs : (↑s).Intersecting
t : Finset α
ht : (↑t).Intersecting
hst : s ⊆ t ∧ s ≠ t
⊢ 2 * t.card ≤ Fintype.card α
state_after: no goals
tactic: exact ht.card_le