mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 20:18:18 +00:00
65 lines
1.6 KiB
C++
65 lines
1.6 KiB
C++
/*++
|
|
Copyright (c) 2022 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
cnf_nnf.h
|
|
|
|
Abstract:
|
|
|
|
pull nested quantifiers
|
|
|
|
Author:
|
|
|
|
Nikolaj Bjorner (nbjorner) 2022-11-24
|
|
|
|
--*/
|
|
|
|
#pragma once
|
|
|
|
#include "ast/simplifiers/dependent_expr_state.h"
|
|
#include "ast/normal_forms/nnf.h"
|
|
#include "ast/rewriter/th_rewriter.h"
|
|
|
|
|
|
class cnf_nnf_simplifier : public dependent_expr_simplifier {
|
|
|
|
defined_names m_defined_names;
|
|
th_rewriter m_rewriter;
|
|
|
|
public:
|
|
cnf_nnf_simplifier(ast_manager& m, params_ref const& p, dependent_expr_state& fmls):
|
|
dependent_expr_simplifier(m, fmls),
|
|
m_defined_names(m),
|
|
m_rewriter(m, p){
|
|
}
|
|
|
|
char const* name() const override { return "cnf-nnf"; }
|
|
|
|
void reduce() override {
|
|
nnf apply_nnf(m, m_defined_names);
|
|
expr_ref_vector push_todo(m);
|
|
proof_ref_vector push_todo_prs(m);
|
|
proof_ref pr(m);
|
|
expr_ref r(m);
|
|
unsigned sz = qtail();
|
|
for (unsigned i = qhead(); i < sz && m.inc(); ++i) {
|
|
auto d = m_fmls[i];
|
|
push_todo.reset();
|
|
push_todo_prs.reset();
|
|
apply_nnf(d.fml(), push_todo, push_todo_prs, r, pr);
|
|
m_fmls.update(i, dependent_expr(m, r, d.dep()));
|
|
for (expr* f : push_todo) {
|
|
if (!m.inc())
|
|
break;
|
|
m_rewriter(f, r, pr);
|
|
m_fmls.add(dependent_expr(m, r, d.dep()));
|
|
}
|
|
}
|
|
}
|
|
|
|
void push() override { dependent_expr_simplifier::push(); m_defined_names.push(); }
|
|
|
|
void pop(unsigned n) override { dependent_expr_simplifier::pop(n); m_defined_names.pop(n); }
|
|
};
|