Require Import Arith. Inductive exp : Set := | Constant : nat -> exp | Plus : exp -> exp -> exp | Times : exp -> exp -> exp. Fixpoint eval (e : exp) : nat := match e with | Constant n => n | Plus e1 e2 => eval e1 + eval e2 | Times e1 e2 => eval e1 * eval e2 end. Fixpoint commuter (e: exp) : exp := match e with | Constant _ => e | Plus e1 e2 => Plus (commuter e2) (commuter e1) | Times e1 e2 => Times (commuter e2) (commuter e1) end. Theorem eval_commuter : forall e, eval(commuter e) = eval e. Proof. induction e; simpl. reflexivity. rewrite IHe1, IHe2. ring. rewrite IHe1, IHe2. ring. Qed.