Library Lambda.Env
Require
Import
Lambda.Terms
.
Require
Import
Lambda.Reduction
.
Require
Import
Lambda.LiftSubst
.
Require
Export
Lambda.MyList
.
Implicit
Types
i
k
m
n
p
: nat
.
Implicit
Type
s
: sort
.
Implicit
Types
A
B
M
N
T
t
u
v
: term
.
Definition
env
:= list
term
.
Implicit
Types
e
f
g
: env
.
Definition
item_lift
t
e
n
:=
ex2
(fun
u
⇒ t
= lift
(S
n
) u
) (fun
u
⇒ item
term
u
(e
:list term
) n
).
Inductive
ins_in_env
A
: nat
→ env
→ env
→ Prop
:=
| ins_O
: ∀ e
, ins_in_env
A
0 e
(A
:: e
)
| ins_S
:
∀ n
e
f
t
,
ins_in_env
A
n
e
f
→
ins_in_env
A
(S
n
) (t
:: e
) (lift_rec
1 t
n
:: f
).
Hint
Resolve
ins_O
ins_S
: coc
.
Lemma
ins_item_ge
:
∀ A
n
e
f
,
ins_in_env
A
n
e
f
→
∀ v
: nat
, n
≤ v
→ ∀ t
, item
_
t
e
v
→ item
_
t
f
(S
v
).
Lemma
ins_item_lt
:
∀ A
n
e
f
,
ins_in_env
A
n
e
f
→
∀ v
: nat
,
n
> v
→ ∀ t
, item_lift
t
e
v
→ item_lift
(lift_rec
1 t
n
) f
v
.
Inductive
sub_in_env
t
T
: nat
→ env
→ env
→ Prop
:=
| sub_O
: ∀ e
, sub_in_env
t
T
0 (T
:: e
) e
| sub_S
:
∀ e
f
n
u
,
sub_in_env
t
T
n
e
f
→
sub_in_env
t
T
(S
n
) (u
:: e
) (subst_rec
t
u
n
:: f
).
Hint
Resolve
sub_O
sub_S
: coc
.
Lemma
nth_sub_sup
:
∀ t
T
n
e
f
,
sub_in_env
t
T
n
e
f
→
∀ v
: nat
, n
≤ v
→ ∀ u
, item
_
u
e
(S
v
) → item
_
u
f
v
.
Lemma
nth_sub_eq
: ∀ t
T
n
e
f
, sub_in_env
t
T
n
e
f
→ item
_
T
e
n
.
Lemma
nth_sub_inf
:
∀ t
T
n
e
f
,
sub_in_env
t
T
n
e
f
→
∀ v
: nat
,
n
> v
→ ∀ u
, item_lift
u
e
v
→ item_lift
(subst_rec
t
u
n
) f
v
.