Definition Array := list (D * R).Fixpoint arrayLookup(ls : list (D * R)) d :=
    match ls with
      | nil => None
      | (d', r') :: ls' =>
        if (eqb d d') 
          then Some r' 
          else (arrayLookup ls' d)
    end.Definition arrayEquiv(arr1 arr2 : Array) :=
    forall d, 
      (arrayLookup arr1 d) = (arrayLookup arr2 d).Definition arrayLookupDef(ls : list (D * R)) d def :=
    match arrayLookup ls d with
        | None => def
        | Some r => r
    end.Definition arrayUpdate (arr_opt : option Array) d r_opt :=
    let arr := match arr_opt with
                 | None => nil
                 | Some arr => arr
               end in
    match r_opt with
        | None => arr
        | Some r =>
          (d, r) :: arr
    end.

Theorem arrayLookup_arrayUpdate_ne : forall arr p1 p2 v, p1 <> p2 -> arrayLookup (arrayUpdate (Some arr) p1 (Some v)) p2 = arrayLookup arr p2.