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