

theorem test1 {α} (a b : α) (as bs : List α) (h : a::as = b::bs) : a = b :=
by {
  injection h;
  assumption;
}

theorem test2 {α} (a b : α) (as bs : List α) (h : a::as = b::bs) : a = b :=
by {
  injection h with h1 h2;
  exact h1
}

theorem test3 {α} (a b : α) (as bs : List α) (h : (x : List α) → (y : List α) → x = y) : as = bs :=
have a::as = b::bs from h (a::as) (b::bs);
by {
  injection this with h1 h2;
  exact h2
}

theorem test4 {α} (a b : α) (as bs : List α) (h : (x : List α) → (y : List α) → x = y) : as = bs :=
by {
  injection h (a::as) (b::bs) with h1 h2;
  exact h2
}

theorem test5 {α} (a : α) (as : List α) (h : a::as = []) : 0 > 1 :=
by {
  injection h
}

theorem test6 (n : Nat) (h : n+1 = 0) : 0 > 1 :=
by {
  injection h
}

theorem test7 (n m k : Nat) (h : n + 1 = m + 1) : m = k → n = k :=
by {
  injection h with h₁;
  subst h₁;
  intro h₂;
  exact h₂
}
