aboutsummaryrefslogtreecommitdiffhomepage
path: root/theories/Numbers/Natural/Binary/NBinary.v
diff options
context:
space:
mode:
Diffstat (limited to 'theories/Numbers/Natural/Binary/NBinary.v')
-rw-r--r--theories/Numbers/Natural/Binary/NBinary.v250
1 files changed, 71 insertions, 179 deletions
diff --git a/theories/Numbers/Natural/Binary/NBinary.v b/theories/Numbers/Natural/Binary/NBinary.v
index 165c1211f..90b338773 100644
--- a/theories/Numbers/Natural/Binary/NBinary.v
+++ b/theories/Numbers/Natural/Binary/NBinary.v
@@ -2,128 +2,106 @@ Require Import NArith.
Require Import NMinus.
Module NBinaryAxiomsMod <: NAxiomsSig.
-
Open Local Scope N_scope.
-
-Definition N := N.
-Definition E := (@eq N).
-Definition O := 0.
-Definition S := Nsucc.
-
-(*Definition Npred (n : N) := match n with
-| 0 => 0
-| Npos p => match p with
- | xH => 0
- | _ => Npos (Ppred p)
- end
-end.*)
-
-Definition P := Npred.
-Definition plus := Nplus.
-Definition minus := Nminus.
-
-(*Definition minus (n m : N) :=
-match n, m with
-| N0, _ => N0
-| n, N0 => n
-| Npos n', Npos m' =>
- match Pminus_mask n' m' with
- | IsPos p => Npos p
- | _ => N0
- end
-end.*)
-
-Definition times := Nmult.
-Definition lt := Nlt.
-Definition le := Nle.
-
-Theorem E_equiv : equiv N E.
+Module Export NZOrdAxiomsMod <: NZOrdAxiomsSig.
+Module Export NZAxiomsMod <: NZAxiomsSig.
+
+Definition NZ := N.
+Definition NZE := (@eq N).
+Definition NZ0 := 0.
+Definition NZsucc := Nsucc.
+Definition NZpred := Npred.
+Definition NZplus := Nplus.
+Definition NZminus := Nminus.
+Definition NZtimes := Nmult.
+
+Theorem NZE_equiv : equiv N NZE.
Proof (eq_equiv N).
-Add Relation N E
- reflexivity proved by (proj1 E_equiv)
- symmetry proved by (proj2 (proj2 E_equiv))
- transitivity proved by (proj1 (proj2 E_equiv))
-as E_rel.
+Add Relation N NZE
+ reflexivity proved by (proj1 NZE_equiv)
+ symmetry proved by (proj2 (proj2 NZE_equiv))
+ transitivity proved by (proj1 (proj2 NZE_equiv))
+as NZE_rel.
-Add Morphism S with signature E ==> E as succ_wd.
+Add Morphism NZsucc with signature NZE ==> NZE as NZsucc_wd.
Proof.
congruence.
Qed.
-Add Morphism P with signature E ==> E as pred_wd.
+Add Morphism NZpred with signature NZE ==> NZE as NZpred_wd.
Proof.
congruence.
Qed.
-Add Morphism plus with signature E ==> E ==> E as plus_wd.
+Add Morphism NZplus with signature NZE ==> NZE ==> NZE as NZplus_wd.
Proof.
congruence.
Qed.
-Add Morphism minus with signature E ==> E ==> E as minus_wd.
+Add Morphism NZminus with signature NZE ==> NZE ==> NZE as NZminus_wd.
Proof.
congruence.
Qed.
-Add Morphism times with signature E ==> E ==> E as times_wd.
+Add Morphism NZtimes with signature NZE ==> NZE ==> NZE as NZtimes_wd.
Proof.
congruence.
Qed.
-Add Morphism lt with signature E ==> E ==> iff as lt_wd.
-Proof.
-unfold E; intros x1 x2 H1 y1 y2 H2; rewrite H1; now rewrite H2.
-Qed.
-
-Add Morphism le with signature E ==> E ==> iff as le_wd.
-Proof.
-unfold E; intros x1 x2 H1 y1 y2 H2; rewrite H1; now rewrite H2.
-Qed.
-
-Theorem induction :
- forall A : N -> Prop, predicate_wd E A ->
- A 0 -> (forall n, A n -> A (Nsucc n)) -> forall n, A n.
+Theorem NZinduction :
+ forall A : N -> Prop, predicate_wd NZE A ->
+ A 0 -> (forall n, A n <-> A (Nsucc n)) -> forall n : N, A n.
Proof.
-intros A predicate_wd; apply Nind.
+intros A A_wd A0 AS. apply Nind. assumption. intros; now apply -> AS.
Qed.
-Theorem pred_0 : Npred 0 = 0.
-Proof.
-reflexivity.
-Qed.
-
-Theorem pred_succ : forall n : N, Npred (Nsucc n) = n.
+Theorem NZpred_succ : forall n : N, Npred (Nsucc n) = n.
Proof.
destruct n as [| p]; simpl. reflexivity.
case_eq (Psucc p); try (intros q H; rewrite <- H; now rewrite Ppred_succ).
intro H; false_hyp H Psucc_not_one.
Qed.
-Theorem plus_0_l : forall n : N, 0 + n = n.
+Theorem NZplus_0_l : forall n : N, 0 + n = n.
Proof Nplus_0_l.
-Theorem plus_succ_l : forall n m : N, (Nsucc n) + m = Nsucc (n + m).
+Theorem NZplus_succ_l : forall n m : N, (Nsucc n) + m = Nsucc (n + m).
Proof Nplus_succ.
-Theorem minus_0_r : forall n : N, n - 0 = n.
+Theorem NZminus_0_r : forall n : N, n - 0 = n.
Proof Nminus_0_r.
-Theorem minus_succ_r : forall n m : N, n - (S m) = P (n - m).
+Theorem NZminus_succ_r : forall n m : N, n - (Nsucc m) = Npred (n - m).
Proof Nminus_succ_r.
-Theorem times_0_r : forall n : N, n * 0 = 0.
+Theorem NZtimes_0_r : forall n : N, n * 0 = 0.
Proof.
intro n; rewrite Nmult_comm; apply Nmult_0_l.
Qed.
-Theorem times_succ_r : forall n m : N, n * (Nsucc m) = n * m + n.
+Theorem NZtimes_succ_r : forall n m : N, n * (Nsucc m) = n * m + n.
Proof.
intros n m; rewrite Nmult_comm, Nmult_Sn_m.
now rewrite Nplus_comm, Nmult_comm.
Qed.
-Theorem le_lt_or_eq : forall n m : N, n <= m <-> n < m \/ n = m.
+End NZAxiomsMod.
+
+Definition NZlt := Nlt.
+Definition NZle := Nle.
+
+Add Morphism NZlt with signature NZE ==> NZE ==> iff as NZlt_wd.
+Proof.
+unfold NZE; intros x1 x2 H1 y1 y2 H2; rewrite H1; now rewrite H2.
+Qed.
+
+Add Morphism NZle with signature NZE ==> NZE ==> iff as NZle_wd.
+Proof.
+unfold NZE; intros x1 x2 H1 y1 y2 H2; rewrite H1; now rewrite H2.
+Qed.
+
+Theorem NZle_lt_or_eq : forall n m : N, n <= m <-> n < m \/ n = m.
Proof.
intros n m.
assert (H : (n ?= m) = Eq <-> n = m).
@@ -133,29 +111,37 @@ destruct (n ?= m); split; intro H1; (try discriminate); try (now left); try now
now elim H1. destruct H1; discriminate.
Qed.
-Theorem nlt_0_r : forall n : N, ~ (n < 0).
-Proof.
-unfold Nlt; destruct n as [| p]; simpl; discriminate.
-Qed.
+Theorem NZlt_irrefl : forall n : N, ~ n < n.
+Proof Nlt_irrefl.
-Theorem lt_succ_le : forall n m : N, n < (S m) <-> n <= m.
+Theorem NZlt_succ_le : forall n m : N, n < (Nsucc m) <-> n <= m.
Proof.
-intros x y. rewrite le_lt_or_eq.
-unfold Nlt, Nle, S; apply Ncompare_n_Sm.
+intros x y. rewrite NZle_lt_or_eq.
+unfold Nlt, Nle; apply Ncompare_n_Sm.
Qed.
+End NZOrdAxiomsMod.
+
Definition recursion (A : Set) (a : A) (f : N -> A -> A) (n : N) :=
Nrec (fun _ => A) a f n.
Implicit Arguments recursion [A].
+Theorem succ_neq_0 : forall n : N, Nsucc n <> 0.
+Proof Nsucc_0.
+
+Theorem pred_0 : Npred 0 = 0.
+Proof.
+reflexivity.
+Qed.
+
Theorem recursion_wd :
forall (A : Set) (EA : relation A),
forall a a' : A, EA a a' ->
- forall f f' : N -> A -> A, eq_fun2 E EA EA f f' ->
+ forall f f' : N -> A -> A, eq_fun2 NZE EA EA f f' ->
forall x x' : N, x = x' ->
EA (recursion a f x) (recursion a' f' x').
Proof.
-unfold fun2_wd, E, eq_fun2.
+unfold fun2_wd, NZE, eq_fun2.
intros A EA a a' Eaa' f f' Eff'.
intro x; pattern x; apply Nind.
intros x' H; now rewrite <- H.
@@ -173,10 +159,10 @@ Qed.
Theorem recursion_succ :
forall (A : Set) (EA : relation A) (a : A) (f : N -> A -> A),
- EA a a -> fun2_wd E EA EA f ->
+ EA a a -> fun2_wd NZE EA EA f ->
forall n : N, EA (recursion a f (Nsucc n)) (f n (recursion a f n)).
Proof.
-unfold E, recursion, Nrec, fun2_wd; intros A EA a f EAaa f_wd n; pattern n; apply Nind.
+unfold NZE, recursion, Nrec, fun2_wd; intros A EA a f EAaa f_wd n; pattern n; apply Nind.
rewrite Nrect_step; rewrite Nrect_base; now apply f_wd.
clear n; intro n; do 2 rewrite Nrect_step; intro IH. apply f_wd; [reflexivity|].
now rewrite Nrect_step.
@@ -186,102 +172,8 @@ End NBinaryAxiomsMod.
Module Export NBinaryMinusPropMod := NMinusPropFunct NBinaryAxiomsMod.
-(*
-Module NBinaryDepRec <: NDepRecSignature.
-Module Export NDomainModule := NBinaryDomain.
-Module Export NBaseMod := BinaryNat.
-
-Definition dep_recursion := Nrec.
-
-Theorem dep_recursion_0 :
- forall (A : N -> Set) (a : A 0) (f : forall n, A n -> A (S n)),
- dep_recursion A a f 0 = a.
-Proof.
-intros A a f; unfold dep_recursion; unfold Nrec; now rewrite Nrect_base.
-Qed.
-
-Theorem dep_recursion_succ :
- forall (A : N -> Set) (a : A 0) (f : forall n, A n -> A (S n)) (n : N),
- dep_recursion A a f (S n) = f n (dep_recursion A a f n).
-Proof.
-intros A a f n; unfold dep_recursion; unfold Nrec; now rewrite Nrect_step.
-Qed.
-End NBinaryDepRec.
-
-Module NBinaryPlus <: NPlusSig.
-Module Export NBaseMod := BinaryNat.
-
-Definition plus := Nplus.
-
-Add Morphism plus with signature E ==> E ==> E as plus_wd.
-Proof.
-unfold E; congruence.
-Qed.
-
-End NBinaryPlus.
-
-Module NBinaryTimes <: NTimesSig.
-Module Export NPlusMod := NBinaryPlus.
-
-Definition times := Nmult.
-
-Add Morphism times with signature E ==> E ==> E as times_wd.
-Proof.
-unfold E; congruence.
-Qed.
-
-
-End NBinaryTimes.
-
-Module NBinaryOrder <: NOrderSig.
-Module Export NBaseMod := BinaryNat.
-
-Definition lt (m n : N) := comp_bool (Ncompare m n) Lt.
-Definition le (m n : N) := let c := (Ncompare m n) in orb (comp_bool c Lt) (comp_bool c Eq).
-
-Add Morphism lt with signature E ==> E ==> eq_bool as lt_wd.
-Proof.
-unfold E; congruence.
-Qed.
-
-Add Morphism le with signature E ==> E ==> eq_bool as le_wd.
-Proof.
-unfold E; congruence.
-Qed.
-
-Theorem le_lt : forall n m, le n m <-> lt n m \/ n = m.
-Proof.
-intros n m.
-assert (H : (n ?= m) = Eq <-> n = m).
-(split; intro H); [now apply Ncompare_Eq_eq | rewrite H; apply Ncompare_refl].
-unfold le, lt; rewrite eq_true_or. repeat rewrite comp_bool_correct. now rewrite H.
-Qed.
-
-Theorem lt_0 : forall x, ~ (lt x 0).
-Proof.
-unfold lt; destruct x as [|x]; simpl; now intro.
-Qed.
-
-Theorem lt_succ : forall x y, lt x (S y) <-> le x y.
-Proof.
-intros x y. rewrite le_lt.
-assert (H1 : lt x (S y) <-> Ncompare x (S y) = Lt);
-[unfold lt, comp_bool; destruct (x ?= S y); simpl; split; now intro |].
-assert (H2 : lt x y <-> Ncompare x y = Lt);
-[unfold lt, comp_bool; destruct (x ?= y); simpl; split; now intro |].
-pose proof (Ncompare_n_Sm m x y) as H. tauto.
-Qed.
-
-End NBinaryOrder.
-
-Module Export NBinaryTimesOrderProperties := NTimesOrderProperties NBinaryTimes NBinaryOrder.
-
-(* Todo: N implements NPred.v and NMinus.v *)
-
-(*Module Export BinaryRecEx := MiscFunctFunctor BinaryNat.*)
-
-(* Just some fun comparing the efficiency of the generic log defined
+(* Some fun comparing the efficiency of the generic log defined
by strong (course-of-value) recursion and the log defined by recursion
on notation *)
(* Time Eval compute in (log 100000). *) (* 98 sec *)
@@ -302,7 +194,7 @@ end.
*)
(* Eval compute in (binlog 1000000000000000000). *) (* Works very fast *)
-*)
+
(*
Local Variables:
tags-file-name: "~/coq/trunk/theories/Numbers/TAGS"