mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
add detection of non-fixed variables to consequence finding
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
7562efbe84
commit
cb2d8d2107
10 changed files with 188 additions and 25 deletions
|
@ -32,7 +32,10 @@ Notes:
|
|||
#include "opt_params.hpp"
|
||||
#include "model_smt2_pp.h"
|
||||
|
||||
static opt::context& get_opt(cmd_context& cmd) {
|
||||
static opt::context& get_opt(cmd_context& cmd, opt::context* opt) {
|
||||
if (opt) {
|
||||
return *opt;
|
||||
}
|
||||
if (!cmd.get_opt()) {
|
||||
cmd.set_opt(alloc(opt::context, cmd.m()));
|
||||
}
|
||||
|
@ -43,12 +46,14 @@ static opt::context& get_opt(cmd_context& cmd) {
|
|||
class assert_soft_cmd : public parametric_cmd {
|
||||
unsigned m_idx;
|
||||
expr* m_formula;
|
||||
opt::context* m_opt;
|
||||
|
||||
public:
|
||||
assert_soft_cmd():
|
||||
assert_soft_cmd(opt::context* opt):
|
||||
parametric_cmd("assert-soft"),
|
||||
m_idx(0),
|
||||
m_formula(0)
|
||||
m_formula(0),
|
||||
m_opt(opt)
|
||||
{}
|
||||
|
||||
virtual ~assert_soft_cmd() {
|
||||
|
@ -96,8 +101,8 @@ public:
|
|||
if (weight.is_zero()) {
|
||||
weight = rational::one();
|
||||
}
|
||||
symbol id = ps().get_sym(symbol("id"), symbol::null);
|
||||
get_opt(ctx).add_soft_constraint(m_formula, weight, id);
|
||||
symbol id = ps().get_sym(symbol("id"), symbol::null);
|
||||
get_opt(ctx, m_opt).add_soft_constraint(m_formula, weight, id);
|
||||
reset(ctx);
|
||||
}
|
||||
|
||||
|
@ -108,11 +113,13 @@ public:
|
|||
|
||||
class min_maximize_cmd : public cmd {
|
||||
bool m_is_max;
|
||||
opt::context* m_opt;
|
||||
|
||||
public:
|
||||
min_maximize_cmd(bool is_max):
|
||||
min_maximize_cmd(bool is_max, opt::context* opt):
|
||||
cmd(is_max?"maximize":"minimize"),
|
||||
m_is_max(is_max)
|
||||
m_is_max(is_max),
|
||||
m_opt(opt)
|
||||
{}
|
||||
|
||||
virtual void reset(cmd_context & ctx) { }
|
||||
|
@ -126,7 +133,7 @@ public:
|
|||
if (!is_app(t)) {
|
||||
throw cmd_exception("malformed objective term: it cannot be a quantifier or bound variable");
|
||||
}
|
||||
get_opt(ctx).add_objective(to_app(t), m_is_max);
|
||||
get_opt(ctx, m_opt).add_objective(to_app(t), m_is_max);
|
||||
}
|
||||
|
||||
virtual void failure_cleanup(cmd_context & ctx) {
|
||||
|
@ -139,10 +146,10 @@ public:
|
|||
|
||||
|
||||
|
||||
void install_opt_cmds(cmd_context & ctx) {
|
||||
ctx.insert(alloc(assert_soft_cmd));
|
||||
ctx.insert(alloc(min_maximize_cmd, true));
|
||||
ctx.insert(alloc(min_maximize_cmd, false));
|
||||
void install_opt_cmds(cmd_context & ctx, opt::context* opt) {
|
||||
ctx.insert(alloc(assert_soft_cmd, opt));
|
||||
ctx.insert(alloc(min_maximize_cmd, true, opt));
|
||||
ctx.insert(alloc(min_maximize_cmd, false, opt));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -19,10 +19,11 @@ Notes:
|
|||
#define OPT_CMDS_H_
|
||||
|
||||
#include "ast.h"
|
||||
#include "opt_context.h"
|
||||
|
||||
class cmd_context;
|
||||
|
||||
void install_opt_cmds(cmd_context & ctx);
|
||||
void install_opt_cmds(cmd_context & ctx, opt::context* opt = 0);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue