3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-24 01:25:31 +00:00

Treat arguments to recursive functions as beta redexes

An argument to a recursive function would escape the scope of the function application when the recursive function definitions are unfolded. Therefore, such argument occurrences need not be considered for extensional equality / equality sharing.

This filter is mostly relevant for recursive functions that take a lambda expression as argument. Lambda expressions / arrays that occur in shared occurrences are checked for extensionality.
This commit is contained in:
Nikolaj Bjorner 2022-06-12 10:48:55 -07:00
parent 25ad5cb073
commit 637120ced5
4 changed files with 16 additions and 0 deletions

View file

@ -333,6 +333,11 @@ namespace recfun {
return found;
}
bool solver::is_beta_redex(euf::enode* p, euf::enode* n) const {
return is_defined(p) || is_case_pred(p);
}
bool solver::add_dep(euf::enode* n, top_sort<euf::enode>& dep) {
if (n->num_args() == 0)
dep.insert(n, nullptr);

View file

@ -108,6 +108,7 @@ namespace recfun {
bool is_shared(euf::theory_var v) const override { return true; }
void init_search() override {}
bool should_research(sat::literal_vector const& core) override;
bool is_beta_redex(euf::enode* p, euf::enode* n) const;
void add_assumptions(sat::literal_set& assumptions) override;
bool tracking_assumptions() override { return true; }
};