let define_array arr =
      let tr = C_array arr in
      let te = Ctypes.object_of arr.arr_element in
      let pool = F.pool () in
      let xm = F.p_fresh pool "m" (Model M.tau_of_mem) in
      let xa,loc = M.forall_loc pool in
      let xi = F.p_fresh pool "i" (Model Integerin
      let xv = F.p_fresh pool "e" (Model (M.tau_of_object te)) in
      let mem = F.var xm in
      let loc' = M.index loc te (F.var xi) in
      let mem' = M.store_mem mem te loc' (M.value_of_logic te (F.var xv)) in
      let r0 = M.logic_of_value (M.load_mem mem tr loc) in
      let r1 = M.logic_of_value (M.load_mem mem' tr loc) in
      let r2 = F.wrap (F.upd_index (F.unwrap r0) (F.var xi) (F.var xv)) in
      let prop = F.p_forall (xm::xi::xv::xa)
        (F.p_implies (in_range arr (F.var xi)) (M.equal tr r1 r2)) in
      let name = F.Arrayinfo.basename arr in
      let path = Pretty_utils.sfprintf "%s.[%a]" name F.pp_var xi in
      add_axiom name (F.Arrayinfo.location arr) name path prop