3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-08 18:31:49 +00:00
z3/src/smt/dyn_ack.h
Nikolaj Bjorner b19f94ae5b make include paths uniformly use path relative to src. #534
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
2017-07-31 13:24:11 -07:00

138 lines
4.3 KiB
C++

/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
dyn_ack.h
Abstract:
Support code for implementing Dynamic Ackermann's reduction
Author:
Leonardo de Moura (leonardo) 2007-04-12.
Revision History:
--*/
#ifndef DYN_ACK_H_
#define DYN_ACK_H_
#include "ast/ast.h"
#include "smt/params/dyn_ack_params.h"
#include "util/obj_hashtable.h"
#include "util/obj_pair_hashtable.h"
#include "util/obj_triple_hashtable.h"
#include "smt/smt_clause.h"
namespace smt {
class context;
class dyn_ack_manager {
typedef std::pair<app *, app *> app_pair;
typedef obj_pair_map<app, app, unsigned> app_pair2num_occs;
typedef svector<app_pair> app_pair_vector;
typedef obj_pair_hashtable<app, app> app_pair_set;
typedef obj_map<clause, app_pair> clause2app_pair;
typedef triple<app *, app *,app *> app_triple;
typedef obj_triple_map<app, app, app, unsigned> app_triple2num_occs;
typedef svector<app_triple> app_triple_vector;
typedef obj_triple_hashtable<app, app, app> app_triple_set;
typedef obj_map<clause, app_triple> clause2app_triple;
context & m_context;
ast_manager & m_manager;
dyn_ack_params & m_params;
app_pair2num_occs m_app_pair2num_occs;
app_pair_vector m_app_pairs;
app_pair_vector m_to_instantiate;
unsigned m_qhead;
unsigned m_num_instances;
unsigned m_num_propagations_since_last_gc;
app_pair_set m_instantiated;
clause2app_pair m_clause2app_pair;
struct _triple {
app_triple2num_occs m_app2num_occs;
app_triple_vector m_apps;
app_triple_vector m_to_instantiate;
unsigned m_qhead;
unsigned m_num_instances;
unsigned m_num_propagations_since_last_gc;
app_triple_set m_instantiated;
clause2app_triple m_clause2apps;
};
_triple m_triple;
void gc();
void reset_app_pairs();
friend class dyn_ack_clause_del_eh;
void del_clause_eh(clause * cls);
void instantiate(app * n1, app * n2);
literal mk_eq(expr * n1, expr * n2);
void cg_eh(app * n1, app * n2);
void eq_eh(app * n1, app * n2, app* r);
void instantiate(app * n1, app * n2, app* r);
void reset_app_triples();
void gc_triples();
public:
dyn_ack_manager(context & ctx, dyn_ack_params & p);
~dyn_ack_manager();
void setup() {
}
/**
\brief This method is invoked before the beginning of the search.
*/
void init_search_eh();
/**
\brief This method is invoked when the congruence rule was used during conflict resolution.
*/
void used_cg_eh(app * n1, app * n2) {
if (m_params.m_dack == DACK_CR)
cg_eh(n1, n2);
}
/**
\brief This method is invoked when the congruence rule is the root of a conflict.
*/
void cg_conflict_eh(app * n1, app * n2) {
if (m_params.m_dack == DACK_ROOT)
cg_eh(n1, n2);
}
/**
\brief This method is invoked when equalities are used during conflict resolution.
*/
void used_eq_eh(app * n1, app * n2, app* r) {
if (m_params.m_dack_eq)
eq_eh(n1, n2, r);
}
/**
\brief This method is invoked when it is safe to expand the new ackermann rule entries.
*/
void propagate_eh();
void reset();
#ifdef Z3DEBUG
bool check_invariant() const;
#endif
};
};
#endif /* DYN_ACK_H_ */