Theorem: Multiset.card_filter_le_iff
File: Mathlib/Data/Multiset/Basic.lean

tactic: fconstructor
state_before: α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
⊢ card (filter P s) ≤ n ↔ ∀ s' ≤ s, n < card s' → ∃ a ∈ s', ¬P a
state_after: case mp
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
⊢ card (filter P s) ≤ n → ∀ s' ≤ s, n < card s' → ∃ a ∈ s', ¬P a

case mpr
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
⊢ (∀ s' ≤ s, n < card s' → ∃ a ∈ s', ¬P a) → card (filter P s) ≤ n

tactic: intro H s' hs' s'_card
state_before: case mp
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
⊢ card (filter P s) ≤ n → ∀ s' ≤ s, n < card s' → ∃ a ∈ s', ¬P a
state_after: case mp
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
H : card (filter P s) ≤ n
s' : Multiset α
hs' : s' ≤ s
s'_card : n < card s'
⊢ ∃ a ∈ s', ¬P a

tactic: by_contra! rid
state_before: case mp
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
H : card (filter P s) ≤ n
s' : Multiset α
hs' : s' ≤ s
s'_card : n < card s'
⊢ ∃ a ∈ s', ¬P a
state_after: case mp
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
H : card (filter P s) ≤ n
s' : Multiset α
hs' : s' ≤ s
s'_card : n < card s'
rid : ∀ a ∈ s', P a
⊢ False

tactic: have card := card_le_card (monotone_filter_left P hs') |>.trans H
state_before: case mp
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
H : card (filter P s) ≤ n
s' : Multiset α
hs' : s' ≤ s
s'_card : n < card s'
rid : ∀ a ∈ s', P a
⊢ False
state_after: case mp
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
H : Multiset.card (filter P s) ≤ n
s' : Multiset α
hs' : s' ≤ s
s'_card : n < Multiset.card s'
rid : ∀ a ∈ s', P a
card : Multiset.card (filter P s') ≤ n
⊢ False

tactic: exact s'_card.not_le (filter_eq_self.mpr rid ▸ card)
state_before: case mp
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
H : Multiset.card (filter P s) ≤ n
s' : Multiset α
hs' : s' ≤ s
s'_card : n < Multiset.card s'
rid : ∀ a ∈ s', P a
card : Multiset.card (filter P s') ≤ n
⊢ False
state_after: no goals

tactic: contrapose!
state_before: case mpr
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
⊢ (∀ s' ≤ s, n < card s' → ∃ a ∈ s', ¬P a) → card (filter P s) ≤ n
state_after: case mpr
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
⊢ n < card (filter P s) → ∃ s' ≤ s, n < card s' ∧ ∀ a ∈ s', P a

tactic: exact fun H ↦ ⟨s.filter P, filter_le _ _, H, fun a ha ↦ (mem_filter.mp ha).2⟩
state_before: case mpr
α : Type u_1
β : Type v
γ : Type u_2
p : α → Prop
inst✝¹ : DecidablePred p
s : Multiset α
P : α → Prop
inst✝ : DecidablePred P
n : ℕ
⊢ n < card (filter P s) → ∃ s' ≤ s, n < card s' ∧ ∀ a ∈ s', P a
state_after: no goals