Set: pp::colors
  Set: pp::unicode
  Assumed: N
  Assumed: lt
  Assumed: zero
  Assumed: one
  Assumed: two
  Assumed: three
  Assumed: two_lt_three
  Defined: vector
  Defined: const
  Defined: update
  Defined: select
  Defined: map
Variable one : N
Variable two : N
Variable three : N
Infix 50 < : lt
Axiom two_lt_three : two < three
Definition vector (A : Type) (n : N) : Type := Π (i : N), i < n → A
Definition const {A : Type} (n : N) (d : A) : vector A n := λ (i : N) (H : i < n), d
Definition update {A : Type} {n : N} (v : vector A n) (i : N) (d : A) : vector A n :=
    λ (j : N) (H : j < n), if (j = i) d (v j H)
Definition select {A : Type} {n : N} (v : vector A n) (i : N) (H : i < n) : A := v i H
Definition map {A B C : Type} {n : N} (f : A → B → C) (v1 : vector A n) (v2 : vector B n) : vector C n :=
    λ (i : N) (H : i < n), f (v1 i H) (v2 i H)
select (update (const three ⊥) two ⊤) two two_lt_three : Bool
if (two == two) ⊤ ⊥
update (const three ⊥) two ⊤ : vector Bool three

--------
@select : Π (A : Type) (n : N) (v : vector A n) (i : N), i < n → A

map type ---> 
@map : Π (A B C : Type) (n : N), (A → B → C) → vector A n → vector B n → vector C n

map normal form --> 
λ (A B C : Type)
  (n : N)
  (f : A → B → C)
  (v1 : Π (i : N), i < n → A)
  (v2 : Π (i : N), i < n → B)
  (i : N)
  (H : i < n),
  f (v1 i H) (v2 i H)

update normal form --> 
λ (A : Type) (n : N) (v : Π (i : N), i < n → A) (i : N) (d : A) (j : N) (H : j < n), if (j == i) d (v j H)