exprt create_safety_constraint(const size_t number_of_loops) { assert(number_of_loops >= 1 && "At least one loop required."); const constant_exprt min(get_min_value()); const notequal_exprt A_x(as_bool(get_Ax())); and_exprt root; root.copy_to_operands(as_bool(get_Ix0())); for (size_t i=0; i < number_of_loops; ++i) { const notequal_exprt S0_x(as_bool(get_Ix(i))); const notequal_exprt G0_x(as_bool(get_Gx(i))); const and_exprt S0_x_and_G0_0x(S0_x, G0_x); const not_exprt not_S0_x_and_G0_0x(S0_x_and_G0_0x); const notequal_exprt S0_x_prime(as_bool(get_Ix_prime(i))); const or_exprt induction(not_S0_x_and_G0_0x, S0_x_prime); root.copy_to_operands(induction); const bool is_last_component=(i == (number_of_loops - 1)); const not_exprt not_G0_x(G0_x); const and_exprt S0_x_and_not_G0_x(S0_x, not_G0_x); const not_exprt not_S0_x_and_not_G0_x(S0_x_and_not_G0_x); const notequal_exprt S1_x(as_bool(get_Ix(i + 1))); const exprt &conseq=is_last_component ? A_x : S1_x; const or_exprt implication(not_S0_x_and_not_G0_x, conseq); root.copy_to_operands(implication); } return root; }
void safety_preprocessingt::operator ()(const size_t max_length) { current_program=original_program; const unsigned int max_width=constant_strategy(current_program, max_length); options.set_option("max-constant-width", max_width); store_x0_choices(current_program); add_choice_labels(current_program.x0_choices, get_x0_offset(current_program)); create_tmp_variables(current_program, max_length); add_invariant_variables(current_program, get_Ix0(), get_Ix, get_Ix_prime); }