import data.nat open nat tactic example (a b : nat) : a * 0 + 0 + b + 0 = b := by do rewrite "mul_zero", trace_state, rewrite "add_zero", repeat $ rewrite "zero_add" print "---------" example (a b : nat) (H : a + b * 0 + 0 = b) : b = a := by do rewrite_at "mul_zero" "H", trace_state, rewrite_at "add_zero" "H", rewrite_at "add_zero" "H", symmetry, assumption print "---------" example (a : nat) : (0 + a) + (0 + a) + (0 + a) = a + a + a := by rewrite "zero_add" meta_definition rewrite_occs (th_name : name) (occs : list nat) : tactic unit := do th ← mk_const th_name, rewrite_core reducible tt (occurrences.pos occs) ff th, try reflexivity print "---------" example (a : nat) : (0 + a) + (0 + a) + (0 + a) = a + a + a := by do rewrite_occs "zero_add" [1, 3], trace_state, rewrite "zero_add" print "---------" example (a : nat) : (0 + a) + (0 + a) + (0 + a) = a + a + a := by do rewrite_occs "zero_add" [2], trace_state, rewrite_occs "zero_add" [2], trace_state, rewrite "zero_add"