aboutsummaryrefslogtreecommitdiff
path: root/theories/Numbers/Natural/Axioms/NTimes.v
diff options
context:
space:
mode:
Diffstat (limited to 'theories/Numbers/Natural/Axioms/NTimes.v')
-rw-r--r--theories/Numbers/Natural/Axioms/NTimes.v162
1 files changed, 162 insertions, 0 deletions
diff --git a/theories/Numbers/Natural/Axioms/NTimes.v b/theories/Numbers/Natural/Axioms/NTimes.v
new file mode 100644
index 0000000000..a470700832
--- /dev/null
+++ b/theories/Numbers/Natural/Axioms/NTimes.v
@@ -0,0 +1,162 @@
+Require Export NPlus.
+
+Module Type TimesSignature.
+Declare Module Export PlusModule : PlusSignature.
+
+Parameter Inline times : N -> N -> N.
+
+Notation "x * y" := (times x y).
+
+Add Morphism times with signature E ==> E ==> E as times_wd.
+
+Axiom times_0_n : forall n, 0 * n == 0.
+Axiom times_Sn_m : forall n m, (S n) * m == m + n * m.
+
+End TimesSignature.
+
+Module TimesProperties (Export TimesModule : TimesSignature).
+
+Module Export PlusPropertiesModule := PlusProperties PlusModule.
+
+Theorem mult_0_r : forall n, n * 0 == 0.
+Proof.
+induct n.
+now rewrite times_0_n.
+intros x IH.
+rewrite times_Sn_m; now rewrite plus_0_n.
+Qed.
+
+Theorem mult_0_l : forall n, 0 * n == 0.
+Proof.
+intro n; now rewrite times_0_n.
+Qed.
+
+Theorem mult_plus_distr_r : forall n m p, (n + m) * p == n * p + m * p.
+Proof.
+intros n m p; induct n.
+rewrite mult_0_l.
+now do 2 rewrite plus_0_l.
+intros x IH.
+rewrite plus_Sn_m.
+do 2 rewrite times_Sn_m.
+rewrite IH.
+apply plus_assoc.
+Qed.
+
+Theorem mult_plus_distr_l : forall n m p, n * (m + p) == n * m + n * p.
+Proof.
+intros n m p; induct n.
+do 3 rewrite mult_0_l; now rewrite plus_0_l.
+intros x IH.
+do 3 rewrite times_Sn_m.
+rewrite IH.
+(* Now we have to rearrange the sum of 4 terms *)
+rewrite <- (plus_assoc m p (x * m + x * p)).
+rewrite (plus_assoc p (x * m) (x * p)).
+rewrite (plus_comm p (x * m)).
+rewrite <- (plus_assoc (x * m) p (x * p)).
+apply (plus_assoc m (x * m) (p + x * p)).
+Qed.
+
+Theorem mult_assoc : forall n m p, n * (m * p) == (n * m) * p.
+Proof.
+intros n m p; induct n.
+now do 3 rewrite mult_0_l.
+intros x IH.
+do 2 rewrite times_Sn_m.
+rewrite mult_plus_distr_r.
+now rewrite IH.
+Qed.
+
+Theorem mult_1_l : forall n, 1 * n == n.
+Proof.
+intro n.
+rewrite times_Sn_m; rewrite times_0_n. now rewrite plus_0_r.
+Qed.
+
+Theorem mult_1_r : forall n, n * 1 == n.
+Proof.
+induct n.
+now rewrite times_0_n.
+intros x IH.
+rewrite times_Sn_m; rewrite IH; rewrite plus_Sn_m; now rewrite plus_0_n.
+Qed.
+
+Theorem mult_comm : forall n m, n * m == m * n.
+Proof.
+intros n m.
+induct n.
+rewrite mult_0_l; now rewrite mult_0_r.
+intros x IH.
+rewrite times_Sn_m.
+assert (H : S x == S 0 + x).
+rewrite plus_Sn_m; rewrite plus_0_n; reflexivity.
+rewrite H.
+rewrite mult_plus_distr_l.
+rewrite mult_1_r; rewrite IH; reflexivity.
+Qed.
+
+Theorem times_eq_0 : forall n m, n * m == 0 -> n == 0 \/ m == 0.
+Proof.
+induct n; induct m.
+intros; now left.
+intros; now left.
+intros; now right.
+intros m IH H1.
+rewrite times_Sn_m in H1; rewrite plus_Sn_m in H1; now apply S_0 in H1.
+Qed.
+
+Definition times_eq_0_dec (n m : N) : bool :=
+ recursion true (fun _ _ => recursion false (fun _ _ => false) m) n.
+
+Lemma times_eq_0_dec_wd_step :
+ forall y y', y == y' ->
+ eq_bool (recursion false (fun _ _ => false) y)
+ (recursion false (fun _ _ => false) y').
+Proof.
+intros y y' Eyy'.
+apply recursion_wd with (EA := eq_bool).
+now unfold eq_bool.
+unfold eq_fun2. intros. now unfold eq_bool.
+assumption.
+Qed.
+
+Add Morphism times_eq_0_dec with signature E ==> E ==> eq_bool
+as times_eq_0_dec_wd.
+unfold fun2_wd, times_eq_0_dec.
+intros x x' Exx' y y' Eyy'.
+apply recursion_wd with (EA := eq_bool).
+now unfold eq_bool.
+unfold eq_fun2; intros. now apply times_eq_0_dec_wd_step.
+assumption.
+Qed.
+
+Theorem times_eq_0_dec_correct :
+ forall n m, n * m == 0 ->
+ (times_eq_0_dec n m = true -> n == 0) /\
+ (times_eq_0_dec n m = false -> m == 0).
+Proof.
+nondep_induct n; nondep_induct m; unfold times_eq_0_dec.
+rewrite recursion_0; split; now intros.
+intro n; rewrite recursion_0; split; now intros.
+intro; rewrite recursion_0; rewrite (recursion_S eq_bool);
+[split; now intros | now unfold eq_bool | unfold fun2_wd; unfold eq_bool; now intros].
+intro m; rewrite (recursion_S eq_bool).
+rewrite times_Sn_m. rewrite plus_Sn_m. intro H; now apply S_0 in H.
+now unfold eq_bool.
+unfold fun2_wd; intros; now unfold eq_bool.
+Qed.
+
+Theorem times_eq_1 : forall n m, n * m == 1 -> n == 1 /\ m == 1.
+Proof.
+nondep_induct n; nondep_induct m.
+intro H; rewrite times_0_n in H; symmetry in H; now apply S_0 in H.
+intros n H; rewrite times_0_n in H; symmetry in H; now apply S_0 in H.
+intro H; rewrite mult_0_r in H; symmetry in H; now apply S_0 in H.
+intros m H; rewrite times_Sn_m in H; rewrite plus_Sn_m in H;
+apply S_inj in H; rewrite mult_comm in H; rewrite times_Sn_m in H;
+apply plus_eq_0 in H; destruct H as [H1 H2];
+apply plus_eq_0 in H2; destruct H2 as [H3 _]; rewrite H1; rewrite H3; now split.
+Qed.
+
+End TimesProperties.