Library Lambda.TPOSR.Reduction

Require
Import
Lambda.TPOSR.Terms
.
Require
Import
Lambda.TPOSR.LiftSubst
.

Implicit
Types
i
k
m
n
p
:
nat
.
Implicit
Type
s
:
sort
.
Implicit
Types
A
B
M
N
T
t
u
v
:
lterm
.

Inductive
lred1
:
lterm
lterm
Prop
:=
|
beta
: ∀
T1
M
N
T
,
lred1
(
App_l
T1
(
Abs_l
T
M
)
N
) (
lsubst
N
M
)
|
pi1
: ∀
T1
T
M
N
,
lred1
(
Pi1_l
T1
(
Pair_l
T
M
N
))
M

|
pi2
: ∀
T1
T
M
N
,
lred1
(
Pi2_l
T1
(
Pair_l
T
M
N
))
N

|
abs_lred_l
: ∀
M
M'
,
lred1
M
M'
→ ∀
N
,
lred1
(
Abs_l
M
N
) (
Abs_l
M'
N
)
|
abs_lred_r
: ∀
M
M'
,
lred1
M
M'
→ ∀
N
,
lred1
(
Abs_l
N
M
) (
Abs_l
N
M'
)
|
app_lred_T
:
T
S
,
lred1
T
S
→ ∀
M1
M2
,
lred1
(
App_l
T
M1
M2
) (
App_l
S
M1
M2
)
|
app_lred_l
: ∀
M1
N1
,
lred1
M1
N1
→ ∀
T1
M2
,
lred1
(
App_l
T1
M1
M2
) (
App_l
T1
N1
M2
)
|
app_lred_r
:
M2
N2
,
lred1
M2
N2
→ ∀
T1
M1
,
lred1
(
App_l
T1
M1
M2
) (
App_l
T1
M1
N2
)
|
pair_lred_T
:
T
S
,
lred1
T
S
→ ∀
M1
M2
,
lred1
(
Pair_l
T
M1
M2
) (
Pair_l
S
M1
M2
)
|
pair_lred_l
:
M1
N1
,
lred1
M1
N1
→ ∀
T
M2
,
lred1
(
Pair_l
T
M1
M2
) (
Pair_l
T
N1
M2
)
|
pair_lred_r
:
M2
N2
,
lred1
M2
N2
→ ∀
T
M1
,
lred1
(
Pair_l
T
M1
M2
) (
Pair_l
T
M1
N2
)
|
prod_lred_l
:
M1
N1
,
lred1
M1
N1
→ ∀
M2
,
lred1
(
Prod_l
M1
M2
) (
Prod_l
N1
M2
)
|
prod_lred_r
:
M2
N2
,
lred1
M2
N2
→ ∀
M1
,
lred1
(
Prod_l
M1
M2
) (
Prod_l
M1
N2
)
|
sum_lred_l
:
M1
N1
,
lred1
M1
N1
→ ∀
M2
,
lred1
(
Sum_l
M1
M2
) (
Sum_l
N1
M2
)
    |
sum_lred_r
:
        ∀
M2
N2
,
lred1
M2
N2
→ ∀
M1
,
lred1
(
Sum_l
M1
M2
) (
Sum_l
M1
N2
)
    |
subset_lred_l
:
        ∀
M1
N1
,
lred1
M1
N1
→ ∀
M2
,
lred1
(
Subset_l
M1
M2
) (
Subset_l
N1
M2
)
    |
subset_lred_r
:
        ∀
M2
N2
,
lred1
M2
N2
→ ∀
M1
,
lred1
(
Subset_l
M1
M2
) (
Subset_l
M1
N2
)
    |
pi1_lred_T
:
        ∀
M
N
,
lred1
M
N
→ ∀
M2
,
lred1
(
Pi1_l
M
M2
) (
Pi1_l
N
M2
)
    |
pi1_lred
:
        ∀
M
N
,
lred1
M
N
→ ∀
M2
,
lred1
(
Pi1_l
M2
M
) (
Pi1_l
M2
N
)
    |
pi2_lred_T
:
        ∀
M
N
,
lred1
M
N
→ ∀
M2
,
lred1
(
Pi2_l
M
M2
) (
Pi2_l
N
M2
)
    |
pi2_lred
:
        ∀
