Library Lambda.TPOSR.Terms
Require
Export
Arith
.
Require
Export
Compare_dec
.
Require
Export
Relations
.
Require
Export
Lambda.Terms
.
Implicit
Types
i
k
m
n
p
: nat
.
Implicit
Type
s
: sort
.
Inductive
lterm
: Set
:=
| Srt_l
: sort
→ lterm
| Ref_l
: nat
→ lterm
| Abs_l
: lterm
→ lterm
→ lterm
| App_l
: lterm
→ lterm
→ lterm
→ lterm
| Pair_l
: lterm
→ lterm
→ lterm
→ lterm
| Prod_l
: lterm
→ lterm
→ lterm
| Sum_l
: lterm
→ lterm
→ lterm
| Subset_l
: lterm
→ lterm
→ lterm
| Pi1_l
: lterm
→ lterm
→ lterm
| Pi2_l
: lterm
→ lterm
→ lterm
.
Implicit
Types
A
B
M
N
T
t
u
v
: lterm
.
Fixpoint
llift_rec
n
t
{struct
t
} : nat
→ lterm
:=
fun
k
⇒
match
t
with
| Srt_l
s
⇒ Srt_l
s
| Ref_l
i
⇒
match
le_gt_dec
k
i
with
| left
_
⇒ Ref_l
(n
+ i
)
| right
_
⇒ Ref_l
i
end
| Abs_l
T
M
⇒ Abs_l
(llift_rec
n
T
k
) (llift_rec
n
M
(S
k
))
| App_l
T
u
v
⇒ App_l
(llift_rec
n
T
(S
k
)) (llift_rec
n
u
k
) (llift_rec
n
v
k
)
| Pair_l
T
A
B
⇒ Pair_l
(llift_rec
n
T
k
) (llift_rec
n
A
k
) (llift_rec
n
B
k
)
| Prod_l
A
B
⇒ Prod_l
(llift_rec
n
A
k
) (llift_rec
n
B
(S
k
))
| Sum_l
A
B
⇒ Sum_l
(llift_rec
n
A
k
) (llift_rec
n
B
(S
k
))
| Subset_l
A
B
⇒ Subset_l
(llift_rec
n
A
k
) (llift_rec
n
B
(S
k
))
| Pi1_l
T
A
⇒ Pi1_l
(llift_rec
n
T
k
) (llift_rec
n
A
k
)
| Pi2_l
T
A
⇒ Pi2_l
(llift_rec
n
T
k
) (llift_rec
n
A
k
)
end
.
Definition
llift
n
t
:= llift_rec
n
t
0.
Fixpoint
lsubst_rec
N
M
{struct
M
} : nat
→ lterm
:=
fun
k
⇒
match
M
with
| Srt_l
s
⇒ Srt_l
s
| Ref_l
i
⇒
match
lt_eq_lt_dec
k
i
with
| inleft
C
⇒
match
C
with
| left
_
⇒ Ref_l
(pred
i
)
| right
_
⇒ llift
k
N
end
| inright
_
⇒ Ref_l
i
end
| Abs_l
A
B
⇒ Abs_l
(lsubst_rec
N
A
k
) (lsubst_rec
N
B
(S
k
))
| App_l
T
u
v
⇒ App_l
(lsubst_rec
N
T
(S
k
)) (lsubst_rec
N
u
k
) (lsubst_rec
N
v
k
)
| Pair_l
T
A
B
⇒ Pair_l
(lsubst_rec
N
T
k
) (lsubst_rec
N
A
k
) (lsubst_rec
N
B
k
)
| Prod_l
T
U
⇒ Prod_l
(lsubst_rec
N
T
k
) (lsubst_rec
N
U
(S
k
))
| Sum_l
T
U
⇒ Sum_l
(lsubst_rec
N
T
k
) (lsubst_rec
N
U
(S
k
))
| Subset_l
T
U
⇒ Subset_l
(lsubst_rec
N
T
k
) (lsubst_rec
N
U
(S
k
))
| Pi1_l
T
A
⇒ Pi1_l
(lsubst_rec
N
T
k
) (lsubst_rec
N
A
k
)
| Pi2_l
T
A
⇒ Pi2_l
(lsubst_rec
N
T
k
) (lsubst_rec
N
A
k
)
end
.
Definition
lsubst
N
M
:= lsubst_rec
N
M
0.
Inductive
free_db
: nat
→ lterm
→ Prop
:=
| db_srt
: ∀ n
s
, free_db
n
(Srt_l
s
)
| db_ref
: ∀ k
n
, k
> n
→ free_db
k
(Ref_l
n
)
| db_abs
:
∀ k
A
M
, free_db
k
A
→ free_db
(S
k
) M
→ free_db
k
(Abs_l
A
M
)
| db_app
:
∀ k
T
u
v
, free_db
(S
k
) T
→ free_db
k
u
→ free_db
k
v
→ free_db
k
(App_l
T
u
v
)
| db_pair
:
∀ k
T
u
v
, free_db
k
T
→ free_db
k
u
→ free_db
k
v
→ free_db
k
(Pair_l
T
u
v
)
| db_prod
:
∀ k
A
B
, free_db
k
A
→ free_db
(S
k
) B
→ free_db
k
(Prod_l
A
B
)
| db_sum
:
∀ k
A
B
, free_db
k
A
→ free_db
(S
k
) B
→ free_db
k
(Sum_l
A
B
)
| db_subset
:
∀ k
A
B
, free_db
k
A
→ free_db
(S
k
) B
→ free_db
k
(Subset_l
A
B
)
| db_pi1
: ∀ k
T
A
, free_db
k
T
→ free_db
k
A
→ free_db
k
(Pi1_l
T
A
)
| db_pi2
: ∀ k
T
A
, free_db
k
T
→ free_db
k
A
→ free_db
k
(Pi2_l
T
A
).
Inductive
subt_bind
T
M
: lterm
→ Prop
:=
| Bsbt_abs
: subt_bind
T
M
(Abs_l
T
M
)
| Bsbt_prod
: subt_bind
T
M
(Prod_l
T
M
)
| Bsbt_sum
: subt_bind
T
M
(Sum_l
T
M
)
| Bsbt_subset
: subt_bind
T
M
(Subset_l
T
M
).
Inductive
subt_nobind
(m
: lterm
) : lterm
→ Prop
:=
| Nbsbt_abs
: ∀ n
: lterm
, subt_nobind
m
(Abs_l
m
n
)
| Nbsbt_app_T
: ∀ u
v
, subt_nobind
m
(App_l
m
u
v
)
| Nbsbt_app_l
: ∀ T
v
, subt_nobind
m
(App_l
T
m
v
)
| Nbsbt_app_r
: ∀ T
u
, subt_nobind
m
(App_l
T
u
m
)
| Nbsbt_pair_T
: ∀ u
v
, subt_nobind
m
(Pair_l
m
u
v
)
| Nbsbt_pair_l
: ∀ T
v
, subt_nobind
m
(Pair_l
T
m
v
)
| Nbsbt_pair_r
: ∀ T
u
, subt_nobind
m
(Pair_l
T
u
m
)
| Nbsbt_prod
: ∀ n
: lterm
, subt_nobind
m
(Prod_l
m
n
)
| Nbsbt_sum
: ∀ n
: lterm
, subt_nobind
m
(Sum_l
m
n
)
| Nbsbt_subset
: ∀ n
: lterm
, subt_nobind
m
(Subset_l
m
n
)
| Nbsbt_pi1_T
: ∀ v
, subt_nobind
m
(Pi1_l
m
v
)
| Nbsbt_pi1
: ∀ T
, subt_nobind
m
(Pi1_l
T
m
)
| Nbsbt_pi2_T
: ∀ v
, subt_nobind
m
(Pi2_l
m
v
)
| Nbsbt_pi2
: ∀ T
, subt_nobind
m
(Pi2_l
T
m
).
Inductive
sublterm
(m
n
: lterm
) : Prop
:=
| Sbtrm_bind
: ∀ t
, subt_bind
t
m
n
→ sublterm
m
n
| Sbtrm_nobind
: subt_nobind
m
n
→ sublterm
m
n
.
Inductive
mem_sort
s
: lterm
→ Prop
:=
| mem_eq
: mem_sort
s
(Srt_l
s
)
| mem_prod_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Prod_l
u
v
)
| mem_prod_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(Prod_l
u
v
)
| mem_abs_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Abs_l
u
v
)
| mem_abs_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(Abs_l
u
v
)
| mem_app_T
: ∀ T
u
v
, mem_sort
s
T
→ mem_sort
s
(App_l
T
u
v
)
| mem_app_l
: ∀ T
u
v
, mem_sort
s
u
→ mem_sort
s
(App_l
T
u
v
)
| mem_app_r
: ∀ T
u
v
, mem_sort
s
v
→ mem_sort
s
(App_l
T
u
v
)
| mem_pair_T
: ∀ T
u
v
, mem_sort
s
T
→ mem_sort
s
(Pair_l
T
u
v
)
| mem_pair_l
: ∀ T
u
v
, mem_sort
s
u
→ mem_sort
s
(Pair_l
T
u
v
)
| mem_pair_r
: ∀ T
u
v
, mem_sort
s
v
→ mem_sort
s
(Pair_l
T
u
v
)
| mem_sum_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Sum_l
u
v
)
| mem_sum_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(Sum_l
u
v
)
| mem_subset_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Subset_l
u
v
)
| mem_subset_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(Subset_l
u
v
)
| mem_pi1_T
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Pi1_l
u
v
)
| mem_pi1
: ∀ T
u
, mem_sort
s
u
→ mem_sort
s
(Pi1_l
T
u
)
| mem_pi2_T
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Pi2_l
u
v
)
| mem_pi2
: ∀ T
u
, mem_sort
s
u
→ mem_sort
s
(Pi2_l
T
u
).
Hint
Resolve
db_srt
db_ref
db_abs
db_app
db_pair
db_prod
db_sum
db_subset
db_pi1
db_pi2
: coc
.
Hint
Resolve
Bsbt_abs
Bsbt_prod
Bsbt_sum
Bsbt_subset
: coc
.
Hint
Resolve
Nbsbt_abs
Nbsbt_app_T
Nbsbt_app_l
Nbsbt_app_r
Nbsbt_pair_T
Nbsbt_pair_l
Nbsbt_pair_r
Nbsbt_pi1_T
Nbsbt_pi1
Nbsbt_pi2_T
Nbsbt_pi2
Nbsbt_prod
Nbsbt_sum
Nbsbt_subset
: coc
.
Hint
Resolve
Sbtrm_nobind
: coc
.
Hint
Resolve
mem_eq
mem_prod_l
mem_prod_r
mem_abs_l
mem_abs_r
mem_app_T
mem_app_l
mem_app_r
mem_pair_T
mem_pair_l
mem_pair_r
: coc
.
Hint
Resolve
mem_sum_l
mem_sum_r
mem_subset_l
mem_subset_r
mem_pi1_T
mem_pi1
mem_pi2_T
mem_pi2
: coc
.