Library Lambda.TPOSR.PreCtxCoercion

Require
Import
Lambda.Tactics
.
Require
Import
Lambda.Utils
.

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.Thinning
.
Require
Import
Lambda.TPOSR.LeftReflexivity
.


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
.

Inductive
pre_coerce_in_env
:
lenv
->
lenv
->
Prop
:=
  |
pre_coerce_env_hd
: ∀
e
t
u
s
,
e
|--
t
>->
u
:
s
->
e
|--
t
->
t
:
s
->
e
|--
u
->
u
:
Srt_l
s
->
        
pre_coerce_in_env
(
t
::
e
) (
u
::
e
)
  |
pre_coerce_env_tl
:
      ∀
e
f
t
,
pre_coerce_in_env
e
f
->
      ∀
s
,
f
|--
t
->
t
:
Srt_l
s
->
      
pre_coerce_in_env
(
t
::
e
) (
t
::
f
).

Hint
Resolve
pre_coerce_env_hd
pre_coerce_env_tl
:
coc
.

Lemma
coerce_item
:
   ∀
n
t
e
,
   
item_llift
t
e
n
->
   ∀
f
,
pre_coerce_in_env
e
f
->
   
item_llift
t
f
n

   ((∀
g
,
trunc
_
(
S
n
)
e
g
->
trunc
_
(
S
n
)
f
g
) ∧
   ∃
u
,
item_llift
u
f
n
∧ (∃
s
:
sort
,
f
|--
t
>->
u
:
s
f
|--
u
->
u
:
s
)).

Lemma
ind_pre_coerce_env
:
  (∀
e
t
u
T
,
e
|--
t
->
u
:
T
->
  ∀
f
,
pre_coerce_in_env
e
f
->
f
|--
t
->
u
:
T
) ∧
  (∀
e
,
tposr_wf
e
->
  ∀
f
,
pre_coerce_in_env
e
f
->
tposr_wf
f
) ∧
  (∀
e
t
u
s
,
e
|--
t
~=
u
:
s
->
  ∀
f
,
pre_coerce_in_env
e
f
->
f
|--
t
~=
u
:
s
) ∧
  (∀
e
t
u
s
,
e
|--
t
>->
u
:
s
->
  ∀
f
,
pre_coerce_in_env
e
f
->
f
|--
t
>->
u
:
s
).

Lemma
tposr_pre_coerce_env
: ∀
e
t
u
T
,
e
|--
t
->
u
:
T
->
  ∀
f
,
pre_coerce_in_env
e
f
->
f
|--
t
->
u
:
T
.

Lemma
eq_pre_coerce_env
: ∀
e
u
v
s
,
e
|--
u
~=
v
:
s
->
  ∀
f
,
pre_coerce_in_env
e
f
->
f
|--
u
~=
v
:
s
.

Lemma
coerce_pre_coerce_env
: ∀
e
T
U
s
,
e
|--
T
>->
U
:
s
->
  ∀
f
,
pre_coerce_in_env
e
f
->
f
|--
T
>->
U
:
s
.

Hint
Resolve
tposr_pre_coerce_env
eq_pre_coerce_env
coerce_pre_coerce_env
:
ecoc
.

Inductive
pre_coerce_in_env_full
:
lenv
->
lenv
->
Prop
:=
  |
pre_coerce_env_trans
: ∀
e
f
g
,
pre_coerce_in_env_full
e
f
->
pre_coerce_in_env_full
f
g
->
pre_coerce_in_env_full
e
g

  |
pre_coerce_env_in_env
: ∀
e
f
,
pre_coerce_in_env
e
f
->
pre_coerce_in_env_full
e
f

  |
pre_coerce_env_nil
:
pre_coerce_in_env_full
nil
nil
.

Hint
Resolve
pre_coerce_env_in_env
pre_coerce_env_nil
:
coc
.

Lemma
pre_coerce_env_sym
: ∀
e
f
,
pre_coerce_in_env
e
f
->
pre_coerce_in_env
f
e
.

Lemma
pre_coerce_env_full_sym
: ∀
e
f
,
pre_coerce_in_env_full
e
f
->
pre_coerce_in_env_full
f
e
.

Hint
Resolve
pre_coerce_env_sym
pre_coerce_env_full_sym
:
coc
.

Lemma
pre_coerce_env_full
:
  (∀
e
t
u
T
,
e
|--
t
->
u
:
T
->
  ∀
f
,
pre_coerce_in_env_full
e
f
->
f
|--
t
->
u
:
T
).

Lemma
pre_coerce_env_full_cons
: ∀
G
D
,
pre_coerce_in_env_full
G
D
-> ∀
T
,
tposr_wf
(
T
::
G
) ->
  
pre_coerce_in_env_full
(
T
::
G
) (
T
::
D
).

Corollary
tposrp_pre_coerce_env_full
:
  (∀
e
t
u
T
,
e
|--
t
-+>
u
:
T
->
  ∀
f
,
pre_coerce_in_env_full
e
f
->
f
|--
t
-+>
u
:
T
).

Corollary
eq_pre_coerce_env_full
:
  (∀
e
t
u
s
,
e
|--
t
~=
u
:
s
->
  ∀
f
,
pre_coerce_in_env_full
e
f
->
f
|--
t
~=
u
:
s
).

Hint
Resolve
pre_coerce_env_full
eq_pre_coerce_env_full
:
ecoc
.

Corollary
coerce_pre_coerce_env_full
:
  (∀
e
t
u
s
,
e
|--
t
>->
u
:
s
->
  ∀
f
,
pre_coerce_in_env_full
e
f
->
f
|--
t
>->
u
:
s
).