M
N
,
lred1
M
N
→ ∀
M2
,
lred1
(
Pi2_l
M2
M
) (
Pi2_l
M2
N
).

  
Inductive
lred
M
:
lterm
Prop
:=
    |
refl_lred
:
lred
M
M

    |
trans_lred
: ∀ (
P
:
lterm
)
N
,
lred
M
P
lred1
P
N
lred
M
N
.

  
Inductive
conv
M
:
lterm
Prop
:=
    |
refl_conv
:
conv
M
M

    |
trans_conv_lred
: ∀ (
P
:
lterm
)
N
,
conv
M
P
lred1
P
N
conv
M
N

    |
trans_conv_exp
: ∀ (
P
:
lterm
)
N
,
conv
M
P
lred1
N
P
conv
M
N
.

  
Inductive
par_lred1
:
lterm
lterm
Prop
:=
    |
par_beta
:
        ∀
Typ
,
        ∀
M
M'
,
        
par_lred1
M
M'

        ∀
N
N'
,
        
par_lred1
N
N'
→ ∀
T
,
par_lred1
(
App_l
Typ
(
Abs_l
T
M
)
N
) (
lsubst
N'
M'
)
    |
par_pi1
: ∀
Typ
, ∀
M
M'
,
par_lred1
M
M'

      ∀
T
N
,
par_lred1
(
Pi1_l
Typ
(
Pair_l
T
M
N
))
M'

    |
par_pi2
: ∀
Typ
N
N'
,
par_lred1
N
N'
→ ∀
T
M
,
      
par_lred1
(
Pi2_l
Typ
(
Pair_l
T
M
N
))
N'

    |
sort_par_lred
: ∀
s
,
par_lred1
(
Srt_l
s
) (
Srt_l
s
)
    |
ref_par_lred
: ∀
n
,
par_lred1
(
Ref_l
n
) (
Ref_l
n
)
    |
abs_par_lred
:
        ∀
M
M'
,
        
par_lred1
M
M'

        ∀
T
T'
,
par_lred1
T
T'
par_lred1
(
Abs_l
T
M
) (
Abs_l
T'
M'
)
    |
app_par_lred
:forall
T
T'
,
par_lred1
T
T'

        ∀
M
M'
,
        
par_lred1
M
M'

        ∀
N
N'
,
par_lred1
N
N'
par_lred1
(
App_l
T
M
N
) (
App_l
T'
M'
N'
)
    |
pair_par_lred
: ∀
T
T'
,
par_lred1
T
T'

        ∀
M
M'
,
        
par_lred1
M
M'

        ∀
N
N'
,
par_lred1
N
N'
par_lred1
(
Pair_l
T
M
N
) (
Pair_l
T'
M'
N'
)
    |
prod_par_lred
:
        ∀
M
M'
,
        
par_lred1
M
M'

        ∀
N
N'
,
par_lred1
N
N'
par_lred1
(
Prod_l
M
N
) (
Prod_l
M'
N'
)
    |
sum_par_lred
:
        ∀
M
M'
,
        
par_lred1
M
M'

        ∀
N
N'
,
par_lred1
N
N'
par_lred1
(
Sum_l
M
N
) (
Sum_l
M'
N'
)
    |
subset_par_lred
:
        ∀
M
M'
,
        
par_lred1
M
M'

        ∀
N
N'
,
par_lred1
N
N'
par_lred1
(
Subset_l
M
N
) (
Subset_l
M'
N'
)
    |
pi1_par_lred
:forall
T
T'
,
par_lred1
T
T'

        ∀
M
M'
,
par_lred1
M
M'
par_lred1
(
Pi1_l
T
M
) (
Pi1_l
T'
M'
)
    |
pi2_par_lred
:forall
T
T'
,
par_lred1
T
T'

        ∀
M
M'
,
par_lred1
M
M'
par_lred1
(
Pi2_l
T
M
) (
Pi2_l
T'
M'
).

  
Definition
par_lred
:=
clos_trans
lterm
par_lred1
.

  
Hint
Resolve
beta
pi1
pi2
abs_lred_l
abs_lred_r
app_lred_T
app_lred_l
app_lred_r
pair_lred_T
pair_lred_l
pair_lred_r
:
coc
.
  
