Theorem: Multiset.Nodup.pi
File: Mathlib/Data/Multiset/Pi.lean

Proof steps:
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s : Multiset α
t : (a : α) → Multiset (β a)
⊢ ∀ (a : α) (s : Multiset α),
    (s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup) →
      (a ::ₘ s).Nodup → (∀ a_3 ∈ a ::ₘ s, (t a_3).Nodup) → ((a ::ₘ s).pi t).Nodup
state_after: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
⊢ ((a ::ₘ s).pi t).Nodup
tactic: intro a s ih hs ht
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
⊢ ((a ::ₘ s).pi t).Nodup
state_after: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
⊢ ((a ::ₘ s).pi t).Nodup
tactic: have has : a ∉ s := by simp only [nodup_cons] at hs; exact hs.1
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
⊢ ((a ::ₘ s).pi t).Nodup
state_after: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs✝ : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : s.Nodup
⊢ ((a ::ₘ s).pi t).Nodup
tactic: have hs : Nodup s := by simp only [nodup_cons] at hs; exact hs.2
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs✝ : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : s.Nodup
⊢ ((a ::ₘ s).pi t).Nodup
state_after: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs✝ : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : s.Nodup
⊢ (∀ a_1 ∈ t a, (Multiset.map (Pi.cons s a a_1) (s.pi t)).Nodup) ∧
    Pairwise (fun a_1 b => (Multiset.map (Pi.cons s a a_1) (s.pi t)).Disjoint (Multiset.map (Pi.cons s a b) (s.pi t)))
      (t a)
tactic: simp only [pi_cons, nodup_bind]
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs✝ : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : s.Nodup
⊢ (∀ a_1 ∈ t a, (Multiset.map (Pi.cons s a a_1) (s.pi t)).Nodup) ∧
    Pairwise (fun a_1 b => (Multiset.map (Pi.cons s a a_1) (s.pi t)).Disjoint (Multiset.map (Pi.cons s a b) (s.pi t)))
      (t a)
state_after: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs✝ : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : s.Nodup
⊢ Pairwise (fun a_1 b => (Multiset.map (Pi.cons s a a_1) (s.pi t)).Disjoint (Multiset.map (Pi.cons s a b) (s.pi t)))
    (t a)
tactic: refine
        ⟨fun b _ => ((ih hs) fun a' h' => ht a' <| mem_cons_of_mem h').map (Pi.cons_injective has),
          ?_⟩
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs✝ : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : s.Nodup
⊢ Pairwise (fun a_1 b => (Multiset.map (Pi.cons s a a_1) (s.pi t)).Disjoint (Multiset.map (Pi.cons s a b) (s.pi t)))
    (t a)
state_after: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs✝ : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : s.Nodup
⊢ ∀ a_1 ∈ t a,
    ∀ b ∈ t a, a_1 ≠ b → (Multiset.map (Pi.cons s a a_1) (s.pi t)).Disjoint (Multiset.map (Pi.cons s a b) (s.pi t))
tactic: refine (ht a <| mem_cons_self _ _).pairwise ?_
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u_2
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
hs✝ : (a ::ₘ s).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : s.Nodup
⊢ ∀ a_1 ∈ t a,
    ∀ b ∈ t a, a_1 ≠ b → (Multiset.map (Pi.cons s a a_1) (s.pi t)).Disjoint (Multiset.map (Pi.cons s a b) (s.pi t))
state_after: no goals
tactic: 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