Skip to content

Commit 229568a

Browse files
author
Lukasz A.J. Wrona
committed
static Instantiate not contains
1 parent 78303df commit 229568a

File tree

2 files changed

+20
-13
lines changed

2 files changed

+20
-13
lines changed

src/solvers/refinement/string_refinement.cpp

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ static void update_index_set(
9797
const namespacet &ns,
9898
const exprt &formula);
9999

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+
100105
/// Convert exprt to a specific type. Throw bad_cast if conversion
101106
/// cannot be performed
102107
/// Generic case doesn't exist, specialize for different types accordingly
@@ -832,7 +837,8 @@ decision_proceduret::resultt string_refinementt::dec_solve()
832837
{
833838
debug()<< "constraint " << i << eom;
834839
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);
836842
for(const exprt &lemma : lemmas)
837843
add_lemma(lemma);
838844
}
@@ -1902,19 +1908,23 @@ static exprt instantiate(
19021908
/// substituting the quantifiers and generating axioms.
19031909
/// \param [in] axiom: the axiom to instantiate
19041910
/// \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)
19071915
{
19081916
const string_exprt s0=to_string_expr(axiom.s0());
19091917
const string_exprt s1=to_string_expr(axiom.s1());
19101918

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 { };
19181928
}
19191929

19201930
/// Replace array-lists by 'with' expressions.

src/solvers/refinement/string_refinement.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,6 @@ class string_refinementt final: public bv_refinementt
104104

105105
void set_char_array_equality(const exprt &lhs, const exprt &rhs);
106106

107-
std::vector<exprt> instantiate_not_contains(
108-
const string_not_contains_constraintt &axiom);
109-
110107
exprt get_array(const exprt &arr, const exprt &size) const;
111108
exprt get_array(const exprt &arr) const;
112109

0 commit comments

Comments
 (0)