Library Lambda.Terms
Require
Export
Arith
.
Require
Export
Compare_dec
.
Require
Export
Relations
.
Implicit
Types
i
k
m
n
p
: nat
.
Inductive
sort
: Set
:=
| kind
: sort
| prop
: sort
| set
: sort
.
Implicit
Type
s
: sort
.
Definition
is_prop
s
:= s
= prop
∨ s
= set
.
Lemma
sort_level_ind
:
∀ P
: sort
→ Prop
,
P
kind
→ (∀ s
, is_prop
s
→ P
s
) → ∀ s
, P
s
.
Inductive
term
: Set
:=
| Srt
: sort
→ term
| Ref
: nat
→ term
| Abs
: term
→ term
→ term
| App
: term
→ term
→ term
| Pair
: term
→ term
→ term
→ term
| Prod
: term
→ term
→ term
| Sum
: term
→ term
→ term
| Subset
: term
→ term
→ term
| Pi1
: term
→ term
| Pi2
: term
→ term
.
Implicit
Types
A
B
M
N
T
t
u
v
: term
.
Fixpoint
lift_rec
n
t
{struct
t
} : nat
→ term
:=
fun
k
⇒
match
t
with
| Srt
s
⇒ Srt
s
| Ref
i
⇒
match
le_gt_dec
k
i
with
| left
_
⇒ Ref
(n
+ i
)
| right
_
⇒ Ref
i
end
| Abs
T
M
⇒ Abs
(lift_rec
n
T
k
) (lift_rec
n
M
(S
k
))
| App
u
v
⇒ App
(lift_rec
n
u
k
) (lift_rec
n
v
k
)
| Pair
T
A
B
⇒ Pair
(lift_rec
n
T
k
) (lift_rec
n
A
k
) (lift_rec
n
B
k
)
| Prod
A
B
⇒ Prod
(lift_rec
n
A
k
) (lift_rec
n
B
(S
k
))
| Sum
A
B
⇒ Sum
(lift_rec
n
A
k
) (lift_rec
n
B
(S
k
))
| Subset
A
B
⇒ Subset
(lift_rec
n
A
k
) (lift_rec
n
B
(S
k
))
| Pi1
A
⇒ Pi1
(lift_rec
n
A
k
)
| Pi2
A
⇒ Pi2
(lift_rec
n
A
k
)
end
.
Definition
lift
n
t
:= lift_rec
n
t
0.
Fixpoint
subst_rec
N
M
{struct
M
} : nat
→ term
:=
fun
k
⇒
match
M
with
| Srt
s
⇒ Srt
s
| Ref
i
⇒
match
lt_eq_lt_dec
k
i
with
| inleft
C
⇒
match
C
with
| left
_
⇒ Ref
(pred
i
)
| right
_
⇒ lift
k
N
end
| inright
_
⇒ Ref
i
end
| Abs
A
B
⇒ Abs
(subst_rec
N
A
k
) (subst_rec
N
B
(S
k
))
| App
u
v
⇒ App
(subst_rec
N
u
k
) (subst_rec
N
v
k
)
| Pair
T
A
B
⇒ Pair
(subst_rec
N
T
k
) (subst_rec
N
A
k
) (subst_rec
N
B
k
)
| Prod
T
U
⇒ Prod
(subst_rec
N
T
k
) (subst_rec
N
U
(S
k
))
| Sum
T
U
⇒ Sum
(subst_rec
N
T
k
) (subst_rec
N
U
(S
k
))
| Subset
T
U
⇒ Subset
(subst_rec
N
T
k
) (subst_rec
N
U
(S
k
))
| Pi1
T
⇒ Pi1
(subst_rec
N
T
k
)
| Pi2
T
⇒ Pi2
(subst_rec
N
T
k
)
end
.
Definition
subst
N
M
:= subst_rec
N
M
0.
Inductive
free_db
: nat
→ term
→ Prop
:=
| db_srt
: ∀ n
s
, free_db
n
(Srt
s
)
| db_ref
: ∀ k
n
, k
> n
→ free_db
k
(Ref
n
)
| db_abs
:
∀ k
A
M
, free_db
k
A
→ free_db
(S
k
) M
→ free_db
k
(Abs
A
M
)
| db_app
:
∀ k
u
v
, free_db
k
u
→ free_db
k
v
→ free_db
k
(App
u
v
)
| db_pair
:
∀ k
T
u
v
, free_db
k
T
→ free_db
k
u
→ free_db
k
v
→ free_db
k
(Pair
T
u
v
)
| db_prod
:
∀ k
A
B
, free_db
k
A
→ free_db
(S
k
) B
→ free_db
k
(Prod
A
B
)
| db_sum
:
∀ k
A
B
, free_db
k
A
→ free_db
(S
k
) B
→ free_db
k
(Sum
A
B
)
| db_subset
:
∀ k
A
B
, free_db
k
A
→ free_db
(S
k
) B
→ free_db
k
(Subset
A
B
)
| db_pi1
: ∀ k
A
, free_db
k
A
→ free_db
k
(Pi1
A
)
| db_pi2
: ∀ k
A
, free_db
k
A
→ free_db
k
(Pi2
A
).
Inductive
subt_bind
T
M
: term
→ Prop
:=
| Bsbt_abs
: subt_bind
T
M
(Abs
T
M
)
| Bsbt_prod
: subt_bind
T
M
(Prod
T
M
)
| Bsbt_sum
: subt_bind
T
M
(Sum
T
M
)
| Bsbt_subset
: subt_bind
T
M
(Subset
T
M
).
Inductive
subt_nobind
(m
: term
) : term
→ Prop
:=
| Nbsbt_abs
: ∀ n
: term
, subt_nobind
m
(Abs
m
n
)
| Nbsbt_app_l
: ∀ v
, subt_nobind
m
(App
m
v
)
| Nbsbt_app_r
: ∀ u
, subt_nobind
m
(App
u
m
)
| Nbsbt_pair_T
: ∀ u
v
, subt_nobind
m
(Pair
m
u
v
)
| Nbsbt_pair_l
: ∀ T
v
, subt_nobind
m
(Pair
T
m
v
)
| Nbsbt_pair_r
: ∀ T
u
, subt_nobind
m
(Pair
T
u
m
)
| Nbsbt_prod
: ∀ n
: term
, subt_nobind
m
(Prod
m
n
)
| Nbsbt_sum
: ∀ n
: term
, subt_nobind
m
(Sum
m
n
)
| Nbsbt_subset
: ∀ n
: term
, subt_nobind
m
(Subset
m
n
)
| Nbsbt_pi1
: subt_nobind
m
(Pi1
m
)
| Nbsbt_pi2
: subt_nobind
m
(Pi2
m
).
Inductive
subterm
(m
n
: term
) : Prop
:=
| Sbtrm_bind
: ∀ t
, subt_bind
t
m
n
→ subterm
m
n
| Sbtrm_nobind
: subt_nobind
m
n
→ subterm
m
n
.
Inductive
mem_sort
s
: term
→ Prop
:=
| mem_eq
: mem_sort
s
(Srt
s
)
| mem_prod_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Prod
u
v
)
| mem_prod_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(Prod
u
v
)
| mem_abs_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Abs
u
v
)
| mem_abs_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(Abs
u
v
)
| mem_app_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(App
u
v
)
| mem_app_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(App
u
v
)
| mem_pair_T
: ∀ T
u
v
, mem_sort
s
T
→ mem_sort
s
(Pair
T
u
v
)
| mem_pair_l
: ∀ T
u
v
, mem_sort
s
u
→ mem_sort
s
(Pair
T
u
v
)
| mem_pair_r
: ∀ T
u
v
, mem_sort
s
v
→ mem_sort
s
(Pair
T
u
v
)
| mem_sum_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Sum
u
v
)
| mem_sum_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(Sum
u
v
)
| mem_subset_l
: ∀ u
v
, mem_sort
s
u
→ mem_sort
s
(Subset
u
v
)
| mem_subset_r
: ∀ u
v
, mem_sort
s
v
→ mem_sort
s
(Subset
u
v
)
| mem_pi1
: ∀ u
, mem_sort
s
u
→ mem_sort
s
(Pi1
u
)
| mem_pi2
: ∀ u
, mem_sort
s
u
→ mem_sort
s
(Pi2
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_l
Nbsbt_app_r
Nbsbt_pair_T
Nbsbt_pair_l
Nbsbt_pair_r
Nbsbt_pi1
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_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
mem_pi2
: coc
.