3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-15 13:28:47 +00:00

Merge branch 'unstable' of https://git01.codeplex.com/z3 into unstable

This commit is contained in:
Nikolaj Bjorner 2013-03-29 08:53:50 -07:00
commit 0590101e6f
41 changed files with 61 additions and 74 deletions

View file

@ -860,7 +860,7 @@ namespace datalog {
void context::transform_rules(rule_transformer& transf) { void context::transform_rules(rule_transformer& transf) {
SASSERT(m_closed); //we must finish adding rules before we start transforming them SASSERT(m_closed); //we must finish adding rules before we start transforming them
TRACE("dl", display_rules(tout);); TRACE("dl", display_rules(tout););
if (transf(m_rule_set, m_mc)) { if (transf(m_rule_set)) {
//we have already ensured the negation is stratified and transformations //we have already ensured the negation is stratified and transformations
//should not break the stratification //should not break the stratification
m_rule_set.ensure_closed(); m_rule_set.ensure_closed();

View file

@ -319,6 +319,7 @@ namespace datalog {
void ensure_opened(); void ensure_opened();
model_converter_ref& get_model_converter() { return m_mc; } model_converter_ref& get_model_converter() { return m_mc; }
void add_model_converter(model_converter* mc) { m_mc = concat(m_mc.get(), mc); }
proof_converter_ref& get_proof_converter() { return m_pc; } proof_converter_ref& get_proof_converter() { return m_pc; }
void add_proof_converter(proof_converter* pc) { m_pc = concat(m_pc.get(), pc); } void add_proof_converter(proof_converter* pc) { m_pc = concat(m_pc.get(), pc); }

View file

@ -211,7 +211,7 @@ namespace datalog {
return true; return true;
} }
rule_set * mk_array_blast::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_array_blast::operator()(rule_set const & source) {
rule_set* rules = alloc(rule_set, m_ctx); rule_set* rules = alloc(rule_set, m_ctx);
rule_set::iterator it = source.begin(), end = source.end(); rule_set::iterator it = source.begin(), end = source.end();

View file

@ -56,7 +56,7 @@ namespace datalog {
virtual ~mk_array_blast(); virtual ~mk_array_blast();
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };

View file

@ -257,7 +257,7 @@ namespace datalog {
m_blaster.updt_params(m_params); m_blaster.updt_params(m_params);
} }
rule_set * operator()(rule_set const & source, model_converter_ref& mc) { rule_set * operator()(rule_set const & source) {
// TODO pc // TODO pc
if (!m_context.get_params().bit_blast()) { if (!m_context.get_params().bit_blast()) {
return 0; return 0;
@ -286,7 +286,7 @@ namespace datalog {
result->add_rule(m_rules.get(i)); result->add_rule(m_rules.get(i));
} }
if (mc) { if (m_context.get_model_converter()) {
filter_model_converter* fmc = alloc(filter_model_converter, m); filter_model_converter* fmc = alloc(filter_model_converter, m);
bit_blast_model_converter* bvmc = alloc(bit_blast_model_converter, m); bit_blast_model_converter* bvmc = alloc(bit_blast_model_converter, m);
func_decl_ref_vector const& old_funcs = m_rewriter.m_cfg.old_funcs(); func_decl_ref_vector const& old_funcs = m_rewriter.m_cfg.old_funcs();
@ -295,7 +295,7 @@ namespace datalog {
fmc->insert(new_funcs[i]); fmc->insert(new_funcs[i]);
bvmc->insert(old_funcs[i], new_funcs[i]); bvmc->insert(old_funcs[i], new_funcs[i]);
} }
mc = concat(mc.get(), concat(bvmc, fmc)); m_context.add_model_converter(concat(bvmc, fmc));
} }
return result; return result;
@ -310,8 +310,8 @@ namespace datalog {
dealloc(m_impl); dealloc(m_impl);
} }
rule_set * mk_bit_blast::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_bit_blast::operator()(rule_set const & source) {
return (*m_impl)(source, mc); return (*m_impl)(source);
} }
}; };

View file

@ -44,7 +44,7 @@ namespace datalog {
mk_bit_blast(context & ctx, unsigned priority = 35000); mk_bit_blast(context & ctx, unsigned priority = 35000);
~mk_bit_blast(); ~mk_bit_blast();
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -171,7 +171,7 @@ namespace datalog {
return true; return true;
} }
rule_set * mk_coalesce::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_coalesce::operator()(rule_set const & source) {
rule_set* rules = alloc(rule_set, m_ctx); rule_set* rules = alloc(rule_set, m_ctx);
rule_set::decl2rules::iterator it = source.begin_grouped_rules(), end = source.end_grouped_rules(); rule_set::decl2rules::iterator it = source.begin_grouped_rules(), end = source.end_grouped_rules();
for (; it != end; ++it) { for (; it != end; ++it) {

View file

@ -52,7 +52,7 @@ namespace datalog {
*/ */
mk_coalesce(context & ctx); mk_coalesce(context & ctx);
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -33,9 +33,7 @@ namespace datalog {
// ----------------------------------- // -----------------------------------
rule_set * mk_coi_filter::operator()( rule_set * mk_coi_filter::operator()(rule_set const & source)
rule_set const & source,
model_converter_ref& mc)
{ {
if (source.get_num_rules()==0) { if (source.get_num_rules()==0) {
return 0; return 0;
@ -80,7 +78,7 @@ namespace datalog {
if (interesting_preds.contains(pred)) { if (interesting_preds.contains(pred)) {
res->add_rule(r); res->add_rule(r);
} }
else if (mc.get()) { else if (m_context.get_model_converter()) {
pruned_preds.insert(pred); pruned_preds.insert(pred);
} }
} }
@ -89,14 +87,14 @@ namespace datalog {
res = 0; res = 0;
} }
if (res && mc) { if (res && m_context.get_model_converter()) {
decl_set::iterator end = pruned_preds.end(); decl_set::iterator end = pruned_preds.end();
decl_set::iterator it = pruned_preds.begin(); decl_set::iterator it = pruned_preds.begin();
extension_model_converter* mc0 = alloc(extension_model_converter, m); extension_model_converter* mc0 = alloc(extension_model_converter, m);
for (; it != end; ++it) { for (; it != end; ++it) {
mc0->insert(*it, m.mk_true()); mc0->insert(*it, m.mk_true());
} }
mc = concat(mc.get(), mc0); m_context.add_model_converter(mc0);
} }
return res.detach(); return res.detach();

View file

@ -38,9 +38,7 @@ namespace datalog {
m(ctx.get_manager()), m(ctx.get_manager()),
m_context(ctx) {} m_context(ctx) {}
rule_set * operator()(rule_set const & source);
rule_set * operator()(rule_set const & source,
model_converter_ref& mc);
}; };
}; };

View file

@ -174,11 +174,9 @@ namespace datalog {
} }
} }
#if 1
virtual void deallocate() { virtual void deallocate() {
get_plugin().recycle(this); get_plugin().recycle(this);
} }
#endif
public: public:
@ -875,14 +873,12 @@ namespace datalog {
} }
} }
rule_set * mk_explanations::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_explanations::operator()(rule_set const & source) {
SASSERT(!mc);
if(source.get_num_rules()==0) { if(source.get_num_rules()==0) {
return 0; return 0;
} }
m_context.collect_predicates(m_original_preds); m_context.collect_predicates(m_original_preds);
rule_set * res = alloc(rule_set, m_context); rule_set * res = alloc(rule_set, m_context);
transform_facts(m_context.get_rel_context().get_rmanager()); transform_facts(m_context.get_rel_context().get_rmanager());
transform_rules(source, *res); transform_rules(source, *res);

View file

@ -82,7 +82,7 @@ namespace datalog {
return get_union_decl(m_context); return get_union_decl(m_context);
} }
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
static expr* get_explanation(relation_base const& r); static expr* get_explanation(relation_base const& r);
}; };

