@@ -39,28 +39,33 @@ exprt string_constraint_generatort::add_axioms_for_equals(
39
39
40
40
typet index_type=s1.length ().type ();
41
41
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
+ }());
64
69
65
70
return tc_eq;
66
71
}
0 commit comments