Library Types
Require
Export
Conv
.
Require
Export
Env
.
Section
Typage
.
Inductive
wf
: env
-> Prop
:=
| wf_nil
: wf
nil
| wf_var
: forall
e
T
s
, typ
e
T
(Srt
s
) -> wf
(T
:: e
)
with
typ
: env
-> term
-> term
-> Prop
:=
| type_prop
:
forall
e
,
wf
e
->
typ
e
(Srt
prop
) (Srt
kind
)
| type_var
:
forall
e
v
t
,
wf
e
->
item_lift
t
e
v
->
typ
e
(Ref
v
) t
| type_abs
:
forall
e
T
M
U
s1
s2
,
typ
e
T
(Srt
s1
) ->
typ
(T
:: e
) U
(Srt
s2
) ->
typ
(T
:: e
) M
U
->
typ
e
(Abs
T
M
) (Prod
T
U
)
| type_app
:
forall
e
u
v
V
Ur
,
typ
e
v
V
->
typ
e
u
(Prod
V
Ur
) ->
typ
e
(App
u
v
) (subst
v
Ur
)
| type_prod
:
forall
e
T
U
s1
s2
,
typ
e
T
(Srt
s1
) ->
typ
(T
:: e
) U
(Srt
s2
) ->
typ
e
(Prod
T
U
) (Srt
s2
)
| type_conv
:
forall
e
t
U
V
s
,
typ
e
t
U
->
conv
U
V
->
typ
e
V
(Srt
s
) ->
typ
e
t
V
.
Hint
Resolve
wf_nil
type_prop
type_var
: coc
.
Scheme
typ_mind
:= Minimality
for
typ
Sort
Prop
with
wf_mind
:= Minimality
for
wf
Sort
Prop
.
Lemma
typ_wf
: forall
e
t
T
, typ
e
t
T
-> wf
e
.
simple
induction
1; auto
with
coc
.
Qed
.
Hint
Resolve
typ_wf
: coc
.
Lemma
wf_sort
:
forall
n
e
f
t
,
trunc
(S
n
) e
f
-> wf
e
-> item
t
e
n
-> exists
s
, typ
f
t
(Srt
s
).
simple
induction
n
.
do
4 intro
.
inversion_clear
H
.
inversion_clear
H0
.
intros
.
inversion_clear
H0
.
inversion_clear
H
.
eauto
with
coc
.
do
6 intro
.
inversion_clear
H0
.
intros
.
inversion_clear
H2
.
inversion_clear
H0
.
elim
H
with
e0
f
t
; intros
; eauto
with
coc
.
Qed
.
Definition
inv_type
(P
: Prop
) e
t
T
:=
match
t
with
| Srt
prop
=> conv
T
(Srt
kind
) -> P
| Srt
kind
=> True
| Ref
n
=> forall
x
, item
x
e
n
-> conv
T
(lift
(S
n
) x
) -> P
| Abs
A
M
=>
forall
s1
s2
U
,
typ
e
A
(Srt
s1
) ->
typ
(A
:: e
) M
U
-> typ
(A
:: e
) U
(Srt
s2
) -> conv
T
(Prod
A
U
) -> P
| App
u
v
=>
forall
Ur
V
,
typ
e
v
V
-> typ
e
u
(Prod
V
Ur
) -> conv
T
(subst
v
Ur
) -> P
| Prod
A
B
=>
forall
s1
s2
,
typ
e
A
(Srt
s1
) -> typ
(A
:: e
) B
(Srt
s2
) -> conv
T
(Srt
s2
) -> P
end
.
Lemma
inv_type_conv
:
forall
P
e
t
U
V
, conv
U
V
-> inv_type
P
e
t
U
-> inv_type
P
e
t
V
.
do
6 intro
.
cut
(forall
x
: term
, conv
V
x
-> conv
U
x
).
intro
.
case
t
; simpl
in
|- *; intros
.
generalize
H1
.
elim
s
; auto
with
coc
; intros
.
apply
H1
with
x
; auto
with
coc
.
apply
H1
with
s1
s2
U0
; auto
with
coc
.
apply
H1
with
Ur
V0
; auto
with
coc
.
apply
H1
with
s1
s2
; auto
with
coc
.
intros
.
apply
trans_conv_conv
with
V
; auto
with
coc
.
Qed
.
Theorem
typ_inversion
: forall
P
e
t
T
, typ
e
t
T
-> inv_type
P
e
t
T
-> P
.
simple
induction
1; simpl
in
|- *; intros
.
auto
with
coc
.
elim
H1
; intros
.
apply
H2
with
x
; auto
with
coc
.
rewrite
H3
; auto
with
coc
.
apply
H6
with
s1
s2
U
; auto
with
coc
.
apply
H4
with
Ur
V
; auto
with
coc
.
apply
H4
with
s1
s2
; auto
with
coc
.
apply
H1
.
apply
inv_type_conv
with
V
; auto
with
coc
.
Qed
.
Lemma
inv_typ_kind
: forall
e
t
, ~ typ
e
(Srt
kind
) t
.
red
in
|- *; intros
.
apply
typ_inversion
with
e
(Srt
kind
) t
; simpl
in
|- *; auto
with
coc
.
Qed
.
Lemma
inv_typ_prop
: forall
e
T
, typ
e
(Srt
prop
) T
-> conv
T
(Srt
kind
).
intros
.
apply
typ_inversion
with
e
(Srt
prop
) T
; simpl
in
|- *; auto
with
coc
.
Qed
.
Lemma
inv_typ_ref
:
forall
(P
: Prop
) e
T
n
,
typ
e
(Ref
n
) T
->
(forall
U
: term
, item
U
e
n
-> conv
T
(lift
(S
n
) U
) -> P
) -> P
.
intros
.
apply
typ_inversion
with
e
(Ref
n
) T
; simpl
in
|- *; intros
; auto
with
coc
.
apply
H0
with
x
; auto
with
coc
.
Qed
.
Lemma
inv_typ_abs
:
forall
(P
: Prop
) e
A
M
U
,
typ
e
(Abs
A
M
) U
->
(forall
s1
s2
T
,
typ
e
A
(Srt
s1
) ->
typ
(A
:: e
) M
T
-> typ
(A
:: e
) T
(Srt
s2
) -> conv
(Prod
A
T
) U
-> P
) ->
P
.
intros
.
apply
typ_inversion
with
e
(Abs
A
M
) U
; simpl
in
|- *; auto
with
coc
; intros
.
apply
H0
with
s1
s2
U0
; auto
with
coc
.
Qed
.
Lemma
inv_typ_app
:
forall
(P
: Prop
) e
u
v
T
,
typ
e
(App
u
v
) T
->
(forall
V
Ur
, typ
e
u
(Prod
V
Ur
) -> typ
e
v
V
-> conv
T
(subst
v
Ur
) -> P
) ->
P
.
intros
.
apply
typ_inversion
with
e
(App
u
v
) T
; simpl
in
|- *; auto
with
coc
; intros
.
apply
H0
with
V
Ur
; auto
with
coc
.
Qed
.
Lemma
inv_typ_prod
:
forall
(P
: Prop
) e
T
U
s
,
typ
e
(Prod
T
U
) s
->
(forall
s1
s2
,
typ
e
T
(Srt
s1
) -> typ
(T
:: e
) U
(Srt
s2
) -> conv
(Srt
s2
) s
-> P
) -> P
.
intros
.
apply
typ_inversion
with
e
(Prod
T
U
) s
; simpl
in
|- *; auto
with
coc
; intros
.
apply
H0
with
s1
s2
; auto
with
coc
.
Qed
.
Lemma
typ_mem_kind
: forall
e
t
T
, mem_sort
kind
t
-> ~ typ
e
t
T
.
red
in
|- *; intros
.
apply
typ_inversion
with
e
t
T
; auto
with
coc
.
generalize
e
T
.
clear
H0
.
elim
H
; simpl
in
|- *; auto
with
coc
; intros
.
apply
typ_inversion
with
e0
u
(Srt
s1
); auto
with
coc
.
apply
typ_inversion
with
(u
:: e0
) v
(Srt
s2
); auto
with
coc
.
apply
typ_inversion
with
e0
u
(Srt
s1
); auto
with
coc
.
apply
typ_inversion
with
(u
:: e0
) v
U
; auto
with
coc
.
apply
typ_inversion
with
e0
u
(Prod
V
Ur
); auto
with
coc
.
apply
typ_inversion
with
e0
v
V
; auto
with
coc
.
Qed
.
Lemma
inv_typ_conv_kind
: forall
e
t
T
, conv
t
(Srt
kind
) -> ~ typ
e
t
T
.
intros
.
apply
typ_mem_kind
.
apply
red_sort_mem
.
elim
church_rosser
with
t
(Srt
kind
); intros
; auto
with
coc
.
rewrite
(red_normal
(Srt
kind
) x
); auto
with
coc
.
red
in
|- *; red
in
|- *; intros
.
inversion_clear
H2
.
Qed
.
Lemma
typ_weak_weak
:
forall
A
e
t
T
,
typ
e
t
T
->
forall
n
f
,
ins_in_env
A
n
e
f
-> wf
f
-> typ
f
(lift_rec
1 t
n
) (lift_rec
1 T
n
).
simple
induction
1; simpl
in
|- *; intros
; auto
with
coc
.
elim
(le_gt_dec
n
v
); intros
; apply
type_var
; auto
with
coc
.
apply
ins_item_lift_ge
with
A
e0
; auto
with
coc
.
apply
ins_item_lift_lt
with
A
e0
; auto
with
coc
.
cut
(wf
(lift_rec
1 T0
n
:: f
)).
intro
.
apply
type_abs
with
s1
s2
; auto
with
coc
.
apply
wf_var
with
s1
; auto
with
coc
.
rewrite
distr_lift_subst
.
apply
type_app
with
(lift_rec
1 V
n
); auto
with
coc
.
cut
(wf
(lift_rec
1 T0
n
:: f
)).
intro
.
apply
type_prod
with
s1
; auto
with
coc
.
apply
wf_var
with
s1
; auto
with
coc
.
apply
type_conv
with
(lift_rec
1 U
n
) s
; auto
with
coc
.
Qed
.
Theorem
thinning
:
forall
e
t
T
A
,
typ
e
t
T
-> wf
(A
:: e
) -> typ
(A
:: e
) (lift
1 t
) (lift
1 T
).
unfold
lift
in
|- *.
intros
.
inversion_clear
H0
.
apply
typ_weak_weak
with
A
e
; auto
with
coc
.
apply
wf_var
with
s
; auto
with
coc
.
Qed
.
Lemma
thinning_n
:
forall
n
e
f
t
T
,
trunc
n
(e
:env) (f
:env) ->
typ
f
t
T
-> wf
e
-> typ
e
(lift
n
t
) (lift
n
T
).
simple
induction
1.
intros
.
rewrite
lift0
.
rewrite
lift0
.
trivial
.
intros
.
rewrite
simpl_lift
; auto
with
coc
.
pattern
(lift
(S
k
) T
) in
|- *.
rewrite
simpl_lift
; auto
with
coc
.
apply
thinning
; auto
with
coc
.
apply
H1
; trivial
.
inversion_clear
H3
.
eauto
with
coc
.
Qed
.
Lemma
wf_sort_lift
:
forall
n
e
t
, wf
e
-> item_lift
t
e
n
-> exists
s
, typ
e
t
(Srt
s
).
simple
induction
n
.
simple
destruct
e
; intros
.
elim
H0
; intros
.
inversion_clear
H2
.
elim
H0
; intros
.
rewrite
H1
.
inversion_clear
H2
.
inversion_clear
H
.
exists
s
.
replace
(Srt
s
) with
(lift
1 (Srt
s
)); auto
with
coc
.
apply
thinning
; auto
with
coc
.
apply
wf_var
with
s
; auto
with
coc
.
intros
.
elim
H1
; intros
.
rewrite
H2
.
generalize
H0
.
inversion_clear
H3
; intros
.
rewrite
simpl_lift
; auto
with
coc
.
cut
(wf
l
); intros
.
elim
H
with
l
(lift
(S
n0
) x
); intros
; auto
with
coc
.
inversion_clear
H3
.
exists
x0
.
change
(typ
(y
:: l
) (lift
1 (lift
(S
n0
) x
)) (lift
1 (Srt
x0
))) in
|- *.
apply
thinning
; auto
with
coc
.
apply
wf_var
with
s
; auto
with
coc
.
exists
x
; auto
with
coc
.
inversion_clear
H3
.
eauto
with
coc
.
Qed
.
Lemma
typ_sub_weak
:
forall
g
d
t
e
u
U
,
typ
g
d
t
->
typ
e
u
U
->
forall
f
n
,
sub_in_env
d
t
n
e
f
->
wf
f
-> trunc
n
f
g
-> typ
f
(subst_rec
d
u
n
) (subst_rec
d
U
n
).
Proof
.
simple
induction
2; simpl
in
|- *; intros
; auto
with
coc
.
destruct
(lt_eq_lt_dec
n
v
) as
[[fvar
|eq_var]|bvar].
constructor
; trivial
.
apply
sub_item_lift_sup
with
(1 := H3
) (2 := fvar
) (3 := H2
).
subst
v
; rewrite
sub_item_lift_eq
with
(1 := H3
) (2 := H2
).
apply
thinning_n
with
g
; auto
with
coc
.
constructor
; trivial
.
apply
nth_sub_inf
with
(1 := H3
); trivial
.
cut
(wf
(subst_rec
d
T
n
:: f
)); intros
.
apply
type_abs
with
s1
s2
; auto
with
coc
.
apply
wf_var
with
s1
; auto
with
coc
.
rewrite
distr_subst
.
apply
type_app
with
(subst_rec
d
V
n
); auto
with
coc
.
cut
(wf
(subst_rec
d
T
n
:: f
)); intros
.
apply
type_prod
with
s1
; auto
with
coc
.
apply
wf_var
with
s1
; auto
with
coc
.
apply
type_conv
with
(subst_rec
d
U0
n
) s
; auto
with
coc
.
Qed
.
Theorem
substitution
:
forall
e
t
u
U
d
,
typ
(t
:: (e
:env)) u
U
-> typ
e
d
t
-> typ
e
(subst
d
u
) (subst
d
U
).
intros
.
unfold
subst
in
|- *.
apply
typ_sub_weak
with
e
t
(t
:: e
); auto
with
coc
.
apply
typ_wf
with
d
t
; auto
with
coc
.
Qed
.
Theorem
typ_unique
:
forall
e
t
T
, typ
e
t
T
-> forall
U
, typ
e
t
U
-> conv
T
U
.
simple
induction
1; intros
.
apply
sym_conv
.
apply
inv_typ_prop
with
e0
; auto
with
coc
.
apply
inv_typ_ref
with
e0
U
v
; auto
with
coc
; intros
.
elim
H1
; intros
.
rewrite
H5
.
elim
fun_item
with
(1 := H3
) (2 := H6
); auto
with
coc
.
apply
inv_typ_abs
with
(1 := H6
); intros
.
apply
trans_conv_conv
with
(Prod
T0
T1
); auto
with
coc
.
apply
inv_typ_app
with
(1 := H4
); intros
.
apply
trans_conv_conv
with
(subst
v
Ur0
); auto
with
coc
.
unfold
subst
in
|- *; apply
conv_conv_subst
; auto
with
coc
.
apply
inv_conv_prod_r
with
(1 := H3
_
H5
).
apply
inv_typ_prod
with
(1 := H4
); intros
.
apply
trans_conv_conv
with
(Srt
s3
); auto
with
coc
.
apply
trans_conv_conv
with
U
; auto
with
coc
.
Qed
.
Theorem
type_case
:
forall
e
t
T
, typ
e
t
T
-> (exists
s
, typ
e
T
(Srt
s
)) \/ T
= Srt
kind
.
simple
induction
1; intros
; auto
with
coc
.
left
.
elim
wf_sort_lift
with
(2 := H1
); trivial
; intros
.
exists
x
; auto
with
coc
.
left
.
exists
s2
.
apply
type_prod
with
s1
; auto
with
coc
.
left
.
elim
H3
; intros
.
elim
H4
; intros
.
apply
inv_typ_prod
with
(1 := H5
); intros
.
exists
s2
.
replace
(Srt
s2
) with
(subst
v
(Srt
s2
)); auto
with
coc
.
apply
substitution
with
V
; auto
with
coc
.
discriminate
H4
.
case
s2
; auto
with
coc
.
left
.
exists
kind
.
apply
type_prop
.
apply
typ_wf
with
(1 := H0
).
left
.
exists
s
; auto
with
coc
.
Qed
.
Lemma
type_kind_not_conv
:
forall
e
t
T
, typ
e
t
T
-> typ
e
t
(Srt
kind
) -> T
= Srt
kind
.
intros
.
elim
type_case
with
e
t
T
; intros
; auto
with
coc
.
elim
H1
; intros
.
elim
inv_typ_conv_kind
with
e
T
(Srt
x
); auto
with
coc
.
apply
typ_unique
with
e
t
; trivial
.
Qed
.
Lemma
typ_red_env
:
forall
e
t
T
, typ
e
t
T
->
forall
f
, red1_in_env
red1
e
f
-> wf
f
-> typ
f
t
T
.
simple
induction
1; intros
.
auto
with
coc
.
elim
red_item
with
(2 := H1
) (3 := H2
); auto
with
coc
; intros
.
inversion_clear
H4
.
inversion_clear
H6
.
elim
H1
; intros
.
elim
item_trunc
with
(1 := H8
); intros
.
elim
wf_sort
with
(1 := H9
) (3 := H8
); eauto
; intros
.
apply
type_conv
with
x
x2
; auto
with
coc
.
rewrite
H6
.
replace
(Srt
x2
) with
(lift
(S
v
) (Srt
x2
)); auto
with
coc
.
apply
thinning_n
with
x1
; auto
with
coc
.
cut
(wf
(T0
:: f
)); intros
.
apply
type_abs
with
s1
s2
; auto
with
coc
.
apply
wf_var
with
s1
; auto
with
coc
.
apply
type_app
with
V
; auto
with
coc
.
cut
(wf
(T0
:: f
)); intros
.
apply
type_prod
with
s1
; auto
with
coc
.
apply
wf_var
with
s1
; auto
with
coc
.
apply
type_conv
with
U
s
; auto
with
coc
.
Qed
.
Lemma
subj_red
: forall
e
t
T
, typ
e
t
T
-> forall
u
, red1
t
u
-> typ
e
u
T
.
simple
induction
1; intros
.
inversion_clear
H1
.
inversion_clear
H2
.
inversion_clear
H6
.
cut
(wf
(M'
:: e0
)); intros
.
apply
type_conv
with
(Prod
M'
U
) s2
; auto
with
coc
.
apply
type_abs
with
s1
s2
; auto
with
coc
.
apply
typ_red_env
with
(T0
:: e0
); auto
with
coc
.
apply
typ_red_env
with
(T0
:: e0
); auto
with
coc
.
apply
type_prod
with
s1
; auto
with
coc
.
apply
wf_var
with
s1
; auto
with
coc
.
apply
type_abs
with
s1
s2
; auto
with
coc
.
elim
type_case
with
(1 := H2
); intros
.
inversion_clear
H5
.
apply
inv_typ_prod
with
(1 := H6
); intros
.
generalize
H2
H3
; clear
H2
H3
.
inversion_clear
H4
; intros
.
apply
inv_typ_abs
with
(1 := H2
); intros
.
apply
type_conv
with
(subst
v
T1
) s2
; auto
with
coc
.
apply
substitution
with
T0
; auto
with
coc
.
apply
type_conv
with
V
s0
; auto
with
coc
.
apply
sym_conv
.
apply
inv_conv_prod_l
with
(1 := H11
).
unfold
subst
in
|- *.
apply
conv_conv_subst
; auto
with
coc
.
apply
inv_conv_prod_r
with
(1 := H11
); auto
with
coc
.
replace
(Srt
s2
) with
(subst
v
(Srt
s2
)); auto
with
coc
.
apply
substitution
with
V
; auto
with
coc
.
apply
type_app
with
V
; auto
with
coc
.
apply
type_conv
with
(subst
N2
Ur
) s2
; auto
with
coc
.
apply
type_app
with
V
; auto
with
coc
.
unfold
subst
in
|- *.
apply
conv_conv_subst
; auto
with
coc
.
replace
(Srt
s2
) with
(subst
v
(Srt
s2
)); auto
with
coc
.
apply
substitution
with
V
; auto
with
coc
.
discriminate
H5
.
inversion_clear
H4
.
apply
type_prod
with
s1
; auto
with
coc
.
apply
typ_red_env
with
(T0
:: e0
); auto
with
coc
.
apply
wf_var
with
s1
; auto
with
coc
.
apply
type_prod
with
s1
; auto
with
coc
.
apply
type_conv
with
U
s
; auto
with
coc
.
Qed
.
Theorem
subject_reduction
:
forall
e
t
u
, red
t
u
-> forall
T
, typ
e
t
T
-> typ
e
u
T
.
simple
induction
1; intros
; auto
with
coc
.
apply
subj_red
with
P
; intros
; auto
with
coc
.
Qed
.
Lemma
type_reduction
: forall
e
t
T
U
, red
T
U
-> typ
e
t
T
-> typ
e
t
U
.
intros
.
elim
type_case
with
(1 := H0
); intros
.
inversion_clear
H1
.
apply
type_conv
with
T
x
; auto
with
coc
.
apply
subject_reduction
with
T
; trivial
.
elim
red_normal
with
(1 := H
); trivial
.
rewrite
H1
.
red
in
|- *; red
in
|- *; intros
.
inversion_clear
H2
.
Qed
.
Lemma
typ_conv_conv
:
forall
e
u
U
v
V
, typ
e
u
U
-> typ
e
v
V
-> conv
u
v
-> conv
U
V
.
intros
.
elim
church_rosser
with
(1 := H1
); auto
with
coc
; intros
.
apply
typ_unique
with
e
x
.
apply
subject_reduction
with
u
; trivial
.
apply
subject_reduction
with
v
; trivial
.
Qed
.
End
Typage
.