mirror of
https://github.com/Z3Prover/z3
synced 2025-08-28 14:08:55 +00:00
First draft of elim_term_ite xform. Not working.
This commit is contained in:
parent
7acea2791d
commit
6d75c31468
9 changed files with 171 additions and 5 deletions
|
@ -1,3 +1,4 @@
|
|||
|
||||
z3_add_component(transforms
|
||||
SOURCES
|
||||
dl_mk_array_blast.cpp
|
||||
|
@ -23,6 +24,7 @@ z3_add_component(transforms
|
|||
dl_transforms.cpp
|
||||
dl_mk_array_eq_rewrite.cpp
|
||||
dl_mk_array_instantiation.cpp
|
||||
dl_mk_elim_term_ite.cpp
|
||||
COMPONENT_DEPENDENCIES
|
||||
dataflow
|
||||
hilbert
|
||||
|
|
117
src/muz/transforms/dl_mk_elim_term_ite.cpp
Normal file
117
src/muz/transforms/dl_mk_elim_term_ite.cpp
Normal file
|
@ -0,0 +1,117 @@
|
|||
/*++
|
||||
Copyright (c) 2018 Arie Gurfinkel
|
||||
|
||||
Module Name:
|
||||
|
||||
dl_mk_elim_term_ite.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Remove term-ite expressions from the rules
|
||||
|
||||
Author:
|
||||
|
||||
Arie Gurfinkel (agurfinkel)
|
||||
|
||||
Revision History:
|
||||
|
||||
--*/
|
||||
|
||||
#include "muz/transforms/dl_mk_elim_term_ite.h"
|
||||
#include "tactic/core/blast_term_ite_tactic.h"
|
||||
#include "ast/ast_util.h"
|
||||
#include "tactic/tactic.h"
|
||||
#include "tactic/core/elim_term_ite_tactic.h"
|
||||
|
||||
namespace datalog {
|
||||
mk_elim_term_ite::mk_elim_term_ite(context & ctx, unsigned priority) :
|
||||
rule_transformer::plugin(priority, false),
|
||||
m_ctx(ctx),
|
||||
m(ctx.get_manager()),
|
||||
rm(ctx.get_rule_manager()) {}
|
||||
|
||||
mk_elim_term_ite::~mk_elim_term_ite() {}
|
||||
|
||||
bool mk_elim_term_ite::elim(rule &r, rule_set &new_rules){
|
||||
unsigned utsz = r.get_uninterpreted_tail_size();
|
||||
unsigned tsz = r.get_tail_size();
|
||||
expr_ref_vector new_conjs(m);
|
||||
expr_ref tmp(m);
|
||||
|
||||
bool change = false;
|
||||
|
||||
for (unsigned i = utsz; i < tsz; ++i)
|
||||
new_conjs.push_back(r.get_tail(i));
|
||||
flatten_and(new_conjs);
|
||||
|
||||
expr_ref fml1(m), fml2(m), old_body(m), body(m), head(m);
|
||||
|
||||
// blast ite
|
||||
old_body = m.mk_and(new_conjs.size(), new_conjs.c_ptr());
|
||||
body = old_body;
|
||||
blast_term_ite(body, 2);
|
||||
change = old_body != body;
|
||||
if (!change) {
|
||||
new_rules.add_rule(&r);
|
||||
return false;
|
||||
}
|
||||
new_conjs.reset();
|
||||
|
||||
// elim ite
|
||||
tactic_ref elim_term_ite = mk_elim_term_ite_tactic(m);
|
||||
goal_ref goal = alloc(class goal, m);
|
||||
goal_ref_buffer result;
|
||||
flatten_and(body, new_conjs);
|
||||
for (auto *e : new_conjs) {
|
||||
goal->assert_expr(e);
|
||||
}
|
||||
unsigned sz = goal->num_exprs();
|
||||
(*elim_term_ite)(goal, result);
|
||||
if (result.size() == 1) {
|
||||
goal_ref new_goal = result[0];
|
||||
if (new_goal->num_exprs() != sz) {
|
||||
new_conjs.reset();
|
||||
new_goal->get_formulas(new_conjs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
expr_ref_vector conjs(m);
|
||||
for (unsigned i = 0; i < utsz; ++i)
|
||||
conjs.push_back(r.get_tail(i));
|
||||
conjs.append(new_conjs);
|
||||
|
||||
body = mk_and(conjs);
|
||||
head = r.get_head();
|
||||
|
||||
fml2 = m.mk_implies(body, head);
|
||||
proof_ref p(m);
|
||||
rm.mk_rule(fml2, p, new_rules, r.name());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
rule_set * mk_elim_term_ite::operator()(rule_set const & source) {
|
||||
if (!m_ctx.elim_term_ite ()) {return nullptr;}
|
||||
|
||||
rule_set* rules = alloc(rule_set, m_ctx);
|
||||
rules->inherit_predicates(source);
|
||||
bool change = false;
|
||||
for (auto *rule : source) {
|
||||
if (m_ctx.canceled()) {
|
||||
change = false;
|
||||
break;
|
||||
}
|
||||
change |= elim(*rule, *rules);
|
||||
}
|
||||
if (!change) {
|
||||
dealloc(rules);
|
||||
rules = nullptr;
|
||||
}
|
||||
return rules;
|
||||
}
|
||||
|
||||
|
||||
}
|
38
src/muz/transforms/dl_mk_elim_term_ite.h
Normal file
38
src/muz/transforms/dl_mk_elim_term_ite.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
/*++
|
||||
Copyright (c) 2018 Arie Gurfinkel
|
||||
|
||||
Module Name:
|
||||
|
||||
dl_mk_elim_term_ite.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Remove term-ite expressions from the rules
|
||||
|
||||
Author:
|
||||
|
||||
Arie Gurfinkel (agurfinkel)
|
||||
|
||||
Revision History:
|
||||
|
||||
--*/
|
||||
#pragma once
|
||||
|
||||
#include "muz/base/dl_context.h"
|
||||
#include "muz/base/dl_rule_set.h"
|
||||
#include "muz/base/dl_rule_transformer.h"
|
||||
#include "tactic/equiv_proof_converter.h"
|
||||
|
||||
namespace datalog {
|
||||
class mk_elim_term_ite : public rule_transformer::plugin {
|
||||
context &m_ctx;
|
||||
ast_manager &m;
|
||||
rule_manager &rm;
|
||||
|
||||
bool elim(rule &r, rule_set &new_rules);
|
||||
public:
|
||||
mk_elim_term_ite(context &ctx, unsigned priority);
|
||||
~mk_elim_term_ite() override;
|
||||
rule_set * operator()(const rule_set &source) override;
|
||||
};
|
||||
}
|
|
@ -35,6 +35,7 @@ Revision History:
|
|||
#include "muz/transforms/dl_mk_scale.h"
|
||||
#include "muz/transforms/dl_mk_array_eq_rewrite.h"
|
||||
#include "muz/transforms/dl_mk_array_instantiation.h"
|
||||
#include "muz/transforms/dl_mk_elim_term_ite.h"
|
||||
#include "muz/base/fp_params.hpp"
|
||||
|
||||
namespace datalog {
|
||||
|
@ -95,6 +96,8 @@ namespace datalog {
|
|||
if (ctx.get_params().xform_magic()) {
|
||||
transf.register_plugin(alloc(datalog::mk_magic_symbolic, ctx, 36020));
|
||||
}
|
||||
|
||||
transf.register_plugin(alloc(datalog::mk_elim_term_ite, ctx, 34999));
|
||||
ctx.transform_rules(transf);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue