Library Consistency
Require
Import
Termes
.
Require
Import
Types
.
Require
Import
Conv
.
Require
Import
Conv_Dec
.
Require
Import
Strong_Norm
.
Require
Import
Omega
.
Fixpoint
applist
(l
: list
term
) : term
-> term
:=
fun
t
=>
match
l
with
| nil
=> t
| arg
:: args
=> App
(applist
args
t
) arg
end
.
Lemma
applist_assoc
:
forall
t
e
e'
, applist
(e
++ e'
) t
= applist
e
(applist
e'
t
).
simple
induction
e
; simpl
in
|- *; intros
; auto
.
rewrite
H
; trivial
.
Qed
.
Lemma
inv_typ_applist_head
:
forall
e
t
l
T
, typ
e
(applist
l
t
) T
-> exists
U
, typ
e
t
U
.
Proof
.
simple
induction
l
; simpl
in
|- *; intros
.
split
with
T
; trivial
.
apply
inv_typ_app
with
(1 := H0
); intros
.
eauto
.
Qed
.
Definition
is_atom
(e
: env
) t
:=
exists2
n
, n
< length
e
& (exists
l
, t
= applist
l
(Ref
n
)).
Lemma
sort_not_atom
: forall
e
s
, ~ is_atom
e
(Srt
s
).
intros
e
s
(n
, lt_n
, ([| t
l
], eq_atom
)); discriminate
eq_atom
.
Qed
.
Lemma
prod_not_atom
: forall
e
T
M
, ~ is_atom
e
(Prod
T
M
).
intros
e
T
M
(n
, lt_n
, ([| t
l
], eq_atom
)); discriminate
eq_atom
.
Qed
.
Lemma
is_atom_app
: forall
e
a
b
, is_atom
e
a
-> is_atom
e
(App
a
b
).
intros
e
a
b
(n
, lt_n
, (l
, eq_atom
)).
rewrite
eq_atom
.
exists
n
; trivial
.
exists
(b
:: l
); trivial
.
Qed
.
Lemma
atom_reduction
: forall
e
t
u
, red
t
u
-> is_atom
e
t
-> is_atom
e
u
.
simple
induction
1; intros
; trivial
.
generalize
(H1
H3
); clear
H1
H3
.
intros
(n
, lt_n
, (l
, eq_atom
)).
rewrite
eq_atom
in
H2
.
exists
n
; trivial
.
generalize
N
H2
; clear
N
H2
eq_atom
H0
.
elim
l
; simpl
in
|- *; intros
.
inversion
H2
.
inversion
H2
.
apply
False_ind
.
generalize
H3
.
case
l0
; simpl
in
|- *; discriminate
.
elim
H0
with
(1 := H5
); intros
.
rewrite
H6
.
exists
(a
:: x
); reflexivity
.
exists
(N2
:: l0
); reflexivity
.
Qed
.
Lemma
conv_sort_atom
: forall
(s
: sort
) e
u
, is_atom
e
u
-> ~ conv
(Srt
s
) u
.
Proof
.
red
in
|- *; intros
.
elim
church_rosser
with
(1 := H0
); intros
.
rewrite
<- red_normal
with
(1 := H1
) in
H2
.
specialize
atom_reduction
with
(1 := H2
) (2 := H
).
apply
sort_not_atom
.
red
in
|- *; red
in
|- *; intros
.
inversion
H3
.
Qed
.
Lemma
conv_prod_atom
: forall
a
b
e
u
, is_atom
e
u
-> ~ conv
(Prod
a
b
) u
.
red
in
|- *; intros
.
elim
church_rosser
with
(1 := H0
); intros
.
apply
red_prod_prod
with
(1 := H1
); intros
.
rewrite
H3
in
H2
.
specialize
atom_reduction
with
(1 := H2
) (2 := H
).
apply
prod_not_atom
.
Qed
.
Lemma
prod_inhabitants
:
forall
e
t
u
,
typ
e
t
u
->
forall
a
b
,
conv
u
(Prod
a
b
) ->
normal
t
-> is_atom
e
t
\/ (exists
a'
, (exists
m
, t
= Abs
a'
m
)).
Proof
.
simple
induction
1; intros
; eauto
.
elim
conv_sort_prod
with
(1 := H1
).
left
.
exists
v
.
inversion_clear
H1
.
elim
H5
; intros
; simpl
in
|- *; auto
with
arith
.
exists
(nil
(A
:=term)); simpl
in
|- *; auto
.
left
.
apply
is_atom_app
.
elim
H3
with
V
Ur
; intros
; auto
with
coc
.
inversion_clear
H6
.
inversion_clear
H7
.
rewrite
H6
in
H5
.
elim
H5
with
(subst
v
x0
); auto
with
coc
.
red
in
|- *; red
in
|- *; intros
.
elim
H5
with
(App
u1
v
); auto
with
coc
.
elim
conv_sort_prod
with
(1 := H4
).
apply
H1
with
a
b
; auto
.
apply
trans_conv_conv
with
V
; auto
.
Qed
.
Definition
hnf_proofs
(e
: env
) (t
: term
) : Prop
:=
match
t
with
| App
_
_
=> is_atom
e
t
| _
=> True
end
.
Lemma
hnf_proofs_sound
:
forall
e
t
T
, typ
e
t
T
-> normal
t
-> hnf_proofs
e
t
.
simple
induction
1; simpl
in
|- *; intros
; auto
.
apply
is_atom_app
.
elim
prod_inhabitants
with
(1 := H2
) (a
:= V
) (b
:= Ur
); intros
;
auto
with
coc
.
inversion_clear
H5
.
inversion_clear
H6
.
rewrite
H5
in
H4
.
elim
H4
with
(subst
v
x0
); auto
with
coc
.
red
in
|- *; red
in
|- *; intros
.
elim
H4
with
(App
u0
v
); auto
with
coc
.
Qed
.
Lemma
atom_inhabitants
:
forall
e
t
u
u'
,
typ
e
t
u
-> conv
u
u'
-> is_atom
e
u'
-> hnf_proofs
e
t
-> is_atom
e
t
.
simple
induction
1; simpl
in
|- *; intros
; auto
.
elim
conv_sort_atom
with
(1 := H2
) (2 := H1
).
split
with
v
.
inversion_clear
H1
.
elim
H6
; simpl
in
|- *; auto
with
arith
.
split
with
(nil
(A
:=term)); auto
.
elim
conv_prod_atom
with
(1 := H7
) (2 := H6
).
elim
conv_sort_atom
with
(1 := H5
) (2 := H4
).
apply
H1
; auto
.
apply
trans_conv_conv
with
V
; auto
with
coc
.
Qed
.
Definition
absurd_prop
:= Prod
(Srt
prop
) (Ref
0).
Lemma
coc_consistency_nf
: forall
t
, normal
t
-> ~ typ
nil
t
absurd_prop
.
Proof
.
unfold
absurd_prop
in
|- *.
red
in
|- *; intros
.
elim
prod_inhabitants
with
(1 := H0
) (a
:= Srt
prop
) (b
:= Ref
0) (3 := H
);
auto
with
coc
.
intros
.
inversion_clear
H1
.
inversion
H2
.
intros
(ty
, (M
, eq_abs
)).
rewrite
eq_abs
in
H0
.
apply
inv_typ_abs
with
(1 := H0
); intros
.
specialize
inv_conv_prod_l
with
(1 := H4
); intro
conv_ty
.
specialize
inv_conv_prod_r
with
(1 := H4
); intro
conv_P
.
clear
H0
H4
H3
H1
.
assert
(M_atom
: is_atom
(ty
:: nil
) M
).
apply
atom_inhabitants
with
(1 := H2
) (2 := conv_P
).
split
with
0; simpl
in
|- *; auto
with
arith
; split
with
(nil
(A
:=term));
trivial
.
apply
hnf_proofs_sound
with
(1 := H2
).
rewrite
eq_abs
in
H
.
red
in
|- *; red
in
|- *; intros
.
elim
H
with
(Abs
ty
u
); auto
with
coc
.
destruct
M_atom
as
(n
, lt_n
, (l
, eq_atom
)).
simpl
in
lt_n
.
generalize
eq_atom
; clear
eq_atom
.
replace
n
with
0; try
omega
.
rewrite
<- (rev_involutive
l
).
case
(rev
l
); simpl
in
|- *; intros
; rewrite
eq_atom
in
H2
.
apply
inv_typ_ref
with
(1 := H2
).
intros
U
itm_U
.
inversion_clear
itm_U
.
intro
conv_T
.
cut
(Ref
0 = Srt
prop
); try
discriminate
.
apply
nf_uniqueness
.
apply
trans_conv_conv
with
T
; auto
with
coc
.
apply
trans_conv_conv
with
(lift
1 ty
); auto
with
coc
.
change
(conv
(lift_rec
1 ty
0) (lift_rec
1 (Srt
prop
) 0)) in
|- *.
apply
conv_conv_lift
; auto
with
coc
.
red
in
|- *; red
in
|- *; intros
r
red_n
; inversion
red_n
.
red
in
|- *; red
in
|- *; intros
r
red_n
; inversion
red_n
.
rewrite
applist_assoc
in
H2
.
simpl
in
H2
.
elim
inv_typ_applist_head
with
(1 := H2
); intros
.
clear
H2
eq_atom
.
apply
inv_typ_app
with
(1 := H0
); intros
.
apply
inv_typ_ref
with
(1 := H1
); intros
.
apply
conv_sort_prod
with
prop
V
Ur
.
apply
trans_conv_conv
with
(lift
1 U
); auto
with
coc
.
apply
sym_conv
.
change
(conv
(lift_rec
1 U
0) (lift_rec
1 (Srt
prop
) 0)) in
|- *.
inversion_clear
H4
.
apply
conv_conv_lift
; auto
with
coc
.
Qed
.
Theorem
coc_consistency
: forall
t
, ~ typ
nil
t
absurd_prop
.
Proof
.
red
in
|- *; intros
.
elim
compute_nf
with
t
; intros
.
specialize
subject_reduction
with
(1 := p
) (2 := H
).
apply
coc_consistency_nf
; trivial
.
apply
strong_norm
with
(1 := H
).
Qed
.