@@ -39,28 +39,33 @@ exprt string_constraint_generatort::add_axioms_for_equals(
3939
4040 typet index_type=s1.length ().type ();
4141
42-
43- implies_exprt a1 (eq, equal_exprt (s1.length (), s2.length ()));
44- lemmas.push_back (a1);
45-
46- symbol_exprt qvar=fresh_univ_index (" QA_equal" , index_type);
47- string_constraintt a2 (
48- qvar,
49- zero_if_negative (s1.length ()),
50- implies_exprt (eq, equal_exprt (s1[qvar], s2[qvar])));
51- constraints.push_back (a2);
52-
53- symbol_exprt witness=fresh_exist_index (" witness_unequal" , index_type);
54- exprt zero=from_integer (0 , index_type);
55- and_exprt bound_witness (
56- binary_relation_exprt (witness, ID_lt, s1.length ()),
57- binary_relation_exprt (witness, ID_ge, zero));
58- and_exprt witnessing (bound_witness, notequal_exprt (s1[witness], s2[witness]));
59- and_exprt diff_length (
60- notequal_exprt (s1.length (), s2.length ()),
61- equal_exprt (witness, from_integer (-1 , index_type)));
62- implies_exprt a3 (not_exprt (eq), or_exprt (diff_length, witnessing));
63- lemmas.push_back (a3);
42+ // Axiom 1.
43+ lemmas.push_back (implies_exprt (eq, equal_exprt (s1.length (), s2.length ())));
44+
45+ // Axiom 2.
46+ constraints.push_back ([&] {
47+ const symbol_exprt qvar = fresh_univ_index (" QA_equal" , index_type);
48+ return string_constraintt (
49+ qvar,
50+ zero_if_negative (s1.length ()),
51+ implies_exprt (eq, equal_exprt (s1[qvar], s2[qvar])));
52+ }());
53+
54+ // Axiom 3.
55+ lemmas.push_back ([&] {
56+ const symbol_exprt witness =
57+ fresh_exist_index (" witness_unequal" , index_type);
58+ const exprt zero = from_integer (0 , index_type);
59+ const and_exprt bound_witness (
60+ binary_relation_exprt (witness, ID_lt, s1.length ()),
61+ binary_relation_exprt (witness, ID_ge, zero));
62+ const and_exprt witnessing (
63+ bound_witness, notequal_exprt (s1[witness], s2[witness]));
64+ const and_exprt diff_length (
65+ notequal_exprt (s1.length (), s2.length ()),
66+ equal_exprt (witness, from_integer (-1 , index_type)));
67+ return implies_exprt (not_exprt (eq), or_exprt (diff_length, witnessing));
68+ }());
6469
6570 return tc_eq;
6671}
0 commit comments