Skip to content

Commit f0bdd85

Browse files
author
Joel Allred
committed
Encapsulate constraints for equals
No functional change
1 parent a10f7ed commit f0bdd85

File tree

1 file changed

+27
-22
lines changed

1 file changed

+27
-22
lines changed

src/solvers/refinement/string_constraint_generator_comparison.cpp

+27-22
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)