View file

@ -355,7 +355,7 @@ namespace datalog {
m_quantifiers.reset(); m_quantifiers.reset();
} }
rule_set * mk_extract_quantifiers::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_extract_quantifiers::operator()(rule_set const & source) {
reset(); reset();
rule_set::iterator it = source.begin(), end = source.end(); rule_set::iterator it = source.begin(), end = source.end();
for (; !m_has_quantifiers && it != end; ++it) { for (; !m_has_quantifiers && it != end; ++it) {

View file

@ -77,7 +77,7 @@ namespace datalog {
void set_query(func_decl* q); void set_query(func_decl* q);
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
bool has_quantifiers() { return m_has_quantifiers; } bool has_quantifiers() { return m_has_quantifiers; }

View file

@ -150,7 +150,7 @@ namespace datalog {
} }
} }
rule_set * mk_filter_rules::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_filter_rules::operator()(rule_set const & source) {
// TODO mc, pc // TODO mc, pc
m_tail2filter.reset(); m_tail2filter.reset();
m_result = alloc(rule_set, m_context); m_result = alloc(rule_set, m_context);

View file

@ -72,7 +72,7 @@ namespace datalog {
/** /**
\brief Return a new rule set where only filter rules contain atoms with repeated variables and/or values. \brief Return a new rule set where only filter rules contain atoms with repeated variables and/or values.
*/ */
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -567,7 +567,7 @@ namespace datalog {
return modified; return modified;
} }
rule_set * mk_interp_tail_simplifier::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_interp_tail_simplifier::operator()(rule_set const & source) {
if (source.get_num_rules() == 0) { if (source.get_num_rules() == 0) {
return 0; return 0;
} }

View file

@ -93,7 +93,7 @@ namespace datalog {
*/ */
bool transform_rule(rule * r, rule_ref& res); bool transform_rule(rule * r, rule_ref& res);
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -553,7 +553,7 @@ namespace datalog {
m_hb.set_cancel(true); m_hb.set_cancel(true);
} }
rule_set * mk_karr_invariants::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_karr_invariants::operator()(rule_set const & source) {
if (!m_ctx.get_params().karr()) { if (!m_ctx.get_params().karr()) {
return 0; return 0;
} }
@ -623,7 +623,7 @@ namespace datalog {
for (; it != end; ++it) { for (; it != end; ++it) {
update_body(*rules, **it); update_body(*rules, **it);
} }
if (mc) { if (m_ctx.get_model_converter()) {
add_invariant_model_converter* kmc = alloc(add_invariant_model_converter, m); add_invariant_model_converter* kmc = alloc(add_invariant_model_converter, m);
rule_set::decl2rules::iterator git = source.begin_grouped_rules(); rule_set::decl2rules::iterator git = source.begin_grouped_rules();
rule_set::decl2rules::iterator gend = source.end_grouped_rules(); rule_set::decl2rules::iterator gend = source.end_grouped_rules();
@ -634,7 +634,7 @@ namespace datalog {
kmc->add(p, *M); kmc->add(p, *M);
} }
} }
mc = concat(mc.get(), kmc); m_ctx.add_model_converter(kmc);
} }
TRACE("dl", rules->display(tout);); TRACE("dl", rules->display(tout););
return rules; return rules;

View file

@ -73,7 +73,7 @@ namespace datalog {
virtual void cancel(); virtual void cancel();
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };

View file

@ -317,8 +317,8 @@ namespace datalog {
m_rules.push_back(r); m_rules.push_back(r);
} }
rule_set * mk_magic_sets::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_magic_sets::operator()(rule_set const & source) {
SASSERT(!mc); SASSERT(!m_context.get_model_converter());
unsigned init_rule_cnt = source.get_num_rules(); unsigned init_rule_cnt = source.get_num_rules();
{ {
func_decl_set intentional; func_decl_set intentional;

View file

@ -121,7 +121,7 @@ namespace datalog {
*/ */
mk_magic_sets(context & ctx, rule * goal_rule); mk_magic_sets(context & ctx, rule * goal_rule);
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -86,7 +86,7 @@ namespace datalog {
} }
rule_set * mk_partial_equivalence_transformer::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_partial_equivalence_transformer::operator()(rule_set const & source) {
// TODO mc // TODO mc
if (source.get_num_rules() == 0) { if (source.get_num_rules() == 0) {

View file

@ -35,7 +35,7 @@ namespace datalog {
m(ctx.get_manager()), m(ctx.get_manager()),
m_context(ctx) {} m_context(ctx) {}
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
private: private:

View file

@ -241,8 +241,10 @@ namespace datalog {
return false; return false;
} }
//these conditions are optional, they avoid possible exponential increase //
//in the size of the problem // these conditions are optional, they avoid possible exponential increase
// in the size of the problem
//
return return
//m_head_pred_non_empty_tails_ctr.get(pred)<=1 //m_head_pred_non_empty_tails_ctr.get(pred)<=1
@ -837,7 +839,7 @@ namespace datalog {
return done_something; return done_something;
} }
rule_set * mk_rule_inliner::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_rule_inliner::operator()(rule_set const & source) {
bool something_done = false; bool something_done = false;
ref<horn_subsume_model_converter> hsmc; ref<horn_subsume_model_converter> hsmc;
@ -854,7 +856,7 @@ namespace datalog {
} }
if (mc) { if (m_context.get_model_converter()) {
hsmc = alloc(horn_subsume_model_converter, m); hsmc = alloc(horn_subsume_model_converter, m);
} }
m_mc = hsmc.get(); m_mc = hsmc.get();
@ -881,9 +883,7 @@ namespace datalog {
res = 0; res = 0;
} }
else { else {
if (mc) { m_context.add_model_converter(hsmc.get());
mc = concat(mc.get(), hsmc.get());
}
} }
return res.detach(); return res.detach();

View file

@ -196,7 +196,7 @@ namespace datalog {
{} {}
virtual ~mk_rule_inliner() { } virtual ~mk_rule_inliner() { }
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -500,7 +500,7 @@ namespace datalog {
} }
} }
rule_set * mk_similarity_compressor::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_similarity_compressor::operator()(rule_set const & source) {
// TODO mc // TODO mc
m_modified = false; m_modified = false;
unsigned init_rule_cnt = source.get_num_rules(); unsigned init_rule_cnt = source.get_num_rules();

View file

@ -69,7 +69,7 @@ namespace datalog {
public: public:
mk_similarity_compressor(context & ctx, unsigned threshold_count); mk_similarity_compressor(context & ctx, unsigned threshold_count);
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -718,8 +718,7 @@ namespace datalog {
} }
}; };
rule_set * mk_simple_joins::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_simple_joins::operator()(rule_set const & source) {
// TODO mc
rule_set rs_aux_copy(m_context); rule_set rs_aux_copy(m_context);
rs_aux_copy.add_rules(source); rs_aux_copy.add_rules(source);
if(!rs_aux_copy.is_closed()) { if(!rs_aux_copy.is_closed()) {

View file

@ -53,7 +53,7 @@ namespace datalog {
public: public:
mk_simple_joins(context & ctx); mk_simple_joins(context & ctx);
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -802,7 +802,7 @@ namespace datalog {
} }
} }
rule_set * mk_slice::operator()(rule_set const & src, model_converter_ref& mc) { rule_set * mk_slice::operator()(rule_set const & src) {
for (unsigned i = 0; i < src.get_num_rules(); ++i) { for (unsigned i = 0; i < src.get_num_rules(); ++i) {
if (src.get_rule(i)->has_quantifiers()) { if (src.get_rule(i)->has_quantifiers()) {
return 0; return 0;
@ -813,7 +813,7 @@ namespace datalog {
if (m_ctx.generate_proof_trace()) { if (m_ctx.generate_proof_trace()) {
spc = alloc(slice_proof_converter, m_ctx); spc = alloc(slice_proof_converter, m_ctx);
} }
if (mc) { if (m_ctx.get_model_converter()) {
smc = alloc(slice_model_converter, *this, m); smc = alloc(slice_model_converter, *this, m);
} }
m_pc = spc.get(); m_pc = spc.get();
@ -836,7 +836,7 @@ namespace datalog {
} }
} }
m_ctx.add_proof_converter(spc.get()); m_ctx.add_proof_converter(spc.get());
mc = concat(mc.get(), smc.get()); m_ctx.add_model_converter(smc.get());
return result; return result;
} }

View file

@ -102,7 +102,7 @@ namespace datalog {
virtual ~mk_slice() { } virtual ~mk_slice() { }
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
func_decl* get_predicate(func_decl* p) { func_decl* q = p; m_predicates.find(p, q); return q; } func_decl* get_predicate(func_decl* p) { func_decl* q = p; m_predicates.find(p, q); return q; }

View file

@ -332,7 +332,7 @@ namespace datalog {
} }
} }
rule_set * mk_subsumption_checker::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_subsumption_checker::operator()(rule_set const & source) {
// TODO mc // TODO mc
m_have_new_total_rule = false; m_have_new_total_rule = false;

View file

@ -84,7 +84,7 @@ namespace datalog {
reset_dealloc_values(m_ground_unconditional_rule_heads); reset_dealloc_values(m_ground_unconditional_rule_heads);
} }
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -334,7 +334,7 @@ namespace datalog {
} }
} }
rule_set * mk_unbound_compressor::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_unbound_compressor::operator()(rule_set const & source) {
// TODO mc // TODO mc
m_modified = false; m_modified = false;

View file

@ -82,7 +82,7 @@ namespace datalog {
public: public:
mk_unbound_compressor(context & ctx); mk_unbound_compressor(context & ctx);
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -50,7 +50,7 @@ namespace datalog {
} }
} }
rule_set * mk_unfold::operator()(rule_set const & source, model_converter_ref& mc) { rule_set * mk_unfold::operator()(rule_set const & source) {
rule_set* rules = alloc(rule_set, m_ctx); rule_set* rules = alloc(rule_set, m_ctx);
rule_set::iterator it = source.begin(), end = source.end(); rule_set::iterator it = source.begin(), end = source.end();
for (; it != end; ++it) { for (; it != end; ++it) {

View file

@ -44,7 +44,7 @@ namespace datalog {
*/ */
mk_unfold(context & ctx); mk_unfold(context & ctx);
rule_set * operator()(rule_set const & source, model_converter_ref& mc); rule_set * operator()(rule_set const & source);
}; };
}; };

View file

@ -71,7 +71,7 @@ namespace datalog {
m_dirty=true; m_dirty=true;
} }
bool rule_transformer::operator()(rule_set & rules, model_converter_ref& mc) { bool rule_transformer::operator()(rule_set & rules) {
ensure_ordered(); ensure_ordered();
bool modified = false; bool modified = false;
@ -85,7 +85,7 @@ namespace datalog {
for(; it!=end && !m_context.canceled(); ++it) { for(; it!=end && !m_context.canceled(); ++it) {
plugin & p = **it; plugin & p = **it;
rule_set * new_rules = p(rules, mc); rule_set * new_rules = p(rules);
if (!new_rules) { if (!new_rules) {
continue; continue;
} }

View file

@ -23,7 +23,6 @@ Revision History:
#include"vector.h" #include"vector.h"
#include"dl_rule.h" #include"dl_rule.h"
#include"dl_rule_set.h" #include"dl_rule_set.h"
#include"model_converter.h"
namespace datalog { namespace datalog {
@ -67,7 +66,7 @@ namespace datalog {
\brief Transform the rule set using the registered transformation plugins. If the rule \brief Transform the rule set using the registered transformation plugins. If the rule
set has changed, return true; otherwise return false. set has changed, return true; otherwise return false.
*/ */
bool operator()(rule_set & rules, model_converter_ref& mc); bool operator()(rule_set & rules);
}; };
class rule_transformer::plugin { class rule_transformer::plugin {
@ -104,8 +103,7 @@ namespace datalog {
The caller takes ownership of the returned \c rule_set object. The caller takes ownership of the returned \c rule_set object.
*/ */
virtual rule_set * operator()(rule_set const & source, virtual rule_set * operator()(rule_set const & source) = 0;
model_converter_ref& mc) = 0;
/** /**
Removes duplicate tails. Removes duplicate tails.

View file

@ -1056,11 +1056,9 @@ void hilbert_basis::select_inequality() {
unsigned best = m_current_ineq; unsigned best = m_current_ineq;
unsigned non_zeros = get_num_nonzeros(m_ineqs[best]); unsigned non_zeros = get_num_nonzeros(m_ineqs[best]);
unsigned prod = get_ineq_product(m_ineqs[best]); unsigned prod = get_ineq_product(m_ineqs[best]);
//numeral diff = get_ineq_diff(m_ineqs[best]);
for (unsigned j = best+1; prod != 0 && j < m_ineqs.size(); ++j) { for (unsigned j = best+1; prod != 0 && j < m_ineqs.size(); ++j) {
unsigned non_zeros2 = get_num_nonzeros(m_ineqs[j]); unsigned non_zeros2 = get_num_nonzeros(m_ineqs[j]);
unsigned prod2 = get_ineq_product(m_ineqs[j]); unsigned prod2 = get_ineq_product(m_ineqs[j]);
//numeral diff2 = get_ineq_diff(m_ineqs[j]);
if (prod2 == 0) { if (prod2 == 0) {
prod = prod2; prod = prod2;
non_zeros = non_zeros2; non_zeros = non_zeros2;
@ -1069,7 +1067,6 @@ void hilbert_basis::select_inequality() {
} }
if (non_zeros2 < non_zeros || (non_zeros2 == non_zeros && prod2 < prod)) { if (non_zeros2 < non_zeros || (non_zeros2 == non_zeros && prod2 < prod)) {
prod = prod2; prod = prod2;
// diff = diff2;
non_zeros = non_zeros2; non_zeros = non_zeros2;
best = j; best = j;
} }