Vectors are another datatype parameterised
over nat but this time vect n is the
collection of lists of length n. With this datatype
we can define the (family of) total functions ``nth''
for any natural number n which take an element of
the finite set
and a list of length
n and returns the appropriate element of the list.
In this file we prove that the ``nth'' function defined
here is equivalent (modulo the appropriate conversions)
to the ``nth'' function in the list library.
** Module lib_vectors Imports lib_finite lib_list_length $vect : (Type)->nat->Type(vect) $vnil : {A:Type}vect A zero $vcons : {A:Type}A->{n|nat}(vect A n)->vect A (suc n) $vect_elim : {A:Type}{C_vect:{n|nat}(vect A n)->Type}(C_vect (vnil A))-> ({a:A}{n|nat}{v:vect A n}(C_vect v)->C_vect (vcons A a v))->{n|nat} {z:vect A n}C_vect z [[A:Type][C_vect:{n|nat}(vect A n)->Type][f_vnil:C_vect (vnil A)] [f_vcons:{a:A}{n|nat}{v:vect A n}(C_vect v)->C_vect (vcons A a v)][a:A] [n|nat][v:vect A n] vect_elim A C_vect f_vnil f_vcons (vnil A) ==> f_vnil || vect_elim A C_vect f_vnil f_vcons (vcons A a v) ==> f_vcons a v (vect_elim A C_vect f_vnil f_vcons v)] vect_elim_ne = ... : {A:Type}{C:{n|nat}(vect A (suc n))->Type} ({a:A}{n|nat}{v:vect A n}C (vcons A a v))->{n|nat}{v:vect A (suc n)} C v vect_elim'_lemma = ... : {A:Type}{n:nat}{m:vect A (suc n)}{P:(vect A (suc n))->Type} ({a:A}{m'6:vect A n}P (vcons A a m'6))->P m vect_rec = ... : {A:Type}{C|Type}C->(A->{n|nat}(vect A n)->C->C)->{n|nat}(vect A n)-> C vect_iter = ... : {A:Type}{C|Type}C->(nat->A->C->C)->{n|nat}(vect A n)->C vect_ind = ... : {A:Type}{P:{n:nat}(vect A n)->Prop}(P (vnil A))-> ({a:A}{n|nat}{v:vect A n}(P v)->P (vcons A a v))->{n|nat} {z:vect A n}P z vnil_lemma = ... : {A:Type}{n:nat}{v:vect A n} nat_elim|([x:nat](vect A x)->Prop) ([v'4:vect A zero]Eq v'4 (vnil A)) ([x:nat][_:(vect A x)->Prop][_:vect A (suc x)]trueProp) n v vect_zero_eq_vnil = ... : {A:Type}{v:vect A zero}Eq v (vnil A) vect_head = ... : {A:Type}{n|nat}(vect A (suc n))->A vect_tail = ... : {A:Type}{n|nat}(vect A (suc n))->vect A n cons_inj_lemma1 = ... : {A:Type}{a,b:A}{n:nat}{v:vect A n}(Eq (vcons A a v) (vcons A b v))-> Eq a b cons_inj_lemma2 = ... : {A:Type}{a:A}{n:nat}{v,w:vect A n}(Eq (vcons A a v) (vcons A a w))-> Eq v w vect_head_cons_tail = ... : {A:Type}{n|nat}{v:vect A (suc n)} Eq (vcons A (vect_head A v) (vect_tail A v)) v vect_nth = ... : {A:Type}{n|nat}(fin n)->(vect A n)->A vect_update = ... : {A:Type}{n|nat}(fin n)->(vect A n)->A->vect A n vect_character = ... : {A:Type} [vect_character_rhs=nat_elim ([n:nat](vect A n)->vect A n) ([_:vect A zero]vnil A) ([x1:nat][_:(vect A x1)->vect A x1] [v:vect A (suc x1)] vcons A (vect_head A v) (vect_tail A v))] {n|nat}{v:vect A n}Eq v (vect_character_rhs n v) vect_zip = ... : {A:Type}{n:nat}(A->A->A)->(vect A n)->(vect A n)->vect A n vector_to_list = ... : {A:Type}{n|nat}(vect A n)->list A vector_to_list_resp_cons = ... : {A:Type}{n|nat}{v:vect A n}{a:A} Eq (cons|A a (vector_to_list A v)) (vector_to_list A (vcons A a v)) vect_nth_equiv_nth = ... : {A:Type}{n|nat}{x:fin n}{v:vect A n}{a:A} Eq (vect_nth A x v) (nth (fin_to_nat x) (vector_to_list A v) a)