]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matita/contribs/lambdadelta/ground/arith/ynat_succ.ma
milestone update in ground, partial commit
[helm.git] / matita / matita / contribs / lambdadelta / ground / arith / ynat_succ.ma
diff --git a/matita/matita/contribs/lambdadelta/ground/arith/ynat_succ.ma b/matita/matita/contribs/lambdadelta/ground/arith/ynat_succ.ma
new file mode 100644 (file)
index 0000000..8f8fe40
--- /dev/null
@@ -0,0 +1,106 @@
+(**************************************************************************)
+(*       ___                                                              *)
+(*      ||M||                                                             *)
+(*      ||A||       A project by Andrea Asperti                           *)
+(*      ||T||                                                             *)
+(*      ||I||       Developers:                                           *)
+(*      ||T||         The HELM team.                                      *)
+(*      ||A||         http://helm.cs.unibo.it                             *)
+(*      \   /                                                             *)
+(*       \ /        This file is distributed under the terms of the       *)
+(*        v         GNU General Public License Version 2                  *)
+(*                                                                        *)
+(**************************************************************************)
+
+include "ground/arith/nat_succ.ma".
+include "ground/arith/ynat_nat.ma".
+
+(* SUCCESSOR FOR NON-NEGATIVE INTEGERS WITH INFINITY ************************)
+
+definition ysucc_aux (n): ynat ≝
+           yinj_nat (↑n).
+
+(*** ysucc *)
+definition ysucc: ynat → ynat ≝
+           ynat_bind_nat ysucc_aux (∞).
+
+interpretation
+  "successor (non-negative integers with infinity)"
+  'UpArrow x = (ysucc x).
+
+(* Constructions ************************************************************)
+
+(*** ysucc_inj *)
+lemma ysucc_inj (n): yinj_nat (↑n) = ↑(yinj_nat n).
+@(ynat_bind_nat_inj ysucc_aux)
+qed.
+
+(*** ysucc_Y *)
+lemma ysucc_inf: ∞ = ↑(∞).
+// qed.
+
+(* Inversion lemmas *********************************************************)
+
+(*** ysucc_inv_inj_sn *)
+lemma eq_inv_inj_ysucc (n1) (x2):
+      yinj_nat n1 = ↑x2 →
+      ∃∃n2. yinj_nat n2 = x2 & ↑n2 = n1.
+#n1 #x2 @(ynat_split_nat_inf … x2) -x2
+[ /3 width=3 by eq_inv_yinj_nat_bi, ex2_intro/
+| #H elim (eq_inv_yinj_nat_inf … H)
+]
+qed-.
+
+(*** ysucc_inv_inj_dx *)
+lemma eq_inv_ysucc_inj (x1) (n2):
+      ↑x1 = yinj_nat n2  →
+      ∃∃n1. yinj_nat n1 = x1 & ↑n1 = n2.
+/2 width=1 by eq_inv_inj_ysucc/ qed-.
+
+(*** ysucc_inv_Y_sn *)
+lemma eq_inv_inf_ysucc (x2): ∞ = ↑x2 → ∞ = x2.
+#x2 @(ynat_split_nat_inf … x2) -x2 //
+#n1 <ysucc_inj #H elim (eq_inv_inf_yinj_nat … H)
+qed-.
+
+(*** ysucc_inv_Y_dx *)
+lemma eq_inv_ysucc_inf (x1): ↑x1 = ∞ → ∞ = x1.
+/2 width=1 by eq_inv_inf_ysucc/ qed-.
+
+(*** ysucc_inv_inj *)
+lemma eq_inv_ysucc_bi: injective … ysucc.
+#x1 @(ynat_split_nat_inf … x1) -x1
+[ #n1 #x2 <ysucc_inj #H
+  elim (eq_inv_inj_ysucc … H) -H #n2 #H1 #H2 destruct
+  /3 width=1 by eq_inv_nsucc_bi, eq_f/
+| #x2 #H <(eq_inv_inf_ysucc … H) -H //
+]
+qed-.
+
+(*** ysucc_inv_refl *)
+lemma ysucc_inv_refl (x): x = ↑x → ∞ = x.
+#x @(ynat_split_nat_inf … x) -x //
+#n <ysucc_inj #H
+lapply (eq_inv_yinj_nat_bi … H) -H #H
+elim (nsucc_inv_refl … H)
+qed-.
+
+(*** ysucc_inv_O_sn *)
+lemma eq_inv_zero_ysucc (x): 𝟎 = ↑x → ⊥.
+#x #H
+elim (eq_inv_inj_ysucc (𝟎) ? H) -H #n #_ #H
+/2 width=2 by eq_inv_zero_nsucc/
+qed-.
+
+(*** ysucc_inv_O_dx *)
+lemma eq_inv_ysucc_zero (x): ↑x = 𝟎 → ⊥.
+/2 width=2 by eq_inv_zero_ysucc/ qed-.
+
+(* Eliminators **************************************************************)
+
+(*** ynat_ind *)
+lemma ynat_ind_succ (Q:predicate …):
+      Q (𝟎) → (∀n:nat. Q (yinj_nat n) → Q (↑(yinj_nat n))) → Q (∞) → ∀x. Q x.
+#Q #IH1 #IH2 #IH3 #x @(ynat_split_nat_inf … x) -x //
+#n @(nat_ind_succ … n) -n /2 width=1 by/
+qed-.