Hint
Resolve
prod_lred_l
prod_lred_r
sum_lred_l
sum_lred_r
subset_lred_l
subset_lred_r
pi1_lred_T
pi1_lred
pi2_lred_T
pi2_lred
:
coc
.
  
Hint
Resolve
refl_lred
refl_conv
:
coc
.
  
Hint
Resolve
par_beta
par_pi1
par_pi2
sort_par_lred
ref_par_lred
abs_par_lred
app_par_lred
pair_par_lred

    
prod_par_lred
sum_par_lred
subset_par_lred
pi1_par_lred
pi2_par_lred
:
coc
.

  
Hint
Unfold
par_lred
:
coc
.

Section
Normalisation_Forte
.

  
Definition
normal
t
:
Prop
:= ∀
u
, ¬
lred1
t
u
.

  
Definition
sn
:
lterm
Prop
:=
Acc
(
transp
_
lred1
).

End
Normalisation_Forte
.

  
Hint
Unfold
sn
:
coc
.

  
Lemma
one_step_lred
: ∀
M
N
,
lred1
M
N
lred
M
N
.

  
Hint
Resolve
one_step_lred
:
coc
.

  
Lemma
lred1_lred_ind
:
   ∀
N
(
P
:
lterm
Prop
),
   
P
N

   (∀
M
(
R
:
lterm
),
lred1
M
R
lred
R
N
P
R
P
M
) →
   ∀
M
,
lred
M
N
P
M
.

  
Lemma
trans_lred_lred
: ∀
M
N
(
P
:
lterm
),
lred
M
N
lred
N
P
lred
M
P
.

  
Lemma
lred_lred_app
:
   ∀
T
T0
u
u0
v
v0
,
lred
T
T0
lred
u
u0
lred
v
v0
lred
(
App_l
T
u
v
) (
App_l
T0
u0
v0
).

Lemma
lred_lred_pair
:
   ∀
T
T0
u
u0
v
v0
,
lred
T
T0
lred
u
u0
lred
v
v0
lred
(
Pair_l
T
u
v
) (
Pair_l
T0
u0
v0
).

Ltac
lred_lred_tac
t
:=
  
intros
u
;
elim
u
;
  [ (
intros
u0
;
elim
u0
;
intros
v
v0
P
;
auto
with
coc
core
arith
sets
;
     
apply
trans_lred
with
(
t
u
P
);
auto
with
coc
core
arith
sets
)
  |
intros
v
v0
P
;
apply
trans_lred
with
(
t
P
v0
);
auto
with
coc
core
arith
sets
].

Lemma
lred_lred_abs
:
   ∀
u
u0
v
v0
,
lred
u
u0
lred
v
v0
lred
(
Abs_l
u
v
) (
Abs_l
u0
v0
).

  
Lemma
lred_lred_prod
:
   ∀
u
u0
v
v0
,
lred
u
u0
lred
v
v0
lred
(
Prod_l
u
v
) (
Prod_l
u0
v0
).

  
Lemma
lred_lred_sum
:
   ∀
u
u0
v
v0
,
lred
u
u0
lred
v
v0
lred
(
Sum_l
u
v
) (
Sum_l
u0
v0
).

  
Lemma
lred_lred_subset
:
   ∀
u
u0
v
v0
,
lred
u
u0
lred
v
v0
lred
(
Subset_l
u
v
) (
Subset_l
u0
v0
).

  
Lemma
lred_lred_pi1
: ∀
u
u0
v
v0
,
lred
u
u0
lred
v
v0
lred
(
Pi1_l
u
v
) (
Pi1_l
u0
v0
).

  
Lemma
lred_lred_pi2
: ∀
u
u0
v
v0
,
lred
u
u0
lred
v
v0
lred
(
Pi2_l
u
v
) (
Pi2_l
u0
v0
).

  
Hint
Resolve
lred_lred_app
lred_lred_abs
lred_lred_prod
:
coc
.
  
Hint
Resolve
lred_lred_pair
lred_lred_sum
lred_lred_subset
lred_lred_pi1
lred_lred_pi2
:
coc
.

  
Lemma
lred1_llift
:
   ∀
