mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
This commit is contained in:
parent
c3549ec784
commit
52032b9ef8
9 changed files with 38 additions and 21 deletions
|
@ -1142,8 +1142,8 @@ namespace seq {
|
|||
|
||||
/**
|
||||
~contains(a, b) => ~prefix(b, a)
|
||||
~contains(a, b) => ~contains(tail(a), b) or a = empty
|
||||
~contains(a, b) & a = empty => b != empty
|
||||
~contains(a, b) => ~contains(tail(a), b)
|
||||
a = empty => tail(a) = empty
|
||||
~(a = empty) => a = head + tail
|
||||
*/
|
||||
void axioms::unroll_not_contains(expr* e) {
|
||||
|
@ -1165,7 +1165,7 @@ namespace seq {
|
|||
expr_ref bound_tracker = m_sk.mk_length_limit(s, k);
|
||||
expr* s0 = nullptr;
|
||||
if (seq.str.is_stoi(s, s0))
|
||||
s = s0;
|
||||
s = s0;
|
||||
add_clause(~bound_tracker, mk_le(mk_len(s), k));
|
||||
return bound_tracker;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ Author:
|
|||
|
||||
--*/
|
||||
|
||||
#include "ast/ast_pp.h"
|
||||
#include "ast/rewriter/seq_eq_solver.h"
|
||||
#include "ast/bv_decl_plugin.h"
|
||||
|
||||
|
@ -675,7 +676,7 @@ namespace seq {
|
|||
if (rs.size() > i) {
|
||||
unsigned diff = rs.size() - (i + 1);
|
||||
for (unsigned j = 0; same && j < i; ++j)
|
||||
same = !m.are_distinct(ls[j], rs[diff + j]);
|
||||
same = !m.are_distinct(ls[j], rs[diff + j]);
|
||||
}
|
||||
// ls = x ++ rs ++ y, diff = |x|
|
||||
else {
|
||||
|
@ -704,8 +705,9 @@ namespace seq {
|
|||
bool same = true;
|
||||
// ls = x ++ rs' && rs = rs' ++ y, diff = |x|
|
||||
if (rs.size() > i) {
|
||||
for (unsigned j = 1; same && j <= i; ++j)
|
||||
same = !m.are_distinct(ls[diff + j], rs[j]);
|
||||
for (unsigned j = 1; same && j <= i; ++j) {
|
||||
same = !m.are_distinct(ls[diff + j], rs[j]);
|
||||
}
|
||||
}
|
||||
// ls = x ++ rs ++ y, diff = |x|
|
||||
else {
|
||||
|
@ -715,6 +717,7 @@ namespace seq {
|
|||
if (same)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -28,8 +28,8 @@ skolem::skolem(ast_manager& m, th_rewriter& rw):
|
|||
m_tail = "seq.tail";
|
||||
m_seq_first = "seq.first";
|
||||
m_seq_last = "seq.last";
|
||||
m_indexof_left = "seq.idx.left";
|
||||
m_indexof_right = "seq.idx.right";
|
||||
m_indexof_left = "seq.idx.l";
|
||||
m_indexof_right = "seq.idx.r";
|
||||
m_aut_step = "aut.step";
|
||||
m_pre = "seq.pre"; // (seq.pre s l): prefix of string s of length l
|
||||
m_post = "seq.post"; // (seq.post s l): suffix of string s of length k, based on extract starting at index i of length l
|
||||
|
|
|
@ -77,8 +77,10 @@ namespace seq {
|
|||
|
||||
expr_ref mk_indexof_left(expr* t, expr* s, expr* offset = nullptr) { return mk(m_indexof_left, t, s, offset); }
|
||||
expr_ref mk_indexof_right(expr* t, expr* s, expr* offset = nullptr) { return mk(m_indexof_right, t, s, offset); }
|
||||
expr_ref mk_last_indexof_left(expr* t, expr* s, expr* offset = nullptr) { return mk("seq.last_indexof_left", t, s, offset); }
|
||||
expr_ref mk_last_indexof_right(expr* t, expr* s, expr* offset = nullptr) { return mk("seq.last_indexof_right", t, s, offset); }
|
||||
expr_ref mk_contains_left(expr* t, expr* s, expr* offset = nullptr) { return mk("seq.cnt.l", t, s, offset); }
|
||||
expr_ref mk_contains_right(expr* t, expr* s, expr* offset = nullptr) { return mk("seq.cnt.r", t, s, offset); }
|
||||
expr_ref mk_last_indexof_left(expr* t, expr* s, expr* offset = nullptr) { return mk("seq.lidx.l", t, s, offset); }
|
||||
expr_ref mk_last_indexof_right(expr* t, expr* s, expr* offset = nullptr) { return mk("seq.lidx.r", t, s, offset); }
|
||||
|
||||
expr_ref mk_tail(expr* s, expr* i) { return mk(m_tail, s, i); }
|
||||
expr_ref mk_post(expr* s, expr* i) { return mk(m_post, s, i); }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue