internlm/Lean-Github huggingface dataset:
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : tl.Nodupkeys → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd : (∀ (a' : α), a' ∈ l' → ¬a = a') ∧ Pairwise (fun x x_1 => ¬x = x_1) l' ∧ map (fun x => x.fst) (hd :: tl) = a :: l'
⊢ s.snd = s'.snd
Tactic:
. rw [List.Nodupkeys, List.Nodup] at ih
  rcases nd with ⟨nd1, nd2, nd3⟩
  rw [List.map_cons] at nd3
  simp only [List.cons.injEq] at nd3
  rcases nd3 with ⟨hd_fst_eq_a, nd3⟩
  rw [← nd3] at nd2
  specialize ih nd2
  rw [List.mem_cons] at h h'
  rcases h with s_eq_hd | s_in_tl
  . rcases h' with s'_eq_hd | s'_in_tl
    . rw [s_eq_hd, s'_eq_hd]
    . rw [← nd3, ← hd_fst_eq_a, ← s_eq_hd] at nd1
      specialize nd1 s'.1
      simp only [List.mem_map, Prod.exists, exists_and_right, exists_eq_right,
        forall_exists_index] at nd1
      specialize nd1 s'.2 s'_in_tl
      exfalso
      exact nd1 keys_eq
  . rcases h' with s'_eq_hd | s'_in_tl
    . rw [← nd3, ← hd_fst_eq_a, ← s'_eq_hd] at nd1
      specialize nd1 s.1
      simp only [List.mem_map, Prod.exists, exists_and_right, exists_eq_right,
        forall_exists_index] at nd1
      specialize nd1 s.2 s_in_tl
      exfalso
      exact nd1 keys_eq.symm
    . exact ih s_in_tl s'_in_tl
Proof state after:
no goals
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inl
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : tl.Nodupkeys → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
l_eq_nil : False
⊢ s.snd = s'.snd
Tactic:
exact False.elim l_eq_nil
Proof state after:
no goals
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : tl.Nodupkeys → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd : (∀ (a' : α), a' ∈ l' → ¬a = a') ∧ Pairwise (fun x x_1 => ¬x = x_1) l' ∧ map (fun x => x.fst) (hd :: tl) = a :: l'
⊢ s.snd = s'.snd
Tactic:
rw [List.Nodupkeys, List.Nodup] at ih
Proof state after:
case right.cons.inr.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd : (∀ (a' : α), a' ∈ l' → ¬a = a') ∧ Pairwise (fun x x_1 => ¬x = x_1) l' ∧ map (fun x => x.fst) (hd :: tl) = a :: l'
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd : (∀ (a' : α), a' ∈ l' → ¬a = a') ∧ Pairwise (fun x x_1 => ¬x = x_1) l' ∧ map (fun x => x.fst) (hd :: tl) = a :: l'
⊢ s.snd = s'.snd
Tactic:
rcases nd with ⟨nd1, nd2, nd3⟩
Proof state after:
case right.cons.inr.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) l'
nd3 : map (fun x => x.fst) (hd :: tl) = a :: l'
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) l'
nd3 : map (fun x => x.fst) (hd :: tl) = a :: l'
⊢ s.snd = s'.snd
Tactic:
rw [List.map_cons] at nd3
Proof state after:
case right.cons.inr.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) l'
nd3 : hd.fst :: map (fun x => x.fst) tl = a :: l'
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) l'
nd3 : hd.fst :: map (fun x => x.fst) tl = a :: l'
⊢ s.snd = s'.snd
Tactic:
simp only [List.cons.injEq] at nd3
Proof state after:
case right.cons.inr.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) l'
nd3 : hd.fst = a ∧ map (fun x => x.fst) tl = l'
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) l'
nd3 : hd.fst = a ∧ map (fun x => x.fst) tl = l'
⊢ s.snd = s'.snd
Tactic:
rcases nd3 with ⟨hd_fst_eq_a, nd3⟩
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) l'
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) l'
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
⊢ s.snd = s'.snd
Tactic:
rw [← nd3] at nd2
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
ih : Pairwise (fun x x_1 => x ≠ x_1) (map (fun x => x.fst) tl) → s ∈ tl → s' ∈ tl → s.snd = s'.snd
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
⊢ s.snd = s'.snd
Tactic:
specialize ih nd2
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h : s ∈ hd :: tl
h' : s' ∈ hd :: tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
⊢ s.snd = s'.snd
Tactic:
rw [List.mem_cons] at h h'
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h : s = hd ∨ s ∈ tl
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h : s = hd ∨ s ∈ tl
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
⊢ s.snd = s'.snd
Tactic:
rcases h with s_eq_hd | s_in_tl
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro.inl
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
⊢ s.snd = s'.snd

