3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-13 12:28:44 +00:00

fixups to theory_str for regex

This commit is contained in:
Murphy Berzish 2018-02-12 17:45:07 -05:00
parent 54206e3674
commit 762129d4c7
2 changed files with 14 additions and 5 deletions

View file

@ -6571,7 +6571,7 @@ namespace smt {
SASSERT(str1.length() == 1);
SASSERT(str2.length() == 1);
return 1 + str2[0] - str1[0];
} else if (u.re.is_full(re)) {
} else if (u.re.is_full_char(re) || u.re.is_full_seq(re)) {
return 1;
} else {
TRACE("str", tout << "WARNING: unknown regex term " << mk_pp(re, get_manager()) << std::endl;);
@ -6613,7 +6613,7 @@ namespace smt {
SASSERT(str1.length() == 1);
SASSERT(str2.length() == 1);
return 1 + str2[0] - str1[0];
} else if (u.re.is_full(re)) {
} else if (u.re.is_full_char(re) || u.re.is_full_seq(re)) {
return 1;
} else {
TRACE("str", tout << "WARNING: unknown regex term " << mk_pp(re, get_manager()) << std::endl;);
@ -6649,8 +6649,10 @@ namespace smt {
}
} else if (u.re.is_range(re)) {
return true;
} else if (u.re.is_full(re)) {
} else if (u.re.is_full_char(re)) {
return true;
} else if (u.re.is_full_seq(re)) {
return false; // generally unbounded
} else if (u.re.is_complement(re)) {
// TODO can we do better?
return false;
@ -6712,8 +6714,10 @@ namespace smt {
SASSERT(str1.length() == 1);
SASSERT(str2.length() == 1);
lens.insert(1);
} else if (u.re.is_full(re)) {
} else if (u.re.is_full_char(re)) {
lens.insert(1);
} else if (u.re.is_full_seq(re)) {
lens.reset();
} else if (u.re.is_complement(re)) {
lens.reset();
} else {
@ -6828,9 +6832,13 @@ namespace smt {
SASSERT(str2.length() == 1);
expr_ref retval(ctx.mk_eq_atom(lenVar, m_autil.mk_numeral(rational::one(), true)), m);
return retval;
} else if (u.re.is_full(re)) {
} else if (u.re.is_full_char(re)) {
expr_ref retval(ctx.mk_eq_atom(lenVar, m_autil.mk_numeral(rational::one(), true)), m);
return retval;
} else if (u.re.is_full_seq(re)) {
// match any unbounded string
expr_ref retval(m_autil.mk_ge(lenVar, m_autil.mk_numeral(rational::zero(), true)), m);
return retval;
} else if (u.re.is_complement(re)) {
// skip complement for now, in general this is difficult to predict
expr_ref retval(m_autil.mk_ge(lenVar, m_autil.mk_numeral(rational::zero(), true)), m);

View file

@ -745,6 +745,7 @@ protected:
void new_diseq_eh(theory_var, theory_var) override;
theory* mk_fresh(context*) override { return alloc(theory_str, get_manager(), m_params); }
void init(context * ctx) override;
void init_search_eh() override;
void add_theory_assumptions(expr_ref_vector & assumptions) override;
lbool validate_unsat_core(expr_ref_vector & unsat_core) override;