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.p_fresh pool "a" vmodel in
    let xb = F.p_fresh pool "b" vmodel in
    let ra = F.var xa in
    let rb = F.var xb in
    let xi = F.p_fresh pool "i" (Model Integerin
    let vi = F.var xi in
    let i_pos = F.p_icmp Cleq (F.i_zero) 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 (F.acc_index ra vi) (F.acc_index rb vi))) in
    F.p_forall [xa;xb]
      (F.p_iff (F.p_app2 eq_name ra rb) a_comp)