Require
Import
Lambda.Utils
.
Require
Import
Lambda.Tactics
.
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.LeftReflexivity
.
Require
Import
Lambda.TPOSR.Thinning
.
Require
Import
Lambda.TPOSR.Substitution
.
Require
Import
Lambda.TPOSR.SubstitutionTPOSR
.
Require
Import
Lambda.TPOSR.CtxConversion
.
Require
Import
Lambda.TPOSR.CtxCoercion
.
Require
Import
Lambda.TPOSR.RightReflexivity
.
Require
Import
Lambda.TPOSR.Basic
.
Require
Import
Lambda.TPOSR.UnicityOfSorting
.
Require
Import
Lambda.TPOSR.Equiv
.
Require
Import
Lambda.TPOSR.TypesDepth
.
Implicit
Types
i
k
m
n
p
: nat
.
Implicit
Type
s
: sort
.
Implicit
Types
A
B
M
N
T
t
u
v
: lterm
.
Implicit
Types
e
f
g
: lenv
.
Lemma
generation_sort
: ∀ e
s
u
T
, e
|-- Srt_l
s
-> u
: T
->
u
= Srt_l
s
∧ T
= Srt_l
kind
.
Lemma
inv_lift_ref
: ∀ t
n
, llift
1 t
= Ref_l
n
-> ∃ n'
, t
= Ref_l
n'
∧ S
n'
= n
.
Lemma
generation_var
: ∀ e
n
X
A
, e
|-- Ref_l
n
-> X
: A
->
X
= Ref_l
n
∧
∃ B
, item_llift
B
e
n
∧
∃ s
, e
|-- A
>-> B
: s
.
Lemma
equiv_sym_sort
: ∀ e
, tposr_wf
e
-> ∀ s
, equiv
e
s
s
.
Lemma
generation_prod_depth
: ∀ e
U
V
X
A
n
, e
|-- Prod_l
U
V
-> X
: A
[n
] ->
exists3
U'
s1
m
, exists3
V'
s2
p
,
e
|-- U
-> U'
: Srt_l
s1
[m
] ∧ m
< n
∧
U
:: e
|-- V
-> V'
: Srt_l
s2
[p
] ∧ p
< n
∧
X
= Prod_l
U'
V'
∧ equiv
e
A
(Srt_l
s2
).
Lemma
generation_prod
: ∀ e
U
V
X
A
, e
|-- Prod_l
U
V
-> X
: A
->
exists2
U'
s1
, exists2
V'
s2
,
e
|-- U
-> U'
: Srt_l
s1
∧
U
:: e
|-- V
-> V'
: Srt_l
s2
∧
X
= Prod_l
U'
V'
∧ equiv
e
A
(Srt_l
s2
).
Lemma
generation_sum_depth
: ∀ e
U
V
X
A
m
, e
|-- Sum_l
U
V
-> X
: A
[m
] ->
exists3
U'
s1
n
,
exists3
V'
s2
p
, ∃ s3
,
e
|-- U
-> U'
: Srt_l
s1
[n
] ∧ n
< m
∧
U
:: e
|-- V
-> V'
: Srt_l
s2
[p
] ∧ p
< m
∧
sum_sort
s1
s2
s3
∧
X
= Sum_l
U'
V'
∧ equiv
e
A
(Srt_l
s3
).
Lemma
generation_sum
: ∀ e
U
V
X
A
, e
|-- Sum_l
U
V
-> X
: A
->
exists2
U'
s1
,
exists2
V'
s2
, ∃ s3
,
e
|-- U
-> U'
: Srt_l
s1
∧
U
:: e
|-- V
-> V'
: Srt_l
s2
∧
sum_sort
s1
s2
s3
∧
X
= Sum_l
U'
V'
∧ equiv
e
A
(Srt_l
s3
).
Lemma
generation_lambda_depth
: ∀ e
T
M
X
A
m
, e
|-- Abs_l
T
M
-> X
: A
[m
] ->
exists3
T'
s1
n
, exists3
M'
s2
p
, exists3
C
C'
q
,
e
|-- T
-> T'
: Srt_l
s1
[n
] ∧ n
< m
∧
T
:: e
|-- M
-> M'
: C
[p
] ∧ p
< m
∧
T
:: e
|-- C
-> C'
: Srt_l
s2
[q
] ∧ q
< m
∧
X
= Abs_l
T'
M'
∧ equiv_sort
e
A
(Prod_l
T
C
) s2
.
Lemma
generation_lambda
: ∀ e
T
M
X
A
, e
|-- Abs_l
T
M
-> X
: A
->
exists2
T'
s1
,
exists2
M'
s2
,
exists2
C
C'
,
e
|-- T
-> T'
: Srt_l
s1
∧
T
:: e
|-- M
-> M'
: C
∧
T
:: e
|-- C
-> C'
: Srt_l
s2
∧
X
= Abs_l
T'
M'
∧ equiv_sort
e
A
(Prod_l
T
C
) s2
.
Lemma
generation_app_depth
: ∀ e
V
W
X
Y
Z
m
, e
|-- App_l
V
W
X
-> Y
: Z
[m
] ->
exists4
U
U'
s1
n
,
exists2
V'
s2
,
exists2
X'
q
,
e
|-- U
-> U'
: Srt_l
s1
[n
] ∧ n
< m
∧
U
:: e
|-- V
>-> V'
: s2
∧
e
|-- X
-> X'
: U
[q
] ∧ q
< m
∧
equiv_sort
e
Z
(lsubst
X
V
) s2
∧
((exists2
W'
r
, e
|-- W
-> W'
: Prod_l
U
V
[r
] ∧ r
< m
∧
Y
= App_l
V'
W'
X'
) ∨
(exists3
T
T'
r
,
W
= Abs_l
U
T
∧
U
:: e
|-- T
-> T'
: V
[r
] ∧ r
< m
∧
Y
= lsubst
X'
T'
)).
Lemma
generation_app
: ∀ e
V
W
X
Y
Z
, e
|-- App_l
V
W
X
-> Y
: Z
->
exists3
U
U'
s1
,
exists2
V'
s2
,
∃ X'
,
e
|-- U
-> U'
: Srt_l
s1
∧
U
:: e
|-- V
>-> V'
: s2
∧
e
|-- X
-> X'
: U
∧
equiv_sort
e
Z
(lsubst
X
V
) s2
∧
((∃ W'
, e
|-- W
-> W'
: Prod_l
U
V
∧
Y
= App_l
V'
W'
X'
) ∨
(exists2
T
T'
,
W
= Abs_l
U
T
∧
U
:: e
|-- T
-> T'
: V
∧ Y
= lsubst
X'
T'
)).
Lemma
generation_app2
: ∀ e
V
W
X
Y
Z
, e
|-- App_l
V
W
X
-> Y
: Z
->
exists3
U
U'
s1
,
exists2
V'
s2
,
exists2
X'
W'
,
e
|-- U
-> U'
: Srt_l
s1
∧
U
:: e
|-- V
>-> V'
: s2
∧
e
|-- W
-> W'
: Prod_l
U
V
∧
e
|-- X
-> X'
: U
∧
equiv_sort
e
Z
(lsubst
X
V
) s2
∧
((Y
= App_l
V'
W'
X'
) ∨
(exists2
T
T'
,
W
= Abs_l
U
T
∧
U
:: e
|-- T
-> T'
: V
∧ Y
= lsubst
X'
T'
)).
Lemma
generation_pair_depth
: ∀ e
T
M
N
X
C
m
, e
|-- Pair_l
T
M
N
-> X
: C
[m
] ->
exists4
A
A'
s1
n
,
exists4
B
B'
s2
p
,
∃ s3
,
T
= Sum_l
A
B
∧
e
|-- A
-> A'
: Srt_l
s1
[n
] ∧ n
< m
∧
A
:: e
|-- B
-> B'
: Srt_l
s2
[p
] ∧ p
< m
∧
sum_sort
s1
s2
s3
∧
exists2
M'
q
, e
|-- M
-> M'
: A
[q
] ∧ q
< m
∧
exists2
N'
r
, e
|-- N
-> N'
: lsubst
M
B
[r
] ∧ r
< m
∧
X
= Pair_l
(Sum_l
A'
B'
) M'
N'
∧ equiv_sort
e
C
(Sum_l
A
B
) s3
.
Lemma
generation_pair
: ∀ e
T
M
N
X
C
, e
|-- Pair_l
T
M
N
-> X
: C
->
exists3
A
A'
s1
,
exists3
B
B'
s2
,
∃ s3
,
T
= Sum_l
A
B
∧
e
|-- A
-> A'
: Srt_l
s1
∧
A
:: e
|-- B
-> B'
: Srt_l
s2
∧
sum_sort
s1
s2
s3
∧
∃ M'
, e
|-- M
-> M'
: A
∧
∃ N'
, e
|-- N
-> N'
: lsubst
M
B
∧
X
= Pair_l
(Sum_l
A'
B'
) M'
N'
∧ equiv_sort
e
C
(Sum_l
A
B
) s3
.
Require
Import
Lambda.TPOSR.MaxLemmas
.
Lemma
generation_pi1_depth
: ∀ e
T
M
X
C
m
, e
|-- Pi1_l
T
M
-> X
: C
[m
] ->
exists2
A
B
, T
= Sum_l
A
B
∧ equiv
e
C
A
∧
exists4
A'
B'
s1
s2
,
e
|-- A
>-> A'
: s1
∧ A
:: e
|-- B
>-> B'
: s2
∧
((exists2
M'
n
, e
|-- M
-> M'
: Sum_l
A
B
[n
] ∧
X
= Pi1_l
(Sum_l
A'
B'
) M'
) ∨
(exists4
u
u'
v
v'
,
M
= Pair_l
(Sum_l
A'
B'
) u
v
∧
exists2
A''
n
, e
|-- A'
-> A''
: s1
[n
] ∧ n
< m
∧
exists2
B''
p
, A'
:: e
|-- B'
-> B''
: s2
[p
] ∧ p
< m
∧
∃ q
, e
|-- M
-> Pair_l
(Sum_l
A''
B''
) u'
v'
: Sum_l
A'
B'
[q
] ∧ q
< m
∧
X
= u'
)).
Lemma
generation_pi1
:
∀ e
T
M
X
C
, e
|-- Pi1_l
T
M
-> X
: C
->
exists2
A
B
, T
= Sum_l
A
B
∧ equiv
e
C
A
∧
exists4
A'
B'
s1
s2
,
e
|-- A
>-> A'
: s1
∧ A
:: e
|-- B
>-> B'
: s2
∧
((∃ M'
, e
|-- M
-> M'
: Sum_l
A
B
∧
X
= Pi1_l
(Sum_l
A'
B'
) M'
) ∨
(exists4
u
u'
v
v'
,
M
= Pair_l
(Sum_l
A'
B'
) u
v
∧
∃ A''
, e
|-- A'
-> A''
: s1
∧
∃ B''
, A'
:: e
|-- B'
-> B''
: s2
∧
e
|-- M
-> Pair_l
(Sum_l
A''
B''
) u'
v'
: Sum_l
A'
B'
∧
X
= u'
)).
Lemma
generation_pi2_depth
: ∀ e
T
M
X
C
m
, e
|-- Pi2_l
T
M
-> X
: C
[m
] ->
exists2
A
B
, T
= Sum_l
A
B
∧ equiv
e
C
(lsubst
(Pi1_l
T
M
) B
) ∧
exists4
A'
B'
s1
s2
,
e
|-- A
>-> A'
: s1
∧ A
:: e
|-- B
>-> B'
: s2
∧
((exists2
M'
n
, e
|-- M
-> M'
: Sum_l
A
B
[n
] ∧
X
= Pi2_l
(Sum_l
A'
B'
) M'
) ∨
(exists4
u
u'
v
v'
,
M
= Pair_l
(Sum_l
A'
B'
) u
v
∧
exists2
A''
n
, e
|-- A'
-> A''
: s1
[n
] ∧ n
< m
∧
exists2
B''
p
, A'
:: e
|-- B'
-> B''
: s2
[p
] ∧ p
< m
∧
∃ q
, e
|-- M
-> Pair_l
(Sum_l
A''
B''
) u'
v'
: Sum_l
A'
B'
[q
] ∧ q
< m
∧
X
= v'
)).
Lemma
generation_pi2
:
∀ e
T
M
X
C
, e
|-- Pi2_l
T
M
-> X
: C
->
exists2
A
B
, T
= Sum_l
A
B
∧ equiv
e
C
(lsubst
(Pi1_l
T
M
) B
) ∧
exists4
A'
B'
s1
s2
,
e
|-- A
>-> A'
: s1
∧ A
:: e
|-- B
>-> B'
: s2
∧
((∃ M'
, e
|-- M
-> M'
: Sum_l
A
B
∧
X
= Pi2_l
(Sum_l
A'
B'
) M'
) ∨
(exists4
u
u'
v
v'
,
M
= Pair_l
(Sum_l
A'
B'
) u
v
∧
∃ A''
, e
|-- A'
-> A''
: s1
∧
∃ B''
, A'
:: e
|-- B'
-> B''
: s2
∧
e
|-- M
-> Pair_l
(Sum_l
A''
B''
) u'
v'
: Sum_l
A'
B'
∧
X
= v'
)).
Lemma
generation_subset_depth
: ∀ e
U
V
X
A
m
, e
|-- Subset_l
U
V
-> X
: A
[m
] ->
exists2
U'
n
,
exists2
V'
p
,
e
|-- U
-> U'
: Srt_l
set
[n
] ∧ n
< m
∧
U
:: e
|-- V
-> V'
: Srt_l
prop
[p
] ∧ p
< m
∧
X
= Subset_l
U'
V'
∧ equiv_sort
e
A
(Srt_l
set
) kind
.
Lemma
generation_subset
: ∀ e
U
V
X
A
, e
|-- Subset_l
U
V
-> X
: A
->
exists2
U'
V'
,
e
|-- U
-> U'
: Srt_l
set
∧
U
:: e
|-- V
-> V'
: Srt_l
prop
∧
X
= Subset_l
U'
V'
∧ equiv_sort
e
A
(Srt_l
set
) kind
.