From c7e7b40d40399fd98aa0b7716e53e7e92d12f2bd Mon Sep 17 00:00:00 2001 From: CEisenhofer Date: Wed, 8 Apr 2026 09:27:46 +0200 Subject: [PATCH] Fix --- src/ast/euf/euf_sgraph.cpp | 3 ++- src/ast/euf/euf_snode.h | 4 +++- src/smt/seq/seq_nielsen.cpp | 5 ++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/ast/euf/euf_sgraph.cpp b/src/ast/euf/euf_sgraph.cpp index 5768d7aec..cd975c328 100644 --- a/src/ast/euf/euf_sgraph.cpp +++ b/src/ast/euf/euf_sgraph.cpp @@ -47,7 +47,6 @@ namespace euf { snode_kind sgraph::classify(expr* e) const { if (!is_app(e)) return snode_kind::s_var; - if (m_seq.str.is_empty(e)) return snode_kind::s_empty; @@ -339,6 +338,8 @@ namespace euf { compute_metadata(n); compute_hash_matrix(n); m_nodes.push_back(n); + SASSERT(!n->is_char_or_unit() || m_seq.str.is_unit(n->get_expr())); + if (e) { unsigned eid = e->get_id(); m_expr2snode.reserve(eid + 1, nullptr); diff --git a/src/ast/euf/euf_snode.h b/src/ast/euf/euf_snode.h index b2241f0ee..1f8d3903b 100644 --- a/src/ast/euf/euf_snode.h +++ b/src/ast/euf/euf_snode.h @@ -27,6 +27,7 @@ Author: #include "util/region.h" #include "ast/ast.h" #include "ast/seq_decl_plugin.h" +#include "ast/rewriter/seq_axioms.h" namespace euf { @@ -88,8 +89,9 @@ namespace euf { n->m_kind = k; n->m_id = id; n->m_num_args = num_args; - for (unsigned i = 0; i < num_args; ++i) + for (unsigned i = 0; i < num_args; ++i) { n->m_args[i] = args[i]; + } return n; } diff --git a/src/smt/seq/seq_nielsen.cpp b/src/smt/seq/seq_nielsen.cpp index cf34e00de..2d857efea 100644 --- a/src/smt/seq/seq_nielsen.cpp +++ b/src/smt/seq/seq_nielsen.cpp @@ -267,6 +267,7 @@ namespace seq { } void nielsen_node::apply_subst(euf::sgraph& sg, nielsen_subst const& s) { + SASSERT(!s.m_var->is_char_or_unit() || s.m_replacement->is_char_or_unit()); SASSERT(s.m_var); SASSERT(s.m_replacement != nullptr); for (auto &eq : m_str_eq) { @@ -294,9 +295,11 @@ namespace seq { if (s.is_char_subst()) { ast_manager& m = graph().get_manager(); + expr* var_c_expr = s.m_var->arg(0)->get_expr(); + expr* repl_c_expr = s.m_replacement->arg(0)->get_expr(); add_constraint( constraint( - m.mk_eq(s.m_var->get_expr(), s.m_replacement->get_expr()), s.m_dep, m)); + m.mk_eq(var_c_expr, repl_c_expr), s.m_dep, m)); if (m_char_ranges.contains(var_id)) { auto range = m_char_ranges.find(var_id); // copy exactly