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

tactic: intro a s ih hs ht
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
δ : α → Sort v
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: have has : a ∉ s := by simp only [nodup_cons] at hs; exact hs.1
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
δ : α → Sort v
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 hs : Nodup s := by simp only [nodup_cons] at hs; exact hs.2
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
δ : α → Sort v
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: simp only [pi_cons, nodup_bind]
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
δ : α → Sort v
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: 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
δ : α → Sort v
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
δ : α → Sort v
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 (ht a <| mem_cons_self _ _).pairwise ?_
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
δ : α → Sort v
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: 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
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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: simp only [nodup_cons] at hs
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
state_after: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
hs : a ∉ s ∧ s.Nodup
⊢ a ∉ s

tactic: exact hs.1
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
hs : a ∉ s ∧ s.Nodup
⊢ a ∉ s
state_after: no goals

tactic: simp only [nodup_cons] at hs
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
⊢ s.Nodup
state_after: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : a ∉ s ∧ s.Nodup
⊢ s.Nodup

tactic: exact hs.2
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
s✝ : Multiset α
t : (a : α) → Multiset (β a)
a : α
s : Multiset α
ih : s.Nodup → (∀ a ∈ s, (t a).Nodup) → (s.pi t).Nodup
ht : ∀ a_1 ∈ a ::ₘ s, (t a_1).Nodup
has : a ∉ s
hs : a ∉ s ∧ s.Nodup
⊢ s.Nodup
state_after: no goals

tactic: rw [eq]
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
b₁ : β a
x✝³ : b₁ ∈ t a
b₂ : β a
x✝² : b₂ ∈ t a
neb : b₁ ≠ b₂
f : (a : α) → a ∈ s → β a
x✝¹ : f ∈ s.pi t
g : (a : α) → a ∈ s → β a
x✝ : g ∈ s.pi t
eq : Pi.cons s a b₁ f = Pi.cons s a b₂ g
⊢ Pi.cons s a b₁ f a ⋯ = Pi.cons s a b₂ g a ⋯
state_after: no goals

tactic: rwa [Pi.cons_same, Pi.cons_same] at this
state_before: α : Type u_1
inst✝ : DecidableEq α
β : α → Type u
δ : α → Sort v
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
b₁ : β a
x✝³ : b₁ ∈ t a
b₂ : β a
x✝² : b₂ ∈ t a
neb : b₁ ≠ b₂
f : (a : α) → a ∈ s → β a
x✝¹ : f ∈ s.pi t
g : (a : α) → a ∈ s → β a
x✝ : g ∈ s.pi t
eq : Pi.cons s a b₁ f = Pi.cons s a b₂ g
this : Pi.cons s a b₁ f a ⋯ = Pi.cons s a b₂ g a ⋯
⊢ b₁ = b₂
state_after: no goals