mirror of
https://github.com/Z3Prover/z3
synced 2026-02-20 07:24:40 +00:00
Subterms Theory (#8115)
* somewhaat failed attempt at declaring subterm predicate I can't really figure out how to link the smt parser to the rest of the machinenery, so I will stop here and try from the other side. I'll start implmenting the logic and see if it brings me back to the parser. * initial logic implmentation Very primitive, but I don't like have that much work uncommitted. * parser implementation * more theory * Working base * subterm reflexivity * a few optimization Skip adding obvious equalities or disequality * removed some optimisations * better handling of backtracking * stupid segfault Add m_subterm to the trail * Update src/smt/theory_datatype.h Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/ast/rewriter/datatype_rewriter.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/smt/theory_datatype.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/smt/theory_datatype.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/smt/theory_datatype.cpp Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * review * forgot to update `iterate_subterm`'s signature * fix iterator segfault * Remove duplicate include statement Removed duplicate include of 'theory_datatype.h'. * Replace 'optional' with 'std::option' in datatype_decl_plugin.h * Add is_subterm_predicate matcher to datatype_decl_plugin * Change std::option to std::optional for m_subterm * Update pdecl.h * Change has_subterm to use has_value method * Update pdecl.cpp --------- Co-authored-by: Nikolaj Bjorner <nbjorner@microsoft.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
parent
a6c1d32074
commit
9ca6580e38
9 changed files with 563 additions and 32 deletions
|
|
@ -541,6 +541,12 @@ void pconstructor_decl::display(std::ostream & out, pdatatype_decl const * const
|
|||
out << ")";
|
||||
}
|
||||
|
||||
// ~~~~~~~~~~~~ psubterm_decl ~~~~~~~~~~~~ //
|
||||
std::ostream& psubterm_decl::display(std::ostream & out) const {
|
||||
return out << ":subterm " << m_name;
|
||||
}
|
||||
|
||||
|
||||
pdatatype_decl::pdatatype_decl(unsigned id, unsigned num_params, pdecl_manager & m,
|
||||
symbol const & n, unsigned num_constructors, pconstructor_decl * const * constructors):
|
||||
psort_decl(id, num_params, m, n),
|
||||
|
|
@ -589,7 +595,11 @@ datatype_decl * pdatatype_decl::instantiate_decl(pdecl_manager & m, unsigned n,
|
|||
for (auto c : m_constructors)
|
||||
cs.push_back(c->instantiate_decl(m, n, s));
|
||||
datatype_util util(m.m());
|
||||
return mk_datatype_decl(util, m_name, m_num_params, s, cs.size(), cs.data());
|
||||
symbol subterm_name = symbol::null;
|
||||
if (m_subterm.has_value()) {
|
||||
subterm_name = m_subterm->get_name();
|
||||
}
|
||||
return mk_datatype_decl(util, m_name, m_num_params, s, cs.size(), cs.data(), subterm_name);
|
||||
}
|
||||
|
||||
struct datatype_decl_buffer {
|
||||
|
|
@ -647,6 +657,9 @@ std::ostream& pdatatype_decl::display(std::ostream & out) const {
|
|||
}
|
||||
first = false;
|
||||
}
|
||||
if (m_subterm.has_value()) {
|
||||
m_subterm->display(out);
|
||||
}
|
||||
return out << ")";
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue