Library Conv
Require
Export
Termes
.
Section
Church_Rosser
.
Definition
str_confluent
R
:= commut
_
R
(transp
term
R
).
Lemma
str_confluence_par_red1
: str_confluent
par_red1
.
red
in
|- *; red
in
|- *.
simple
induction
1; intros
.
inversion_clear
H4
.
elim
H1
with
M'0
; auto
with
coc
; intros
.
elim
H3
with
N'0
; auto
with
coc
; intros
.
exists
(subst
x1
x0
); unfold
subst
in
|- *; auto
with
coc
.
inversion_clear
H5
.
elim
H1
with
M'1
; auto
with
coc
; intros
.
elim
H3
with
N'0
; auto
with
coc
; intros
.
exists
(subst
x1
x0
); auto
with
coc
; unfold
subst
in
|- *; auto
with
coc
.
inversion_clear
H0
.
exists
(Srt
s
); auto
with
coc
.
inversion_clear
H0
.
exists
(Ref
n
); auto
with
coc
.
inversion_clear
H4
.
elim
H1
with
M'0
; auto
with
coc
; intros
.
elim
H3
with
T'0
; auto
with
coc
; intros
.
exists
(Abs
x1
x0
); auto
with
coc
.
generalize
H0
H1
.
clear
H0
H1
.
inversion_clear
H4
.
intro
.
inversion_clear
H4
.
intros
.
elim
H4
with
(Abs
T
M'0
); auto
with
coc
; intros
.
elim
H3
with
N'0
; auto
with
coc
; intros
.
apply
inv_par_red_abs
with
T'
M'1
x0
; intros
; auto
with
coc
.
generalize
H7
H8
.
rewrite
H11
.
clear
H7
H8
; intros
.
inversion_clear
H7
.
inversion_clear
H8
.
exists
(subst
x1
U'
); auto
with
coc
.
unfold
subst
in
|- *; auto
with
coc
.
intros
.
elim
H5
with
M'0
; auto
with
coc
; intros
.
elim
H3
with
N'0
; auto
with
coc
; intros
.
exists
(App
x0
x1
); auto
with
coc
.
intros
.
inversion_clear
H4
.
elim
H1
with
M'0
; auto
with
coc
; intros
.
elim
H3
with
N'0
; auto
with
coc
; intros
.
exists
(Prod
x0
x1
); auto
with
coc
.
Qed
.
Lemma
strip_lemma
: commut
_
par_red
(transp
_
par_red1
).
unfold
commut
, par_red
in
|- *; simple
induction
1; intros
.
elim
str_confluence_par_red1
with
z
x0
y0
; auto
with
coc
; intros
.
exists
x1
; auto
with
coc
.
elim
H1
with
z0
; auto
with
coc
; intros
.
elim
H3
with
x1
; intros
; auto
with
coc
.
exists
x2
; auto
with
coc
.
apply
t_trans
with
x1
; auto
with
coc
.
Qed
.
Lemma
confluence_par_red
: str_confluent
par_red
.
red
in
|- *; red
in
|- *.
simple
induction
1; intros
.
elim
strip_lemma
with
z
x0
y0
; intros
; auto
with
coc
.
exists
x1
; auto
with
coc
.
elim
H1
with
z0
; intros
; auto
with
coc
.
elim
H3
with
x1
; intros
; auto
with
coc
.
exists
x2
; auto
with
coc
.
red
in
|- *.
apply
t_trans
with
x1
; auto
with
coc
.
Qed
.
Lemma
confluence_red
: str_confluent
red
.
red
in
|- *; red
in
|- *.
intros
.
elim
confluence_par_red
with
x
y
z
; auto
with
coc
; intros
.
exists
x0
; auto
with
coc
.
Qed
.
Theorem
church_rosser
:
forall
u
v
, conv
u
v
-> exists2
t
: _
, red
u
t
& red
v
t
.
simple
induction
1; intros
.
exists
u
; auto
with
coc
.
elim
H1
; intros
.
elim
confluence_red
with
x
P
N
; auto
with
coc
; intros
.
exists
x0
; auto
with
coc
.
apply
trans_red_red
with
x
; auto
with
coc
.
elim
H1
; intros
.
exists
x
; auto
with
coc
.
apply
trans_red_red
with
P
; auto
with
coc
.
Qed
.
Lemma
inv_conv_prod_l
:
forall
a
b
c
d
, conv
(Prod
a
c
) (Prod
b
d
) -> conv
a
b
.
intros
.
elim
church_rosser
with
(Prod
a
c
) (Prod
b
d
); intros
; auto
with
coc
.
apply
red_prod_prod
with
a
c
x
; intros
; auto
with
coc
.
apply
red_prod_prod
with
b
d
x
; intros
; auto
with
coc
.
apply
trans_conv_conv
with
a0
; auto
with
coc
.
apply
sym_conv
.
generalize
H2
.
rewrite
H5
; intro
.
injection
H8
.
simple
induction
2; auto
with
coc
.
Qed
.
Lemma
inv_conv_prod_r
:
forall
a
b
c
d
, conv
(Prod
a
c
) (Prod
b
d
) -> conv
c
d
.
intros
.
elim
church_rosser
with
(Prod
a
c
) (Prod
b
d
); intros
; auto
with
coc
.
apply
red_prod_prod
with
a
c
x
; intros
; auto
with
coc
.
apply
red_prod_prod
with
b
d
x
; intros
; auto
with
coc
.
apply
trans_conv_conv
with
b0
; auto
with
coc
.
apply
sym_conv
.
generalize
H2
.
rewrite
H5
; intro
.
injection
H8
.
simple
induction
1; auto
with
coc
.
Qed
.
Lemma
nf_uniqueness
: forall
u
v
, conv
u
v
-> normal
u
-> normal
v
-> u
= v
.
intros
.
elim
church_rosser
with
u
v
; intros
; auto
with
coc
.
rewrite
(red_normal
u
x
); auto
with
coc
.
elim
red_normal
with
v
x
; auto
with
coc
.
Qed
.
Lemma
conv_sort
: forall
s1
s2
, conv
(Srt
s1
) (Srt
s2
) -> s1
= s2
.
intros
.
cut
(Srt
s1
= Srt
s2
); intros
.
injection
H0
; auto
with
coc
.
apply
nf_uniqueness
; auto
with
coc
.
red
in
|- *; red
in
|- *; intros
.
inversion_clear
H0
.
red
in
|- *; red
in
|- *; intros
.
inversion_clear
H0
.
Qed
.
Lemma
conv_kind_prop
: ~ conv
(Srt
kind
) (Srt
prop
).
red
in
|- *; intro
.
absurd
(kind
= prop
).
discriminate
.
apply
conv_sort
; auto
with
coc
.
Qed
.
Lemma
conv_sort_prod
: forall
s
t
u
, ~ conv
(Srt
s
) (Prod
t
u
).
red
in
|- *; intros
.
elim
church_rosser
with
(Srt
s
) (Prod
t
u
); auto
with
coc
.
do
2 intro
.
elim
red_normal
with
(Srt
s
) x
; auto
with
coc
.
intro
.
apply
red_prod_prod
with
t
u
(Srt
s
); auto
with
coc
; intros
.
discriminate
H2
.
red
in
|- *; red
in
|- *; intros
.
inversion_clear
H1
.
Qed
.
End
Church_Rosser
.