diff --git a/src/plugins/wp/Cint.ml b/src/plugins/wp/Cint.ml index f4924f0490375eaf58d70a78c06ad2ef72486d16..3957a58125d11475b0f07091ccb0d32b9e51096b 100644 --- a/src/plugins/wp/Cint.ml +++ b/src/plugins/wp/Cint.ml @@ -815,177 +815,295 @@ let c_int_bounds_ival f = let max_reduce_quantifiers = 1000 -(** We know that t is a predicate which is the opened body of a forall *) -let reduce_bound v tv dom t : term = - let module Exc = struct - exception True - exception False - exception Unknown of Integer.t - end in - try - let red i () = - match repr (QED.e_subst_var v (e_zint i) t) with - | True -> () - | False -> raise Exc.False - | _ -> raise (Exc.Unknown i) in - let min_bound = try - Ival.fold_int red dom (); raise Exc.True - with Exc.Unknown i -> i in - let max_bound = try - Ival.fold_int_decrease red dom (); raise Exc.True - with Exc.Unknown i -> i in - (** we try to reduce the bounds of the domains, when trivially false *) - let dom_red = Ival.inject_range (Some min_bound) (Some max_bound) in - assert ( Ival.is_included dom_red dom); - if Ival.equal dom_red dom - then t - else - (e_imply [e_leq (e_zint min_bound) tv; - e_leq tv (e_zint max_bound)] - t) - with - | Exc.True -> e_true - | Exc.False -> e_false - -module Polarity = struct - type t = Pos | Neg | Both - let flip = function | Pos -> Neg | Neg -> Pos | Both -> Both - let from_bool = function | false -> Neg | true -> Pos -end - -let is_cint_simplifier = object (self) +module Dom = struct + type t = Ival.t Tmap.t + let is_top_ival = Ival.equal Ival.top - val mutable domain : Ival.t Tmap.t = Tmap.empty + let top = Tmap.empty - method private print fmt = + let print fmt dom = Tmap.iter (fun k v -> Format.fprintf fmt "%a: %a,@ " Lang.F.pp_term k Ival.pretty v) - domain - - method name = "Remove redundant is_cint" - method copy = {< domain = domain >} - - method private narrow_dom t v = - domain <- - Tmap.change (fun _ p -> - function - | None -> Some p - | Some old -> Some (Ival.narrow p old)) - t v domain - - method assume p = - let rec aux t = - match Lang.F.repr t with - | _ when not (is_prop t) -> () - | Fun(g,[a]) -> - begin try - let ubound = c_int_bounds_ival (is_cint g) in - self#narrow_dom a ubound - with Not_found -> () + dom + + let find t dom = Tmap.find t dom + + let get t dom = try find t dom with Not_found -> Ival.top + + let narrow t v dom = + if Ival.is_bottom v then raise Lang.Contradiction + else if is_top_ival v then dom + else Tmap.change (fun _ v old -> + match old with | None -> Some v + | (Some old) as old' -> + let v = Ival.narrow v old in + if Ival.is_bottom v then raise Lang.Contradiction; + if Ival.equal v old then old' + else Some v) t v dom + + let add t v dom = + if Ival.is_bottom v then raise Lang.Contradiction; + if is_top_ival v then dom else Tmap.add t v dom + + let remove t dom = Tmap.remove t dom + + let assume_cmp = + let module Local = struct + type t = Integer of Ival.t | Term of Ival.t option + end in fun cmp t1 t2 dom -> + let encode t = match Lang.F.repr t with + | Kint z -> Local.Integer (Ival.inject_singleton z) + | _ -> Local.Term (try Some (Tmap.find t dom) with Not_found -> None) + in + let term_dom = function + | Some v -> v + | None -> Ival.top + in + match encode t1, encode t2 with + | Local.Integer cst1, Local.Integer cst2 -> (* assume cmp cst1 cst2 *) + if Abstract_interp.Comp.False = Ival.forward_comp_int cmp cst1 cst2 + then raise Lang.Contradiction; + dom + | Local.Term None, Local.Term None -> + dom (* nothing can be collected *) + | Local.Term opt1, Local.Integer cst2 -> + let v1 = term_dom opt1 in + add t1 (Ival.backward_comp_int_left cmp v1 cst2) dom + | Local.Integer cst1, Local.Term opt2 -> + let v2 = term_dom opt2 in + let cmp_sym = Abstract_interp.Comp.sym cmp in + add t2 (Ival.backward_comp_int_left cmp_sym v2 cst1) dom + | Local.Term opt1, Local.Term opt2 -> + let v1 = term_dom opt1 in + let v2 = term_dom opt2 in + let cmp_sym = Abstract_interp.Comp.sym cmp in + add t1 (Ival.backward_comp_int_left cmp v1 v2) + (add t2 (Ival.backward_comp_int_left cmp_sym v2 v1) dom) + + let assume_literal t dom = match Lang.F.repr t with + | Eq(a,b) -> assume_cmp Abstract_interp.Comp.Eq a b dom + | Leq(a,b) -> assume_cmp Abstract_interp.Comp.Le a b dom + | Lt(a,b) -> assume_cmp Abstract_interp.Comp.Lt a b dom + | Fun(g,[a]) -> begin try + let ubound = + c_int_bounds_ival (is_cint g) (* may raise Not_found *) in + narrow a ubound dom + with Not_found -> dom + end + | Not p -> begin match Lang.F.repr p with + | Fun(g,[a]) -> begin try (* just checks for a contraction *) + let ubound = + c_int_bounds_ival (is_cint g) (* may raise Not_found *) in + let v = find a dom (* may raise Not_found *) in + if Ival.is_included v ubound then raise Lang.Contradiction; + dom + with Not_found -> dom end - | And _ -> Lang.F.QED.f_iter aux t - | _ -> () + | _ -> dom + end + | _ -> dom +end + +let is_cint_simplifier = + let reduce_bound ~add_bonus quant v tv dom t : term = + (** Returns [new_t] such that [c_bind quant (alpha,t)] + equals [c_bind quant v (alpha,new_t)] + under the knowledge that [(not t) ==> (var in dom)]. + Note: [~add_bonus] has not effect on the correctness of the transformation. + It is a parameter that can be used in order to get better results. + Bonus: Add additionnal hypothesis when we could deduce better constraint + on the variable *) + let module Tool = struct + exception Stop + exception Empty + exception Unknown of Integer.t + type t = { when_empty: unit -> term; + add_hyp: term list -> term -> term; + when_true: bool ref -> unit; + when_false: bool ref -> unit; + when_stop: unit -> term; + } + end in + let tools = Tool.(match quant with + | Forall -> { when_empty=(fun () -> e_true); + add_hyp =(fun hyps t -> e_imply hyps t); + when_true=(fun bonus -> bonus := add_bonus); + when_false=(fun _ -> raise Stop); + when_stop=(fun () -> e_false); + } + | Exists ->{ when_empty= (fun () -> e_false); + add_hyp =(fun hyps t -> e_and (t::hyps)); + when_true=(fun _ -> raise Stop); + when_false=(fun bonus -> bonus := add_bonus); + when_stop=(fun () -> e_true); + } + | _ -> assert false) in - aux (Lang.F.e_prop p) + if Vars.mem v (vars t) then try + let bonus_min = ref false in + let bonus_max = ref false in + let dom = if Ival.cardinal_is_less_than dom max_reduce_quantifiers then + (* try to reduce the domain when [var] is still in [t] *) + let red reduced i () = + match repr (QED.e_subst_var v (e_zint i) t) with + | True -> tools.Tool.when_true reduced + | False -> tools.Tool.when_false reduced + | _ -> raise (Tool.Unknown i) in + let min_bound = try Ival.fold_int (red bonus_min) dom (); + raise Tool.Empty with Tool.Unknown i -> i in + let max_bound = try Ival.fold_int_decrease (red bonus_max) dom (); + raise Tool.Empty with Tool.Unknown i -> i in + let red_dom = Ival.inject_range (Some min_bound) (Some max_bound) in + Ival.narrow dom red_dom + else dom + in begin match Ival.min_and_max dom with + | None, None -> t (* Cannot be reduced *) + | Some min, None -> (* May be reduced to [min ...] *) + if !bonus_min then tools.Tool.add_hyp [e_leq (e_zint min) tv] t + else t + | None, Some max -> (* May be reduced to [... max] *) + if !bonus_max then tools.Tool.add_hyp [e_leq tv (e_zint max)] t + else t + | Some min, Some max -> + if Integer.equal min max then (* Reduced to only one value: [min] *) + QED.e_subst_var v (e_zint min) t + else if Integer.lt min max then + let h = if !bonus_min then [e_leq (e_zint min) tv] else [] + in + let h = if !bonus_max then (e_leq tv (e_zint max))::h else h + in tools.Tool.add_hyp h t + else assert false (* Abstract_interp.Error_Bottom raised *) + end + with + | Tool.Stop -> tools.Tool.when_stop () + | Tool.Empty -> tools.Tool.when_empty () + | Abstract_interp.Error_Bottom -> tools.Tool.when_empty () + | Abstract_interp.Error_Top -> t + else (* [alpha] is no more in [t] *) + if Ival.is_bottom dom then tools.Tool.when_empty () else t + in + let module Polarity = struct + type t = Pos | Neg | Both + let flip = function | Pos -> Neg | Neg -> Pos | Both -> Both + let from_bool = function | false -> Neg | true -> Pos + end + in object (self) - method target _ = () - method fixpoint = () + val mutable domain : Dom.t = Dom.top - method private simplify ~is_goal p = - let pool = Lang.get_pool () in + method name = "Remove redundant is_cint" + method copy = {< domain = domain >} - let reduce op var_domain base = - let dom = - match Lang.F.repr base with - | Kint z -> Ival.inject_singleton z - | _ -> - try Tmap.find base domain - with Not_found -> Ival.top + method target _ = () + method fixpoint = () + + method assume p = + Lang.iter_confident_literals + (fun p -> domain <- Dom.assume_literal p domain) (Lang.F.e_prop p) + + method private simplify ~is_goal p = + let pool = Lang.get_pool () in + + let reduce op var_domain base = + let dom = + match Lang.F.repr base with + | Kint z -> Ival.inject_singleton z + | _ -> + try Tmap.find base domain + with Not_found -> Ival.top + in + var_domain := Ival.backward_comp_int_left op !var_domain dom in - var_domain := Ival.backward_comp_int_left op !var_domain dom - in - let rec reduce_on_neg var var_domain t = - match Lang.F.repr t with - | _ when not (is_prop t) -> () - | Leq(a,b) when Lang.F.equal a var -> - reduce Abstract_interp.Comp.Le var_domain b - | Leq(b,a) when Lang.F.equal a var -> - reduce Abstract_interp.Comp.Ge var_domain b - | Lt(a,b) when Lang.F.equal a var -> - reduce Abstract_interp.Comp.Lt var_domain b - | Lt(b,a) when Lang.F.equal a var -> - reduce Abstract_interp.Comp.Gt var_domain b - | And l -> List.iter (reduce_on_neg var var_domain) l - | _ -> () - in - let reduce_on_pos var var_domain t = - match Lang.F.repr t with - | Imply (l,_) -> List.iter (reduce_on_neg var var_domain) l - | _ -> () - in - let rec walk ~term_pol t = - let walk_flip_pol t = walk ~term_pol:(Polarity.flip term_pol) t - and walk_same_pol t = walk ~term_pol t - and walk_both_pol t = walk ~term_pol:Polarity.Both t + let rec reduce_on_neg var var_domain t = + match Lang.F.repr t with + | _ when not (is_prop t) -> () + | Leq(a,b) when Lang.F.equal a var -> + reduce Abstract_interp.Comp.Le var_domain b + | Leq(b,a) when Lang.F.equal a var -> + reduce Abstract_interp.Comp.Ge var_domain b + | Lt(a,b) when Lang.F.equal a var -> + reduce Abstract_interp.Comp.Lt var_domain b + | Lt(b,a) when Lang.F.equal a var -> + reduce Abstract_interp.Comp.Gt var_domain b + | And l -> List.iter (reduce_on_neg var var_domain) l + | Not p -> reduce_on_pos var var_domain p + | _ -> () + and reduce_on_pos var var_domain t = + match Lang.F.repr t with + | Neq _ | Leq _ | Lt _ -> reduce_on_neg var var_domain (e_not t) + | Imply (l,p) -> List.iter (reduce_on_neg var var_domain) l; + reduce_on_pos var var_domain p + | Or l -> List.iter (reduce_on_pos var var_domain) l; + | Not p -> reduce_on_neg var var_domain p + | _ -> () in - match repr t with - | _ when not (is_prop t) -> t - | Bind((Forall|Exists),_,_) -> - let ctx,t = e_open ~pool ~lambda:false t in - let ctx_with_dom = - List.map (fun ((quant,var) as qv) -> match tau_of_var var with - | Int -> - let tvar = (e_var var) in - let var_domain = ref Ival.top in - if quant = Forall - then reduce_on_pos tvar var_domain t - else reduce_on_neg tvar var_domain t; - domain <- Tmap.add tvar !var_domain domain; - qv, Some (tvar, var_domain) - | _ -> qv, None) ctx - in - let t = walk_same_pol t in - let f_close t = function - | (quant,var), None -> e_bind quant var t - | (quant,var), Some (tvar,var_domain) -> - domain <- Tmap.remove tvar domain; - (** Bonus: Add additionnal hypothesis in forall when we could deduce - better constraint on the variable *) - let t = if quant = Forall && - term_pol = Polarity.Pos && - Ival.cardinal_is_less_than !var_domain max_reduce_quantifiers - then reduce_bound var tvar !var_domain t - else t in - e_bind quant var t - in - List.fold_left f_close t ctx_with_dom - | Fun(g,[a]) -> - (** Here we simplifies the cints which are redoundant *) - begin try - let ubound = c_int_bounds_ival (is_cint g) in - let dom = (Tmap.find a domain) in - if Ival.is_included dom ubound - then e_true - else t - with Not_found -> t - end - | Imply (l1,l2) -> e_imply (List.map walk_flip_pol l1) (walk_same_pol l2) - | Not p -> e_not (walk_flip_pol p) - | And _ | Or _ -> Lang.F.QED.f_map walk_same_pol t - | _ -> - Lang.F.QED.f_map ~pool ~forall:false ~exists:false walk_both_pol t in - Lang.F.p_bool (walk ~term_pol:(Polarity.from_bool is_goal) (Lang.F.e_prop p)) + (* [~term_pol] gives the polarity of the term [t] from the top level. + That informs about how should be considered the quantifiers + of [t] + *) + let rec walk ~term_pol t = + let walk_flip_pol t = walk ~term_pol:(Polarity.flip term_pol) t + and walk_same_pol t = walk ~term_pol t + and walk_both_pol t = walk ~term_pol:Polarity.Both t + in + match repr t with + | _ when not (is_prop t) -> t + | Bind((Forall|Exists),_,_) -> + let ctx,t = e_open ~pool ~lambda:false t in + let ctx_with_dom = + List.map (fun ((quant,var) as qv) -> match tau_of_var var with + | Int -> + let tvar = (e_var var) in + let var_domain = ref Ival.top in + if quant = Forall + then reduce_on_pos tvar var_domain t + else reduce_on_neg tvar var_domain t; + domain <- Dom.add tvar !var_domain domain; + qv, Some (tvar, var_domain) + | _ -> qv, None) ctx + in + let t = walk_same_pol t in + let f_close t = function + | (quant,var), None -> e_bind quant var t + | (quant,var), Some (tvar,var_domain) -> + domain <- Dom.remove tvar domain; + (** Bonus: Add additionnal hypothesis in forall when we could deduce + better constraint on the variable *) + let add_bonus = match term_pol with + | Polarity.Both -> false + | _ -> (term_pol=Polarity.Pos) = (quant=Forall) + in + let t = reduce_bound ~add_bonus quant var tvar !var_domain t in + e_bind quant var t + in + List.fold_left f_close t ctx_with_dom + | Fun(g,[a]) -> + (** Here we simplifies the cints which are redoundant *) + begin try + let ubound = c_int_bounds_ival (is_cint g) in + let dom = (Tmap.find a domain) in + if Ival.is_included dom ubound + then e_true + else t + with Not_found -> t + end + | Imply (l1,l2) -> e_imply (List.map walk_flip_pol l1) (walk_same_pol l2) + | Not p -> e_not (walk_flip_pol p) + | And _ | Or _ -> Lang.F.QED.f_map walk_same_pol t + | _ -> + Lang.F.QED.f_map ~pool ~forall:false ~exists:false walk_both_pol t in + Lang.F.p_bool (walk ~term_pol:(Polarity.from_bool is_goal) (Lang.F.e_prop p)) - method simplify_exp (e : term) = e + method simplify_exp (e : term) = e - method simplify_hyp p = self#simplify ~is_goal:false p + method simplify_hyp p = self#simplify ~is_goal:false p - method simplify_goal p = self#simplify ~is_goal:true p + method simplify_goal p = self#simplify ~is_goal:true p - method simplify_branch p = p + method simplify_branch p = p - method infer = [] -end + method infer = [] + end let mask_simplifier = diff --git a/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle index 4bdd96e577592e920b55247a65817225f9fce919..115de5d9648a90244d293e05cf3fe13140cb66c5 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle/simpl_is_type.res.oracle @@ -165,20 +165,17 @@ Prove: exists i : Z. forall i_1 : Z. (is_uint8(i_1) -> ------------------------------------------------------------ Goal Check 'ko,Let1,intro_let' (file tests/wp_acsl/simpl_is_type.i, line 92): -Prove: exists i : Z. forall i_1 : Z. ((10 <= i_1) -> ((i_1 <= 10) -> - P_P(i_1, i, 1.0))). +Prove: exists i : Z. P_P(10, i, 1.0). ------------------------------------------------------------ Goal Check 'ko,Let2,intro_let' (file tests/wp_acsl/simpl_is_type.i, line 93): -Prove: exists i : Z. forall i_1 : Z. ((i_1 <= 0) -> ((0 <= i_1) -> - (((-5) <= i_1) -> P_P(i_1, i, 1.0)))). +Prove: exists i : Z. P_P(0, i, 1.0). ------------------------------------------------------------ Goal Check 'ko,Let3,intro_let' (file tests/wp_acsl/simpl_is_type.i, line 94): -Prove: exists i : Z. forall i_1 : Z. ((255 <= i_1) -> ((i_1 <= 255) -> - ((i_1 <= 599) -> P_P(i_1, i, 1.0)))). +Prove: exists i : Z. P_P(255, i, 1.0). ------------------------------------------------------------ diff --git a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle index 696cfec43770e4113b397f51767d8f05354ec8ec..fc119b8181b6ad0bf377c2a272cd82e97e22ef16 100644 --- a/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle +++ b/src/plugins/wp/tests/wp_acsl/oracle_qualif/init_value.0.res.oracle @@ -11,7 +11,7 @@ [wp] [Qed] Goal typed_main_requires_qed_ok_Struct_Simple_a : Valid [wp] [Qed] Goal typed_main_requires_qed_ok_Struct_Simple_b : Valid [wp] [Qed] Goal typed_main_requires_qed_ok_Simple_Array_0 : Valid -[wp] [Alt-Ergo] Goal typed_main_requires_qed_ok_Simple_Array_1 : Valid +[wp] [Qed] Goal typed_main_requires_qed_ok_Simple_Array_1 : Valid [wp] [Qed] Goal typed_main_requires_qed_ok_With_Array_Struct_5 : Valid [wp] [Qed] Goal typed_main_requires_qed_ok_With_Array_Struct_3 : Valid [wp] [Alt-Ergo] Goal typed_main_requires_qed_ok_Sc_eq : Valid @@ -25,19 +25,19 @@ [wp] [Qed] Goal typed_main_requires_qed_ok_2 : Valid [wp] [Alt-Ergo] Goal typed_main_requires_qed_ok_3 : Valid [wp] [Qed] Goal typed_main_requires_qed_ok_todo : Valid -[wp] [Alt-Ergo] Goal typed_main_requires_qed_ok_4 : Valid +[wp] [Qed] Goal typed_main_requires_qed_ok_4 : Valid [wp] [Alt-Ergo] Goal typed_main_requires_qed_ok_5 : Valid [wp] [Qed] Goal typed_main_requires_qed_ok_direct_init_union : Valid [wp] Proved goals: 24 / 24 - Qed: 17 - Alt-Ergo: 7 + Qed: 19 + Alt-Ergo: 5 [wp] Report in: 'tests/wp_acsl/oracle_qualif/init_value.0.report.json' [wp] Report out: 'tests/wp_acsl/result_qualif/init_value.0.report.json' ------------------------------------------------------------- Functions WP Alt-Ergo Total Success -main 14 6 (28..40) 20 100% +main 16 4 (28..40) 20 100% fa1 1 - 1 100% fa2 1 - 1 100% fa3 1 - 1 100% -fs1 - 1 (160..184) 1 100% +fs1 - 1 (112..136) 1 100% ------------------------------------------------------------- diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle index fed0f0257b43b01a4adf56ecd94d3c31195a0263..e889fe4a6738733e3c74bc71527620338455930d 100644 --- a/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle +++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_and_struct.res.oracle @@ -172,9 +172,7 @@ Assume { Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> ((m[i_1].F1_T_a) = 0))). (* Call Effects *) - Have: (forall i_1 : Z. ((i_1 != 1) -> (smatrix_1[i_1] = smatrix_0[i_1]))) /\ - (forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> - (((i_1 < 0) \/ (5 <= i_1)) -> (smatrix_1[1][i_1] = m[i_1]))))). + Have: forall i_1 : Z. ((i_1 != 1) -> (smatrix_1[i_1] = smatrix_0[i_1])). } Prove: (m[i].F1_T_a) = 0. diff --git a/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle b/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle index 92a060753dfd1ee1cb05e5af64a26b33a619de9b..3beaa58f2543d773ccd2649dd8da348ef9a70cb9 100644 --- a/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle +++ b/src/plugins/wp/tests/wp_hoare/oracle/reference_array.res.oracle @@ -230,9 +230,7 @@ Assume { (* Call 'reset_5' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> (m[i_1] = 0))). (* Call Effects *) - Have: (forall i_1 : Z. ((i_1 != 0) -> (tt_0[i_1] = tt_1[i_1]))) /\ - (forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> - (((i_1 < 0) \/ (5 <= i_1)) -> (m_1[i_1] = m[i_1]))))). + Have: forall i_1 : Z. ((i_1 != 0) -> (tt_0[i_1] = tt_1[i_1])). (* Call 'add_5' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> (reg_add_0[i_1] = (reg_load_0[i_1] + m[i_1])))). @@ -243,19 +241,16 @@ Prove: m_1[i] = reg_load_0[i]. Goal Post-condition 'Preset' in 'calls_on_array_dim_2_to_1': Let m = tt_0[0]. -Let m_1 = tt_1[0]. Assume { (* Goal *) When: (0 <= i) /\ (i <= 4). (* Call 'load_5' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> - (m_1[i_1] = reg_load_0[i_1]))). + (tt_1[0][i_1] = reg_load_0[i_1]))). (* Call 'reset_5' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> (m[i_1] = 0))). (* Call Effects *) - Have: (forall i_1 : Z. ((i_1 != 0) -> (tt_1[i_1] = tt_0[i_1]))) /\ - (forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> - (((i_1 < 0) \/ (5 <= i_1)) -> (m_1[i_1] = m[i_1]))))). + Have: forall i_1 : Z. ((i_1 != 0) -> (tt_1[i_1] = tt_0[i_1])). (* Call 'add_5' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> (reg_add_0[i_1] = (reg_load_0[i_1] + m[i_1])))). @@ -276,9 +271,7 @@ Assume { (* Call 'reset_5' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> (m[i_1] = 0))). (* Call Effects *) - Have: (forall i_1 : Z. ((i_1 != 0) -> (tt_0[i_1] = tt_1[i_1]))) /\ - (forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> - (((i_1 < 0) \/ (5 <= i_1)) -> (m_1[i_1] = m[i_1]))))). + Have: forall i_1 : Z. ((i_1 != 0) -> (tt_0[i_1] = tt_1[i_1])). (* Call 'add_5' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 4) -> (reg_add_0[i_1] = (reg_load_0[i_1] + m[i_1])))). diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle index 099a8b0731ad6cd478d7ada6d46db738c28d17bc..7ed70002fbc5d83e5b704f38f2a51dc1652dab1f 100644 --- a/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.0.res.oracle @@ -1278,10 +1278,6 @@ Goal Post-condition (file tests/wp_typed/user_init.i, line 68) in 'init_t2_v2': Assume { (* Goal *) When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). (* Invariant 'Partial_i' *) Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> ((i_2 <= 19) -> (t2_0[i_3][i_2] = v))))). @@ -1296,24 +1292,16 @@ Assume { Type: is_uint32(i). (* Goal *) When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) -> - ((i_3 <= 19) -> (((i_4 < 0) \/ (10 <= i_4)) -> - (t2_1[i_4][i_3] = t2_2[i_4][i_3])))))). (* Invariant 'Partial_i' *) Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) -> - ((i_3 <= 19) -> (t2_2[i_4][i_3] = v))))). + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) -> - ((i_3 <= 19) -> (((i_4 < 0) \/ (10 <= i_4)) -> - (t2_0[i_4][i_3] = t2_2[i_4][i_3])))))). (* Invariant 'Previous_i' *) Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) -> - ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_2[i_4][i_3]))))). + ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))). (* Invariant 'Partial_j' *) Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))). } @@ -1329,26 +1317,18 @@ Prove: true. Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 76): Assume { Type: is_uint32(i). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))). } Prove: to_uint32(1 + i) <= 10. @@ -1365,24 +1345,16 @@ Assume { Type: is_uint32(i) /\ is_uint32(j). (* Goal *) When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_1[i_3][i_2] = t2_2[i_3][i_2])))))). (* Invariant 'Partial_i' *) Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) -> - ((i_2 <= 19) -> (t2_2[i_3][i_2] = v))))). + ((i_2 <= 19) -> (t2_1[i_3][i_2] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_0[i_3][i_2] = t2_2[i_3][i_2])))))). (* Invariant 'Previous_i' *) Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) -> - ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_2[i_3][i_2]))))). + ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_1[i_3][i_2]))))). (* Invariant 'Partial_j' *) Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))). (* Invariant 'Range_j' *) @@ -1405,10 +1377,6 @@ Assume { Type: is_uint32(i) /\ is_uint32(j). (* Goal *) When: (0 <= i_1) /\ (i_1 < i) /\ (0 <= i_2) /\ (i_2 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) -> - ((i_3 <= 19) -> (((i_4 < 0) \/ (10 <= i_4)) -> - (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). (* Invariant 'Partial_i' *) Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) -> ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). @@ -1416,10 +1384,6 @@ Assume { Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) -> - ((i_3 <= 19) -> (((i_4 < 0) \/ (10 <= i_4)) -> - (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). (* Invariant 'Previous_i' *) Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) -> ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))). @@ -1442,26 +1406,18 @@ Prove: true. Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 82): Assume { Type: is_uint32(i) /\ is_uint32(j). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))). (* Invariant 'Range_j' *) Have: (0 <= j) /\ (j <= 20). (* Then *) @@ -1498,27 +1454,19 @@ Assume { (* Goal *) When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_0[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Partial_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_1[i_7][i_6] = v))))). + ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i_2) /\ (i_2 <= 10). (* Then *) Have: i_2 <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_2[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Previous_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_2[i_7][i_6] = t2_1[i_7][i_6]))))). + ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))). (* Invariant 'Partial_j' *) Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) -> - (t2_2[i_2][i_6] = v))). + (t2_1[i_2][i_6] = v))). } Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\ (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9). @@ -1532,27 +1480,19 @@ Assume { (* Goal *) When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_0[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Partial_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_1[i_7][i_6] = v))))). + ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i_2) /\ (i_2 <= 10). (* Then *) Have: i_2 <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_2[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Previous_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_2[i_7][i_6] = t2_1[i_7][i_6]))))). + ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))). (* Invariant 'Partial_j' *) Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) -> - (t2_2[i_2][i_6] = v))). + (t2_1[i_2][i_6] = v))). } Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\ (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9). @@ -1571,26 +1511,18 @@ Assume { (* Goal *) When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_0[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Partial_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_1[i_7][i_6] = v))))). + ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i_2) /\ (i_2 <= 10). (* Then *) Have: i_2 <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_2[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Previous_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_2[i_7][i_6] = t2_1[i_7][i_6]))))). + ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))). (* Invariant 'Partial_j' *) - Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < j) -> (t2_2[i_2][i_6] = v))). + Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < j) -> (t2_1[i_2][i_6] = v))). (* Invariant 'Range_j' *) Have: (0 <= j) /\ (j <= 20). (* Then *) @@ -1607,24 +1539,16 @@ Assume { Type: is_uint32(i) /\ is_uint32(j). (* Goal *) When: (0 <= i) /\ (0 <= j) /\ (i <= 9) /\ (j <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: i <= 10. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))). (* Invariant 'Range_j' *) Have: j <= 20. } @@ -1648,10 +1572,6 @@ Assume { Have: i_3 <= 19. Have: 0 <= i. Have: i <= 9. - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_5,i_4 : Z. ((0 <= i_5) -> ((0 <= i_4) -> ((i_5 <= 9) -> - ((i_4 <= 19) -> (((i_5 < 0) \/ (10 <= i_5)) -> - (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). } Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_1 <= i_4) /\ (i_5 <= 9). @@ -1661,26 +1581,18 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\ Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 80): Assume { Type: is_uint32(i). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))). } Prove: i < to_uint32(1 + i). @@ -1694,26 +1606,18 @@ Prove: true. Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 87): Assume { Type: is_uint32(i) /\ is_uint32(j). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))). (* Invariant 'Range_j' *) Have: (0 <= j) /\ (j <= 20). (* Then *) @@ -1736,10 +1640,6 @@ Assume { Type: is_sint32(v). (* Goal *) When: (0 <= i) /\ (i <= 9). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 9) -> P_MemSet20(t2_0[i_1], 20, v))). @@ -1754,10 +1654,6 @@ Assume { IsArray1_sint32(t2_0[i]). (* Goal *) When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). (* Invariant 'Partial_i' *) Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> P_MemSet20(t2_0[i_2], 20, v_1))). @@ -1781,10 +1677,6 @@ Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). @@ -1809,10 +1701,6 @@ Let m = v[j <- v_1]. Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]) /\ IsArray1_sint32(m). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). @@ -1835,10 +1723,6 @@ Goal Establishment of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, li Let m = t2_0[i]. Assume { Type: is_uint32(i) /\ is_sint32(v) /\ IsArray1_sint32(m). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v))). @@ -1855,10 +1739,6 @@ Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). @@ -1905,10 +1785,6 @@ Assume { (* Goal *) When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_1[i_7][i_6] = t2_0[i_7][i_6])))))). (* Invariant 'Partial_i' *) Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < i_2) -> P_MemSet20(t2_0[i_6], 20, v_1))). @@ -1931,10 +1807,6 @@ Assume { IsArray1_sint32(t2_0[i]). (* Goal *) When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). (* Invariant 'Partial_i' *) Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> P_MemSet20(t2_0[i_2], 20, v_1))). @@ -1974,10 +1846,6 @@ Assume { Have: i_3 <= 19. Have: 0 <= i. Have: i <= 9. - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_5,i_4 : Z. ((0 <= i_5) -> ((0 <= i_4) -> ((i_5 <= 9) -> - ((i_4 <= 19) -> (((i_5 < 0) \/ (10 <= i_5)) -> - (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). } Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_1 <= i_4) /\ (i_5 <= 9). @@ -1988,10 +1856,6 @@ Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 1 Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). @@ -2015,10 +1879,6 @@ Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 1 Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). diff --git a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle index 620a41fc301d404db82f618cac7e8a585d940513..f759219c74fa5cf2cda5b811b530c4a10cb3cc1c 100644 --- a/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle/user_init.1.res.oracle @@ -1278,10 +1278,6 @@ Goal Post-condition (file tests/wp_typed/user_init.i, line 68) in 'init_t2_v2': Assume { (* Goal *) When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). (* Invariant 'Partial_i' *) Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> ((i_2 <= 19) -> (t2_0[i_3][i_2] = v))))). @@ -1296,24 +1292,16 @@ Assume { Type: is_uint32(i). (* Goal *) When: (0 <= i_1) /\ (0 <= i_2) /\ (i_1 < to_uint32(1 + i)) /\ (i_2 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) -> - ((i_3 <= 19) -> (((i_4 < 0) \/ (10 <= i_4)) -> - (t2_1[i_4][i_3] = t2_2[i_4][i_3])))))). (* Invariant 'Partial_i' *) Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) -> - ((i_3 <= 19) -> (t2_2[i_4][i_3] = v))))). + ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) -> - ((i_3 <= 19) -> (((i_4 < 0) \/ (10 <= i_4)) -> - (t2_0[i_4][i_3] = t2_2[i_4][i_3])))))). (* Invariant 'Previous_i' *) Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) -> - ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_2[i_4][i_3]))))). + ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))). (* Invariant 'Partial_j' *) Have: forall i_3 : Z. ((0 <= i_3) -> ((i_3 <= 19) -> (m[i_3] = v))). } @@ -1329,26 +1317,18 @@ Prove: true. Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line 76): Assume { Type: is_uint32(i). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))). } Prove: to_uint32(1 + i) <= 10. @@ -1365,24 +1345,16 @@ Assume { Type: is_uint32(i) /\ is_uint32(j). (* Goal *) When: (0 <= i_1) /\ (i_1 < to_uint32(1 + j)). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_1[i_3][i_2] = t2_2[i_3][i_2])))))). (* Invariant 'Partial_i' *) Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) -> - ((i_2 <= 19) -> (t2_2[i_3][i_2] = v))))). + ((i_2 <= 19) -> (t2_1[i_3][i_2] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_0[i_3][i_2] = t2_2[i_3][i_2])))))). (* Invariant 'Previous_i' *) Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((i_3 < i) -> ((0 <= i_2) -> - ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_2[i_3][i_2]))))). + ((i_2 <= 19) -> (t2_0[i_3][i_2] = t2_1[i_3][i_2]))))). (* Invariant 'Partial_j' *) Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < j) -> (m[i_2] = v))). (* Invariant 'Range_j' *) @@ -1405,10 +1377,6 @@ Assume { Type: is_uint32(i) /\ is_uint32(j). (* Goal *) When: (0 <= i_1) /\ (i_1 < i) /\ (0 <= i_2) /\ (i_2 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) -> - ((i_3 <= 19) -> (((i_4 < 0) \/ (10 <= i_4)) -> - (t2_2[i_4][i_3] = t2_1[i_4][i_3])))))). (* Invariant 'Partial_i' *) Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) -> ((i_3 <= 19) -> (t2_1[i_4][i_3] = v))))). @@ -1416,10 +1384,6 @@ Assume { Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((0 <= i_3) -> ((i_4 <= 9) -> - ((i_3 <= 19) -> (((i_4 < 0) \/ (10 <= i_4)) -> - (t2_0[i_4][i_3] = t2_1[i_4][i_3])))))). (* Invariant 'Previous_i' *) Have: forall i_4,i_3 : Z. ((0 <= i_4) -> ((i_4 < i) -> ((0 <= i_3) -> ((i_3 <= 19) -> (t2_0[i_4][i_3] = t2_1[i_4][i_3]))))). @@ -1442,26 +1406,18 @@ Prove: true. Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line 82): Assume { Type: is_uint32(i) /\ is_uint32(j). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))). (* Invariant 'Range_j' *) Have: (0 <= j) /\ (j <= 20). (* Then *) @@ -1498,27 +1454,19 @@ Assume { (* Goal *) When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_0[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Partial_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_1[i_7][i_6] = v))))). + ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i_2) /\ (i_2 <= 10). (* Then *) Have: i_2 <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_2[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Previous_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_2[i_7][i_6] = t2_1[i_7][i_6]))))). + ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))). (* Invariant 'Partial_j' *) Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) -> - (t2_2[i_2][i_6] = v))). + (t2_1[i_2][i_6] = v))). } Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\ (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9). @@ -1532,27 +1480,19 @@ Assume { (* Goal *) When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_0[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Partial_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_1[i_7][i_6] = v))))). + ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i_2) /\ (i_2 <= 10). (* Then *) Have: i_2 <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_2[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Previous_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_2[i_7][i_6] = t2_1[i_7][i_6]))))). + ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))). (* Invariant 'Partial_j' *) Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 <= 19) -> - (t2_2[i_2][i_6] = v))). + (t2_1[i_2][i_6] = v))). } Prove: exists i_7,i_6 : Z. (i_7 <= i) /\ (i_6 <= i_1) /\ (0 <= i_7) /\ (i <= i_7) /\ (i_1 <= i_6) /\ (i_7 <= 9). @@ -1571,26 +1511,18 @@ Assume { (* Goal *) When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_0[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Partial_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_1[i_7][i_6] = v))))). + ((i_6 <= 19) -> (t2_0[i_7][i_6] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i_2) /\ (i_2 <= 10). (* Then *) Have: i_2 <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_2[i_7][i_6] = t2_1[i_7][i_6])))))). (* Invariant 'Previous_i' *) Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((i_7 < i_2) -> ((0 <= i_6) -> - ((i_6 <= 19) -> (t2_2[i_7][i_6] = t2_1[i_7][i_6]))))). + ((i_6 <= 19) -> (t2_1[i_7][i_6] = t2_0[i_7][i_6]))))). (* Invariant 'Partial_j' *) - Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < j) -> (t2_2[i_2][i_6] = v))). + Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < j) -> (t2_1[i_2][i_6] = v))). (* Invariant 'Range_j' *) Have: (0 <= j) /\ (j <= 20). (* Then *) @@ -1607,24 +1539,16 @@ Assume { Type: is_uint32(i) /\ is_uint32(j). (* Goal *) When: (0 <= i) /\ (0 <= j) /\ (i <= 9) /\ (j <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: i <= 10. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))). (* Invariant 'Range_j' *) Have: j <= 20. } @@ -1648,10 +1572,6 @@ Assume { Have: i_3 <= 19. Have: 0 <= i. Have: i <= 9. - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_5,i_4 : Z. ((0 <= i_5) -> ((0 <= i_4) -> ((i_5 <= 9) -> - ((i_4 <= 19) -> (((i_5 < 0) \/ (10 <= i_5)) -> - (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). } Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_1 <= i_4) /\ (i_5 <= 9). @@ -1661,26 +1581,18 @@ Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\ Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 80): Assume { Type: is_uint32(i). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 19) -> (t2_1[i][i_1] = v))). } Prove: i < to_uint32(1 + i). @@ -1694,26 +1606,18 @@ Prove: true. Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 87): Assume { Type: is_uint32(i) /\ is_uint32(j). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_0[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_1[i_2][i_1] = v))))). + ((i_1 <= 19) -> (t2_0[i_2][i_1] = v))))). (* Invariant 'Range_i' *) Have: (0 <= i) /\ (i <= 10). (* Then *) Have: i <= 9. - (* Loop assigns 'tactic,Zone_j' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_2[i_2][i_1] = t2_1[i_2][i_1])))))). (* Invariant 'Previous_i' *) Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((i_2 < i) -> ((0 <= i_1) -> - ((i_1 <= 19) -> (t2_2[i_2][i_1] = t2_1[i_2][i_1]))))). + ((i_1 <= 19) -> (t2_1[i_2][i_1] = t2_0[i_2][i_1]))))). (* Invariant 'Partial_j' *) - Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_2[i][i_1] = v))). + Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < j) -> (t2_1[i][i_1] = v))). (* Invariant 'Range_j' *) Have: (0 <= j) /\ (j <= 20). (* Then *) @@ -1736,10 +1640,6 @@ Assume { Type: is_sint32(v). (* Goal *) When: (0 <= i) /\ (i <= 9). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 <= 9) -> P_MemSet20(t2_0[i_1], 20, v))). @@ -1754,10 +1654,6 @@ Assume { IsArray1_sint32(t2_0[i]). (* Goal *) When: (0 <= i_1) /\ (i_1 < to_uint32(1 + i)). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). (* Invariant 'Partial_i' *) Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> P_MemSet20(t2_0[i_2], 20, v_1))). @@ -1781,10 +1677,6 @@ Goal Preservation of Invariant 'Range_i' (file tests/wp_typed/user_init.i, line Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). @@ -1809,10 +1701,6 @@ Let m = v[j <- v_1]. Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]) /\ IsArray1_sint32(m). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). @@ -1835,10 +1723,6 @@ Goal Establishment of Invariant 'Partial_j' (file tests/wp_typed/user_init.i, li Let m = t2_0[i]. Assume { Type: is_uint32(i) /\ is_sint32(v) /\ IsArray1_sint32(m). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v))). @@ -1855,10 +1739,6 @@ Goal Preservation of Invariant 'Range_j' (file tests/wp_typed/user_init.i, line Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). @@ -1905,10 +1785,6 @@ Assume { (* Goal *) When: (0 <= i_3) /\ (0 <= i_4) /\ (0 <= i_5) /\ (0 <= i) /\ (i_3 <= 9) /\ (i_5 <= 9) /\ (i <= 9) /\ (i_4 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_7,i_6 : Z. ((0 <= i_7) -> ((0 <= i_6) -> ((i_7 <= 9) -> - ((i_6 <= 19) -> (((i_7 < 0) \/ (10 <= i_7)) -> - (t2_1[i_7][i_6] = t2_0[i_7][i_6])))))). (* Invariant 'Partial_i' *) Have: forall i_6 : Z. ((0 <= i_6) -> ((i_6 < i_2) -> P_MemSet20(t2_0[i_6], 20, v_1))). @@ -1931,10 +1807,6 @@ Assume { IsArray1_sint32(t2_0[i]). (* Goal *) When: (0 <= i) /\ (0 <= i_1) /\ (i <= 9) /\ (i_1 <= 19). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_3,i_2 : Z. ((0 <= i_3) -> ((0 <= i_2) -> ((i_3 <= 9) -> - ((i_2 <= 19) -> (((i_3 < 0) \/ (10 <= i_3)) -> - (t2_1[i_3][i_2] = t2_0[i_3][i_2])))))). (* Invariant 'Partial_i' *) Have: forall i_2 : Z. ((0 <= i_2) -> ((i_2 < i) -> P_MemSet20(t2_0[i_2], 20, v_1))). @@ -1974,10 +1846,6 @@ Assume { Have: i_3 <= 19. Have: 0 <= i. Have: i <= 9. - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_5,i_4 : Z. ((0 <= i_5) -> ((0 <= i_4) -> ((i_5 <= 9) -> - ((i_4 <= 19) -> (((i_5 < 0) \/ (10 <= i_5)) -> - (t2_0[i_5][i_4] = t2_1[i_5][i_4])))))). } Prove: exists i_5,i_4 : Z. (i_5 <= i) /\ (i_4 <= i_1) /\ (0 <= i_5) /\ (i <= i_5) /\ (i_1 <= i_4) /\ (i_5 <= 9). @@ -1988,10 +1856,6 @@ Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 1 Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). @@ -2015,10 +1879,6 @@ Goal Decreasing of Loop variant at loop (file tests/wp_typed/user_init.i, line 1 Assume { Type: IsArray1_sint32(v) /\ is_uint32(i) /\ is_uint32(j) /\ is_sint32(v_1) /\ IsArray1_sint32(t2_0[i]). - (* Loop assigns 'tactic,Zone_i' *) - Have: forall i_2,i_1 : Z. ((0 <= i_2) -> ((0 <= i_1) -> ((i_2 <= 9) -> - ((i_1 <= 19) -> (((i_2 < 0) \/ (10 <= i_2)) -> - (t2_1[i_2][i_1] = t2_0[i_2][i_1])))))). (* Invariant 'Partial_i' *) Have: forall i_1 : Z. ((0 <= i_1) -> ((i_1 < i) -> P_MemSet20(t2_0[i_1], 20, v_1))). diff --git a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.res.oracle b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.res.oracle index 476ee7df2e400ce497d6f2692ba419dd46bab530..cc112824722069d119c08dbe0974f80fb1083582 100644 --- a/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.res.oracle +++ b/src/plugins/wp/tests/wp_typed/oracle_qualif/user_init.0.res.oracle @@ -110,7 +110,7 @@ Functions WP Alt-Ergo Total Success init 6 4 (80..104) 10 100% init_t1 6 4 (12..24) 10 100% init_t2_v1 9 8 (40..52) 17 100% -init_t2_v2 9 8 (32..44) 17 100% +init_t2_v2 9 8 (24..36) 17 100% init_t2_v3 7 8 (28..40) 15 100% init_t2_bis_v1 7 4 (208..256) 11 100% init_t2_bis_v2 7 4 (192..240) 11 100%