From: Claudio Sacerdoti Coen Date: Fri, 1 Jul 2005 15:43:43 +0000 (+0000) Subject: The library of matita is borned! Long life to the library of matita. X-Git-Tag: PRE_GETTER_STORAGE~53 X-Git-Url: http://matita.cs.unibo.it/gitweb/?a=commitdiff_plain;h=109ddb8c437013d6d86e1564d5df3f8b089b9700;p=helm.git The library of matita is borned! Long life to the library of matita. --- diff --git a/helm/matita/library/Makefile b/helm/matita/library/Makefile new file mode 100644 index 000000000..4df43ba60 --- /dev/null +++ b/helm/matita/library/Makefile @@ -0,0 +1,40 @@ +TODO=\ + bool.moo\ + compare.moo\ + equality.moo\ + logic.moo\ + nat.moo \ + Z.moo + +DEPEND_NAME=.depend + +all: links $(TODO) + +clean: + rm -f $(DEPEND_NAME) $(TODO) + ../matitaclean all + +# Let's prepare the environment +links: .matita matita.lang matita.conf.xml +.PHONY: links + +.matita: + ln -s ../.matita . + +matita.lang: + ln -s ../matita.lang . + +matita.conf.xml: + ln -s ../matita.conf.xml . +#done + +depend: $(DEPEND_NAME) + +%.moo:%.ma + [ ! -e $@ ] || ../matitaclean $< + ../matitac $< || ../matitaclean $< + +$(DEPEND_NAME): $(TODO:%.moo=%.ma) + ../matitadep $^ > $@ + +include $(DEPEND_NAME) diff --git a/helm/matita/library/Z.ma b/helm/matita/library/Z.ma new file mode 100644 index 000000000..130fdff13 --- /dev/null +++ b/helm/matita/library/Z.ma @@ -0,0 +1,346 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +set "baseuri" "cic:/matita/Z/". + +alias id "nat" = "cic:/matita/nat/nat.ind#xpointer(1/1)". +alias id "O" = "cic:/matita/nat/nat.ind#xpointer(1/1/1)". +alias id "false" = "cic:/matita/bool/bool.ind#xpointer(1/1/2)". +alias id "true" = "cic:/matita/bool/bool.ind#xpointer(1/1/1)". +alias id "Not" = "cic:/matita/logic/Not.con". +alias id "eq" = "cic:/matita/equality/eq.ind#xpointer(1/1)". +alias id "if_then_else" = "cic:/matita/bool/if_then_else.con". +alias id "refl_equal" = "cic:/matita/equality/eq.ind#xpointer(1/1/1)". +alias id "False" = "cic:/matita/logic/False.ind#xpointer(1/1)". +alias id "True" = "cic:/matita/logic/True.ind#xpointer(1/1)". +alias id "sym_eq" = "cic:/matita/equality/sym_eq.con". +alias id "I" = "cic:/matita/logic/True.ind#xpointer(1/1/1)". +alias id "S" = "cic:/matita/nat/nat.ind#xpointer(1/1/2)". +alias id "LT" = "cic:/matita/compare/compare.ind#xpointer(1/1/1)". +alias id "minus" = "cic:/matita/nat/minus.con". +alias id "nat_compare" = "cic:/matita/nat/nat_compare.con". +alias id "plus" = "cic:/matita/nat/plus.con". +alias id "pred" = "cic:/matita/nat/pred.con". +alias id "sym_plus" = "cic:/matita/nat/sym_plus.con". +alias id "nat_compare_invert" = "cic:/matita/nat/nat_compare_invert.con". +alias id "plus_n_O" = "cic:/matita/nat/plus_n_O.con". +alias id "plus_n_Sm" = "cic:/matita/nat/plus_n_Sm.con". +alias id "nat_double_ind" = "cic:/matita/nat/nat_double_ind.con". +alias id "f_equal" = "cic:/matita/equality/f_equal.con". + +inductive Z : Set \def + OZ : Z +| pos : nat \to Z +| neg : nat \to Z. + +definition Z_of_nat \def +\lambda n. match n with +[ O \Rightarrow OZ +| (S n)\Rightarrow pos n]. + +coercion Z_of_nat. + +definition neg_Z_of_nat \def +\lambda n. match n with +[ O \Rightarrow OZ +| (S n)\Rightarrow neg n]. + +definition absZ \def +\lambda z. + match z with +[ OZ \Rightarrow O +| (pos n) \Rightarrow n +| (neg n) \Rightarrow n]. + +definition OZ_testb \def +\lambda z. +match z with +[ OZ \Rightarrow true +| (pos n) \Rightarrow false +| (neg n) \Rightarrow false]. + +theorem OZ_discr : +\forall z. if_then_else (OZ_testb z) (eq Z z OZ) (Not (eq Z z OZ)). +intros.elim z.simplify. +apply refl_equal. +simplify.intros. +cut match neg e with +[ OZ \Rightarrow True +| (pos n) \Rightarrow False +| (neg n) \Rightarrow False]. +apply Hcut. + elim (sym_eq ? ? ? H).simplify. +exact I. +simplify.intros. +cut match pos e with +[ OZ \Rightarrow True +| (pos n) \Rightarrow False +| (neg n) \Rightarrow False]. +apply Hcut. elim (sym_eq ? ? ? H).simplify.exact I. +qed. + +definition Zsucc \def +\lambda z. match z with +[ OZ \Rightarrow pos O +| (pos n) \Rightarrow pos (S n) +| (neg n) \Rightarrow + match n with + [ O \Rightarrow OZ + | (S p) \Rightarrow neg p]]. + +definition Zpred \def +\lambda z. match z with +[ OZ \Rightarrow neg O +| (pos n) \Rightarrow + match n with + [ O \Rightarrow OZ + | (S p) \Rightarrow pos p] +| (neg n) \Rightarrow neg (S n)]. + +theorem Zpred_succ: \forall z:Z. eq Z (Zpred (Zsucc z)) z. +intros.elim z.apply refl_equal. +elim e.apply refl_equal. +apply refl_equal. +apply refl_equal. +qed. + +theorem Zsucc_pred: \forall z:Z. eq Z (Zsucc (Zpred z)) z. +intros.elim z.apply refl_equal. +apply refl_equal. +elim e.apply refl_equal. +apply refl_equal. +qed. + +let rec Zplus x y : Z \def + match x with + [ OZ \Rightarrow y + | (pos m) \Rightarrow + match y with + [ OZ \Rightarrow x + | (pos n) \Rightarrow (pos (S (plus m n))) + | (neg n) \Rightarrow + match nat_compare m n with + [ LT \Rightarrow (neg (pred (minus n m))) + | EQ \Rightarrow OZ + | GT \Rightarrow (pos (pred (minus m n)))]] + | (neg m) \Rightarrow + match y with + [ OZ \Rightarrow x + | (pos n) \Rightarrow + match nat_compare m n with + [ LT \Rightarrow (pos (pred (minus n m))) + | EQ \Rightarrow OZ + | GT \Rightarrow (neg (pred (minus m n)))] + | (neg n) \Rightarrow (neg (S (plus m n)))]]. + +theorem Zplus_z_O: \forall z:Z. eq Z (Zplus z OZ) z. +intro.elim z. +simplify.apply refl_equal. +simplify.apply refl_equal. +simplify.apply refl_equal. +qed. + +theorem sym_Zplus : \forall x,y:Z. eq Z (Zplus x y) (Zplus y x). +intros.elim x.simplify.elim (sym_eq ? ? ? (Zplus_z_O y)).apply refl_equal. +elim y.simplify.reflexivity. +simplify. +elim (sym_plus e e1).apply refl_equal. +simplify. +elim (sym_eq ? ? ?(nat_compare_invert e e1)). +simplify.elim nat_compare e1 e.simplify.apply refl_equal. +simplify. apply refl_equal. +simplify. apply refl_equal. +elim y.simplify.reflexivity. +simplify.elim (sym_eq ? ? ?(nat_compare_invert e e1)). +simplify.elim nat_compare e1 e.simplify.apply refl_equal. +simplify. apply refl_equal. +simplify. apply refl_equal. +simplify.elim (sym_plus e1 e).apply refl_equal. +qed. + +theorem Zpred_neg : \forall z:Z. eq Z (Zpred z) (Zplus (neg O) z). +intros.elim z. +simplify.apply refl_equal. +simplify.apply refl_equal. +elim e.simplify.apply refl_equal. +simplify.apply refl_equal. +qed. + +theorem Zsucc_pos : \forall z:Z. eq Z (Zsucc z) (Zplus (pos O) z). +intros.elim z. +simplify.apply refl_equal. +elim e.simplify.apply refl_equal. +simplify.apply refl_equal. +simplify.apply refl_equal. +qed. + +theorem Zplus_succ_pred_pp : +\forall n,m. eq Z (Zplus (pos n) (pos m)) (Zplus (Zsucc (pos n)) (Zpred (pos m))). +intros. +elim n.elim m. +simplify.apply refl_equal. +simplify.apply refl_equal. +elim m. +simplify. +elim (plus_n_O ?).apply refl_equal. +simplify. +elim (plus_n_Sm ? ?).apply refl_equal. +qed. + +theorem Zplus_succ_pred_pn : +\forall n,m. eq Z (Zplus (pos n) (neg m)) (Zplus (Zsucc (pos n)) (Zpred (neg m))). +intros.apply refl_equal. +qed. + +theorem Zplus_succ_pred_np : +\forall n,m. eq Z (Zplus (neg n) (pos m)) (Zplus (Zsucc (neg n)) (Zpred (pos m))). +intros. +elim n.elim m. +simplify.apply refl_equal. +simplify.apply refl_equal. +elim m. +simplify.apply refl_equal. +simplify.apply refl_equal. +qed. + +theorem Zplus_succ_pred_nn: +\forall n,m. eq Z (Zplus (neg n) (neg m)) (Zplus (Zsucc (neg n)) (Zpred (neg m))). +intros. +elim n.elim m. +simplify.apply refl_equal. +simplify.apply refl_equal. +elim m. +simplify.elim (plus_n_Sm ? ?).apply refl_equal. +simplify.elim (sym_eq ? ? ? (plus_n_Sm ? ?)).apply refl_equal. +qed. + +theorem Zplus_succ_pred: +\forall x,y. eq Z (Zplus x y) (Zplus (Zsucc x) (Zpred y)). +intros. +elim x. elim y. +simplify.apply refl_equal. +simplify.apply refl_equal. +elim (Zsucc_pos ?).elim (sym_eq ? ? ? (Zsucc_pred ?)).apply refl_equal. +elim y.elim sym_Zplus ? ?.elim sym_Zplus (Zpred OZ) ?. +elim (Zpred_neg ?).elim (sym_eq ? ? ? (Zpred_succ ?)). +simplify.apply refl_equal. +apply Zplus_succ_pred_nn. +apply Zplus_succ_pred_np. +elim y.simplify.apply refl_equal. +apply Zplus_succ_pred_pn. +apply Zplus_succ_pred_pp. +qed. + +theorem Zsucc_plus_pp : +\forall n,m. eq Z (Zplus (Zsucc (pos n)) (pos m)) (Zsucc (Zplus (pos n) (pos m))). +intros.apply refl_equal. +qed. + +theorem Zsucc_plus_pn : +\forall n,m. eq Z (Zplus (Zsucc (pos n)) (neg m)) (Zsucc (Zplus (pos n) (neg m))). +intros. +apply nat_double_ind +(\lambda n,m. eq Z (Zplus (Zsucc (pos n)) (neg m)) (Zsucc (Zplus (pos n) (neg m)))).intro. +intros.elim n1. +simplify. apply refl_equal. +elim e.simplify. apply refl_equal. +simplify. apply refl_equal. +intros. elim n1. +simplify. apply refl_equal. +simplify.apply refl_equal. +intros. +elim (Zplus_succ_pred_pn ? m1). +elim H.apply refl_equal. +qed. + +theorem Zsucc_plus_nn : +\forall n,m. eq Z (Zplus (Zsucc (neg n)) (neg m)) (Zsucc (Zplus (neg n) (neg m))). +intros. +apply nat_double_ind +(\lambda n,m. eq Z (Zplus (Zsucc (neg n)) (neg m)) (Zsucc (Zplus (neg n) (neg m)))).intro. +intros.elim n1. +simplify. apply refl_equal. +elim e.simplify. apply refl_equal. +simplify. apply refl_equal. +intros. elim n1. +simplify. apply refl_equal. +simplify.apply refl_equal. +intros. +elim (Zplus_succ_pred_nn ? m1). +apply refl_equal. +qed. + +theorem Zsucc_plus_np : +\forall n,m. eq Z (Zplus (Zsucc (neg n)) (pos m)) (Zsucc (Zplus (neg n) (pos m))). +intros. +apply nat_double_ind +(\lambda n,m. eq Z (Zplus (Zsucc (neg n)) (pos m)) (Zsucc (Zplus (neg n) (pos m)))). +intros.elim n1. +simplify. apply refl_equal. +elim e.simplify. apply refl_equal. +simplify. apply refl_equal. +intros. elim n1. +simplify. apply refl_equal. +simplify.apply refl_equal. +intros. +elim H. +elim (Zplus_succ_pred_np ? (S m1)). +apply refl_equal. +qed. + + +theorem Zsucc_plus : \forall x,y:Z. eq Z (Zplus (Zsucc x) y) (Zsucc (Zplus x y)). +intros.elim x.elim y. +simplify. apply refl_equal. +elim (Zsucc_pos ?).apply refl_equal. +simplify.apply refl_equal. +elim y.elim sym_Zplus ? ?.elim sym_Zplus OZ ?.simplify.apply refl_equal. +apply Zsucc_plus_nn. +apply Zsucc_plus_np. +elim y. +elim (sym_Zplus OZ ?).apply refl_equal. +apply Zsucc_plus_pn. +apply Zsucc_plus_pp. +qed. + +theorem Zpred_plus : \forall x,y:Z. eq Z (Zplus (Zpred x) y) (Zpred (Zplus x y)). +intros. +cut eq Z (Zpred (Zplus x y)) (Zpred (Zplus (Zsucc (Zpred x)) y)). +elim (sym_eq ? ? ? Hcut). +elim (sym_eq ? ? ? (Zsucc_plus ? ?)). +elim (sym_eq ? ? ? (Zpred_succ ?)). +apply refl_equal. +elim (sym_eq ? ? ? (Zsucc_pred ?)). +apply refl_equal. +qed. + +theorem assoc_Zplus : +\forall x,y,z:Z. eq Z (Zplus x (Zplus y z)) (Zplus (Zplus x y) z). +intros.elim x.simplify.apply refl_equal. +elim e.elim (Zpred_neg (Zplus y z)). +elim (Zpred_neg y). +elim (Zpred_plus ? ?). +apply refl_equal. +elim (sym_eq ? ? ? (Zpred_plus (neg e1) ?)). +elim (sym_eq ? ? ? (Zpred_plus (neg e1) ?)). +elim (sym_eq ? ? ? (Zpred_plus (Zplus (neg e1) y) ?)). +apply f_equal.assumption. +elim e.elim (Zsucc_pos ?). +elim (Zsucc_pos ?). +apply (sym_eq ? ? ? (Zsucc_plus ? ?)) . +elim (sym_eq ? ? ? (Zsucc_plus (pos e1) ?)). +elim (sym_eq ? ? ? (Zsucc_plus (pos e1) ?)). +elim (sym_eq ? ? ? (Zsucc_plus (Zplus (pos e1) y) ?)). +apply f_equal.assumption. +qed. diff --git a/helm/matita/library/bool.ma b/helm/matita/library/bool.ma new file mode 100644 index 000000000..fdb376c60 --- /dev/null +++ b/helm/matita/library/bool.ma @@ -0,0 +1,45 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +set "baseuri" "cic:/matita/bool/". + +inductive bool : Set \def + | true : bool + | false : bool. + +definition notb : bool \to bool \def +\lambda b:bool. + match b with + [ true \Rightarrow false + | false \Rightarrow true ]. + +definition andb : bool \to bool \to bool\def +\lambda b1,b2:bool. + match b1 with + [ true \Rightarrow + match b2 with [true \Rightarrow true | false \Rightarrow false] + | false \Rightarrow false ]. + +definition orb : bool \to bool \to bool\def +\lambda b1,b2:bool. + match b1 with + [ true \Rightarrow + match b2 with [true \Rightarrow true | false \Rightarrow false] + | false \Rightarrow false ]. + +definition if_then_else : bool \to Prop \to Prop \to Prop \def +\lambda b:bool.\lambda P,Q:Prop. +match b with +[ true \Rightarrow P +| false \Rightarrow Q]. diff --git a/helm/matita/library/compare.ma b/helm/matita/library/compare.ma new file mode 100644 index 000000000..3e0271d59 --- /dev/null +++ b/helm/matita/library/compare.ma @@ -0,0 +1,27 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +set "baseuri" "cic:/matita/compare/". + +inductive compare :Set \def +| LT : compare +| EQ : compare +| GT : compare. + +definition compare_invert: compare \to compare \def + \lambda c. + match c with + [ LT \Rightarrow GT + | EQ \Rightarrow EQ + | GT \Rightarrow LT ]. diff --git a/helm/matita/library/equality.ma b/helm/matita/library/equality.ma new file mode 100644 index 000000000..c49475c13 --- /dev/null +++ b/helm/matita/library/equality.ma @@ -0,0 +1,38 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +set "baseuri" "cic:/matita/equality/". + +inductive eq (A:Type) (x:A) : A \to Prop \def + refl_equal : eq A x x. + +theorem sym_eq : \forall A:Type.\forall x,y:A. eq A x y \to eq A y x. +intros. elim H. apply refl_equal. +qed. + +theorem trans_eq : \forall A:Type. +\forall x,y,z:A. eq A x y \to eq A y z \to eq A x z. +intros.elim H1.assumption. +qed. + +theorem f_equal: \forall A,B:Type.\forall f:A\to B. +\forall x,y:A. eq A x y \to eq B (f x) (f y). +intros.elim H.apply refl_equal. +qed. + +theorem f_equal2: \forall A,B,C:Type.\forall f:A\to B \to C. +\forall x1,x2:A. \forall y1,y2:B. +eq A x1 x2\to eq B y1 y2\to eq C (f x1 y1) (f x2 y2). +intros.elim H1.elim H.apply refl_equal. +qed. diff --git a/helm/matita/library/logic.ma b/helm/matita/library/logic.ma new file mode 100644 index 000000000..a509bbb8d --- /dev/null +++ b/helm/matita/library/logic.ma @@ -0,0 +1,49 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +set "baseuri" "cic:/matita/logic/". + + +inductive True: Prop \def +I : True. + +inductive False: Prop \def . + +definition Not: Prop \to Prop \def +\lambda A. (A \to False). + +theorem absurd : \forall A,C:Prop. A \to Not A \to C. +intros. elim (H1 H). +qed. + +inductive And (A,B:Prop) : Prop \def + conj : A \to B \to (And A B). + +theorem proj1: \forall A,B:Prop. (And A B) \to A. +intros. elim H. assumption. +qed. + +theorem proj2: \forall A,B:Prop. (And A B) \to A. +intros. elim H. assumption. +qed. + +inductive Or (A,B:Prop) : Prop \def + or_introl : A \to (Or A B) + | or_intror : B \to (Or A B). + +inductive ex (A:Type) (P:A \to Prop) : Prop \def + ex_intro: \forall x:A. P x \to ex A P. + +inductive ex2 (A:Type) (P,Q:A \to Prop) : Prop \def + ex_intro2: \forall x:A. P x \to Q x \to ex2 A P Q. diff --git a/helm/matita/library/nat.ma b/helm/matita/library/nat.ma new file mode 100644 index 000000000..b58004b5a --- /dev/null +++ b/helm/matita/library/nat.ma @@ -0,0 +1,257 @@ +(**************************************************************************) +(* ___ *) +(* ||M|| *) +(* ||A|| A project by Andrea Asperti *) +(* ||T|| *) +(* ||I|| Developers: *) +(* ||T|| A.Asperti, C.Sacerdoti Coen, *) +(* ||A|| E.Tassi, S.Zacchiroli *) +(* \ / *) +(* \ / This file is distributed under the terms of the *) +(* v GNU Lesser General Public License Version 2.1 *) +(* *) +(**************************************************************************) + +set "baseuri" "cic:/matita/nat/". + +alias id "eq" = "cic:/matita/equality/eq.ind#xpointer(1/1)". +alias id "refl_equal" = "cic:/matita/equality/eq.ind#xpointer(1/1/1)". +alias id "sym_eq" = "cic:/matita/equality/sym_eq.con". +alias id "f_equal" = "cic:/matita/equality/f_equal.con". +alias id "Not" = "cic:/matita/logic/Not.con". +alias id "False" = "cic:/matita/logic/False.ind#xpointer(1/1)". +alias id "True" = "cic:/matita/logic/True.ind#xpointer(1/1)". +alias id "trans_eq" = "cic:/matita/equality/trans_eq.con". +alias id "I" = "cic:/matita/logic/True.ind#xpointer(1/1/1)". +alias id "f_equal2" = "cic:/matita/equality/f_equal2.con". +alias id "False_ind" = "cic:/matita/logic/False_ind.con". +alias id "false" = "cic:/matita/bool/bool.ind#xpointer(1/1/2)". +alias id "true" = "cic:/matita/bool/bool.ind#xpointer(1/1/1)". +alias id "if_then_else" = "cic:/matita/bool/if_then_else.con". +alias id "EQ" = "cic:/matita/compare/compare.ind#xpointer(1/1/2)". +alias id "GT" = "cic:/matita/compare/compare.ind#xpointer(1/1/3)". +alias id "LT" = "cic:/matita/compare/compare.ind#xpointer(1/1/1)". +alias id "compare" = "cic:/matita/compare/compare.ind#xpointer(1/1)". +alias id "compare_invert" = "cic:/matita/compare/compare_invert.con". + +inductive nat : Set \def + | O : nat + | S : nat \to nat. + +definition pred: nat \to nat \def +\lambda n:nat. match n with +[ O \Rightarrow O +| (S u) \Rightarrow u ]. + +theorem pred_Sn : \forall n:nat. +(eq nat n (pred (S n))). +intros. +apply refl_equal. +qed. + +theorem injective_S : \forall n,m:nat. +(eq nat (S n) (S m)) \to (eq nat n m). +intros. +(elim (sym_eq ? ? ? (pred_Sn n))).(elim (sym_eq ? ? ? (pred_Sn m))). +apply f_equal. assumption. +qed. + +theorem not_eq_S : \forall n,m:nat. +Not (eq nat n m) \to Not (eq nat (S n) (S m)). +intros. simplify.intros. +apply H.apply injective_S.assumption. +qed. + +definition not_zero : nat \to Prop \def +\lambda n: nat. + match n with + [ O \Rightarrow False + | (S p) \Rightarrow True ]. + +theorem O_S : \forall n:nat. Not (eq nat O (S n)). +intros.simplify.intros. +cut (not_zero O).exact Hcut.elim (sym_eq ? ? ? H). +exact I. +qed. + +theorem n_Sn : \forall n:nat. Not (eq nat n (S n)). +intros.elim n.apply O_S.apply not_eq_S.assumption. +qed. + + +let rec plus n m \def + match n with + [ O \Rightarrow m + | (S p) \Rightarrow S (plus p m) ]. + +theorem plus_n_O: \forall n:nat. eq nat n (plus n O). +intros.elim n.simplify.apply refl_equal.simplify.apply f_equal.assumption. +qed. + +theorem plus_n_Sm : \forall n,m:nat. eq nat (S (plus n m)) (plus n (S m)). +intros.elim n.simplify.apply refl_equal.simplify.apply f_equal.assumption. +qed. + +theorem sym_plus: \forall n,m:nat. eq nat (plus n m) (plus m n). +intros.elim n.simplify.apply plus_n_O. +simplify.elim (sym_eq ? ? ? H).apply plus_n_Sm. +qed. + +theorem assoc_plus: +\forall n,m,p:nat. eq nat (plus (plus n m) p) (plus n (plus m p)). +intros.elim n.simplify.apply refl_equal.simplify.apply f_equal.assumption. +qed. + +let rec times n m \def + match n with + [ O \Rightarrow O + | (S p) \Rightarrow (plus m (times p m)) ]. + +theorem times_n_O: \forall n:nat. eq nat O (times n O). +intros.elim n.simplify.apply refl_equal.simplify.assumption. +qed. + +theorem times_n_Sm : +\forall n,m:nat. eq nat (plus n (times n m)) (times n (S m)). +intros.elim n.simplify.apply refl_equal. +simplify.apply f_equal.elim H. +apply trans_eq ? ? (plus (plus e m) (times e m)).apply sym_eq. +apply assoc_plus.apply trans_eq ? ? (plus (plus m e) (times e m)). +apply f_equal2. +apply sym_plus.apply refl_equal.apply assoc_plus. +qed. + +theorem sym_times : +\forall n,m:nat. eq nat (times n m) (times m n). +intros.elim n.simplify.apply times_n_O. +simplify.elim (sym_eq ? ? ? H).apply times_n_Sm. +qed. + +let rec minus n m \def + match n with + [ O \Rightarrow O + | (S p) \Rightarrow + match m with + [O \Rightarrow (S p) + | (S q) \Rightarrow minus p q ]]. + +theorem nat_case : +\forall n:nat.\forall P:nat \to Prop. +P O \to (\forall m:nat. P (S m)) \to P n. +intros.elim n.assumption.apply H1. +qed. + +theorem nat_double_ind : +\forall R:nat \to nat \to Prop. +(\forall n:nat. R O n) \to +(\forall n:nat. R (S n) O) \to +(\forall n,m:nat. R n m \to R (S n) (S m)) \to \forall n,m:nat. R n m. +intros.cut \forall m:nat.R n m.apply Hcut.elim n.apply H. +apply nat_case m1.apply H1.intros.apply H2. apply H3. +qed. + +inductive le (n:nat) : nat \to Prop \def + | le_n : le n n + | le_S : \forall m:nat. le n m \to le n (S m). + +theorem trans_le: \forall n,m,p:nat. le n m \to le m p \to le n p. +intros. +elim H1.assumption. +apply le_S.assumption. +qed. + +theorem le_n_S: \forall n,m:nat. le n m \to le (S n) (S m). +intros.elim H. +apply le_n.apply le_S.assumption. +qed. + +theorem le_O_n : \forall n:nat. le O n. +intros.elim n.apply le_n.apply le_S. assumption. +qed. + +theorem le_n_Sn : \forall n:nat. le n (S n). +intros. apply le_S.apply le_n. +qed. + +theorem le_pred_n : \forall n:nat. le (pred n) n. +intros.elim n.simplify.apply le_n.simplify. +apply le_n_Sn. +qed. + +theorem not_zero_le : \forall n,m:nat. (le (S n) m ) \to not_zero m. +intros.elim H.exact I.exact I. +qed. + +theorem le_Sn_O: \forall n:nat. Not (le (S n) O). +intros.simplify.intros.apply not_zero_le ? O H. +qed. + +theorem le_n_O_eq : \forall n:nat. (le n O) \to (eq nat O n). +intros.cut (le n O) \to (eq nat O n).apply Hcut. assumption. +elim n.apply refl_equal. +apply False_ind.apply (le_Sn_O ? H2). +qed. + +theorem le_S_n : \forall n,m:nat. le (S n) (S m) \to le n m. +intros.cut le (pred (S n)) (pred (S m)).exact Hcut. +elim H.apply le_n.apply trans_le ? (pred x).assumption. +apply le_pred_n. +qed. + +theorem le_Sn_n : \forall n:nat. Not (le (S n) n). +intros.elim n.apply le_Sn_O.simplify.intros. +cut le (S e) e.apply H.assumption.apply le_S_n.assumption. +qed. + +theorem le_antisym : \forall n,m:nat. (le n m) \to (le m n) \to (eq nat n m). +intros.cut (le n m) \to (le m n) \to (eq nat n m).exact Hcut H H1. +apply nat_double_ind (\lambda n,m.((le n m) \to (le m n) \to eq nat n m)). +intros.whd.intros. +apply le_n_O_eq.assumption. +intros.whd.intros.apply sym_eq.apply le_n_O_eq.assumption. +intros.whd.intros.apply f_equal.apply H2. +apply le_S_n.assumption. +apply le_S_n.assumption. +qed. + +let rec leb n m \def + match n with + [ O \Rightarrow true + | (S p) \Rightarrow + match m with + [ O \Rightarrow false + | (S q) \Rightarrow leb p q]]. + +theorem le_dec: \forall n,m:nat. if_then_else (leb n m) (le n m) (Not (le n m)). +intros. +apply (nat_double_ind +(\lambda n,m:nat.if_then_else (leb n m) (le n m) (Not (le n m))) ? ? ? n m). +simplify.intros.apply le_O_n. +simplify.exact le_Sn_O. +intros 2.simplify.elim (leb n1 m1). +simplify.apply le_n_S.apply H. +simplify.intros.apply H.apply le_S_n.assumption. +qed. + +let rec nat_compare n m: compare \def +match n with +[ O \Rightarrow + match m with + [ O \Rightarrow EQ + | (S q) \Rightarrow LT ] +| (S p) \Rightarrow + match m with + [ O \Rightarrow GT + | (S q) \Rightarrow nat_compare p q]]. + +theorem nat_compare_invert: \forall n,m:nat. +eq compare (nat_compare n m) (compare_invert (nat_compare m n)). +intros. +apply nat_double_ind (\lambda n,m.eq compare (nat_compare n m) (compare_invert (nat_compare m n))). +intros.elim n1.simplify.apply refl_equal. +simplify.apply refl_equal. +intro.elim n1.simplify.apply refl_equal. +simplify.apply refl_equal. +intros.simplify.elim H.apply refl_equal. +qed. +