Library Lambda.TPOSR.Types
Require
Import
Lambda.Terms
.
Require
Import
Lambda.Reduction
.
Require
Import
Lambda.Conv
.
Require
Import
Lambda.LiftSubst
.
Require
Import
Lambda.Env
.
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
.
Implicit
Types
s
: sort
.
Reserved Notation
"G |-- T -> U : s" (at
level
70, T
, U
, s
at
next
level
).
Definition
sum_sort
s1
s2
s3
:=
(s1
= set
∧ s2
= set
∧ s3
= set
) ∨
(s1
= prop
∧ s2
= prop
∧ s3
= prop
).
Coercion
Srt_l
: sort
>-> lterm
.
Reserved Notation
"G |-- T ~= U : s" (at
level
70, T
, U
, s
at
next
level
).
Reserved Notation
"G |-- T >-> U : s" (at
level
70, T
, U
, s
at
next
level
).
Inductive
tposr_wf
: lenv
-> Prop
:=
| wf_nil
: tposr_wf
nil
| wf_cons
: ∀ G
A
s
, G
|-- A
-> A
: s
-> tposr_wf
(A
:: G
)
with
tposr
: lenv
-> lterm
-> lterm
-> lterm
-> Prop
:=
| tposr_var
: ∀ e
, tposr_wf
e
->
∀ n
T
, item_llift
T
e
n
-> e
|-- (Ref_l
n
) -> (Ref_l
n
) : T
| tposr_set
: ∀ e
, tposr_wf
e
-> e
|-- set
-> set
: kind
| tposr_prop
: ∀ e
, tposr_wf
e
-> e
|-- prop
-> prop
: kind
| tposr_prod
: ∀ e
A
A'
s1
, e
|-- A
-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: s2
->
e
|-- Prod_l
A
B
-> Prod_l
A'
B'
: s2
| tposr_abs
: ∀ e
A
A'
s1
, e
|-- A
-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: s2
->
∀ M
M'
, (A
:: e
) |-- M
-> M'
: B
->
e
|-- Abs_l
A
M
-> Abs_l
A'
M'
: (Prod_l
A
B
)
| tposr_app
: ∀ e
A
A'
s1
, e
|-- A
-> A'
: 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
| tposr_beta
: ∀ e
A
A'
s1
, e
|-- A
-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: s2
->
∀ M
M'
, (A
:: e
) |-- M
-> M'
: B
->
∀ N
N'
, e
|-- N
-> N'
: A
->
e
|-- App_l
B
(Abs_l
A
M
) N
-> lsubst
N'
M'
: lsubst
N
B
| tposr_conv
: ∀ e
M
N
A
, e
|-- M
-> N
: A
->
∀ B
s
, e
|-- A
>-> B
: s
->
e
|-- M
-> N
: B
| tposr_subset
: ∀ e
A
A'
, e
|-- A
-> A'
: set
->
∀ B
B'
, (A
:: e
) |-- B
-> B'
: prop
->
e
|-- Subset_l
A
B
-> Subset_l
A'
B'
: set
| tposr_sum
: ∀ e
A
A'
s1
, e
|-- A
-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: s2
->
∀ s3
, sum_sort
s1
s2
s3
->
e
|-- Sum_l
A
B
-> Sum_l
A'
B'
: s3
| tposr_pair
: ∀ e
A
A'
s1
, e
|-- A
-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: 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
| tposr_pi1
: ∀ e
A
A'
s1
, 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
| tposr_pi1_red
: ∀ e
A
A'
s1
, e
|-- A
-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: s2
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ u
u'
v
v'
, e
|-- Pair_l
(Sum_l
A
B
) u
v
-> Pair_l
(Sum_l
A'
B'
) u'
v'
: Sum_l
A
B
->
∀ A''
, e
|-- A''
-> A''
: s1
-> e
|-- A''
>-> A
: s1
->
∀ B''
, A''
:: e
|-- B''
>-> B
: s2
->
e
|-- Sum_l
A''
B''
>-> Sum_l
A
B
: s3
->
e
|-- Pi1_l
(Sum_l
A''
B''
) (Pair_l
(Sum_l
A
B
) u
v
) -> u'
: A''
| tposr_pi2
: ∀ e
A
A'
s1
, 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
| tposr_pi2_red
: ∀ e
A
A'
s1
, e
|-- A
-> A'
: s1
->
∀ B
B'
s2
, (A
:: e
) |-- B
-> B'
: s2
->
∀ s3
, sum_sort
s1
s2
s3
->
∀ u
u'
v
v'
,
e
|-- Pair_l
(Sum_l
A
B
) u
v
-> Pair_l
(Sum_l
A'
B'
) u'
v'
: Sum_l
A
B
->
∀ A''
, e
|-- A''
-> A''
: s1
-> e
|-- A''
>-> A
: s1
->
∀ B''
, A''
:: e
|-- B''
>-> B
: s2
->
e
|-- Sum_l
A''
B''
>-> Sum_l
A
B
: s3
->
e
|-- Pi2_l
(Sum_l
A''
B''
) (Pair_l
(Sum_l
A
B
) u
v
) -> v'
: lsubst
(Pi1_l
(Sum_l
A''
B''
) (Pair_l
(Sum_l
A
B
) u
v
)) B''
where
"G |-- T -> U : s" := (tposr
G
T
U
s
)
with
tposr_eq
: lenv
-> lterm
-> lterm
-> sort
-> Prop
:=
| tposr_eq_tposr
: ∀ e
X
Y
s
, e
|-- X
-> Y
: s
-> e
|-- X
~= Y
: s
| tposr_eq_sym
: ∀ e
X
Y
s
, e
|-- X
~= Y
: s
-> e
|-- Y
~= X
: s
| tposr_eq_trans
: ∀ e
W
X
Y
s
, e
|-- W
~= X
: s
-> e
|-- X
~= Y
: s
-> e
|-- W
~= Y
: s
where
"G |-- T ~= U : s" := (tposr_eq
G
T
U
s
)
with
tposr_coerce
: lenv
-> lterm
-> lterm
-> sort
-> Prop
:=
| tposr_coerce_conv
: ∀ e
A
B
s
, e
|-- A
~= B
: s
-> e
|-- A
>-> B
: s
| tposr_coerce_prod
: ∀ e
A
B
A'
B'
,
∀ s
, e
|-- A'
>-> A
: s
->
e
|-- A'
-> A'
: s
-> e
|-- A
-> A
: s
->
∀ s'
, (A'
:: e
) |-- B
>-> B'
: s'
->
A
:: e
|-- B
-> B
: s'
-> A'
:: e
|-- B'
-> B'
: s'
->
e
|-- (Prod_l
A
B
) >-> (Prod_l
A'
B'
) : s'
| tposr_coerce_sum
: ∀ e
A
B
A'
B'
,
∀ s
, e
|-- A
>-> A'
: s
->
e
|-- A'
-> A'
: s
-> e
|-- A
-> A
: s
->
∀ s'
, (A
:: e
) |-- B
>-> B'
: s'
->
A
:: e
|-- B
-> B
: s'
-> A'
:: e
|-- B'
-> B'
: s'
->
∀ s''
, sum_sort
s
s'
s''
->
e
|-- (Sum_l
A
B
) >-> (Sum_l
A'
B'
) : s''
| tposr_coerce_sub_l
: ∀ e
U
P
U'
,
e
|-- U
>-> U'
: set
->
e
|-- U
-> U
: set
-> e
|-- U'
-> U'
: set
->
U
:: e
|-- P
-> P
: prop
->
e
|-- Subset_l
U
P
>-> U'
: set
| tposr_coerce_sub_r
: ∀ e
U
U'
P
,
e
|-- U
>-> U'
: set
->
e
|-- U
-> U
: set
-> e
|-- U'
-> U'
: set
->
U'
:: e
|-- P
-> P
: prop
->
e
|-- U
>-> (Subset_l
U'
P
) : set
| tposr_coerce_sym
: ∀ e
U
V
s
, e
|-- U
>-> V
: s
-> e
|-- V
>-> U
: s
| tposr_coerce_trans
: ∀ e
A
B
C
s
,
e
|-- A
>-> B
: s
-> e
|-- B
>-> C
: s
-> e
|-- A
>-> C
: s
where
"G |-- T >-> U : s" := (tposr_coerce
G
T
U
s
).
Scheme
ind_tposr
:= Induction
for
tposr
Sort
Prop
.
Scheme
tposr_wf_mutind
:= Induction
for
tposr
Sort
Prop
with
wf_tposr_mutind
:= Induction
for
tposr_wf
Sort
Prop
.
Scheme
tposr_mutind
:= Induction
for
tposr
Sort
Prop
with
wf_mutind
:= Induction
for
tposr_wf
Sort
Prop
with
eq_mutind
:= Induction
for
tposr_eq
Sort
Prop
with
coerce_mutind
:= Induction
for
tposr_coerce
Sort
Prop
.
Lemma
wf_tposr
: ∀ e
M
N
T
, e
|-- M
-> N
: T
-> tposr_wf
e
.
Hint
Resolve
wf_tposr
: ecoc
.
Reserved Notation
"G |-- M -+> N : B" (at
level
70, M
, N
, B
at
next
level
).
Inductive
tposrp
: lenv
-> lterm
-> lterm
-> lterm
-> Prop
:=
| tposrp_tposr
: ∀ e
X
Y
Z
, e
|-- X
-> Y
: Z
-> e
|-- X
-+> Y
: Z
| tposrp_trans
: ∀ e
W
X
Y
Z
, e
|-- W
-+> X
: Z
-> e
|-- X
-+> Y
: Z
-> e
|-- W
-+> Y
: Z
where
"G |-- M -+> N : B" := (tposrp
G
M
N
B
).
Hint
Resolve
tposrp_tposr
: coc
.
Hint
Resolve
tposrp_trans
: ecoc
.
Definition
tposr_term
G
M
A
:= ∃ M'
, G
|-- M
-> M'
: A
.
Lemma
tposr_tposr_term
: ∀ G
M
M'
A
, tposr
G
M
M'
A
-> tposr_term
G
M
A
.
Hint
Resolve
tposr_tposr_term
: ecoc
.