]> matita.cs.unibo.it Git - helm.git/blob - matita/matita/contribs/lambda/paths/standard_precedence.ma
e67a96d0402808750961c5c15175eb10210824c6
[helm.git] / matita / matita / contribs / lambda / paths / standard_precedence.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 "paths/path.ma".
16
17 (* STANDARD PRECEDENCE ******************************************************)
18
19 (* Note: standard precedence relation on paths: p ≺ q
20          to serve as base for the order relations: p < q and p ≤ q *)
21 inductive sprec: relation path ≝
22 | sprec_nil : ∀o,q.   sprec (◊) (o::q)
23 | sprec_rc  : ∀p,q.   sprec (dx::p) (rc::q)
24 | sprec_sn  : ∀p,q.   sprec (rc::p) (sn::q)
25 | sprec_comp: ∀o,p,q. sprec p q → sprec (o::p) (o::q)
26 | sprec_skip:         sprec (dx::◊) ◊
27 .
28
29 interpretation "standard 'precedes' on paths"
30    'prec p q = (sprec p q).
31
32 lemma sprec_inv_sn: ∀p,q. p ≺ q → ∀p0. sn::p0 = p →
33                     ∃∃q0. p0 ≺ q0 & sn::q0 = q.
34 #p #q * -p -q
35 [ #o #q #p0 #H destruct
36 | #p #q #p0 #H destruct
37 | #p #q #p0 #H destruct
38 | #o #p #q #Hpq #p0 #H destruct /2 width=3/
39 | #p0 #H destruct
40 ]
41 qed-.
42
43 lemma sprec_inv_rc: ∀p,q. p ≺ q → ∀p0. rc::p0 = p →
44                     (∃∃q0. p0 ≺ q0 & rc::q0 = q) ∨
45                     ∃q0. sn::q0 = q.
46 #p #q * -p -q
47 [ #o #q #p0 #H destruct
48 | #p #q #p0 #H destruct
49 | #p #q #p0 #H destruct /3 width=2/
50 | #o #p #q #Hpq #p0 #H destruct /3 width=3/
51 | #p0 #H destruct
52 ]
53 qed-.
54
55 lemma sprec_inv_comp: ∀p1,p2. p1 ≺ p2 →
56                       ∀o,q1,q2. o::q1 = p1 → o::q2 = p2 → q1 ≺ q2.
57 #p1 #p2 * -p1 -p2
58 [ #o #q #o0 #q1 #q2 #H destruct
59 | #p #q #o0 #q1 #q2 #H1 #H2 destruct
60 | #p #q #o0 #q1 #q2 #H1 #H2 destruct
61 | #o #p #q #Hpq #o0 #q1 #q2 #H1 #H2 destruct //
62 | #o0 #q1 #q2 #_ #H destruct
63 ]
64 qed-.
65
66 lemma sprec_fwd_in_whd: ∀p,q. p ≺ q → in_whd q → in_whd p.
67 #p #q #H elim H -p -q // /2 width=1/
68 [ #p #q * #H destruct
69 | #p #q * #H destruct
70 | #o #p #q #_ #IHpq * #H destruct /3 width=1/
71 ]
72 qed-.