-- Module: Mathlib.Combinatorics.SetFamily.HarrisKleitman
Goal:
α : Type u_1
inst : DecidableEq α
𝒜 ℬ : Finset (Finset α)
s : Finset α
h𝒜 : IsLowerSet (↑𝒜 : Set (Finset α))
hℬ : IsLowerSet (↑ℬ : Set (Finset α))
h𝒜s : ∀ t ∈ 𝒜, t ⊆ s
hℬs : ∀ t ∈ ℬ, t ⊆ s
empty :
  ∀ {𝒜 ℬ : Finset (Finset α)} (h𝒜 : IsLowerSet (↑𝒜 : Set (Finset α))) (hℬ : IsLowerSet (↑ℬ : Set (Finset α)))
    (h𝒜s : ∀ t ∈ 𝒜, t ⊆ ∅) (hℬs : ∀ t ∈ ℬ, t ⊆ ∅), #𝒜 * #ℬ ≤ HPow.hPow (α := ℕ) 2 (card.{u_1} (α := α) ∅) * #(𝒜 ∩ ℬ)
insert :
  ∀ (a : α) (s : Finset α) (hs : a ∉ s)
    (ih :
      ∀ {𝒜 ℬ : Finset (Finset α)} (h𝒜 : IsLowerSet (↑𝒜 : Set (Finset α))) (hℬ : IsLowerSet (↑ℬ : Set (Finset α)))
        (h𝒜s : ∀ t ∈ 𝒜, t ⊆ s) (hℬs : ∀ t ∈ ℬ, t ⊆ s), #𝒜 * #ℬ ≤ HPow.hPow (α := ℕ) 2 #s * #(𝒜 ∩ ℬ))
    {𝒜 ℬ : Finset (Finset α)} (h𝒜 : IsLowerSet (↑𝒜 : Set (Finset α))) (hℬ : IsLowerSet (↑ℬ : Set (Finset α)))
    (h𝒜s : ∀ t ∈ 𝒜, t ⊆ Insert.insert a s) (hℬs : ∀ t ∈ ℬ, t ⊆ Insert.insert a s),
    #𝒜 * #ℬ ≤ HPow.hPow (α := ℕ) 2 #(Insert.insert a s) * #(𝒜 ∩ ℬ)
⊢ #𝒜 * #ℬ ≤ HPow.hPow (α := ℕ) 2 #s * #(𝒜 ∩ ℬ)

Tactic:
induction s using Finset.induction generalizing 𝒜 ℬ with
  | empty =>
    simp_rw [subset_empty, ← subset_singleton_iff', subset_singleton_iff] at h𝒜s hℬs
    obtain rfl | rfl := h𝒜s
    · simp only [card_empty, zero_mul, empty_inter, mul_zero, le_refl]
    obtain rfl | rfl := hℬs
    · simp
    · simp only [card_empty, pow_zero, inter_singleton_of_mem, mem_singleton, card_singleton,
        le_refl]
  | insert a s hs ih =>
  rw [card_insert_of_notMem hs, ← card_memberSubfamily_add_card_nonMemberSubfamily a 𝒜, ←
    card_memberSubfamily_add_card_nonMemberSubfamily a ℬ, add_mul, mul_add, mul_add,
    add_comm (_ * _), add_add_add_comm]
  grw [mul_add_mul_le_mul_add_mul
    (card_le_card h𝒜.memberSubfamily_subset_nonMemberSubfamily) <|
      card_le_card hℬ.memberSubfamily_subset_nonMemberSubfamily, ← two_mul, pow_succ', mul_assoc]
  have h₀ : ∀ 𝒞 : Finset (Finset α), (∀ t ∈ 𝒞, t ⊆ insert a s) →
      ∀ t ∈ 𝒞.nonMemberSubfamily a, t ⊆ s := by
    rintro 𝒞 h𝒞 t ht
    rw [mem_nonMemberSubfamily] at ht
    exact (subset_insert_iff_of_notMem ht.2).1 (h𝒞 _ ht.1)
  have h₁ : ∀ 𝒞 : Finset (Finset α), (∀ t ∈ 𝒞, t ⊆ insert a s) →
      ∀ t ∈ 𝒞.memberSubfamily a, t ⊆ s := by
    rintro 𝒞 h𝒞 t ht
    rw [mem_memberSubfamily] at ht
    exact (subset_insert_iff_of_notMem ht.2).1 ((subset_insert _ _).trans <| h𝒞 _ ht.1)
  gcongr
  refine (add_le_add (ih h𝒜.memberSubfamily hℬ.memberSubfamily (h₁ _ h𝒜s) <| h₁ _ hℬs) <|
    ih h𝒜.nonMemberSubfamily hℬ.nonMemberSubfamily (h₀ _ h𝒜s) <| h₀ _ hℬs).trans_eq ?_
  rw [← mul_add, ← memberSubfamily_inter, ← nonMemberSubfamily_inter,
    card_memberSubfamily_add_card_nonMemberSubfamily]

Premises used: Finset.empty_inter, add_mul, Finset.mem_singleton, le_refl, Finset.card_memberSubfamily_add_card_nonMemberSubfamily, HMul.hMul, Finset.subset_empty, Finset.inter_singleton_of_mem, Finset.card_le_card, MulZeroClass.zero_mul, mul_assoc, Finset.nonMemberSubfamily_inter, two_mul, Finset.memberSubfamily_inter, Insert.insert, add_comm, pow_zero, MulZeroClass.mul_zero, IsLowerSet.memberSubfamily_subset_nonMemberSubfamily, Finset.card_empty, mul_add_mul_le_mul_add_mul, Finset.subset_singleton_iff, Finset.subset_singleton_iff', mul_add, add_add_add_comm, pow_succ', rfl, Finset.card_singleton