Library Rational.Natural.NATURAL




Require Export Arith.
Require Export Plus.
Require Export Mult.
Require Import AC.
Require Import HS.

Open Scope nat_scope.

Notation "p .1" := (fst p) (at level 20) : nat_scope.
Notation "p .2" := (snd p) (at level 20) : nat_scope.


Notation "0" := 0 (at level 11) : nat_scope.
Notation "1" := 1 (at level 11) : nat_scope.


Notation "t1 = t2" := (t1 = t2) (at level 70).

Section NAT.



Lemma plus_simpl_l : n m p : nat, m = pn + m = n + p.
intros.
elim H; auto.
Qed.

Lemma mult_simpl_l : n m p : nat, m = pn × m = n × p.
intros.
elim H; auto.
Qed.

Lemma mult_permute : n m p : nat, n × (m × p) = m × (n × p).
intros.
elim (mult_comm p n).
elim (mult_assoc_reverse m p n).
elim (mult_comm n).
auto.
Qed.

Lemma mult_plus_distr_l : n m p : nat, p × (n + m) = p × n + p × m.
intros.
rewrite (mult_comm p).
rewrite (mult_plus_distr_r n m p).
repeat elim (mult_comm p); auto.
Qed.

End NAT.

Ltac CNa := intros; ac_of eq plus plus_comm plus_permute; auto.

Ltac ANa := intros; repeat elim plus_assoc.

Ltac ACNa :=
  intros; repeat elim plus_assoc; ac_of eq plus plus_comm plus_permute; auto.

Ltac HSNa := intros; hs_of eq plus plus_comm plus_permute plus_simpl_l.

Ltac CNm := intros; ac_of eq mult mult_comm mult_permute; auto.

Ltac ANm := intros; repeat elim mult_assoc.

Ltac ACNm :=
  intros; repeat elim mult_assoc; ac_of eq mult mult_comm mult_permute; auto.

Ltac HSNm := intros; hs_of eq mult mult_comm mult_permute mult_simpl_l.