Library Coq.Vectors.VectorSpec
Proofs of specification for functions defined over Vector
Author: Pierre Boutillier Institution: PPS, INRIA 12/2010
Require
Fin
.
Require
Import
VectorDef
.
Import
VectorNotations
.
Definition
cons_inj
A
a1
a2
n
(
v1
v2
:
t
A
n
)
(
eq
:
a1
::
v1
=
a2
::
v2
) :
a1
=
a2
/\
v1
=
v2
:=
match
eq
in
_
=
x
return
caseS
_
(
fun
a2´
_
v2´
=>
fun
v1´
=>
a1
=
a2´
/\
v1´
=
v2´
)
x
v1
with
|
eq_refl
=>
conj
eq_refl
eq_refl
end
.
Lemmas are done for functions that use
Fin.t
but thanks to
Peano_dec.le_unique
, all is true for the one that use
lt
Lemma
eq_nth_iff
A
n
(
v1
v2
:
t
A
n
):
(
forall
p1
p2
,
p1
=
p2
->
v1
[@
p1
]
=
v2
[@
p2
]
)
<->
v1
=
v2
.
Lemma
nth_order_last
A
:
forall
n
(
v
:
t
A
(
S
n
)) (
H
:
n
<
S
n
),
nth_order
v
H
=
last
v
.
Lemma
shiftin_nth
A
a
n
(
v
:
t
A
n
)
k1
k2
(
eq
:
k1
=
k2
):
nth
(
shiftin
a
v
) (
Fin.L_R
1
k1
)
=
nth
v
k2
.
Lemma
shiftin_last
A
a
n
(
v
:
t
A
n
):
last
(
shiftin
a
v
)
=
a
.
Lemma
shiftrepeat_nth
A
:
forall
n
k
(
v
:
t
A
(
S
n
)),
nth
(
shiftrepeat
v
) (
Fin.L_R
1
k
)
=
nth
v
k
.
Lemma
shiftrepeat_last
A
:
forall
n
(
v
:
t
A
(
S
n
)),
last
(
shiftrepeat
v
)
=
last
v
.
Lemma
const_nth
A
(
a
:
A
)
n
(
p
:
Fin.t
n
):
(
const
a
n
)[@
p
]
=
a
.
Lemma
nth_map
{
A
B
} (
f
:
A
->
B
) {
n
}
v
(
p1
p2
:
Fin.t
n
) (
eq
:
p1
=
p2
):
(
map
f
v
)
[@
p1
]
=
f
(
v
[@
p2
]
).
Lemma
nth_map2
{
A
B
C
} (
f
:
A
->
B
->
C
) {
n
}
v
w
(
p1
p2
p3
:
Fin.t
n
):
p1
=
p2
->
p2
=
p3
->
(
map2
f
v
w
)
[@
p1
]
=
f
(
v
[@
p2
]
) (
w
[@
p3
]
).
Lemma
fold_left_right_assoc_eq
{
A
B
} {
f
:
A
->
B
->
A
}
(
assoc
:
forall
a
b
c
,
f
(
f
a
b
)
c
=
f
(
f
a
c
)
b
)
{
n
} (
v
:
t
B
n
):
forall
a
,
fold_left
f
a
v
=
fold_right
(
fun
x
y
=>
f
y
x
)
v
a
.
Lemma
to_list_of_list_opp
{
A
} (
l
:
list
A
):
to_list
(
of_list
l
)
=
l
.