]> matita.cs.unibo.it Git - helm.git/blobdiff - matita/matita/contribs/lambda_delta/basic_2/grammar/lenv_px.ma
- we set up the support for the "bt-reduction" of Automath literature
[helm.git] / matita / matita / contribs / lambda_delta / basic_2 / grammar / lenv_px.ma
index 1b0c88e021c03d71a5c83bc0d0b321f44745d3e8..41710626a8cf70bf594baad61604c14f207cb9f7 100644 (file)
@@ -12,7 +12,7 @@
 (*                                                                        *)
 (**************************************************************************)
 
-include "basic_2/grammar/lenv_length.ma".
+include "basic_2/grammar/lenv_append.ma".
 
 (* POINTWISE EXTENSION OF A CONTEXT-FREE REALTION FOR TERMS *****************)
 
@@ -74,12 +74,42 @@ lemma lpx_fwd_length: ∀R,L1,L2. lpx R L1 L2 → |L1| = |L2|.
 #R #L1 #L2 #H elim H -L1 -L2 normalize //
 qed-.
 
+(* Advanced inversion lemmas ************************************************)
+
+lemma lpx_inv_append1: ∀R,L1,K1,L. lpx R (K1 @@ L1) L →
+                       ∃∃K2,L2. lpx R K1 K2 & lpx R L1 L2 & L = K2 @@ L2.
+#R #L1 elim L1 -L1 normalize
+[ #K1 #K2 #HK12
+  @(ex3_2_intro … K2 (⋆)) // (**) (* explicit constructor, /2 width=5/ does not work *) 
+| #L1 #I #V1 #IH #K1 #X #H
+  elim (lpx_inv_pair1 … H) -H #L #V2 #H1 #HV12 #H destruct
+  elim (IH … H1) -IH -H1 #K2 #L2 #HK12 #HL12 #H destruct
+  @(ex3_2_intro … HK12) [2: /2 width=2/ | skip | // ] (* explicit constructor, /3 width=5/ does not work *)
+]
+qed-.
+
+lemma lpx_inv_append2: ∀R,L2,K2,L. lpx R L (K2 @@ L2) →
+                       ∃∃K1,L1. lpx R K1 K2 & lpx R L1 L2 & L = K1 @@ L1.
+#R #L2 elim L2 -L2 normalize
+[ #K2 #K1 #HK12
+  @(ex3_2_intro … K1 (⋆)) // (**) (* explicit constructor, /2 width=5/ does not work *) 
+| #L2 #I #V2 #IH #K2 #X #H
+  elim (lpx_inv_pair2 … H) -H #L #V1 #H1 #HV12 #H destruct
+  elim (IH … H1) -IH -H1 #K1 #L1 #HK12 #HL12 #H destruct
+  @(ex3_2_intro … HK12) [2: /2 width=2/ | skip | // ] (* explicit constructor, /3 width=5/ does not work *)
+]
+qed-.   
+
 (* Basic properties *********************************************************)
 
 lemma lpx_refl: ∀R. reflexive ? R → reflexive … (lpx R).
 #R #HR #L elim L -L // /2 width=1/
 qed.
 
+lemma lpx_sym: ∀R. symmetric ? R → symmetric … (lpx R).
+#R #HR #L1 #L2 #H elim H -H // /3 width=1/
+qed.
+
 lemma lpx_trans: ∀R. Transitive ? R → Transitive … (lpx R).
 #R #HR #L1 #L #H elim H -L //
 #I #K1 #K #V1 #V #_ #HV1 #IHK1 #X #H
@@ -121,11 +151,16 @@ lemma TC_lpx_pair_sn: ∀R. reflexive ? R →
 /4 width=5 by lpx_refl, lpx_pair, inj, step/ (**) (* too slow without trace *)
 qed.
 
-lemma lpx_TC: ∀R,L1,L2. TC … (lpx R) L1 L2 → lpx (TC … R) L1 L2. 
+lemma lpx_TC: ∀R,L1,L2. TC … (lpx R) L1 L2 → lpx (TC … R) L1 L2.
 #R #L1 #L2 #H elim H -L2 /2 width=1/ /2 width=3/
 qed.
 
 lemma lpx_inv_TC: ∀R. reflexive ? R →
                   ∀L1,L2. lpx (TC … R) L1 L2 → TC … (lpx R) L1 L2.
-#R #HR #L1 #L2 #H elim H -L1 -L2 /2 width=1/ /3 width=3/
+#R #HR #L1 #L2 #H elim H -L1 -L2 /3 width=1/ /3 width=3/
+qed.
+
+lemma lpx_append: ∀R,K1,K2. lpx R K1 K2 → ∀L1,L2. lpx R L1 L2 →
+                  lpx R (L1 @@ K1) (L2 @@ K2).
+#R #K1 #K2 #H elim H -K1 -K2 // /3 width=1/
 qed.