@@ -99,6 +99,7 @@ static std::vector<exprt> instantiate_not_contains(
99
99
const namespacet &ns,
100
100
const string_not_contains_constraintt &axiom,
101
101
const std::map<exprt, std::set<exprt>> &index_set,
102
+ const std::map<exprt, std::set<exprt>> ¤t_index_set,
102
103
const string_constraint_generatort &generator);
103
104
104
105
static exprt get_array (
@@ -850,7 +851,12 @@ decision_proceduret::resultt string_refinementt::dec_solve()
850
851
debug () << " constraint " << i << ' \n ' ;
851
852
const std::vector<exprt> lemmas=
852
853
instantiate_not_contains (
853
- debug (), ns, not_contains_axioms[i], index_set, generator);
854
+ debug (),
855
+ ns,
856
+ not_contains_axioms[i],
857
+ index_set,
858
+ current_index_set,
859
+ generator);
854
860
for (const exprt &lemma : lemmas)
855
861
add_lemma (lemma);
856
862
}
@@ -1510,23 +1516,26 @@ static std::pair<bool, std::vector<exprt>> check_axioms(
1510
1516
1511
1517
if (use_counter_example)
1512
1518
{
1513
- // TODO: add counter examples for not_contains?
1519
+ stream << " Adding counter-examples: " << eom;
1520
+ // TODO: add counter-examples for universal constraints?
1514
1521
1515
- // Checking if the current solution satisfies the constraints
1516
1522
std::vector<exprt> lemmas;
1517
- for (const auto &v : violated )
1523
+ for (const auto &v : violated_not_contains )
1518
1524
{
1519
1525
const exprt &val=v.second ;
1520
- const string_constraintt &axiom=universal_axioms[v.first ];
1521
-
1522
- exprt premise (axiom.premise ());
1523
- exprt body (axiom.body ());
1524
- implies_exprt instance (premise, body);
1525
- replace_expr (symbol_resolve, instance);
1526
- replace_expr (axiom.univ_var (), val, instance);
1527
- stream << " adding counter example " << from_expr (ns, " " , instance)
1528
- << eom;
1529
- lemmas.push_back (instance);
1526
+ const string_not_contains_constraintt &axiom=
1527
+ not_contains_axioms[v.first ];
1528
+
1529
+ const exprt func_val=generator.get_witness_of (axiom, val);
1530
+ const exprt comp_val=simplify_sum (plus_exprt (val, func_val));
1531
+
1532
+ std::set<std::pair<exprt, exprt>> indices;
1533
+ indices.insert (std::pair<exprt, exprt>(comp_val, func_val));
1534
+ const exprt counter=::instantiate_not_contains (
1535
+ axiom, indices, generator)[0 ];
1536
+
1537
+ stream << " - " << from_expr (ns, " " , counter) << eom;
1538
+ lemmas.push_back (counter);
1530
1539
}
1531
1540
return { false , lemmas };
1532
1541
}
@@ -1960,19 +1969,36 @@ static std::vector<exprt> instantiate_not_contains(
1960
1969
const namespacet &ns,
1961
1970
const string_not_contains_constraintt &axiom,
1962
1971
const std::map<exprt, std::set<exprt>> &index_set,
1972
+ const std::map<exprt, std::set<exprt>> ¤t_index_set,
1963
1973
const string_constraint_generatort &generator)
1964
1974
{
1965
- const string_exprt s0=to_string_expr ( axiom.s0 () );
1966
- const string_exprt s1=to_string_expr ( axiom.s1 () );
1975
+ const string_exprt & s0=axiom.s0 ();
1976
+ const string_exprt & s1=axiom.s1 ();
1967
1977
1968
1978
stream << " instantiate not contains " << from_expr (ns, " " , s0) << " : "
1969
1979
<< from_expr (ns, " " , s1) << messaget::eom;
1970
- const auto &i0=index_set.find (s0.content ());
1971
- const auto &i1=index_set.find (s1.content ());
1972
- if (i0!=index_set.end () && i1!=index_set.end ())
1980
+
1981
+ const auto &index_set0=index_set.find (s0.content ());
1982
+ const auto &index_set1=index_set.find (s1.content ());
1983
+ const auto ¤t_index_set0=current_index_set.find (s0.content ());
1984
+ const auto ¤t_index_set1=current_index_set.find (s1.content ());
1985
+
1986
+ if (index_set0!=index_set.end () &&
1987
+ index_set1!=index_set.end () &&
1988
+ current_index_set0!=index_set.end () &&
1989
+ current_index_set1!=index_set.end ())
1973
1990
{
1974
- return ::instantiate_not_contains (
1975
- axiom, i0->second , i1->second , generator);
1991
+ typedef std::pair<exprt, exprt> expr_pairt;
1992
+ std::set<expr_pairt> index_pairs;
1993
+
1994
+ for (const auto &ic0 : current_index_set0->second )
1995
+ for (const auto &i1 : index_set1->second )
1996
+ index_pairs.insert (expr_pairt (ic0, i1));
1997
+ for (const auto &ic1 : current_index_set1->second )
1998
+ for (const auto &i0 : index_set0->second )
1999
+ index_pairs.insert (expr_pairt (i0, ic1));
2000
+
2001
+ return ::instantiate_not_contains (axiom, index_pairs, generator);
1976
2002
}
1977
2003
return { };
1978
2004
}
0 commit comments