u
v
,
lred1
u
v
→ ∀
n
k
,
lred1
(
llift_rec
n
u
k
) (
llift_rec
n
v
k
).

  
Hint
Resolve
lred1_llift
:
coc
.

  
Lemma
lred1_lsubst_r
:
   ∀
t
u
,
   
lred1
t
u
→ ∀ (
a
:
lterm
)
k
,
lred1
(
lsubst_rec
a
t
k
) (
lsubst_rec
a
u
k
).

  
Lemma
lred1_lsubst_l
:
   ∀ (
a
:
lterm
)
t
u
k
,
   
lred1
t
u
lred
(
lsubst_rec
t
a
k
) (
lsubst_rec
u
a
k
).

  
Hint
Resolve
lred1_lsubst_l
lred1_lsubst_r
:
coc
.

  
Lemma
lred_prod_prod
:
   ∀
u
v
t
,
   
lred
(
Prod_l
u
v
)
t

   ∀
P
:
Prop
,
   (∀
a
b
:
lterm
,
t
=
Prod_l
a
b
lred
u
a
lred
v
b
P
) →
P
.

  
Lemma
lred_sum_sum
:
   ∀
u
v
t
,
   
lred
(
Sum_l
u
v
)
t

   ∀
P
:
Prop
,
   (∀
a
b
:
lterm
,
t
=
Sum_l
a
b
lred
u
a
lred
v
b
P
) →
P
.

  
Lemma
lred_subset_subset
:
   ∀
u
v
t
,
   
lred
(
Subset_l
u
v
)
t

   ∀
P
:
Prop
,
   (∀
a
b
:
lterm
,
t
=
Subset_l
a
b
lred
u
a
lred
v
b
P
) →
P
.

  
Lemma
lred_sort_sort
: ∀
s
t
,
lred
(
Srt_l
s
)
t
t
Srt_l
s
False
.

  
Lemma
lred_ref_ref
: ∀
n
t
,
lred
(
Ref_l
n
)
t
t
Ref_l
n
False
.

  
Lemma
one_step_conv_exp
: ∀
M
N
,
lred1
M
N
conv
N
M
.

  
Lemma
lred_conv
: ∀
M
N
,
lred
M
N
conv
M
N
.

  
Hint
Resolve
one_step_conv_exp
lred_conv
:
coc
.

  
Lemma
sym_conv
: ∀
M
N
,
conv
M
N
conv
N
M
.

  
Hint
Immediate
sym_conv
:
coc
.

  
Lemma
trans_conv_conv
:
   ∀
M
N
(
P
:
lterm
),
conv
M
N
conv
N
P
conv
M
P
.

  
Lemma
conv_conv_prod
:
   ∀
a
b
c
d
:
lterm
,
conv
a
b
conv
c
d
conv
(
Prod_l
a
c
) (
Prod_l
b
d
).

Lemma
conv_conv_sum
: ∀
a
b
c
d
:
lterm
,
conv
a
b
conv
c
d
conv
(
Sum_l
a
c
) (
Sum_l
b
d
).

Lemma
conv_conv_subset
:
  ∀
a
b
c
d
:
lterm
,
conv
a
b
conv
c
d
conv
(
Subset_l
a
c
) (
Subset_l
b
d
).

Lemma
conv_conv_pair
: ∀
T
S
a
b
c
d
:
lterm
,
conv
T
S
conv
a
b
conv
c
d
conv
(
Pair_l
T
a
c
) (
Pair_l
S
b
d
).

  
Lemma
conv_conv_llift
:
   ∀ (
a
b
:
lterm
)
n
k
,
   
conv
a
b
conv
(
llift_rec
n
a
k
) (
llift_rec
n
b
k
).

  
Lemma
conv_conv_lsubst
:
   ∀ (
a
b
c
d
:
lterm
)
k
,
   
conv
a
b
conv
c
d
conv
(
lsubst_rec
a
c
k
) (
lsubst_rec
b
d
k
).

  
Hint
Resolve
conv_conv_prod
conv_conv_llift
conv_conv_lsubst
:
coc
.

  
Lemma
refl_par_lred1
: ∀
M
,
par_lred1
M
M
.

  
Hint
Resolve
refl_par_lred1
:
coc
.

  
Lemma
lred1_par_lred1
: ∀
M
N
,
lred1
M
N
par_lred1
M
N
.

  
Hint
Resolve
lred1_par_lred1
:
coc
.

  
Lemma
lred_par_lred
: ∀
M
N
,
lred
M
N
par_lred
M
N
.

  
Lemma
par_lred_lred
: ∀
M
N
,
par_lred
M
N
lred
M
N
.

  
Hint
Resolve
lred_par_lred
par_lred_lred
:
coc
.

  
Lemma
par_lred1_llift
:
   ∀
