Library Substitutions_proofs
Require Import List.
Require Import Arith.
Require Import Util.
Require Import MatchCompNat.
Require Syntax.
Module SetProgram(My_Program: Syntax.Program).
Import My_Program.
Require Binders_proofs.
Module My_Binders_proofs := Binders_proofs.SetProgram(My_Program).
Import My_Binders_proofs.
Import My_Semantics.
Import My_WellFormedness.
Import My_Typing.
Import My_Auxiliary.
Import My_Substitutions.
Import My_Binders.
Permuting type lifting and substitution (auxiliary)
Lemma Permuting_type_lifting_and_substitution_aux:
forall (R: TypeS) (k1 n: nat) (t: TypeS) (k2: nat),
(lift_at_depth_in_type (typeSubst_in_type t (k1 + k2) R) n k2) =
(typeSubst_in_type (lift_at_depth_in_type t n k2) (k1 + k2 + n) R)
.
Lemma Permuting_type_lifting_and_substitution:
forall (t: TypeS) (X: TypeVar) (R: TypeS) (n: nat),
(lift_in_type (typeSubst_in_type t X R) n) =
(typeSubst_in_type (lift_in_type t n) (X + n) R)
.
Lemma Permuting_type_lifting_and_substitution_cor1:
forall (t : TypeS) (X : TypeVar) (R : TypeS),
(lift_in_type (typeSubst_in_type t X R) 1) =
(typeSubst_in_type (lift_in_type t 1) (S X) R)
.
Lemma Permuting_type_liftings_aux:
forall (k1 n1 n2: nat) (t: TypeS) (k2: nat),
(lift_at_depth_in_type (lift_at_depth_in_type t n2 k2) n1 (k1 + n2 + k2)) =
(lift_at_depth_in_type (lift_at_depth_in_type t n1 (k1 + k2)) n2 k2)
.
Lemma Permuting_type_liftings_cor1:
forall (k1 n1 n2: nat) (t: TypeS),
(n2 <= k1) ->
(lift_at_depth_in_type (lift_in_type t n2) n1 k1) =
(lift_in_type (lift_at_depth_in_type t n1 (k1 - n2)) n2)
.
forall (R: TypeS) (k1 n: nat) (t: TypeS) (k2: nat),
(lift_at_depth_in_type (typeSubst_in_type t (k1 + k2) R) n k2) =
(typeSubst_in_type (lift_at_depth_in_type t n k2) (k1 + k2 + n) R)
.
Lemma Permuting_type_lifting_and_substitution:
forall (t: TypeS) (X: TypeVar) (R: TypeS) (n: nat),
(lift_in_type (typeSubst_in_type t X R) n) =
(typeSubst_in_type (lift_in_type t n) (X + n) R)
.
Lemma Permuting_type_lifting_and_substitution_cor1:
forall (t : TypeS) (X : TypeVar) (R : TypeS),
(lift_in_type (typeSubst_in_type t X R) 1) =
(typeSubst_in_type (lift_in_type t 1) (S X) R)
.
Lemma Permuting_type_liftings_aux:
forall (k1 n1 n2: nat) (t: TypeS) (k2: nat),
(lift_at_depth_in_type (lift_at_depth_in_type t n2 k2) n1 (k1 + n2 + k2)) =
(lift_at_depth_in_type (lift_at_depth_in_type t n1 (k1 + k2)) n2 k2)
.
Lemma Permuting_type_liftings_cor1:
forall (k1 n1 n2: nat) (t: TypeS),
(n2 <= k1) ->
(lift_at_depth_in_type (lift_in_type t n2) n1 k1) =
(lift_in_type (lift_at_depth_in_type t n1 (k1 - n2)) n2)
.
Permuting type lifting and substitution 2 (auxiliary)
Lemma Permuting_type_lifting_and_substitution_2_aux:
forall (R: TypeS) (k1 n: nat) (t: TypeS) (k2: nat),
(lift_at_depth_in_type (typeSubst_in_type t k2 R) n (k1 + k2)) =
(typeSubst_in_type (lift_at_depth_in_type t n (S (k1 + k2))) k2
(lift_at_depth_in_type R n k1))
.
Lemma Permuting_type_lifting_and_substitution_2_cor1:
forall (R : TypeS) (k n : nat) (t : TypeS),
(lift_at_depth_in_type (typeSubst_in_type t 0 R) n k) =
(typeSubst_in_type (lift_at_depth_in_type t n (S k)) 0
(lift_at_depth_in_type R n k))
.
Lemma Type_lifting_stronger_than_substitution_aux:
forall (n d: nat) (R t: TypeS) (k: nat),
(typeSubst_in_type (lift_at_depth_in_type t (S (n + d)) k) (n + k) R) =
(lift_at_depth_in_type t (n + d) k)
.
Lemma Type_lifting_stronger_than_substitution:
forall (n d: nat) (R t: TypeS),
(typeSubst_in_type (lift_in_type t (S (n + d))) n R) =
(lift_in_type t (n + d))
.
forall (R: TypeS) (k1 n: nat) (t: TypeS) (k2: nat),
(lift_at_depth_in_type (typeSubst_in_type t k2 R) n (k1 + k2)) =
(typeSubst_in_type (lift_at_depth_in_type t n (S (k1 + k2))) k2
(lift_at_depth_in_type R n k1))
.
Lemma Permuting_type_lifting_and_substitution_2_cor1:
forall (R : TypeS) (k n : nat) (t : TypeS),
(lift_at_depth_in_type (typeSubst_in_type t 0 R) n k) =
(typeSubst_in_type (lift_at_depth_in_type t n (S k)) 0
(lift_at_depth_in_type R n k))
.
Lemma Type_lifting_stronger_than_substitution_aux:
forall (n d: nat) (R t: TypeS) (k: nat),
(typeSubst_in_type (lift_at_depth_in_type t (S (n + d)) k) (n + k) R) =
(lift_at_depth_in_type t (n + d) k)
.
Lemma Type_lifting_stronger_than_substitution:
forall (n d: nat) (R t: TypeS),
(typeSubst_in_type (lift_in_type t (S (n + d))) n R) =
(lift_in_type t (n + d))
.
Permuting type substitutions
Lemma Permuting_type_substitutions:
forall (R R': TypeS) (k: nat) (t: TypeS) (n: nat),
(typeSubst_in_type (typeSubst_in_type t n R) (n + k) R') =
(typeSubst_in_type (typeSubst_in_type t (S (n + k)) R') n (typeSubst_in_type R k R'))
.
Lemma Permuting_type_substitutions_cor1:
forall (R R': TypeS) (k: nat) (t: TypeS),
(typeSubst_in_type (typeSubst_in_type t 0 R) k R') =
(typeSubst_in_type (typeSubst_in_type t (S k) R') 0 (typeSubst_in_type R k R'))
.
Lemma Permuting_type_substitutions_cor2:
forall (R R': TypeS) (k: nat) (t: TypeS),
(typeSubst_in_type (typeSubst_in_type t 1 R) (S k) R') =
(typeSubst_in_type (typeSubst_in_type t (S (S k)) R') 1 (typeSubst_in_type R k R'))
.
End SetProgram.
forall (R R': TypeS) (k: nat) (t: TypeS) (n: nat),
(typeSubst_in_type (typeSubst_in_type t n R) (n + k) R') =
(typeSubst_in_type (typeSubst_in_type t (S (n + k)) R') n (typeSubst_in_type R k R'))
.
Lemma Permuting_type_substitutions_cor1:
forall (R R': TypeS) (k: nat) (t: TypeS),
(typeSubst_in_type (typeSubst_in_type t 0 R) k R') =
(typeSubst_in_type (typeSubst_in_type t (S k) R') 0 (typeSubst_in_type R k R'))
.
Lemma Permuting_type_substitutions_cor2:
forall (R R': TypeS) (k: nat) (t: TypeS),
(typeSubst_in_type (typeSubst_in_type t 1 R) (S k) R') =
(typeSubst_in_type (typeSubst_in_type t (S (S k)) R') 1 (typeSubst_in_type R k R'))
.
End SetProgram.