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 Integer) in
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