]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambdadelta/ground_2/relocation/nstream_lift.ma
precommit for rtmap ...
[helm.git] / matita / matita / contribs / lambdadelta / ground_2 / relocation / nstream_lift.ma
1 (**************************************************************************)
2 (*       ___                                                              *)
3 (*      ||M||                                                             *)
4 (*      ||A||       A project by Andrea Asperti                           *)
5 (*      ||T||                                                             *)
6 (*      ||I||       Developers:                                           *)
7 (*      ||T||         The HELM team.                                      *)
8 (*      ||A||         http://helm.cs.unibo.it                             *)
9 (*      \   /                                                             *)
10 (*       \ /        This file is distributed under the terms of the       *)
11 (*        v         GNU General Public License Version 2                  *)
12 (*                                                                        *)
13 (**************************************************************************)
14
15 include "ground_2/notation/functions/lift_1.ma".
16 include "ground_2/relocation/nstream.ma".
17
18 (* RELOCATION N-STREAM ******************************************************)
19
20 definition push: rtmap → rtmap ≝ λf. 0@f.
21
22 interpretation "push (nstream)" 'Lift f = (push f).
23
24 definition next: rtmap → rtmap.
25 * #n #f @(⫯n@f)
26 qed.
27
28 interpretation "next (nstream)" 'Successor f = (next f).
29
30 (* Basic properties *********************************************************)
31
32 lemma push_rew: ∀f. 0@f = ↑f.
33 // qed.
34
35 lemma next_rew: ∀f,n. (⫯n)@f = ⫯(n@f).
36 // qed.
37 (*
38 lemma next_rew_sn: ∀f,n1,n2. n1 = ⫯n2 → n1@f = ⫯(n2@f).
39 // qed.
40 *)
41 (* Basic inversion lemmas ***************************************************)
42
43 lemma injective_push: injective ? ? push.
44 #f1 #f2 normalize #H destruct //
45 qed-.
46
47 lemma discr_push_next: ∀f1,f2. ↑f1 = ⫯f2 → ⊥.
48 #f1 * #n2 #f2 normalize #H destruct
49 qed-.
50
51 lemma discr_next_push: ∀f1,f2. ⫯f1 = ↑f2 → ⊥.
52 * #n1 #f1 #f2 normalize #H destruct
53 qed-.
54
55 lemma injective_next: injective ? ? next.
56 * #n1 #f1 * #n2 #f2 normalize #H destruct //
57 qed-.
58
59 lemma push_inv_seq_sn: ∀f,g,n. n@g = ↑f → 0 = n ∧ g = f.
60 #f #g #n <push_rew #H destruct /2 width=1 by conj/
61 qed-.
62
63 lemma push_inv_seq_dx: ∀f,g,n. ↑f = n@g → 0 = n ∧ g = f.
64 #f #g #n <push_rew #H destruct /2 width=1 by conj/
65 qed-.
66
67 lemma next_inv_seq_sn: ∀f,g,n. n@g = ⫯f → ∃∃m. m@g = f & ⫯m = n.
68 * #m #f #g #n <next_rew #H destruct /2 width=3 by ex2_intro/
69 qed-.
70
71 lemma next_inv_seq_dx: ∀f,g,n. ⫯f = n@g → ∃∃m. m@g = f & ⫯m = n.
72 * #m #f #g #n <next_rew #H destruct /2 width=3 by ex2_intro/
73 qed-.
74
75 lemma pn_split: ∀f. (∃g. ↑g = f) ∨ (∃g. ⫯g = f).
76 * * /3 width=2 by or_introl, or_intror, ex_intro/
77 qed-.