let eq_array_definition ta eq_name =
    let pool = F.pool() in
    let te = Ctypes.object_of ta.arr_element in
    let vmodel = Model(Array ta) in
    let xa = F.fresh pool "a" vmodel in
    let xb = F.fresh pool "b" vmodel in
    let ra = F.var xa in
    let rb = F.var xb in
    let xi = F.fresh pool "i" (Model Integerin
    let vi = F.var xi in
    let i_pos = F.p_icmp Cleq (F.e_int 0) vi in
    let i_max =
      match ta.arr_flat with
        | None -> F.p_true
        | Some f -> F.p_icmp Clt vi (F.e_icst (Int64.to_string f.arr_size))
    in
    let i_range = F.p_and i_pos i_max in
    let a_comp =
      F.p_forall [xi]
        (F.p_implies
           i_range
           (!equal_rec te (acc_index ra vi) (acc_index rb vi))) in
    F.p_forall [xa;xb]
      (F.p_iff (p_app2 eq_name ra rb) a_comp)