[GOAL]
α : Type u_1
β : α → Type u_2
γ : Type u_3
fγ : (a : α) × (β a → γ) → γ
fγ_injective : Function.Injective fγ
a₁ : α
f₁ : β a₁ → WType fun a => β a
a₂ : α
f₂ : β a₂ → WType fun a => β a
h : elim γ fγ (mk a₁ f₁) = elim γ fγ (mk a₂ f₂)
⊢ mk a₁ f₁ = mk a₂ f₂
[PROOFSTEP]
obtain ⟨rfl, h⟩ := Sigma.mk.inj_iff.mp (fγ_injective h)
[GOAL]
case intro
α : Type u_1
β : α → Type u_2
γ : Type u_3
fγ : (a : α) × (β a → γ) → γ
fγ_injective : Function.Injective fγ
a₁ : α
f₁ f₂ : β a₁ → WType fun a => β a
h✝ : elim γ fγ (mk a₁ f₁) = elim γ fγ (mk a₁ f₂)
h : HEq (fun b => elim γ fγ (f₁ b)) fun b => elim γ fγ (f₂ b)
⊢ mk a₁ f₁ = mk a₁ f₂
[PROOFSTEP]
congr with x
[GOAL]
case intro.e_f.h
α : Type u_1
β : α → Type u_2
γ : Type u_3
fγ : (a : α) × (β a → γ) → γ
fγ_injective : Function.Injective fγ
a₁ : α
f₁ f₂ : β a₁ → WType fun a => β a
h✝ : elim γ fγ (mk a₁ f₁) = elim γ fγ (mk a₁ f₂)
h : HEq (fun b => elim γ fγ (f₁ b)) fun b => elim γ fγ (f₂ b)
x : β a₁
⊢ f₁ x = f₂ x
[PROOFSTEP]
exact elim_injective γ fγ fγ_injective (congr_fun (eq_of_heq h) x : _)
[GOAL]
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
⊢ ¬Finite (WType β)
[PROOFSTEP]
intro hf
[GOAL]
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
⊢ False
[PROOFSTEP]
have hba : b ≠ a := fun h => ha.elim (IsEmpty.elim' (show IsEmpty (β a) from h ▸ he))
[GOAL]
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
⊢ False
[PROOFSTEP]
refine'
  not_injective_infinite_finite
    (fun n : ℕ => show WType β from Nat.recOn n ⟨b, IsEmpty.elim' he⟩ fun _ ih => ⟨a, fun _ => ih⟩) _
[GOAL]
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
⊢ Function.Injective fun n =>
    let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
    this
[PROOFSTEP]
intro n m h
[GOAL]
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
n m : ℕ
h :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m
⊢ n = m
[PROOFSTEP]
induction' n with n ih generalizing m
[GOAL]
case zero
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
n m✝ : ℕ
h✝ :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m✝
m : ℕ
h :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      Nat.zero =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m
⊢ Nat.zero = m
[PROOFSTEP]
cases' m with m
[GOAL]
case zero.zero
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
n m : ℕ
h✝ :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m
h :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      Nat.zero =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      Nat.zero
⊢ Nat.zero = Nat.zero
[PROOFSTEP]
simp_all
[GOAL]
case zero.succ
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
n m✝ : ℕ
h✝ :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m✝
m : ℕ
h :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      Nat.zero =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      (Nat.succ m)
⊢ Nat.zero = Nat.succ m
[PROOFSTEP]
simp_all
[GOAL]
case succ
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
n✝ m✝ : ℕ
h✝ :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n✝ =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m✝
n : ℕ
ih :
  ∀ ⦃m : ℕ⦄,
    (fun n =>
            let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
            this)
          n =
        (fun n =>
            let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
            this)
          m →
      n = m
m : ℕ
h :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      (Nat.succ n) =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m
⊢ Nat.succ n = m
[PROOFSTEP]
cases' m with m
[GOAL]
case succ.zero
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
n✝ m : ℕ
h✝ :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n✝ =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m
n : ℕ
ih :
  ∀ ⦃m : ℕ⦄,
    (fun n =>
            let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
            this)
          n =
        (fun n =>
            let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
            this)
          m →
      n = m
h :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      (Nat.succ n) =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      Nat.zero
⊢ Nat.succ n = Nat.zero
[PROOFSTEP]
simp_all
[GOAL]
case succ.succ
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
n✝ m✝ : ℕ
h✝ :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n✝ =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m✝
n : ℕ
ih :
  ∀ ⦃m : ℕ⦄,
    (fun n =>
            let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
            this)
          n =
        (fun n =>
            let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
            this)
          m →
      n = m
m : ℕ
h :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      (Nat.succ n) =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      (Nat.succ m)
⊢ Nat.succ n = Nat.succ m
[PROOFSTEP]
refine' congr_arg Nat.succ (ih _)
[GOAL]
case succ.succ
α : Type u_1
β : α → Type u_2
a b : α
ha : Nonempty (β a)
he : IsEmpty (β b)
hf : Finite (WType β)
hba : b ≠ a
n✝ m✝ : ℕ
h✝ :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n✝ =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m✝
n : ℕ
ih :
  ∀ ⦃m : ℕ⦄,
    (fun n =>
            let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
            this)
          n =
        (fun n =>
            let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
            this)
          m →
      n = m
m : ℕ
h :
  (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      (Nat.succ n) =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      (Nat.succ m)
⊢ (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      n =
    (fun n =>
        let_fun this := Nat.recOn n (mk b (IsEmpty.elim' he)) fun x ih => mk a fun x => ih;
        this)
      m
[PROOFSTEP]
simp_all [Function.funext_iff]
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝ : (a : α) → Fintype (β a)
t : WType β
⊢ 0 < depth t
[PROOFSTEP]
cases t
[GOAL]
case mk
α : Type u_1
β : α → Type u_2
inst✝ : (a : α) → Fintype (β a)
a✝ : α
f✝ : β a✝ → WType β
⊢ 0 < depth (mk a✝ f✝)
[PROOFSTEP]
apply Nat.succ_pos
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝¹ : (a : α) → Fintype (β a)
inst✝ : (a : α) → Encodable (β a)
f : WType.WType' β 0 → Empty :=
  fun x =>
    match x with
    | { val := x, property := h } => False.elim (_ : False)
⊢ Empty → WType.WType' β 0
[PROOFSTEP]
intro x
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝¹ : (a : α) → Fintype (β a)
inst✝ : (a : α) → Encodable (β a)
f : WType.WType' β 0 → Empty :=
  fun x =>
    match x with
    | { val := x, property := h } => False.elim (_ : False)
x : Empty
⊢ WType.WType' β 0
[PROOFSTEP]
cases x
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝¹ : (a : α) → Fintype (β a)
inst✝ : (a : α) → Encodable (β a)
n : ℕ
t : WType β
h : depth t ≤ n + 1
⊢ (a : α) × (β a → WType.WType' β n)
[PROOFSTEP]
cases' t with a f
[GOAL]
case mk
α : Type u_1
β : α → Type u_2
inst✝¹ : (a : α) → Fintype (β a)
inst✝ : (a : α) → Encodable (β a)
n : ℕ
a : α
f : β a → WType β
h : depth (mk a f) ≤ n + 1
⊢ (a : α) × (β a → WType.WType' β n)
[PROOFSTEP]
have h₀ : ∀ i : β a, WType.depth (f i) ≤ n := fun i =>
  Nat.le_of_lt_succ (lt_of_lt_of_le (WType.depth_lt_depth_mk a f i) h)
[GOAL]
case mk
α : Type u_1
β : α → Type u_2
inst✝¹ : (a : α) → Fintype (β a)
inst✝ : (a : α) → Encodable (β a)
n : ℕ
a : α
f : β a → WType β
h : depth (mk a f) ≤ n + 1
h₀ : ∀ (i : β a), depth (f i) ≤ n
⊢ (a : α) × (β a → WType.WType' β n)
[PROOFSTEP]
exact ⟨a, fun i : β a => ⟨f i, h₀ i⟩⟩
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝² : (a : α) → Fintype (β a)
inst✝¹ : (a : α) → Encodable (β a)
inst✝ : Encodable α
n : ℕ
h : Encodable (WType.WType' β n)
⊢ ∀ (b : WType.WType' β (n + 1)), WType.finv n (WType.f n b) = b
[PROOFSTEP]
rintro ⟨⟨_, _⟩, _⟩
[GOAL]
case mk.mk
α : Type u_1
β : α → Type u_2
inst✝² : (a : α) → Fintype (β a)
inst✝¹ : (a : α) → Encodable (β a)
inst✝ : Encodable α
n : ℕ
h : Encodable (WType.WType' β n)
a✝ : α
f✝ : β a✝ → WType β
property✝ : depth (mk a✝ f✝) ≤ n + 1
⊢ WType.finv n (WType.f n { val := mk a✝ f✝, property := property✝ }) = { val := mk a✝ f✝, property := property✝ }
[PROOFSTEP]
rfl
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝² : (a : α) → Fintype (β a)
inst✝¹ : (a : α) → Encodable (β a)
inst✝ : Encodable α
⊢ Encodable (WType β)
[PROOFSTEP]
haveI h' : ∀ n, Encodable (WType' β n) := fun n => Nat.rec encodable_zero encodable_succ n
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝² : (a : α) → Fintype (β a)
inst✝¹ : (a : α) → Encodable (β a)
inst✝ : Encodable α
h' : (n : ℕ) → Encodable (WType.WType' β n)
⊢ Encodable (WType β)
[PROOFSTEP]
let f : WType β → Σ n, WType' β n := fun t => ⟨t.depth, ⟨t, le_rfl⟩⟩
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝² : (a : α) → Fintype (β a)
inst✝¹ : (a : α) → Encodable (β a)
inst✝ : Encodable α
h' : (n : ℕ) → Encodable (WType.WType' β n)
f : WType β → (n : ℕ) × WType.WType' β n :=
  fun t => { fst := depth t, snd := { val := t, property := (_ : depth t ≤ depth t) } }
⊢ Encodable (WType β)
[PROOFSTEP]
let finv : (Σ n, WType' β n) → WType β := fun p => p.2.1
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝² : (a : α) → Fintype (β a)
inst✝¹ : (a : α) → Encodable (β a)
inst✝ : Encodable α
h' : (n : ℕ) → Encodable (WType.WType' β n)
f : WType β → (n : ℕ) × WType.WType' β n :=
  fun t => { fst := depth t, snd := { val := t, property := (_ : depth t ≤ depth t) } }
finv : (n : ℕ) × WType.WType' β n → WType β := fun p => ↑p.snd
⊢ Encodable (WType β)
[PROOFSTEP]
have : ∀ t, finv (f t) = t := fun t => rfl
[GOAL]
α : Type u_1
β : α → Type u_2
inst✝² : (a : α) → Fintype (β a)
inst✝¹ : (a : α) → Encodable (β a)
inst✝ : Encodable α
h' : (n : ℕ) → Encodable (WType.WType' β n)
f : WType β → (n : ℕ) × WType.WType' β n :=
  fun t => { fst := depth t, snd := { val := t, property := (_ : depth t ≤ depth t) } }
finv : (n : ℕ) × WType.WType' β n → WType β := fun p => ↑p.snd
this : ∀ (t : WType β), finv (f t) = t
⊢ Encodable (WType β)
[PROOFSTEP]
exact Encodable.ofLeftInverse f finv this


[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCancelAddCommMonoid M
hf : ∀ (a : α), a ∈ s → f a ∈ t
hb : card t • b < ∑ x in s, w x
⊢ ∑ i in t, b < ∑ i in t, ∑ x in filter (fun x => f x = i) s, w x
[PROOFSTEP]
simpa only [sum_fiberwise_of_maps_to hf, sum_const]
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCancelAddCommMonoid M
ht : ∀ (y : β), ¬y ∈ t → ∑ x in filter (fun x => f x = y) s, w x ≤ 0
hb : card t • b < ∑ x in s, w x
⊢ ∑ _y in t, b < ∑ x in s, w x
[PROOFSTEP]
simpa
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCancelAddCommMonoid M
hf : ∀ (a : α), a ∈ s → f a ∈ t
ht : Finset.Nonempty t
hb : card t • b ≤ ∑ x in s, w x
⊢ ∑ i in t, b ≤ ∑ i in t, ∑ x in filter (fun x => f x = i) s, w x
[PROOFSTEP]
simpa only [sum_fiberwise_of_maps_to hf, sum_const]
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCancelAddCommMonoid M
hf : ∀ (y : β), ¬y ∈ t → ∑ x in filter (fun x => f x = y) s, w x ≤ 0
ht : Finset.Nonempty t
hb : card t • b ≤ ∑ x in s, w x
⊢ ∑ _y in t, b ≤ ∑ x in s, w x
[PROOFSTEP]
simpa
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCommSemiring M
hf : ∀ (a : α), a ∈ s → f a ∈ t
ht : card t • b < ↑(card s)
⊢ ∃ y, y ∈ t ∧ b < ↑(card (filter (fun x => f x = y) s))
[PROOFSTEP]
simp_rw [cast_card] at ht ⊢
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCommSemiring M
hf : ∀ (a : α), a ∈ s → f a ∈ t
ht : card t • b < ∑ a in s, 1
⊢ ∃ y, y ∈ t ∧ b < ∑ a in filter (fun x => f x = y) s, 1
[PROOFSTEP]
exact exists_lt_sum_fiber_of_maps_to_of_nsmul_lt_sum hf ht
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCommSemiring M
ht : ↑(card s) < card t • b
⊢ ∃ y, y ∈ t ∧ ↑(card (filter (fun x => f x = y) s)) < b
[PROOFSTEP]
simp_rw [cast_card] at ht ⊢
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCommSemiring M
ht : ∑ a in s, 1 < card t • b
⊢ ∃ y, y ∈ t ∧ ∑ a in filter (fun x => f x = y) s, 1 < b
[PROOFSTEP]
exact exists_sum_fiber_lt_of_sum_fiber_nonneg_of_sum_lt_nsmul (fun _ _ => sum_nonneg fun _ _ => zero_le_one) ht
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCommSemiring M
hf : ∀ (a : α), a ∈ s → f a ∈ t
ht : Finset.Nonempty t
hb : card t • b ≤ ↑(card s)
⊢ ∃ y, y ∈ t ∧ b ≤ ↑(card (filter (fun x => f x = y) s))
[PROOFSTEP]
simp_rw [cast_card] at hb ⊢
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCommSemiring M
hf : ∀ (a : α), a ∈ s → f a ∈ t
ht : Finset.Nonempty t
hb : card t • b ≤ ∑ a in s, 1
⊢ ∃ y, y ∈ t ∧ b ≤ ∑ a in filter (fun x => f x = y) s, 1
[PROOFSTEP]
exact exists_le_sum_fiber_of_maps_to_of_nsmul_le_sum hf ht hb
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCommSemiring M
ht : Finset.Nonempty t
hb : ↑(card s) ≤ card t • b
⊢ ∃ y, y ∈ t ∧ ↑(card (filter (fun x => f x = y) s)) ≤ b
[PROOFSTEP]
simp_rw [cast_card] at hb ⊢
[GOAL]
α : Type u
β : Type v
M : Type w
inst✝¹ : DecidableEq β
s : Finset α
t : Finset β
f : α → β
w : α → M
b : M
n : ℕ
inst✝ : LinearOrderedCommSemiring M
ht : Finset.Nonempty t
hb : ∑ a in s, 1 ≤ card t • b
⊢ ∃ y, y ∈ t ∧ ∑ a in filter (fun x => f x = y) s, 1 ≤ b
[PROOFSTEP]
refine' exists_sum_fiber_le_of_sum_fiber_nonneg_of_sum_le_nsmul (fun _ _ => sum_nonneg fun _ _ => zero_le_one) ht hb


[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
⊢ IsClique G s ↔ induce s G = ⊤
[PROOFSTEP]
rw [isClique_iff]
[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
⊢ Set.Pairwise s G.Adj ↔ induce s G = ⊤
[PROOFSTEP]
constructor
[GOAL]
case mp
α : Type u_1
G H : SimpleGraph α
s t : Set α
⊢ Set.Pairwise s G.Adj → induce s G = ⊤
[PROOFSTEP]
intro h
[GOAL]
case mp
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : Set.Pairwise s G.Adj
⊢ induce s G = ⊤
[PROOFSTEP]
ext ⟨v, hv⟩ ⟨w, hw⟩
[GOAL]
case mp.Adj.h.mk.h.mk.a
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : Set.Pairwise s G.Adj
v : α
hv : v ∈ s
w : α
hw : w ∈ s
⊢ Adj (induce s G) { val := v, property := hv } { val := w, property := hw } ↔
    Adj ⊤ { val := v, property := hv } { val := w, property := hw }
[PROOFSTEP]
simp only [comap_Adj, Subtype.coe_mk, top_adj, Ne.def, Subtype.mk_eq_mk]
[GOAL]
case mp.Adj.h.mk.h.mk.a
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : Set.Pairwise s G.Adj
v : α
hv : v ∈ s
w : α
hw : w ∈ s
⊢ Adj G (↑(Function.Embedding.subtype fun x => x ∈ s) { val := v, property := hv })
      (↑(Function.Embedding.subtype fun x => x ∈ s) { val := w, property := hw }) ↔
    ¬v = w
[PROOFSTEP]
exact ⟨Adj.ne, h hv hw⟩
[GOAL]
case mpr
α : Type u_1
G H : SimpleGraph α
s t : Set α
⊢ induce s G = ⊤ → Set.Pairwise s G.Adj
[PROOFSTEP]
intro h v hv w hw hne
[GOAL]
case mpr
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : induce s G = ⊤
v : α
hv : v ∈ s
w : α
hw : w ∈ s
hne : v ≠ w
⊢ Adj G v w
[PROOFSTEP]
have h2 : (G.induce s).Adj ⟨v, hv⟩ ⟨w, hw⟩ = _ := rfl
[GOAL]
case mpr
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : induce s G = ⊤
v : α
hv : v ∈ s
w : α
hw : w ∈ s
hne : v ≠ w
h2 :
  Adj (induce s G) { val := v, property := hv } { val := w, property := hw } =
    Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
⊢ Adj G v w
[PROOFSTEP]
conv_lhs at h2 => rw [h]
[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : induce s G = ⊤
v : α
hv : v ∈ s
w : α
hw : w ∈ s
hne : v ≠ w
h2 :
  Adj (induce s G) { val := v, property := hv } { val := w, property := hw } =
    Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
| Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
[PROOFSTEP]
rw [h]
[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : induce s G = ⊤
v : α
hv : v ∈ s
w : α
hw : w ∈ s
hne : v ≠ w
h2 :
  Adj (induce s G) { val := v, property := hv } { val := w, property := hw } =
    Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
| Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
[PROOFSTEP]
rw [h]
[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : induce s G = ⊤
v : α
hv : v ∈ s
w : α
hw : w ∈ s
hne : v ≠ w
h2 :
  Adj (induce s G) { val := v, property := hv } { val := w, property := hw } =
    Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
| Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
[PROOFSTEP]
rw [h]
[GOAL]
case mpr
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : induce s G = ⊤
v : α
hv : v ∈ s
w : α
hw : w ∈ s
hne : v ≠ w
h2 :
  Adj ⊤ { val := v, property := hv } { val := w, property := hw } =
    Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
⊢ Adj G v w
[PROOFSTEP]
simp only [top_adj, ne_eq, Subtype.mk.injEq, eq_iff_iff] at h2
[GOAL]
case mpr
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : induce s G = ⊤
v : α
hv : v ∈ s
w : α
hw : w ∈ s
hne : v ≠ w
h2 : ¬v = w ↔ Adj (induce s G) { val := v, property := hv } { val := w, property := hw }
⊢ Adj G v w
[PROOFSTEP]
exact h2.1 hne
[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : G ≤ H
⊢ IsClique G s → IsClique H s
[PROOFSTEP]
simp_rw [isClique_iff]
[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : G ≤ H
⊢ Set.Pairwise s G.Adj → Set.Pairwise s H.Adj
[PROOFSTEP]
exact Set.Pairwise.mono' h
[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : t ⊆ s
⊢ IsClique G s → IsClique G t
[PROOFSTEP]
simp_rw [isClique_iff]
[GOAL]
α : Type u_1
G H : SimpleGraph α
s t : Set α
h : t ⊆ s
⊢ Set.Pairwise s G.Adj → Set.Pairwise t G.Adj
[PROOFSTEP]
exact Set.Pairwise.mono h
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
h : G ≤ H
⊢ IsNClique G n s → IsNClique H n s
[PROOFSTEP]
simp_rw [isNClique_iff]
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
h : G ≤ H
⊢ IsClique G ↑s ∧ Finset.card s = n → IsClique H ↑s ∧ Finset.card s = n
[PROOFSTEP]
exact And.imp_left (IsClique.mono h)
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
⊢ IsNClique ⊥ n s ↔ n ≤ 1 ∧ Finset.card s = n
[PROOFSTEP]
rw [isNClique_iff, isClique_bot_iff]
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
⊢ Set.Subsingleton ↑s ∧ Finset.card s = n ↔ n ≤ 1 ∧ Finset.card s = n
[PROOFSTEP]
refine' and_congr_left _
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
⊢ Finset.card s = n → (Set.Subsingleton ↑s ↔ n ≤ 1)
[PROOFSTEP]
rintro rfl
[GOAL]
α : Type u_1
G H : SimpleGraph α
s : Finset α
⊢ Set.Subsingleton ↑s ↔ Finset.card s ≤ 1
[PROOFSTEP]
exact card_le_one.symm
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
⊢ IsNClique G 3 {a, b, c} ↔ Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
simp only [isNClique_iff, isClique_iff, Set.pairwise_insert_of_symmetric G.symm, coe_insert]
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
by_cases hab : a = b
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : a = b
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
by_cases hbc : b = c
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : ¬a = b
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
by_cases hbc : b = c
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : a = b
hbc : b = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
by_cases hac : a = c
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : a = b
hbc : ¬b = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
by_cases hac : a = c
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : ¬a = b
hbc : b = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
by_cases hac : a = c
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : ¬a = b
hbc : ¬b = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
by_cases hac : a = c
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : a = b
hbc : b = c
hac : a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
subst_vars
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : a = b
hbc : b = c
hac : ¬a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
subst_vars
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : a = b
hbc : ¬b = c
hac : a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
subst_vars
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : a = b
hbc : ¬b = c
hac : ¬a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
subst_vars
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : ¬a = b
hbc : b = c
hac : a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
subst_vars
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : ¬a = b
hbc : b = c
hac : ¬a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
subst_vars
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : ¬a = b
hbc : ¬b = c
hac : a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
subst_vars
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : ¬a = b
hbc : ¬b = c
hac : ¬a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
subst_vars
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
c : α
hac : c = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b : α), b ∈ ↑{c} → c ≠ b → Adj G c b) ∧
        ∀ (b : α), b ∈ insert c ↑{c} → c ≠ b → Adj G c b) ∧
      Finset.card {c, c, c} = 3 ↔
    Adj G c c ∧ Adj G c c ∧ Adj G c c
[PROOFSTEP]
simp [G.ne_of_adj, and_rotate, *]
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
c : α
hac : ¬c = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b : α), b ∈ ↑{c} → c ≠ b → Adj G c b) ∧
        ∀ (b : α), b ∈ insert c ↑{c} → c ≠ b → Adj G c b) ∧
      Finset.card {c, c, c} = 3 ↔
    Adj G c c ∧ Adj G c c ∧ Adj G c c
[PROOFSTEP]
simp [G.ne_of_adj, and_rotate, *]
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
c : α
hbc : ¬c = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b : α), b ∈ ↑{c} → c ≠ b → Adj G c b) ∧
        ∀ (b : α), b ∈ insert c ↑{c} → c ≠ b → Adj G c b) ∧
      Finset.card {c, c, c} = 3 ↔
    Adj G c c ∧ Adj G c c ∧ Adj G c c
[PROOFSTEP]
simp [G.ne_of_adj, and_rotate, *]
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
b c : α
hbc hac : ¬b = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
      Finset.card {b, b, c} = 3 ↔
    Adj G b b ∧ Adj G b c ∧ Adj G b c
[PROOFSTEP]
simp [G.ne_of_adj, and_rotate, *]
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
c : α
hab : ¬c = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b : α), b ∈ ↑{c} → c ≠ b → Adj G c b) ∧
        ∀ (b : α), b ∈ insert c ↑{c} → c ≠ b → Adj G c b) ∧
      Finset.card {c, c, c} = 3 ↔
    Adj G c c ∧ Adj G c c ∧ Adj G c c
[PROOFSTEP]
simp [G.ne_of_adj, and_rotate, *]
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a c : α
hac hab : ¬a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b : α), b ∈ ↑{c} → c ≠ b → Adj G c b) ∧
        ∀ (b : α), b ∈ insert c ↑{c} → a ≠ b → Adj G a b) ∧
      Finset.card {a, c, c} = 3 ↔
    Adj G a c ∧ Adj G a c ∧ Adj G c c
[PROOFSTEP]
simp [G.ne_of_adj, and_rotate, *]
[GOAL]
case pos
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
b c : α
hbc : ¬b = c
hab : ¬c = b
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → c ≠ b_1 → Adj G c b_1) ∧
      Finset.card {c, b, c} = 3 ↔
    Adj G c b ∧ Adj G c c ∧ Adj G b c
[PROOFSTEP]
simp [G.ne_of_adj, and_rotate, *]
[GOAL]
case neg
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
hab : ¬a = b
hbc : ¬b = c
hac : ¬a = c
⊢ ((Set.Pairwise (↑{c}) G.Adj ∧ ∀ (b_1 : α), b_1 ∈ ↑{c} → b ≠ b_1 → Adj G b b_1) ∧
        ∀ (b_1 : α), b_1 ∈ insert b ↑{c} → a ≠ b_1 → Adj G a b_1) ∧
      Finset.card {a, b, c} = 3 ↔
    Adj G a b ∧ Adj G a c ∧ Adj G b c
[PROOFSTEP]
simp [G.ne_of_adj, and_rotate, *]
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
⊢ IsNClique G 3 s ↔ ∃ a b c, Adj G a b ∧ Adj G a c ∧ Adj G b c ∧ s = {a, b, c}
[PROOFSTEP]
refine' ⟨fun h ↦ _, _⟩
[GOAL]
case refine'_1
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
h : IsNClique G 3 s
⊢ ∃ a b c, Adj G a b ∧ Adj G a c ∧ Adj G b c ∧ s = {a, b, c}
[PROOFSTEP]
obtain ⟨a, b, c, -, -, -, hs⟩ := card_eq_three.1 h.card_eq
[GOAL]
case refine'_1.intro.intro.intro.intro.intro.intro
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a✝ b✝ c✝ : α
h : IsNClique G 3 s
a b c : α
hs : s = {a, b, c}
⊢ ∃ a b c, Adj G a b ∧ Adj G a c ∧ Adj G b c ∧ s = {a, b, c}
[PROOFSTEP]
refine' ⟨a, b, c, _⟩
[GOAL]
case refine'_1.intro.intro.intro.intro.intro.intro
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a✝ b✝ c✝ : α
h : IsNClique G 3 s
a b c : α
hs : s = {a, b, c}
⊢ Adj G a b ∧ Adj G a c ∧ Adj G b c ∧ s = {a, b, c}
[PROOFSTEP]
rwa [hs, eq_self_iff_true, and_true, is3Clique_triple_iff.symm, ← hs]
[GOAL]
case refine'_2
α : Type u_1
G H : SimpleGraph α
n : ℕ
s : Finset α
inst✝ : DecidableEq α
a b c : α
⊢ (∃ a b c, Adj G a b ∧ Adj G a c ∧ Adj G b c ∧ s = {a, b, c}) → IsNClique G 3 s
[PROOFSTEP]
rintro ⟨a, b, c, hab, hbc, hca, rfl⟩
[GOAL]
case refine'_2.intro.intro.intro.intro.intro.intro
α : Type u_1
G H : SimpleGraph α
n : ℕ
inst✝ : DecidableEq α
a✝ b✝ c✝ a b c : α
hab : Adj G a b
hbc : Adj G a c
hca : Adj G b c
⊢ IsNClique G 3 {a, b, c}
[PROOFSTEP]
exact is3Clique_triple_iff.2 ⟨hab, hbc, hca⟩
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
f : ⊤ ↪g G
⊢ ¬CliqueFree G n
[PROOFSTEP]
simp only [CliqueFree, isNClique_iff, isClique_iff_induce_eq, not_forall, Classical.not_not]
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
f : ⊤ ↪g G
⊢ ∃ x, induce (↑x) G = ⊤ ∧ Finset.card x = n
[PROOFSTEP]
use Finset.univ.map f.toEmbedding
[GOAL]
case h
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
f : ⊤ ↪g G
⊢ induce (↑(map f.toEmbedding univ)) G = ⊤ ∧ Finset.card (map f.toEmbedding univ) = n
[PROOFSTEP]
simp only [card_map, Finset.card_fin, eq_self_iff_true, and_true_iff]
[GOAL]
case h
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
f : ⊤ ↪g G
⊢ induce (↑(map f.toEmbedding univ)) G = ⊤
[PROOFSTEP]
ext ⟨v, hv⟩ ⟨w, hw⟩
[GOAL]
case h.Adj.h.mk.h.mk.a
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
f : ⊤ ↪g G
v : α
hv : v ∈ ↑(map f.toEmbedding univ)
w : α
hw : w ∈ ↑(map f.toEmbedding univ)
⊢ Adj (induce (↑(map f.toEmbedding univ)) G) { val := v, property := hv } { val := w, property := hw } ↔
    Adj ⊤ { val := v, property := hv } { val := w, property := hw }
[PROOFSTEP]
simp only [coe_map, Set.mem_image, coe_univ, Set.mem_univ, true_and_iff] at hv hw
[GOAL]
case h.Adj.h.mk.h.mk.a
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
f : ⊤ ↪g G
v : α
hv✝ : v ∈ ↑(map f.toEmbedding univ)
w : α
hw✝ : w ∈ ↑(map f.toEmbedding univ)
hv : ∃ x, ↑f.toEmbedding x = v
hw : ∃ x, ↑f.toEmbedding x = w
⊢ Adj (induce (↑(map f.toEmbedding univ)) G) { val := v, property := hv✝ } { val := w, property := hw✝ } ↔
    Adj ⊤ { val := v, property := hv✝ } { val := w, property := hw✝ }
[PROOFSTEP]
obtain ⟨v', rfl⟩ := hv
[GOAL]
case h.Adj.h.mk.h.mk.a.intro
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
f : ⊤ ↪g G
w : α
hw✝ : w ∈ ↑(map f.toEmbedding univ)
hw : ∃ x, ↑f.toEmbedding x = w
v' : Fin n
hv : ↑f.toEmbedding v' ∈ ↑(map f.toEmbedding univ)
⊢ Adj (induce (↑(map f.toEmbedding univ)) G) { val := ↑f.toEmbedding v', property := hv }
      { val := w, property := hw✝ } ↔
    Adj ⊤ { val := ↑f.toEmbedding v', property := hv } { val := w, property := hw✝ }
[PROOFSTEP]
obtain ⟨w', rfl⟩ := hw
[GOAL]
case h.Adj.h.mk.h.mk.a.intro.intro
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
f : ⊤ ↪g G
v' : Fin n
hv : ↑f.toEmbedding v' ∈ ↑(map f.toEmbedding univ)
w' : Fin n
hw : ↑f.toEmbedding w' ∈ ↑(map f.toEmbedding univ)
⊢ Adj (induce (↑(map f.toEmbedding univ)) G) { val := ↑f.toEmbedding v', property := hv }
      { val := ↑f.toEmbedding w', property := hw } ↔
    Adj ⊤ { val := ↑f.toEmbedding v', property := hv } { val := ↑f.toEmbedding w', property := hw }
[PROOFSTEP]
simp only [coe_sort_coe, RelEmbedding.coe_toEmbedding, comap_Adj, Function.Embedding.coe_subtype, f.map_adj_iff,
  top_adj, ne_eq, Subtype.mk.injEq, RelEmbedding.inj]
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
h : ¬CliqueFree G n
⊢ ⊤ ↪g G
[PROOFSTEP]
simp only [CliqueFree, isNClique_iff, isClique_iff_induce_eq, not_forall, Classical.not_not] at h
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
h : ∃ x, induce (↑x) G = ⊤ ∧ Finset.card x = n
⊢ ⊤ ↪g G
[PROOFSTEP]
obtain ⟨ha, hb⟩ := h.choose_spec
[GOAL]
case intro
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
h : ∃ x, induce (↑x) G = ⊤ ∧ Finset.card x = n
ha : induce (↑(Exists.choose h)) G = ⊤
hb : Finset.card (Exists.choose h) = n
⊢ ⊤ ↪g G
[PROOFSTEP]
have : (⊤ : SimpleGraph (Fin h.choose.card)) ≃g (⊤ : SimpleGraph h.choose) :=
  by
  apply Iso.completeGraph
  simpa using (Fintype.equivFin h.choose).symm
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
h : ∃ x, induce (↑x) G = ⊤ ∧ Finset.card x = n
ha : induce (↑(Exists.choose h)) G = ⊤
hb : Finset.card (Exists.choose h) = n
⊢ ⊤ ≃g ⊤
[PROOFSTEP]
apply Iso.completeGraph
[GOAL]
case f
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
h : ∃ x, induce (↑x) G = ⊤ ∧ Finset.card x = n
ha : induce (↑(Exists.choose h)) G = ⊤
hb : Finset.card (Exists.choose h) = n
⊢ Fin (Finset.card (Exists.choose h)) ≃ { x // x ∈ Exists.choose h }
[PROOFSTEP]
simpa using (Fintype.equivFin h.choose).symm
[GOAL]
case intro
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
h : ∃ x, induce (↑x) G = ⊤ ∧ Finset.card x = n
ha : induce (↑(Exists.choose h)) G = ⊤
hb : Finset.card (Exists.choose h) = n
this : ⊤ ≃g ⊤
⊢ ⊤ ↪g G
[PROOFSTEP]
rw [← ha] at this
[GOAL]
case intro
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
h : ∃ x, induce (↑x) G = ⊤ ∧ Finset.card x = n
ha : induce (↑(Exists.choose h)) G = ⊤
hb : Finset.card (Exists.choose h) = n
this : ⊤ ≃g induce (↑(Exists.choose h)) G
⊢ ⊤ ↪g G
[PROOFSTEP]
convert (Embedding.induce ↑h.choose.toSet).comp this.toEmbedding
[GOAL]
case h.e'_1.h.e'_1
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
h : ∃ x, induce (↑x) G = ⊤ ∧ Finset.card x = n
ha : induce (↑(Exists.choose h)) G = ⊤
hb : Finset.card (Exists.choose h) = n
this : ⊤ ≃g induce (↑(Exists.choose h)) G
⊢ n = Finset.card (Exists.choose h)
[PROOFSTEP]
exact hb.symm
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n✝ : ℕ
s : Finset α
n : ℕ
⊢ CliqueFree G n ↔ IsEmpty (⊤ ↪g G)
[PROOFSTEP]
rw [← not_iff_not, not_cliqueFree_iff, not_isEmpty_iff]
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
inst✝ : Fintype α
f : ⊤ ↪g G
⊢ ¬CliqueFree G (Fintype.card α)
[PROOFSTEP]
rw [not_cliqueFree_iff]
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
inst✝ : Fintype α
f : ⊤ ↪g G
⊢ Nonempty (⊤ ↪g G)
[PROOFSTEP]
exact ⟨(Iso.completeGraph (Fintype.equivFin α)).symm.toEmbedding.trans f⟩
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
h : 2 ≤ n
⊢ CliqueFree ⊥ n
[PROOFSTEP]
intro t ht
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
h : 2 ≤ n
t : Finset α
ht : IsNClique ⊥ n t
⊢ False
[PROOFSTEP]
have := le_trans h (isNClique_bot_iff.1 ht).1
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
h : 2 ≤ n
t : Finset α
ht : IsNClique ⊥ n t
this : 2 ≤ 1
⊢ False
[PROOFSTEP]
simp only at this
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
h : m ≤ n
⊢ CliqueFree G m → CliqueFree G n
[PROOFSTEP]
intro hG s hs
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s✝ : Finset α
h : m ≤ n
hG : CliqueFree G m
s : Finset α
hs : IsNClique G n s
⊢ False
[PROOFSTEP]
obtain ⟨t, hts, ht⟩ := s.exists_smaller_set _ (h.trans hs.card_eq.ge)
[GOAL]
case intro.intro
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s✝ : Finset α
h : m ≤ n
hG : CliqueFree G m
s : Finset α
hs : IsNClique G n s
t : Finset α
hts : t ⊆ s
ht : Finset.card t = m
⊢ False
[PROOFSTEP]
exact hG _ ⟨hs.clique.subset hts, ht⟩
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
inst✝ : Fintype α
hc : Fintype.card α < n
⊢ CliqueFree G n
[PROOFSTEP]
by_contra h
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
inst✝ : Fintype α
hc : Fintype.card α < n
h : ¬CliqueFree G n
⊢ False
[PROOFSTEP]
refine' Nat.lt_le_antisymm hc _
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
inst✝ : Fintype α
hc : Fintype.card α < n
h : ¬CliqueFree G n
⊢ n ≤ Fintype.card α
[PROOFSTEP]
rw [cliqueFree_iff, not_isEmpty_iff] at h
[GOAL]
α : Type u_1
G H : SimpleGraph α
m n : ℕ
s : Finset α
inst✝ : Fintype α
hc : Fintype.card α < n
h : Nonempty (⊤ ↪g G)
⊢ n ≤ Fintype.card α
[PROOFSTEP]
simpa only [Fintype.card_fin] using Fintype.card_le_of_embedding h.some.toEmbedding
[GOAL]
α : Type u_1
G H : SimpleGraph α
n : ℕ
a b c : α
s : Finset α
⊢ cliqueSet G n = ∅ ↔ CliqueFree G n
[PROOFSTEP]
simp_rw [CliqueFree, Set.eq_empty_iff_forall_not_mem, mem_cliqueSet_iff]
[GOAL]
α : Type u_1
G H : SimpleGraph α
inst✝² : Fintype α
inst✝¹ : DecidableEq α
inst✝ : DecidableRel G.Adj
n : ℕ
a b c : α
s : Finset α
⊢ cliqueFinset G n = ∅ ↔ CliqueFree G n
[PROOFSTEP]
simp_rw [CliqueFree, eq_empty_iff_forall_not_mem, mem_cliqueFinset_iff]


[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
⊢ HEq (cons (a' ::ₘ m) a b (cons m a' b' f)) (cons (a ::ₘ m) a' b' (cons m a b f))
[PROOFSTEP]
apply hfunext rfl
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
⊢ ∀ (a_1 a'_1 : α),
    HEq a_1 a'_1 → HEq (cons (a' ::ₘ m) a b (cons m a' b' f) a_1) (cons (a ::ₘ m) a' b' (cons m a b f) a'_1)
[PROOFSTEP]
simp only [heq_iff_eq]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
⊢ ∀ (a_1 a'_1 : α),
    a_1 = a'_1 → HEq (cons (a' ::ₘ m) a b (cons m a' b' f) a_1) (cons (a ::ₘ m) a' b' (cons m a b f) a'_1)
[PROOFSTEP]
rintro a'' _ rfl
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
a'' : α
⊢ HEq (cons (a' ::ₘ m) a b (cons m a' b' f) a'') (cons (a ::ₘ m) a' b' (cons m a b f) a'')
[PROOFSTEP]
refine' hfunext (by rw [Multiset.cons_swap]) fun ha₁ ha₂ _ => _
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
a'' : α
⊢ (a'' ∈ a ::ₘ a' ::ₘ m) = (a'' ∈ a' ::ₘ a ::ₘ m)
[PROOFSTEP]
rw [Multiset.cons_swap]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
a'' : α
ha₁ : a'' ∈ a ::ₘ a' ::ₘ m
ha₂ : a'' ∈ a' ::ₘ a ::ₘ m
x✝ : HEq ha₁ ha₂
⊢ HEq (cons (a' ::ₘ m) a b (cons m a' b' f) a'' ha₁) (cons (a ::ₘ m) a' b' (cons m a b f) a'' ha₂)
[PROOFSTEP]
rcases ne_or_eq a'' a with (h₁ | rfl)
[GOAL]
case inl
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
a'' : α
ha₁ : a'' ∈ a ::ₘ a' ::ₘ m
ha₂ : a'' ∈ a' ::ₘ a ::ₘ m
x✝ : HEq ha₁ ha₂
h₁ : a'' ≠ a
⊢ HEq (cons (a' ::ₘ m) a b (cons m a' b' f) a'' ha₁) (cons (a ::ₘ m) a' b' (cons m a b f) a'' ha₂)
case inr
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a' : α
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
a'' : α
b : δ a''
h : a'' ≠ a'
ha₁ : a'' ∈ a'' ::ₘ a' ::ₘ m
ha₂ : a'' ∈ a' ::ₘ a'' ::ₘ m
x✝ : HEq ha₁ ha₂
⊢ HEq (cons (a' ::ₘ m) a'' b (cons m a' b' f) a'' ha₁) (cons (a'' ::ₘ m) a' b' (cons m a'' b f) a'' ha₂)
[PROOFSTEP]
rcases eq_or_ne a'' a' with (rfl | h₂)
[GOAL]
case inl.inl
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a : α
b : δ a
m : Multiset α
f : (a : α) → a ∈ m → δ a
a'' : α
h₁ : a'' ≠ a
b' : δ a''
h : a ≠ a''
ha₁ : a'' ∈ a ::ₘ a'' ::ₘ m
ha₂ : a'' ∈ a'' ::ₘ a ::ₘ m
x✝ : HEq ha₁ ha₂
⊢ HEq (cons (a'' ::ₘ m) a b (cons m a'' b' f) a'' ha₁) (cons (a ::ₘ m) a'' b' (cons m a b f) a'' ha₂)
case inl.inr
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
a'' : α
ha₁ : a'' ∈ a ::ₘ a' ::ₘ m
ha₂ : a'' ∈ a' ::ₘ a ::ₘ m
x✝ : HEq ha₁ ha₂
h₁ : a'' ≠ a
h₂ : a'' ≠ a'
⊢ HEq (cons (a' ::ₘ m) a b (cons m a' b' f) a'' ha₁) (cons (a ::ₘ m) a' b' (cons m a b f) a'' ha₂)
case inr
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a' : α
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
a'' : α
b : δ a''
h : a'' ≠ a'
ha₁ : a'' ∈ a'' ::ₘ a' ::ₘ m
ha₂ : a'' ∈ a' ::ₘ a'' ::ₘ m
x✝ : HEq ha₁ ha₂
⊢ HEq (cons (a' ::ₘ m) a'' b (cons m a' b' f) a'' ha₁) (cons (a'' ::ₘ m) a' b' (cons m a'' b f) a'' ha₂)
[PROOFSTEP]
all_goals simp [*, Pi.cons_same, Pi.cons_ne]
[GOAL]
case inl.inl
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a : α
b : δ a
m : Multiset α
f : (a : α) → a ∈ m → δ a
a'' : α
h₁ : a'' ≠ a
b' : δ a''
h : a ≠ a''
ha₁ : a'' ∈ a ::ₘ a'' ::ₘ m
ha₂ : a'' ∈ a'' ::ₘ a ::ₘ m
x✝ : HEq ha₁ ha₂
⊢ HEq (cons (a'' ::ₘ m) a b (cons m a'' b' f) a'' ha₁) (cons (a ::ₘ m) a'' b' (cons m a b f) a'' ha₂)
[PROOFSTEP]
simp [*, Pi.cons_same, Pi.cons_ne]
[GOAL]
case inl.inr
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a a' : α
b : δ a
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
h : a ≠ a'
a'' : α
ha₁ : a'' ∈ a ::ₘ a' ::ₘ m
ha₂ : a'' ∈ a' ::ₘ a ::ₘ m
x✝ : HEq ha₁ ha₂
h₁ : a'' ≠ a
h₂ : a'' ≠ a'
⊢ HEq (cons (a' ::ₘ m) a b (cons m a' b' f) a'' ha₁) (cons (a ::ₘ m) a' b' (cons m a b f) a'' ha₂)
[PROOFSTEP]
simp [*, Pi.cons_same, Pi.cons_ne]
[GOAL]
case inr
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a' : α
b' : δ a'
m : Multiset α
f : (a : α) → a ∈ m → δ a
a'' : α
b : δ a''
h : a'' ≠ a'
ha₁ : a'' ∈ a'' ::ₘ a' ::ₘ m
ha₂ : a'' ∈ a' ::ₘ a'' ::ₘ m
x✝ : HEq ha₁ ha₂
⊢ HEq (cons (a' ::ₘ m) a'' b (cons m a' b' f) a'' ha₁) (cons (a'' ::ₘ m) a' b' (cons m a'' b f) a'' ha₂)
[PROOFSTEP]
simp [*, Pi.cons_same, Pi.cons_ne]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
a : α
f : (a' : α) → a' ∈ a ::ₘ m → δ a'
⊢ (Pi.cons m a (f a (_ : a ∈ a ::ₘ m)) fun a' ha' => f a' (_ : a' ∈ a ::ₘ m)) = f
[PROOFSTEP]
ext a' h'
[GOAL]
case h.h
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
a : α
f : (a' : α) → a' ∈ a ::ₘ m → δ a'
a' : α
h' : a' ∈ a ::ₘ m
⊢ Pi.cons m a (f a (_ : a ∈ a ::ₘ m)) (fun a' ha' => f a' (_ : a' ∈ a ::ₘ m)) a' h' = f a' h'
[PROOFSTEP]
by_cases h : a' = a
[GOAL]
case pos
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
a : α
f : (a' : α) → a' ∈ a ::ₘ m → δ a'
a' : α
h' : a' ∈ a ::ₘ m
h : a' = a
⊢ Pi.cons m a (f a (_ : a ∈ a ::ₘ m)) (fun a' ha' => f a' (_ : a' ∈ a ::ₘ m)) a' h' = f a' h'
[PROOFSTEP]
subst h
[GOAL]
case pos
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
a' : α
f : (a'_1 : α) → a'_1 ∈ a' ::ₘ m → δ a'_1
h' : a' ∈ a' ::ₘ m
⊢ Pi.cons m a' (f a' (_ : a' ∈ a' ::ₘ m)) (fun a'_1 ha' => f a'_1 (_ : a'_1 ∈ a' ::ₘ m)) a' h' = f a' h'
[PROOFSTEP]
rw [Pi.cons_same]
[GOAL]
case neg
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
a : α
f : (a' : α) → a' ∈ a ::ₘ m → δ a'
a' : α
h' : a' ∈ a ::ₘ m
h : ¬a' = a
⊢ Pi.cons m a (f a (_ : a ∈ a ::ₘ m)) (fun a' ha' => f a' (_ : a' ∈ a ::ₘ m)) a' h' = f a' h'
[PROOFSTEP]
rw [Pi.cons_ne _ h]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a : α
b : δ a
s : Multiset α
hs : ¬a ∈ s
f₁ f₂ : (a : α) → a ∈ s → δ a
eq : cons s a b f₁ = cons s a b f₂
a' : α
h' : a' ∈ s
ne : a ≠ a'
this : a' ∈ a ::ₘ s
⊢ f₁ a' h' = cons s a b f₁ a' this
[PROOFSTEP]
rw [Pi.cons_ne this ne.symm]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a : α
b : δ a
s : Multiset α
hs : ¬a ∈ s
f₁ f₂ : (a : α) → a ∈ s → δ a
eq : cons s a b f₁ = cons s a b f₂
a' : α
h' : a' ∈ s
ne : a ≠ a'
this : a' ∈ a ::ₘ s
⊢ cons s a b f₁ a' this = cons s a b f₂ a' this
[PROOFSTEP]
rw [eq]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
a : α
b : δ a
s : Multiset α
hs : ¬a ∈ s
f₁ f₂ : (a : α) → a ∈ s → δ a
eq : cons s a b f₁ = cons s a b f₂
a' : α
h' : a' ∈ s
ne : a ≠ a'
this : a' ∈ a ::ₘ s
⊢ cons s a b f₂ a' this = f₂ a' h'
[PROOFSTEP]
rw [Pi.cons_ne this ne.symm]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
⊢ ∀ (a a' : α) (m : Multiset α) (b : Multiset ((a : α) → a ∈ m → β a)),
    HEq (bind (t a) fun b_1 => map (Pi.cons (a' ::ₘ m) a b_1) (bind (t a') fun b_2 => map (Pi.cons m a' b_2) b))
      (bind (t a') fun b_1 => map (Pi.cons (a ::ₘ m) a' b_1) (bind (t a) fun b_2 => map (Pi.cons m a b_2) b))
[PROOFSTEP]
intro a a' m n
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
⊢ HEq (bind (t a) fun b => map (Pi.cons (a' ::ₘ m) a b) (bind (t a') fun b => map (Pi.cons m a' b) n))
    (bind (t a') fun b => map (Pi.cons (a ::ₘ m) a' b) (bind (t a) fun b => map (Pi.cons m a b) n))
[PROOFSTEP]
by_cases eq : a = a'
[GOAL]
case pos
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : a = a'
⊢ HEq (bind (t a) fun b => map (Pi.cons (a' ::ₘ m) a b) (bind (t a') fun b => map (Pi.cons m a' b) n))
    (bind (t a') fun b => map (Pi.cons (a ::ₘ m) a' b) (bind (t a) fun b => map (Pi.cons m a b) n))
[PROOFSTEP]
subst eq
[GOAL]
case pos
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
⊢ HEq (bind (t a) fun b => map (Pi.cons (a ::ₘ m) a b) (bind (t a) fun b => map (Pi.cons m a b) n))
    (bind (t a) fun b => map (Pi.cons (a ::ₘ m) a b) (bind (t a) fun b => map (Pi.cons m a b) n))
[PROOFSTEP]
rfl
[GOAL]
case neg
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
⊢ HEq (bind (t a) fun b => map (Pi.cons (a' ::ₘ m) a b) (bind (t a') fun b => map (Pi.cons m a' b) n))
    (bind (t a') fun b => map (Pi.cons (a ::ₘ m) a' b) (bind (t a) fun b => map (Pi.cons m a b) n))
[PROOFSTEP]
simp [map_bind, bind_bind (t a') (t a)]
[GOAL]
case neg
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
⊢ HEq (bind (t a) fun b => bind (t a') fun a_1 => map (fun x => Pi.cons (a' ::ₘ m) a b (Pi.cons m a' a_1 x)) n)
    (bind (t a) fun b => bind (t a') fun a_1 => map (fun x => Pi.cons (a ::ₘ m) a' a_1 (Pi.cons m a b x)) n)
[PROOFSTEP]
apply bind_hcongr
[GOAL]
case neg.h
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
⊢ ((a_1 : α) → a_1 ∈ a ::ₘ a' ::ₘ m → β a_1) = ((a_1 : α) → a_1 ∈ a' ::ₘ a ::ₘ m → β a_1)
[PROOFSTEP]
rw [cons_swap a a']
[GOAL]
case neg.hf
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
⊢ ∀ (a_1 : β a),
    a_1 ∈ t a →
      HEq (bind (t a') fun a_3 => map (fun x => Pi.cons (a' ::ₘ m) a a_1 (Pi.cons m a' a_3 x)) n)
        (bind (t a') fun a_3 => map (fun x => Pi.cons (a ::ₘ m) a' a_3 (Pi.cons m a a_1 x)) n)
[PROOFSTEP]
intro b _
[GOAL]
case neg.hf
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
b : β a
a✝ : b ∈ t a
⊢ HEq (bind (t a') fun a_1 => map (fun x => Pi.cons (a' ::ₘ m) a b (Pi.cons m a' a_1 x)) n)
    (bind (t a') fun a_1 => map (fun x => Pi.cons (a ::ₘ m) a' a_1 (Pi.cons m a b x)) n)
[PROOFSTEP]
apply bind_hcongr
[GOAL]
case neg.hf.h
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
b : β a
a✝ : b ∈ t a
⊢ ((a_1 : α) → a_1 ∈ a ::ₘ a' ::ₘ m → β a_1) = ((a_1 : α) → a_1 ∈ a' ::ₘ a ::ₘ m → β a_1)
[PROOFSTEP]
rw [cons_swap a a']
[GOAL]
case neg.hf.hf
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
b : β a
a✝ : b ∈ t a
⊢ ∀ (a_1 : β a'),
    a_1 ∈ t a' →
      HEq (map (fun x => Pi.cons (a' ::ₘ m) a b (Pi.cons m a' a_1 x)) n)
        (map (fun x => Pi.cons (a ::ₘ m) a' a_1 (Pi.cons m a b x)) n)
[PROOFSTEP]
intro b' _
[GOAL]
case neg.hf.hf
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
b : β a
a✝¹ : b ∈ t a
b' : β a'
a✝ : b' ∈ t a'
⊢ HEq (map (fun x => Pi.cons (a' ::ₘ m) a b (Pi.cons m a' b' x)) n)
    (map (fun x => Pi.cons (a ::ₘ m) a' b' (Pi.cons m a b x)) n)
[PROOFSTEP]
apply map_hcongr
[GOAL]
case neg.hf.hf.h
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
b : β a
a✝¹ : b ∈ t a
b' : β a'
a✝ : b' ∈ t a'
⊢ ((a_1 : α) → a_1 ∈ a ::ₘ a' ::ₘ m → β a_1) = ((a_1 : α) → a_1 ∈ a' ::ₘ a ::ₘ m → β a_1)
[PROOFSTEP]
rw [cons_swap a a']
[GOAL]
case neg.hf.hf.hf
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
b : β a
a✝¹ : b ∈ t a
b' : β a'
a✝ : b' ∈ t a'
⊢ ∀ (a_1 : (a : α) → a ∈ m → β a),
    a_1 ∈ n → HEq (Pi.cons (a' ::ₘ m) a b (Pi.cons m a' b' a_1)) (Pi.cons (a ::ₘ m) a' b' (Pi.cons m a b a_1))
[PROOFSTEP]
intro f _
[GOAL]
case neg.hf.hf.hf
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
a a' : α
m : Multiset α
n : Multiset ((a : α) → a ∈ m → β a)
eq : ¬a = a'
b : β a
a✝² : b ∈ t a
b' : β a'
a✝¹ : b' ∈ t a'
f : (a : α) → a ∈ m → β a
a✝ : f ∈ n
⊢ HEq (Pi.cons (a' ::ₘ m) a b (Pi.cons m a' b' f)) (Pi.cons (a ::ₘ m) a' b' (Pi.cons m a b f))
[PROOFSTEP]
exact Pi.cons_swap eq
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
⊢ ↑card (pi 0 t) = prod (map (fun a => ↑card (t a)) 0)
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
⊢ ∀ ⦃a : α⦄ {s : Multiset α},
    ↑card (pi s t) = prod (map (fun a => ↑card (t a)) s) →
      ↑card (pi (a ::ₘ s) t) = prod (map (fun a => ↑card (t a)) (a ::ₘ s))
[PROOFSTEP]
simp (config := { contextual := true }) [mul_comm]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s : Multiset α
t : (a : α) → Multiset (β a)
⊢ ∀ ⦃a : α⦄ {s : Multiset α},
    (Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)) →
      Nodup (a ::ₘ s) → (∀ (a_3 : α), a_3 ∈ a ::ₘ s → Nodup (t a_3)) → Nodup (pi (a ::ₘ s) t)
[PROOFSTEP]
intro a s ih hs ht
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
⊢ Nodup (pi (a ::ₘ s) t)
[PROOFSTEP]
have has : a ∉ s := by simp at hs ; exact hs.1
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
⊢ ¬a ∈ s
[PROOFSTEP]
simp at hs
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
hs : ¬a ∈ s ∧ Nodup s
⊢ ¬a ∈ s
[PROOFSTEP]
exact hs.1
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
⊢ Nodup (pi (a ::ₘ s) t)
[PROOFSTEP]
have hs : Nodup s := by simp at hs ; exact hs.2
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
⊢ Nodup s
[PROOFSTEP]
simp at hs
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
hs : ¬a ∈ s ∧ Nodup s
⊢ Nodup s
[PROOFSTEP]
exact hs.2
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs✝ : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
hs : Nodup s
⊢ Nodup (pi (a ::ₘ s) t)
[PROOFSTEP]
simp
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs✝ : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
hs : Nodup s
⊢ (∀ (a_1 : β a), a_1 ∈ t a → Nodup (Multiset.map (Pi.cons s a a_1) (pi s t))) ∧
    Pairwise (fun a_1 b => Disjoint (Multiset.map (Pi.cons s a a_1) (pi s t)) (Multiset.map (Pi.cons s a b) (pi s t)))
      (t a)
[PROOFSTEP]
refine' ⟨fun b _ => ((ih hs) fun a' h' => ht a' <| mem_cons_of_mem h').map (Pi.cons_injective has), _⟩
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs✝ : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
hs : Nodup s
⊢ Pairwise (fun a_1 b => Disjoint (Multiset.map (Pi.cons s a a_1) (pi s t)) (Multiset.map (Pi.cons s a b) (pi s t)))
    (t a)
[PROOFSTEP]
refine' (ht a <| mem_cons_self _ _).pairwise _
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs✝ : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
hs : Nodup s
⊢ ∀ (a_1 : β a),
    a_1 ∈ t a →
      ∀ (b : β a),
        b ∈ t a → a_1 ≠ b → Disjoint (Multiset.map (Pi.cons s a a_1) (pi s t)) (Multiset.map (Pi.cons s a b) (pi s t))
[PROOFSTEP]
exact fun b₁ _ b₂ _ neb =>
  disjoint_map_map.2 fun f _ g _ eq =>
    have : Pi.cons s a b₁ f a (mem_cons_self _ _) = Pi.cons s a b₂ g a (mem_cons_self _ _) := by rw [eq]
    neb <| show b₁ = b₂ by rwa [Pi.cons_same, Pi.cons_same] at this
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs✝ : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
hs : Nodup s
b₁ : β a
x✝³ : b₁ ∈ t a
b₂ : β a
x✝² : b₂ ∈ t a
neb : b₁ ≠ b₂
f : (a : α) → a ∈ s → β a
x✝¹ : f ∈ pi s t
g : (a : α) → a ∈ s → β a
x✝ : g ∈ pi s t
eq : Pi.cons s a b₁ f = Pi.cons s a b₂ g
⊢ Pi.cons s a b₁ f a (_ : a ∈ a ::ₘ s) = Pi.cons s a b₂ g a (_ : a ∈ a ::ₘ s)
[PROOFSTEP]
rw [eq]
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : Nodup s → (∀ (a : α), a ∈ s → Nodup (t a)) → Nodup (pi s t)
hs✝ : Nodup (a ::ₘ s)
ht : ∀ (a_1 : α), a_1 ∈ a ::ₘ s → Nodup (t a_1)
has : ¬a ∈ s
hs : Nodup s
b₁ : β a
x✝³ : b₁ ∈ t a
b₂ : β a
x✝² : b₂ ∈ t a
neb : b₁ ≠ b₂
f : (a : α) → a ∈ s → β a
x✝¹ : f ∈ pi s t
g : (a : α) → a ∈ s → β a
x✝ : g ∈ pi s t
eq : Pi.cons s a b₁ f = Pi.cons s a b₂ g
this : Pi.cons s a b₁ f a (_ : a ∈ a ::ₘ s) = Pi.cons s a b₂ g a (_ : a ∈ a ::ₘ s)
⊢ b₁ = b₂
[PROOFSTEP]
rwa [Pi.cons_same, Pi.cons_same] at this
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
⊢ ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
[PROOFSTEP]
intro f
[GOAL]
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
f : (a : α) → a ∈ m → β a
⊢ f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
[PROOFSTEP]
induction' m using Multiset.induction_on with a m ih
[GOAL]
case empty
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m → β a
f : (a : α) → a ∈ 0 → β a
⊢ f ∈ pi 0 t ↔ ∀ (a : α) (h : a ∈ 0), f a h ∈ t a
[PROOFSTEP]
have : f = Pi.empty β := funext (fun _ => funext fun h => (not_mem_zero _ h).elim)
[GOAL]
case empty
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m → β a
f : (a : α) → a ∈ 0 → β a
this : f = Pi.empty β
⊢ f ∈ pi 0 t ↔ ∀ (a : α) (h : a ∈ 0), f a h ∈ t a
[PROOFSTEP]
simp only [this, pi_zero, mem_singleton, true_iff]
[GOAL]
case empty
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m → β a
f : (a : α) → a ∈ 0 → β a
this : f = Pi.empty β
⊢ ∀ (a : α) (h : a ∈ 0), Pi.empty β a h ∈ t a
[PROOFSTEP]
intro _ h
[GOAL]
case empty
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m → β a
f : (a : α) → a ∈ 0 → β a
this : f = Pi.empty β
a✝ : α
h : a✝ ∈ 0
⊢ Pi.empty β a✝ h ∈ t a✝
[PROOFSTEP]
exact (not_mem_zero _ h).elim
[GOAL]
case cons
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
f : (a_1 : α) → a_1 ∈ a ::ₘ m → β a_1
⊢ f ∈ pi (a ::ₘ m) t ↔ ∀ (a_1 : α) (h : a_1 ∈ a ::ₘ m), f a_1 h ∈ t a_1
[PROOFSTEP]
simp_rw [pi_cons, mem_bind, mem_map, ih]
[GOAL]
case cons
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
f : (a_1 : α) → a_1 ∈ a ::ₘ m → β a_1
⊢ (∃ a_1, a_1 ∈ t a ∧ ∃ a_2, (∀ (a : α) (h : a ∈ m), a_2 a h ∈ t a) ∧ Pi.cons m a a_1 a_2 = f) ↔
    ∀ (a_1 : α) (h : a_1 ∈ a ::ₘ m), f a_1 h ∈ t a_1
[PROOFSTEP]
constructor
[GOAL]
case cons.mp
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
f : (a_1 : α) → a_1 ∈ a ::ₘ m → β a_1
⊢ (∃ a_1, a_1 ∈ t a ∧ ∃ a_2, (∀ (a : α) (h : a ∈ m), a_2 a h ∈ t a) ∧ Pi.cons m a a_1 a_2 = f) →
    ∀ (a_2 : α) (h : a_2 ∈ a ::ₘ m), f a_2 h ∈ t a_2
[PROOFSTEP]
rintro ⟨b, hb, f', hf', rfl⟩ a' ha'
[GOAL]
case cons.mp.intro.intro.intro.intro
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
b : β a
hb : b ∈ t a
f' : (a : α) → a ∈ m → β a
hf' : ∀ (a : α) (h : a ∈ m), f' a h ∈ t a
a' : α
ha' : a' ∈ a ::ₘ m
⊢ Pi.cons m a b f' a' ha' ∈ t a'
[PROOFSTEP]
by_cases h : a' = a
[GOAL]
case pos
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
b : β a
hb : b ∈ t a
f' : (a : α) → a ∈ m → β a
hf' : ∀ (a : α) (h : a ∈ m), f' a h ∈ t a
a' : α
ha' : a' ∈ a ::ₘ m
h : a' = a
⊢ Pi.cons m a b f' a' ha' ∈ t a'
[PROOFSTEP]
subst h
[GOAL]
case pos
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f : (a : α) → a ∈ m✝ → β a
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
f' : (a : α) → a ∈ m → β a
hf' : ∀ (a : α) (h : a ∈ m), f' a h ∈ t a
a' : α
b : β a'
hb : b ∈ t a'
ha' : a' ∈ a' ::ₘ m
⊢ Pi.cons m a' b f' a' ha' ∈ t a'
[PROOFSTEP]
rwa [Pi.cons_same]
[GOAL]
case neg
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
b : β a
hb : b ∈ t a
f' : (a : α) → a ∈ m → β a
hf' : ∀ (a : α) (h : a ∈ m), f' a h ∈ t a
a' : α
ha' : a' ∈ a ::ₘ m
h : ¬a' = a
⊢ Pi.cons m a b f' a' ha' ∈ t a'
[PROOFSTEP]
rw [Pi.cons_ne _ h]
[GOAL]
case neg
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
b : β a
hb : b ∈ t a
f' : (a : α) → a ∈ m → β a
hf' : ∀ (a : α) (h : a ∈ m), f' a h ∈ t a
a' : α
ha' : a' ∈ a ::ₘ m
h : ¬a' = a
⊢ f' a' (_ : a' ∈ m) ∈ t a'
[PROOFSTEP]
apply hf'
[GOAL]
case cons.mpr
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
f : (a_1 : α) → a_1 ∈ a ::ₘ m → β a_1
⊢ (∀ (a_1 : α) (h : a_1 ∈ a ::ₘ m), f a_1 h ∈ t a_1) →
    ∃ a_2, a_2 ∈ t a ∧ ∃ a_3, (∀ (a : α) (h : a ∈ m), a_3 a h ∈ t a) ∧ Pi.cons m a a_2 a_3 = f
[PROOFSTEP]
intro hf
[GOAL]
case cons.mpr
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
f : (a_1 : α) → a_1 ∈ a ::ₘ m → β a_1
hf : ∀ (a_1 : α) (h : a_1 ∈ a ::ₘ m), f a_1 h ∈ t a_1
⊢ ∃ a_1, a_1 ∈ t a ∧ ∃ a_2, (∀ (a : α) (h : a ∈ m), a_2 a h ∈ t a) ∧ Pi.cons m a a_1 a_2 = f
[PROOFSTEP]
refine' ⟨_, hf a (mem_cons_self _ _), _, fun a ha => hf a (mem_cons_of_mem ha), _⟩
[GOAL]
case cons.mpr
α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
m✝ : Multiset α
t : (a : α) → Multiset (β a)
f✝ : (a : α) → a ∈ m✝ → β a
a : α
m : Multiset α
ih : ∀ (f : (a : α) → a ∈ m → β a), f ∈ pi m t ↔ ∀ (a : α) (h : a ∈ m), f a h ∈ t a
f : (a_1 : α) → a_1 ∈ a ::ₘ m → β a_1
hf : ∀ (a_1 : α) (h : a_1 ∈ a ::ₘ m), f a_1 h ∈ t a_1
⊢ (Pi.cons m a (f a (_ : a ∈ a ::ₘ m)) fun a_1 ha => f a_1 (_ : a_1 ∈ a ::ₘ m)) = f
[PROOFSTEP]
rw [pi.cons_eta]