n
(
a
b
:
lterm
),
   
par_lred1
a
b
→ ∀
k
,
par_lred1
(
llift_rec
n
a
k
) (
llift_rec
n
b
k
).

  
Lemma
par_lred1_lsubst
:
   ∀
c
d
:
lterm
,
   
par_lred1
c
d

   ∀
a
b
:
lterm
,
   
par_lred1
a
b
→ ∀
k
,
par_lred1
(
lsubst_rec
a
c
k
) (
lsubst_rec
b
d
k
).

  
Lemma
inv_par_lred_abs
:
   ∀ (
P
:
Prop
)
T
(
U
x
:
lterm
),
   
par_lred1
(
Abs_l
T
U
)
x

   (∀
T'
(
U'
:
lterm
),
x
=
Abs_l
T'
U'
par_lred1
U
U'
P
) →
P
.

  
Lemma
inv_par_lred_pair
:
   ∀ (
P
:
Prop
)
T
(
U
V
x
:
lterm
),
   
par_lred1
(
Pair_l
T
U
V
)
x

   (∀
T'
(
U'
V'
:
lterm
),
x
=
Pair_l
T'
U'
V'
par_lred1
U
U'
par_lred1
V
V'
P
) →
P
.

  
Hint
Resolve
par_lred1_llift
par_lred1_lsubst
:
coc
.

  
Lemma
sublterm_abs
: ∀
t
(
m
:
lterm
),
sublterm
m
(
Abs_l
t
m
).

  
Lemma
sublterm_prod
: ∀
t
(
m
:
lterm
),
sublterm
m
(
Prod_l
t
m
).

  
Lemma
sublterm_sum
: ∀
t
(
m
:
lterm
),
sublterm
m
(
Sum_l
t
m
).

  
Lemma
sublterm_subset
: ∀
t
(
m
:
lterm
),
sublterm
m
(
Subset_l
t
m
).

Hint
Resolve
sublterm_abs
sublterm_prod
sublterm_sum
sublterm_subset
:
coc
.

  
Lemma
mem_sort_llift
:
   ∀
t
n
k
s
,
mem_sort
s
(
llift_rec
n
t
k
) →
mem_sort
s
t
.

  
Lemma
mem_sort_lsubst
:
   ∀ (
b
a
:
lterm
)
n
s
,
   
mem_sort
s
(
lsubst_rec
a
b
n
) →
mem_sort
s
a
mem_sort
s
b
.

  
Lemma
lred_sort_mem
: ∀
t
s
,
lred
t
(
Srt_l
s
) →
mem_sort
s
t
.

  
Lemma
lred_normal
: ∀
u
v
,
lred
u
v
normal
u
u
=
v
.

  
Lemma
sn_lred_sn
: ∀
a
b
:
lterm
,
sn
a
lred
a
b
sn
b
.

  
Lemma
commut_lred1_sublterm
:
commut
_
sublterm
(
transp
_
lred1
).

 
Lemma
sublterm_sn
:
   ∀
a
:
lterm
,
sn
a
→ ∀
b
:
lterm
,
sublterm
b
a
sn
b
.

  
Lemma
sn_prod
: ∀
A
,
sn
A
→ ∀
B
,
sn
B
sn
(
Prod_l
A
B
).

  
Lemma
sn_sum
: ∀
A
,
sn
A
→ ∀
B
,
sn
B
sn
(
Sum_l
A
B
).

  
Lemma
sn_pair
: ∀
T
,
sn
T
→ ∀
A
,
sn
A
→ ∀
B
,
sn
B
sn
(
Pair_l
T
A
B
).

  
Lemma
sn_subset
: ∀
A
,
sn
A
→ ∀
B
,
sn
B
sn
(
Subset_l
A
B
).

  
Lemma
sn_lsubst
: ∀
T
M
,
sn
(
lsubst
T
M
) →
sn
M
.