aboutsummaryrefslogtreecommitdiff
path: root/theories/Numbers/Natural/Axioms/NPlus.v
diff options
context:
space:
mode:
Diffstat (limited to 'theories/Numbers/Natural/Axioms/NPlus.v')
-rw-r--r--theories/Numbers/Natural/Axioms/NPlus.v60
1 files changed, 39 insertions, 21 deletions
diff --git a/theories/Numbers/Natural/Axioms/NPlus.v b/theories/Numbers/Natural/Axioms/NPlus.v
index 29b65e3f4d..d2ef810181 100644
--- a/theories/Numbers/Natural/Axioms/NPlus.v
+++ b/theories/Numbers/Natural/Axioms/NPlus.v
@@ -2,10 +2,13 @@ Require Export NAxioms.
Module Type PlusSignature.
Declare Module Export NatModule : NatSignature.
+(* We use Export here because if we have an access to plus,
+then we need also an access to S and N *)
+Open Local Scope NScope.
Parameter Inline plus : N -> N -> N.
-Notation "x + y" := (plus x y).
+Notation "x + y" := (plus x y) : NScope.
Add Morphism plus with signature E ==> E ==> E as plus_wd.
@@ -14,11 +17,11 @@ Axiom plus_Sn_m : forall n m, (S n) + m == S (n + m).
End PlusSignature.
-Module PlusProperties (Export PlusModule : PlusSignature).
-
+Module PlusProperties (Import PlusModule : PlusSignature).
Module Export NatPropertiesModule := NatProperties NatModule.
+Open Local Scope NScope.
-Lemma plus_0_r : forall n, n + 0 == n.
+Theorem plus_0_r : forall n, n + 0 == n.
Proof.
induct n.
now rewrite plus_0_n.
@@ -27,13 +30,13 @@ rewrite plus_Sn_m.
now rewrite IH.
Qed.
-Lemma plus_0_l : forall n, 0 + n == n.
+Theorem plus_0_l : forall n, 0 + n == n.
Proof.
intro n.
now rewrite plus_0_n.
Qed.
-Lemma plus_n_Sm : forall n m, n + S m == S (n + m).
+Theorem plus_n_Sm : forall n m, n + S m == S (n + m).
Proof.
intros n m; generalize n; clear n. induct n.
now repeat rewrite plus_0_n.
@@ -41,13 +44,13 @@ intros x IH.
repeat rewrite plus_Sn_m; now rewrite IH.
Qed.
-Lemma plus_Sn_m : forall n m, S n + m == S (n + m).
+Theorem plus_Sn_m : forall n m, S n + m == S (n + m).
Proof.
intros.
now rewrite plus_Sn_m.
Qed.
-Lemma plus_comm : forall n m, n + m == m + n.
+Theorem plus_comm : forall n m, n + m == m + n.
Proof.
intros n m; generalize n; clear n. induct n.
rewrite plus_0_l; now rewrite plus_0_r.
@@ -55,7 +58,7 @@ intros x IH.
rewrite plus_Sn_m; rewrite plus_n_Sm; now rewrite IH.
Qed.
-Lemma plus_assoc : forall n m p, n + (m + p) == (n + m) + p.
+Theorem plus_assoc : forall n m p, n + (m + p) == (n + m) + p.
Proof.
intros n m p; generalize n; clear n. induct n.
now repeat rewrite plus_0_l.
@@ -63,24 +66,39 @@ intros x IH.
repeat rewrite plus_Sn_m; now rewrite IH.
Qed.
-Lemma plus_1_l : forall n, 1 + n == S n.
+Theorem plus_shuffle1 : forall n m p q, (n + m) + (p + q) == (n + p) + (m + q).
+Proof.
+intros n m p q.
+rewrite <- (plus_assoc n m (p + q)). rewrite (plus_comm m (p + q)).
+rewrite <- (plus_assoc p q m). rewrite (plus_assoc n p (q + m)).
+now rewrite (plus_comm q m).
+Qed.
+
+Theorem plus_shuffle2 : forall n m p q, (n + m) + (p + q) == (n + q) + (m + p).
+Proof.
+intros n m p q.
+rewrite <- (plus_assoc n m (p + q)). rewrite (plus_assoc m p q).
+rewrite (plus_comm (m + p) q). now rewrite <- (plus_assoc n q (m + p)).
+Qed.
+
+Theorem plus_1_l : forall n, 1 + n == S n.
Proof.
intro n; rewrite plus_Sn_m; now rewrite plus_0_n.
Qed.
-Lemma plus_1_r : forall n, n + 1 == S n.
+Theorem plus_1_r : forall n, n + 1 == S n.
Proof.
intro n; rewrite plus_comm; apply plus_1_l.
Qed.
-Lemma plus_cancel_l : forall n m p, p + n == p + m -> n == m.
+Theorem plus_cancel_l : forall n m p, p + n == p + m -> n == m.
Proof.
induct p.
do 2 rewrite plus_0_n; trivial.
intros p IH H. do 2 rewrite plus_Sn_m in H. apply S_inj in H. now apply IH.
Qed.
-Lemma plus_cancel_r : forall n m p, n + p == m + p -> n == m.
+Theorem plus_cancel_r : forall n m p, n + p == m + p -> n == m.
Proof.
intros n m p.
rewrite plus_comm.
@@ -88,7 +106,7 @@ set (k := p + n); rewrite plus_comm; unfold k.
apply plus_cancel_l.
Qed.
-Lemma plus_eq_0 : forall n m, n + m == 0 -> n == 0 /\ m == 0.
+Theorem plus_eq_0 : forall n m, n + m == 0 -> n == 0 /\ m == 0.
Proof.
intros n m; induct n.
rewrite plus_0_n; now split.
@@ -96,7 +114,7 @@ intros n IH H. rewrite plus_Sn_m in H.
absurd_hyp H; [|assumption]. unfold not; apply S_0.
Qed.
-Lemma succ_plus_discr : forall n m, m # S (n + m).
+Theorem succ_plus_discr : forall n m, m # S (n + m).
Proof.
intro n; induct m.
intro H. apply S_0 with (n := (n + 0)). now apply (proj2 (proj2 E_equiv)). (* symmetry *)
@@ -104,19 +122,19 @@ intros m IH H. apply S_inj in H. rewrite plus_n_Sm in H.
unfold not in IH; now apply IH.
Qed.
-Lemma n_SSn : forall n, n # S (S n).
+Theorem n_SSn : forall n, n # S (S n).
Proof.
intro n. pose proof (succ_plus_discr 1 n) as H.
rewrite plus_Sn_m in H; now rewrite plus_0_n in H.
Qed.
-Lemma n_SSSn : forall n, n # S (S (S n)).
+Theorem n_SSSn : forall n, n # S (S (S n)).
Proof.
intro n. pose proof (succ_plus_discr (S (S 0)) n) as H.
do 2 rewrite plus_Sn_m in H. now rewrite plus_0_n in H.
Qed.
-Lemma n_SSSSn : forall n, n # S (S (S (S n))).
+Theorem n_SSSSn : forall n, n # S (S (S (S n))).
Proof.
intro n. pose proof (succ_plus_discr (S (S (S 0))) n) as H.
do 3 rewrite plus_Sn_m in H. now rewrite plus_0_n in H.
@@ -138,7 +156,7 @@ Qed.
Definition plus_eq_1_dec (m n : N) : bool := recursion true (fun _ _ => false) m.
-Lemma plus_eq_1_dec_step_wd : fun2_wd E eq_bool eq_bool (fun _ _ => false).
+Theorem plus_eq_1_dec_step_wd : fun2_wd E eq_bool eq_bool (fun _ _ => false).
Proof.
unfold fun2_wd; intros. unfold eq_bool. reflexivity.
Qed.
@@ -153,13 +171,13 @@ unfold eq_fun2; unfold eq_bool; reflexivity.
assumption.
Qed.
-Lemma plus_eq_1_dec_0 : forall n, plus_eq_1_dec 0 n = true.
+Theorem plus_eq_1_dec_0 : forall n, plus_eq_1_dec 0 n = true.
Proof.
intro n. unfold plus_eq_1_dec.
now apply recursion_0.
Qed.
-Lemma plus_eq_1_dec_S : forall m n, plus_eq_1_dec (S n) m = false.
+Theorem plus_eq_1_dec_S : forall m n, plus_eq_1_dec (S n) m = false.
Proof.
intros n m. unfold plus_eq_1_dec.
now rewrite (recursion_S eq_bool);