let declare obj _ =
let pool = F.pool () in
let xt = F.p_fresh pool "t"
(Model (ADT("farray",[tau_of_object obj])))
in
let t = F.var xt in
let xi = F.p_fresh pool "i" (Model Integer) in
let i = F.var xi in
let xlow = F.p_fresh pool "low" (Model Integer) in
let low = F.var xlow in
let xhigh = F.p_fresh pool "high" (Model Integer) in
let high = F.var xhigh in
let is_init =
F.p_app3 ((InitObjRange.get_definition obj).d_name) t low high
in
let i_low = F.p_icmp Cleq low i in
let i_high = F.p_icmp Clt i high in
let i_init =
!init_value_term_rec pool (F.acc_index (F.unwrap t) i) obj
in
let body =
F.p_forall [xi]
(F.p_implies i_low (F.p_implies i_high i_init))
in
Formula.Axiom
(F.p_forall [xt;xlow;xhigh] (F.p_iff is_init body))