include "ground_2/relocation/nstream_after.ma".
include "basic_2/notation/relations/rliftstar_3.ma".
-include "basic_2/grammar/term.ma".
+include "basic_2/syntax/term.ma".
(* GENERIC RELOCATION FOR TERMS *********************************************)
interpretation "generic relocation (term)"
'RLiftStar f T1 T2 = (lifts f T1 T2).
+definition liftable2: predicate (relation term) ≝
+ λR. ∀T1,T2. R T1 T2 → ∀f,U1. ⬆*[f] T1 ≡ U1 →
+ ∃∃U2. ⬆*[f] T2 ≡ U2 & R U1 U2.
+
+definition deliftable2_sn: predicate (relation term) ≝
+ λR. ∀U1,U2. R U1 U2 → ∀f,T1. ⬆*[f] T1 ≡ U1 →
+ ∃∃T2. ⬆*[f] T2 ≡ U2 & R T1 T2.
(* Basic inversion lemmas ***************************************************)
]
qed-.
+(* Inversion lemmas with uniform relocations ********************************)
+
lemma lifts_inv_lref1_uni: ∀l,Y,i. ⬆*[l] #i ≡ Y → Y = #(l+i).
#l #Y #i1 #H elim (lifts_inv_lref1 … H) -H /4 width=4 by at_mono, eq_f/
qed-.
+lemma lifts_inv_lref2_uni: ∀l,X,i2. ⬆*[l] X ≡ #i2 →
+ ∃∃i1. X = #i1 & i2 = l + i1.
+#l #X #i2 #H elim (lifts_inv_lref2 … H) -H
+/3 width=3 by at_inv_uni, ex2_intro/
+qed-.
+
+lemma lifts_inv_lref2_uni_ge: ∀l,X,i. ⬆*[l] X ≡ #(l + i) → X = #i.
+#l #X #i2 #H elim (lifts_inv_lref2_uni … H) -H
+#i1 #H1 #H2 destruct /4 width=2 by injective_plus_r, eq_f, sym_eq/
+qed-.
+
+lemma lifts_inv_lref2_uni_lt: ∀l,X,i. ⬆*[l] X ≡ #i → i < l → ⊥.
+#l #X #i2 #H elim (lifts_inv_lref2_uni … H) -H
+#i1 #_ #H1 #H2 destruct /2 width=4 by lt_le_false/
+qed-.
+
(* Basic forward lemmas *****************************************************)
(* Basic_2A1: includes: lift_inv_O2 *)