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;
}
Example #2
0
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);
}