So, this is one of the exercises that I worked from Software Foundations , in which I have to prove that animation is commutative. And this is my solution:
Theorem brack_help : forall nmp: nat, n + (m + p) = n + m + p. Proof. intros nm p. induction n as [| n']. Case "n = 0". simpl. reflexivity. Case "n = S n'". simpl. rewrite -> IHn'. reflexivity. Qed. Lemma plus_help: forall nm: nat, S (n + m) = n + S m. Proof. intros n m. induction n as [| n]. Case "n = 0". simpl. reflexivity. Case "n = S n". simpl. rewrite -> IHn. reflexivity. Qed. Theorem mult_0_r : forall n:nat, n * 0 = 0. Proof. intros n. induction n as [|n']. Case "n = 0". simpl. reflexivity. Case "n = S n'". simpl. rewrite -> IHn'. reflexivity. Qed. Theorem plus_comm : forall nm : nat, n + m = m + n. Proof. intros n m. induction n as [| n]. Case "n = 0". simpl. rewrite <- plus_n_O. reflexivity. Case "n = S n". simpl. rewrite -> IHn. rewrite -> plus_help. reflexivity. Qed. Theorem plus_swap : forall nmp : nat, n + (m + p) = m + (n + p). Proof. intros nm p. rewrite -> brack_help. assert (H: n + m = m + n). Case "Proof of assertion". rewrite -> plus_comm. reflexivity. rewrite -> H. rewrite <- brack_help. reflexivity. Qed. Lemma mult_help : forall mn : nat, m + (m * n) = m * (S n). Proof. intros m n. induction m as [| m']. Case "m = 0". simpl. reflexivity. Case "m = S m'". simpl. rewrite <- IHm'. rewrite -> plus_swap. reflexivity. Qed. Lemma mult_identity : forall m : nat, m * 1 = m. Proof. intros m. induction m as [| m']. Case "m = 0". simpl. reflexivity. Case "m = S m'". simpl. rewrite -> IHm'. reflexivity. Qed. Lemma plus_0_r : forall m : nat, m + 0 = m. Proof. intros m. induction m as [| m']. Case "m = 0". simpl. reflexivity. Case "m = S m'". simpl. rewrite -> IHm'. reflexivity. Qed. Theorem mult_comm_helper : forall mn : nat, m * S n = m + m * n. Proof. intros m n. simpl. induction n as [| n']. Case "n = 0". assert (H: m * 0 = 0). rewrite -> mult_0_r. reflexivity. rewrite -> H. rewrite -> mult_identity. assert (H2: m + 0 = m). rewrite -> plus_0_r. reflexivity. rewrite -> H2. reflexivity. Case "n = S n'". rewrite -> IHn'. assert (H3: m + m * n' = m * S n'). rewrite -> mult_help. reflexivity. rewrite -> H3. assert (H4: m + m * S n' = m * S (S n')). rewrite -> mult_help. reflexivity. rewrite -> H4. reflexivity. Qed. Theorem mult_comm : forall mn : nat, m * n = n * m. Proof. intros m n. induction n as [| n']. Case "n = 0". simpl. rewrite -> mult_0_r. reflexivity. Case "n = S n'". simpl. rewrite <- IHn'. rewrite -> mult_comm_helper. reflexivity. Qed.
Now, in my opinion, this proof is rather cumbersome. Is there a more concise way to do this without using any library? (Note that to use Case tactics, you need a certain predefined code. The stand-alone working code is as follows: https://gist.github.com/psibi/1c80d61ca574ae62c23e ).
source share