open nat example (A B : Type) (a : A) (b : B) (h₁ : A = B) (h₂ : eq.rec_on h₁ a = b) : b = eq.rec_on h₁ a := begin subst h₁ h₂ end example (A B : Type) (a : A) (b : B) (h₁ : A = B) (h₂ : eq.rec_on h₁ a = b) : b = eq.rec_on h₁ a := begin subst B h₂ end example (a b c : nat) (a0 : a = 0) (b1 : b = 1 + a) (ab : a = b) : empty := begin subst a0, subst b1, contradiction end example (a : nat) : a = 0 → a = 1 → empty := begin intro a0 a1, subst a0, contradiction end example (a b c : nat) : a = 0 → b = 1 + a → a = b → empty := begin intro a0 b1 ab, subst a0, rewrite b1 at *, state, contradiction end example (a b c : nat) : a = 0 → b = 1 + a → a = b → empty := begin intro a0 b1 ab, subst a0, subst b1, state, contradiction end example (a b c : nat) : a = 0 → 1 + a = b → a = b → empty := begin intro a0 b1 ab, subst a0 b1, state, contradiction end example (a b c : nat) : a = 0 → 1 + a = b → a = b → empty := begin intros, subst a b, state, contradiction end