@@ -97,6 +97,11 @@ static void update_index_set(
97
97
const namespacet &ns,
98
98
const exprt &formula);
99
99
100
+ static std::vector<exprt> instantiate_not_contains (
101
+ const string_not_contains_constraintt &axiom,
102
+ const std::map<exprt, std::set<exprt>>& index_set,
103
+ const string_constraint_generatort &generator);
104
+
100
105
// / Convert exprt to a specific type. Throw bad_cast if conversion
101
106
// / cannot be performed
102
107
// / Generic case doesn't exist, specialize for different types accordingly
@@ -832,7 +837,8 @@ decision_proceduret::resultt string_refinementt::dec_solve()
832
837
{
833
838
debug ()<< " constraint " << i << eom;
834
839
const std::vector<exprt> lemmas=
835
- instantiate_not_contains (not_contains_axioms[i]);
840
+ instantiate_not_contains (
841
+ not_contains_axioms[i], index_set, generator);
836
842
for (const exprt &lemma : lemmas)
837
843
add_lemma (lemma);
838
844
}
@@ -1902,19 +1908,23 @@ static exprt instantiate(
1902
1908
// / substituting the quantifiers and generating axioms.
1903
1909
// / \param [in] axiom: the axiom to instantiate
1904
1910
// / \return the lemmas produced through instantiation
1905
- std::vector<exprt> string_refinementt::instantiate_not_contains (
1906
- const string_not_contains_constraintt &axiom)
1911
+ static std::vector<exprt> instantiate_not_contains (
1912
+ const string_not_contains_constraintt &axiom,
1913
+ const std::map<exprt, std::set<exprt>>& index_set,
1914
+ const string_constraint_generatort &generator)
1907
1915
{
1908
1916
const string_exprt s0=to_string_expr (axiom.s0 ());
1909
1917
const string_exprt s1=to_string_expr (axiom.s1 ());
1910
1918
1911
- debug () << " instantiate not contains " << from_expr (ns, " " , s0) << " : "
1912
- << from_expr (ns, " " , s1) << eom;
1913
- const expr_sett index_set0=index_set[s0.content ()];
1914
- const expr_sett index_set1=index_set[s1.content ()];
1915
-
1916
- return ::instantiate_not_contains (
1917
- axiom, index_set0, index_set1, generator);
1919
+ // debug() << "instantiate not contains " << from_expr(ns, "", s0) << " : "
1920
+ // << from_expr(ns, "", s1) << eom;
1921
+ const auto & i0=index_set.find (s0.content ());
1922
+ const auto & i1=index_set.find (s1.content ());
1923
+ if (i0 != index_set.end () && i1 != index_set.end ()) {
1924
+ return ::instantiate_not_contains (
1925
+ axiom, i0->second , i1->second , generator);
1926
+ }
1927
+ return { };
1918
1928
}
1919
1929
1920
1930
// / Replace array-lists by 'with' expressions.
0 commit comments