Library Lambda.TPOSR.Substitution
Require Import Lambda.TPOSR.Terms.
Require Import Lambda.TPOSR.Reduction.
Require Import Lambda.TPOSR.Conv.
Require Import Lambda.TPOSR.LiftSubst.
Require Import Lambda.TPOSR.Env.
Require Import Lambda.TPOSR.Types.
Require Import Lambda.TPOSR.LeftReflexivity.
Require Import Lambda.TPOSR.Thinning.
Require Import Lambda.TPOSR.CtxReduction.
Require Import Coq.Arith.Lt.
Implicit Types i k m n p : nat.
Implicit Type s : sort.
Implicit Types A B M N T t u v : lterm.
Implicit Types e f g : lenv.
Lemma ind_substitution :
(∀ e t u U, e |-- t -> u : U ->
∀ g d T, g |-- d -> d : T ->
∀ f n, sub_in_lenv d T n e f -> trunc _ n f g ->
f |-- (lsubst_rec d t n) -> (lsubst_rec d u n) : (lsubst_rec d U n)) ∧
(∀ e, tposr_wf e ->
∀ g d T, g |-- d -> d : T ->
∀ n f, sub_in_lenv d T n e f -> trunc _ n f g ->
tposr_wf f) ∧
(∀ e t u s, e |-- t ~= u : s ->
∀ g d T, g |-- d -> d : T ->
∀ f n, sub_in_lenv d T n e f -> trunc _ n f g ->
f |-- (lsubst_rec d t n) ~= (lsubst_rec d u n) : s) ∧
(∀ e t u s, e |-- t >-> u : s ->
∀ g d T, g |-- d -> d : T ->
∀ f n, sub_in_lenv d T n e f -> trunc _ n f g ->
f |-- (lsubst_rec d t n) >-> (lsubst_rec d u n) : s).
Corollary substitution_tposr_n : ∀ g d t, g |-- d -> d : t ->
∀ e u v U, e |-- u -> v : U ->
∀ f n, sub_in_lenv d t n e f -> trunc _ n f g ->
f |-- (lsubst_rec d u n) -> (lsubst_rec d v n) : (lsubst_rec d U n).
Corollary substitution_tposr_wf_n : ∀ g d t, g |-- d -> d : t ->
∀ e, tposr_wf e -> ∀ f n, sub_in_lenv d t n e f ->
trunc _ n f g -> tposr_wf f.
Corollary substitution_eq_n : ∀ g d t, g |-- d -> d : t ->
∀ e u v s, e |-- u ~= v : s ->
∀ f n, sub_in_lenv d t n e f -> trunc _ n f g ->
f |-- (lsubst_rec d u n) ~= (lsubst_rec d v n) : s.
Corollary substitution_coerce_n : ∀ g d t, g |-- d -> d : t ->
∀ e u v s, e |-- u >-> v : s ->
∀ f n, sub_in_lenv d t n e f -> trunc _ n f g ->
f |-- (lsubst_rec d u n) >-> (lsubst_rec d v n) : s.
Corollary substitution : ∀ e t u v U, (t :: e) |-- u -> v : U ->
∀ d, e |-- d -> d : t -> e |-- (lsubst d u) -> (lsubst d v) : (lsubst d U).
Corollary substitution_eq :
∀ e t u v s, t :: e |-- u ~= v : s ->
∀ d, e |-- d -> d : t ->
e |-- (lsubst d u) ~= (lsubst d v) : s.
Corollary substitution_coerce :
∀ e t u v s, t :: e |-- u >-> v : s ->
∀ d, e |-- d -> d : t ->
e |-- (lsubst d u) >-> (lsubst d v) : s.
Corollary substitution_tposrp_aux : ∀ G u v U, G |-- u -+> v : U -> ∀ t e, G = (t :: e) ->
∀ d, e |-- d -> d : t -> e |-- (lsubst d u) -+> (lsubst d v) : (lsubst d U).
Corollary substitution_tposrp : ∀ t e u v U, t :: e |-- u -+> v : U ->
∀ d, e |-- d -> d : t -> e |-- (lsubst d u) -+> (lsubst d v) : (lsubst d U).
Corollary substitution_sorted_n :
∀ g d t, g |-- d -> d : t ->
∀ e u v s, e |-- u -> v : s ->
∀ f n, sub_in_lenv d t n e f -> trunc _ n f g ->
f |-- (lsubst_rec d u n) -> (lsubst_rec d v n) : Srt_l s.
Corollary substitution_sorted : ∀ e t u v s, (t :: e) |-- u -> v : Srt_l s ->
∀ d, e |-- d -> d : t -> e |-- (lsubst d u) -> (lsubst d v) : Srt_l s.
Hint Resolve substitution substitution_coerce substitution_eq substitution_tposrp : ecoc.