case right.cons.inr.intro.intro.intro.intro.intro.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_in_tl : s ∈ tl
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
⊢ s.snd = s'.snd

case right.cons.inr.intro.intro.intro.intro.intro.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_in_tl : s ∈ tl
⊢ s.snd = s'.snd
Tactic:
. rcases h' with s'_eq_hd | s'_in_tl
  . rw [s_eq_hd, s'_eq_hd]
  . rw [← nd3, ← hd_fst_eq_a, ← s_eq_hd] at nd1
    specialize nd1 s'.1
    simp only [List.mem_map, Prod.exists, exists_and_right, exists_eq_right,
      forall_exists_index] at nd1
    specialize nd1 s'.2 s'_in_tl
    exfalso
    exact nd1 keys_eq
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_in_tl : s ∈ tl
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_in_tl : s ∈ tl
⊢ s.snd = s'.snd
Tactic:
. rcases h' with s'_eq_hd | s'_in_tl
  . rw [← nd3, ← hd_fst_eq_a, ← s'_eq_hd] at nd1
    specialize nd1 s.1
    simp only [List.mem_map, Prod.exists, exists_and_right, exists_eq_right,
      forall_exists_index] at nd1
    specialize nd1 s.2 s_in_tl
    exfalso
    exact nd1 keys_eq.symm
  . exact ih s_in_tl s'_in_tl
Proof state after:
no goals
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
h' : s' = hd ∨ s' ∈ tl
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
⊢ s.snd = s'.snd
Tactic:
rcases h' with s'_eq_hd | s'_in_tl
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inl
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_eq_hd : s' = hd
⊢ s.snd = s'.snd

case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inl
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_eq_hd : s' = hd
⊢ s.snd = s'.snd

case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
⊢ s.snd = s'.snd
Tactic:
. rw [s_eq_hd, s'_eq_hd]
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
⊢ s.snd = s'.snd
Tactic:
. rw [← nd3, ← hd_fst_eq_a, ← s_eq_hd] at nd1
  specialize nd1 s'.1
  simp only [List.mem_map, Prod.exists, exists_and_right, exists_eq_right,
    forall_exists_index] at nd1
  specialize nd1 s'.2 s'_in_tl
  exfalso
  exact nd1 keys_eq
Proof state after:
no goals
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inl
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_eq_hd : s' = hd
⊢ s.snd = s'.snd
Tactic:
rw [s_eq_hd, s'_eq_hd]
Proof state after:
no goals
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ l' → ¬a = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
⊢ s.snd = s'.snd
Tactic:
rw [← nd3, ← hd_fst_eq_a, ← s_eq_hd] at nd1
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ map (fun x => x.fst) tl → ¬s.fst = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd1 : ∀ (a' : α), a' ∈ map (fun x => x.fst) tl → ¬s.fst = a'
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
⊢ s.snd = s'.snd
Tactic:
specialize nd1 s'.1
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
nd1 : s'.fst ∈ map (fun x => x.fst) tl → ¬s.fst = s'.fst
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
nd1 : s'.fst ∈ map (fun x => x.fst) tl → ¬s.fst = s'.fst
⊢ s.snd = s'.snd
Tactic:
simp only [List.mem_map, Prod.exists, exists_and_right, exists_eq_right,
  forall_exists_index] at nd1
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
nd1 : ∀ (x : β), (s'.fst, x) ∈ tl → ¬s.fst = s'.fst
⊢ s.snd = s'.snd
Theorem: List.nodupkeys_eq_of_fst_eq
Proof state before:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
nd1 : ∀ (x : β), (s'.fst, x) ∈ tl → ¬s.fst = s'.fst
⊢ s.snd = s'.snd
Tactic:
specialize nd1 s'.2 s'_in_tl
Proof state after:
case right.cons.inr.intro.intro.intro.intro.intro.inl.inr
α : Type u_1
β : Type u_2
s s' : α × β
keys_eq : s.fst = s'.fst
goal_rw : (s = s') = (s.fst = s'.fst ∧ s.snd = s'.snd)
hd : α × β
tl : List (α × β)
a : α
l' : List α
nd2 : Pairwise (fun x x_1 => ¬x = x_1) (map (fun x => x.fst) tl)
hd_fst_eq_a : hd.fst = a
nd3 : map (fun x => x.fst) tl = l'
ih : s ∈ tl → s' ∈ tl → s.snd = s'.snd
s_eq_hd : s = hd
s'_in_tl : s' ∈ tl
nd1 : ¬s.fst = s'.fst
⊢ s.snd = s'.snd