Require
Import
Lambda.Utils
.
Require
Import
Lambda.Tactics
.
Require
Import
Lambda.MyList
.
Require
Import
Lambda.TPOSR.Terms
.
Require
Import
Lambda.TPOSR.Reduction
.
Require
Import
Lambda.TPOSR.Conv
.
Require
Import
Lambda.TPOSR.LiftSubst
.
Require
Import
Lambda.TPOSR.Env
.
Require
Import
Lambda.TPOSR.Types
.
Require
Import
Lambda.TPOSR.Basic
.
Require
Import
Lambda.TPOSR.Thinning
.
Require
Import
Lambda.TPOSR.LeftReflexivity
.
Require
Import
Lambda.TPOSR.Substitution
.
Require
Import
Lambda.TPOSR.SubstitutionTPOSR
.
Require
Import
Lambda.TPOSR.CtxConversion
.
Require
Import
Lambda.TPOSR.RightReflexivity
.
Require
Import
Lambda.TPOSR.CtxCoercion
.
Require
Import
Lambda.TPOSR.Equiv
.
Require
Import
Lambda.TPOSR.Generation
.
Require
Import
Lambda.TPOSR.Validity
.
Require
Import
Lambda.TPOSR.TypesDepth
.
Require
Import
Lambda.TPOSR.TypesFunctionality
.
Require
Import
Lambda.TPOSR.UniquenessOfTypes
.
Require
Import
Lambda.TPOSR.ChurchRosser
.
Require
Import
Lambda.TPOSR.SubjectReduction
.
Implicit
Types
i
k
m
n
p
: nat
.
Implicit
Type
s
: sort
.
Implicit
Types
A
B
M
N
T
t
u
v
: lterm
.
Lemma
substitution_tposrp_tposr
: ∀ e
d
d'
t
, e
|-- d
-+> d'
: t
->
∀ u
u'
U
, t
:: e
|-- u
-> u'
: U
->
e
|-- (lsubst
d
u
) -+> (lsubst
d'
u'
) : (lsubst
d
U
).
Lemma
substitution_tposrp_coerce
: ∀ e
d
d'
t
, e
|-- d
-+> d'
: t
->
∀ u
u'
s
, t
:: e
|-- u
>-> u'
: s
->
e
|-- (lsubst
d
u
) >-> (lsubst
d'
u'
) : s
.
Require
Import
Lambda.TPOSR.Substitution
.
Lemma
tposrp_abs_aux
: ∀ e
A
A'
Ts1
, e
|-- A
-+> A'
: Ts1
->
∀ s1
, Ts1
= Srt_l
s1
->
∀ B
M
M'
, (A
:: e
) |-- M
-> M'
: B
->
∀ B'
s2
, (A
:: e
) |-- B
-> B'
: Srt_l
s2
->
e
|-- Abs_l
A
M
-+> Abs_l
A'
M'
: (Prod_l
A
B
).
Lemma
tposrp_abs_aux2
:
∀ G
B
M
M'
, G
|-- M
-+> M'
: B
->
∀ e
A
A'
s1
, e
|-- A
-> A'
: s1
->
G
= (A
:: e
) ->
∀ B'
s2
, (A
:: e
) |-- B
-> B'
: Srt_l
s2
->
e
|-- Abs_l
A
M
-+> Abs_l
A'
M'
: (Prod_l
A
B
).
Hint
Resolve
conv_env
tposrp_conv_env
: ecoc
.
Lemma
tposrp_abs
: ∀ e
A
A'
s1
, e
|-- A
-+> A'
: Srt_l
s1
->
∀ B
M
M'
, (A
:: e
) |-- M
-+> M'
: B
->
∀ B'
s2
, (A
:: e
) |-- B
-+> B'
: Srt_l
s2
->
e
|-- Abs_l
A
M
-+> Abs_l
A'
M'
: (Prod_l
A
B
).
Ltac
conv_in_env
X
Y
e
s
:=
assert
(conv_in_env
(X
:: e
) (Y
:: e
)) by
(apply
conv_env_hd
with
s
; auto
with
coc
).
Ltac
coerce_in_env
X
Y
e
s
:=
assert
(coerce_in_env
(X
:: e
) (Y
:: e
)) by
(apply
coerce_env_hd
with
s
; auto
with
coc
ecoc
).
Lemma
tposrp_prod_aux
: ∀ e
A
A'
Ts1
, e
|-- A
-+> A'
: Ts1
->
∀ s1
, Ts1
= Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: Srt_l
s2
->
e
|-- Prod_l
A
B
-+> Prod_l
A'
B'
: Srt_l
s2
.
Lemma
tposrp_prod
: ∀ e
A
A'
s1
, e
|-- A
-+> A'
: Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-+> B'
: Srt_l
s2
->
e
|-- Prod_l
A
B
-+> Prod_l
A'
B'
: Srt_l
s2
.
Ltac
induction_ws
:= induction_with_subterm
.
Ltac
induction_ws2
:= induction_with_subterms
.
Lemma
tposrp_app_aux
:
∀ e
A
A'
s1
, e
|-- A
-+> A'
: Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
>-> B'
: s2
->
∀ M
M'
, e
|-- M
-> M'
: (Prod_l
A
B
) ->
∀ N
N'
, e
|-- N
-> N'
: A
->
e
|-- App_l
B
M
N
-+> App_l
B'
M'
N'
: lsubst
N
B
.
Lemma
tposrp_app_aux2
:
∀ e
M
M'
A
B
, e
|-- M
-+> M'
: (Prod_l
A
B
) ->
∀ B'
s2
, (A
:: e
) |-- B
>-> B'
: s2
->
∀ A'
s1
, e
|-- A
-> A'
: Srt_l
s1
->
∀ N
N'
, e
|-- N
-> N'
: A
->
e
|-- App_l
B
M
N
-+> App_l
B'
M'
N'
: lsubst
N
B
.
Lemma
tposrp_app_aux3
:
∀ e
N
N'
A
, e
|-- N
-+> N'
: A
->
∀ M
M'
B
, e
|-- M
-> M'
: (Prod_l
A
B
) ->
∀ B'
s2
, (A
:: e
) |-- B
>-> B'
: s2
->
∀ A'
s1
, e
|-- A
-> A'
: Srt_l
s1
->
e
|-- App_l
B
M
N
-+> App_l
B'
M'
N'
: lsubst
N
B
.
Lemma
tposrp_app
: ∀ e
A
A'
s1
, e
|-- A
-+> A'
: Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
>-> B'
: s2
->
∀ M
M'
, e
|-- M
-+> M'
: (Prod_l
A
B
) ->
∀ N
N'
, e
|-- N
-+> N'
: A
->
e
|-- App_l
B
M
N
-+> App_l
B'
M'
N'
: lsubst
N
B
.
Lemma
tposrp_subset_aux
: ∀ e
A
A'
, e
|-- A
-+> A'
: Srt_l
set
->
∀ B
B'
, (A
:: e
) |-- B
-> B'
: Srt_l
prop
->
e
|-- Subset_l
A
B
-+> Subset_l
A'
B'
: Srt_l
set
.
Lemma
tposrp_subset
: ∀ e
A
A'
, e
|-- A
-+> A'
: Srt_l
set
->
∀ B
B'
, (A
:: e
) |-- B
-+> B'
: Srt_l
prop
->
e
|-- Subset_l
A
B
-+> Subset_l
A'
B'
: Srt_l
set
.
Lemma
tposrp_sigma_aux
: ∀ e
A
A'
s1
, e
|-- A
-+> A'
: Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: Srt_l
s2
->
∀ s3
, sum_sort
s1
s2
s3
->
e
|-- Sum_l
A
B
-+> Sum_l
A'
B'
: Srt_l
s3
.
Lemma
tposrp_sigma
: ∀ e
A
A'
s1
, e
|-- A
-+> A'
: Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-+> B'
: Srt_l
s2
->
∀ s3
, sum_sort
s1
s2
s3
->
e
|-- Sum_l
A
B
-+> Sum_l
A'
B'
: Srt_l
s3
.
Lemma
tposrp_pair_aux1
: ∀ e
A
A'
s1
, e
|-- A
-+> A'
: Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: Srt_l
s2
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ u
u'
, e
|-- u
-> u'
: A
->
∀ v
v'
, e
|-- v
-> v'
: lsubst
u
B
->
e
|-- Pair_l
(Sum_l
A
B
) u
v
-+> Pair_l
(Sum_l
A'
B'
) u'
v'
: Sum_l
A
B
.
Lemma
tposrp_pair_aux2
:
∀ e
A
B
B'
s2
, (A
:: e
) |-- B
-+> B'
: Srt_l
s2
->
∀ A'
s1
, e
|-- A
-> A'
: Srt_l
s1
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ u
u'
, e
|-- u
-> u'
: A
->
∀ v
v'
, e
|-- v
-> v'
: lsubst
u
B
->
e
|-- Pair_l
(Sum_l
A
B
) u
v
-+> Pair_l
(Sum_l
A'
B'
) u'
v'
: Sum_l
A
B
.
Lemma
tposrp_pair_aux3
:
∀ e
u
u'
A
, e
|-- u
-+> u'
: A
->
∀ A'
s1
, e
|-- A
-> A'
: Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: Srt_l
s2
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ v
v'
, e
|-- v
-> v'
: lsubst
u
B
->
e
|-- Pair_l
(Sum_l
A
B
) u
v
-+> Pair_l
(Sum_l
A'
B'
) u'
v'
: Sum_l
A
B
.
Lemma
tposrp_pair_aux4
:
∀ e
u
v
v'
B
, e
|-- v
-+> v'
: lsubst
u
B
->
∀ A
A'
s1
, e
|-- A
-> A'
: Srt_l
s1
->
∀ B'
s2
, (A
:: e
) |-- B
-> B'
: Srt_l
s2
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ u'
, e
|-- u
-> u'
: A
->
e
|-- Pair_l
(Sum_l
A
B
) u
v
-+> Pair_l
(Sum_l
A'
B'
) u'
v'
: Sum_l
A
B
.
Lemma
tposrp_pair
: ∀ e
A
A'
s1
, e
|-- A
-+> A'
: Srt_l
s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-+> B'
: Srt_l
s2
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ u
u'
, e
|-- u
-+> u'
: A
->
∀ v
v'
, e
|-- v
-+> v'
: lsubst
u
B
->
e
|-- Pair_l
(Sum_l
A
B
) u
v
-+> Pair_l
(Sum_l
A'
B'
) u'
v'
: Sum_l
A
B
.
Lemma
tposrp_pi1_aux
:
∀ e
t
t'
A
B
, e
|-- t
-+> t'
: Sum_l
A
B
->
∀ A'
s1
, e
|-- A
>-> A'
: s1
->
∀ B'
s2
, (A
:: e
) |-- B
>-> B'
: s2
->
∀ s3
, sum_sort
s1
s2
s3
->
e
|-- Pi1_l
(Sum_l
A
B
) t
-+> Pi1_l
(Sum_l
A'
B'
) t'
: A
.
Lemma
tposrp_pi1
:
∀ e
A
A'
s1
, e
|-- A
>-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
>-> B'
: s2
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ t
t'
, e
|-- t
-+> t'
: Sum_l
A
B
->
e
|-- Pi1_l
(Sum_l
A
B
) t
-+> Pi1_l
(Sum_l
A'
B'
) t'
: A
.
Lemma
tposrp_pi2_aux
: ∀ e
t
t'
A
B
, e
|-- t
-+> t'
: Sum_l
A
B
->
∀ A'
s1
, e
|-- A
>-> A'
: s1
->
∀ B'
s2
, (A
:: e
) |-- B
>-> B'
: s2
->
∀ s3
, sum_sort
s1
s2
s3
->
e
|-- Pi2_l
(Sum_l
A
B
) t
-+> Pi2_l
(Sum_l
A'
B'
) t'
: lsubst
(Pi1_l
(Sum_l
A
B
) t
) B
.
Lemma
tposrp_pi2
: ∀ e
A
A'
s1
, e
|-- A
>-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
>-> B'
: s2
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ t
t'
, e
|-- t
-+> t'
: Sum_l
A
B
->
e
|-- Pi2_l
(Sum_l
A
B
) t
-+> Pi2_l
(Sum_l
A'
B'
) t'
: lsubst
(Pi1_l
(Sum_l
A
B
) t
) B
.