refactor(library/type_context): with the new tracing infrastructure, type_context doesn't need an io_state
This commit is contained in:
parent
58ab526d44
commit
7da64a768f
24 changed files with 95 additions and 89 deletions
|
@ -541,7 +541,7 @@ static void print_simp_rules(parser & p) {
|
||||||
if (p.curr_is_identifier()) {
|
if (p.curr_is_identifier()) {
|
||||||
ns = p.get_name_val();
|
ns = p.get_name_val();
|
||||||
p.next();
|
p.next();
|
||||||
s = get_simp_rule_sets(p.env(), p.ios(), ns);
|
s = get_simp_rule_sets(p.env(), p.get_options(), ns);
|
||||||
} else {
|
} else {
|
||||||
s = get_simp_rule_sets(p.env());
|
s = get_simp_rule_sets(p.env());
|
||||||
}
|
}
|
||||||
|
@ -1394,7 +1394,7 @@ static environment replace_cmd(parser & p) {
|
||||||
parse_expr_vector(p, to);
|
parse_expr_vector(p, to);
|
||||||
if (from.size() != to.size())
|
if (from.size() != to.size())
|
||||||
throw parser_error("invalid #replace command, from/to vectors have different size", pos);
|
throw parser_error("invalid #replace command, from/to vectors have different size", pos);
|
||||||
tmp_type_context ctx(env, p.ios());
|
tmp_type_context ctx(env, p.get_options());
|
||||||
fun_info_manager infom(ctx);
|
fun_info_manager infom(ctx);
|
||||||
auto r = replace(infom, e, from, to);
|
auto r = replace(infom, e, from, to);
|
||||||
if (!r)
|
if (!r)
|
||||||
|
@ -1410,7 +1410,7 @@ static environment congr_cmd_core(parser & p, congr_kind kind) {
|
||||||
auto pos = p.pos();
|
auto pos = p.pos();
|
||||||
expr e; level_param_names ls;
|
expr e; level_param_names ls;
|
||||||
std::tie(e, ls) = parse_local_expr(p);
|
std::tie(e, ls) = parse_local_expr(p);
|
||||||
tmp_type_context ctx(env, p.ios());
|
tmp_type_context ctx(env, p.get_options());
|
||||||
app_builder b(ctx);
|
app_builder b(ctx);
|
||||||
fun_info_manager infom(ctx);
|
fun_info_manager infom(ctx);
|
||||||
congr_lemma_manager cm(b, infom);
|
congr_lemma_manager cm(b, infom);
|
||||||
|
@ -1468,7 +1468,7 @@ static environment simplify_cmd(parser & p) {
|
||||||
} else if (ns == name("env")) {
|
} else if (ns == name("env")) {
|
||||||
srss = get_simp_rule_sets(p.env());
|
srss = get_simp_rule_sets(p.env());
|
||||||
} else {
|
} else {
|
||||||
srss = get_simp_rule_sets(p.env(), p.ios(), ns);
|
srss = get_simp_rule_sets(p.env(), p.get_options(), ns);
|
||||||
}
|
}
|
||||||
|
|
||||||
blast::simp::result r = blast::simplify(rel, e, srss);
|
blast::simp::result r = blast::simplify(rel, e, srss);
|
||||||
|
@ -1506,8 +1506,8 @@ static environment normalizer_cmd(parser & p) {
|
||||||
|
|
||||||
static environment abstract_expr_cmd(parser & p) {
|
static environment abstract_expr_cmd(parser & p) {
|
||||||
unsigned o = p.parse_small_nat();
|
unsigned o = p.parse_small_nat();
|
||||||
default_type_context ctx(p.env(), p.ios());
|
default_type_context ctx(p.env(), p.get_options());
|
||||||
app_builder builder(p.env(), p.ios());
|
app_builder builder(p.env(), p.get_options());
|
||||||
fun_info_manager fun_info(ctx);
|
fun_info_manager fun_info(ctx);
|
||||||
congr_lemma_manager congr_lemma(builder, fun_info);
|
congr_lemma_manager congr_lemma(builder, fun_info);
|
||||||
abstract_expr_manager ae_manager(congr_lemma);
|
abstract_expr_manager ae_manager(congr_lemma);
|
||||||
|
|
|
@ -98,8 +98,8 @@ struct app_builder::imp {
|
||||||
m_trans_getter(mk_trans_info_getter(m_ctx->env())) {
|
m_trans_getter(mk_trans_info_getter(m_ctx->env())) {
|
||||||
}
|
}
|
||||||
|
|
||||||
imp(environment const & env, io_state const & ios, reducible_behavior b):
|
imp(environment const & env, options const & o, reducible_behavior b):
|
||||||
imp(*new tmp_type_context(env, ios, b), true) {
|
imp(*new tmp_type_context(env, o, b), true) {
|
||||||
}
|
}
|
||||||
|
|
||||||
imp(tmp_type_context & ctx):
|
imp(tmp_type_context & ctx):
|
||||||
|
@ -676,12 +676,12 @@ struct app_builder::imp {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
app_builder::app_builder(environment const & env, io_state const & ios, reducible_behavior b):
|
app_builder::app_builder(environment const & env, options const & o, reducible_behavior b):
|
||||||
m_ptr(new imp(env, ios, b)) {
|
m_ptr(new imp(env, o, b)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
app_builder::app_builder(environment const & env, reducible_behavior b):
|
app_builder::app_builder(environment const & env, reducible_behavior b):
|
||||||
app_builder(env, get_dummy_ios(), b) {
|
app_builder(env, options(), b) {
|
||||||
}
|
}
|
||||||
|
|
||||||
app_builder::app_builder(tmp_type_context & ctx):
|
app_builder::app_builder(tmp_type_context & ctx):
|
||||||
|
|
|
@ -36,7 +36,7 @@ class app_builder {
|
||||||
struct imp;
|
struct imp;
|
||||||
std::unique_ptr<imp> m_ptr;
|
std::unique_ptr<imp> m_ptr;
|
||||||
public:
|
public:
|
||||||
app_builder(environment const & env, io_state const & ios, reducible_behavior b = UnfoldReducible);
|
app_builder(environment const & env, options const & o, reducible_behavior b = UnfoldReducible);
|
||||||
app_builder(environment const & env, reducible_behavior b = UnfoldReducible);
|
app_builder(environment const & env, reducible_behavior b = UnfoldReducible);
|
||||||
app_builder(tmp_type_context & ctx);
|
app_builder(tmp_type_context & ctx);
|
||||||
~app_builder();
|
~app_builder();
|
||||||
|
|
|
@ -23,8 +23,8 @@ static std::string * g_key = nullptr;
|
||||||
struct brs_state {
|
struct brs_state {
|
||||||
backward_rule_set m_backward_rule_set;
|
backward_rule_set m_backward_rule_set;
|
||||||
name_set m_names;
|
name_set m_names;
|
||||||
void add(environment const & env, io_state const & ios, name const & cname, unsigned prio) {
|
void add(environment const & env, options const & o, name const & cname, unsigned prio) {
|
||||||
default_type_context tctx(env, ios);
|
default_type_context tctx(env, o);
|
||||||
m_backward_rule_set.insert(tctx, cname, prio);
|
m_backward_rule_set.insert(tctx, cname, prio);
|
||||||
m_names.insert(cname);
|
m_names.insert(cname);
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ struct brs_config {
|
||||||
typedef brs_entry entry;
|
typedef brs_entry entry;
|
||||||
typedef brs_state state;
|
typedef brs_state state;
|
||||||
static void add_entry(environment const & env, io_state const & ios, state & s, entry const & e) {
|
static void add_entry(environment const & env, io_state const & ios, state & s, entry const & e) {
|
||||||
s.add(env, ios, e.m_name, e.m_priority);
|
s.add(env, ios.get_options(), e.m_name, e.m_priority);
|
||||||
}
|
}
|
||||||
static name const & get_class_name() {
|
static name const & get_class_name() {
|
||||||
return *g_class_name;
|
return *g_class_name;
|
||||||
|
@ -75,12 +75,12 @@ backward_rule_set get_backward_rule_set(environment const & env) {
|
||||||
return brs_ext::get_state(env).m_backward_rule_set;
|
return brs_ext::get_state(env).m_backward_rule_set;
|
||||||
}
|
}
|
||||||
|
|
||||||
backward_rule_set get_backward_rule_sets(environment const & env, io_state const & ios, name const & ns) {
|
backward_rule_set get_backward_rule_sets(environment const & env, options const & o, name const & ns) {
|
||||||
backward_rule_set brs;
|
backward_rule_set brs;
|
||||||
list<brs_entry> const * entries = brs_ext::get_entries(env, ns);
|
list<brs_entry> const * entries = brs_ext::get_entries(env, ns);
|
||||||
if (entries) {
|
if (entries) {
|
||||||
for (auto const & e : *entries) {
|
for (auto const & e : *entries) {
|
||||||
default_type_context tctx(env, ios);
|
default_type_context tctx(env, o);
|
||||||
brs.insert(tctx, e.m_name, e.m_priority);
|
brs.insert(tctx, e.m_name, e.m_priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,7 +61,7 @@ bool is_backward_rule(environment const & env, name const & n);
|
||||||
/** \brief Get current backward rule set */
|
/** \brief Get current backward rule set */
|
||||||
blast::backward_rule_set get_backward_rule_set(environment const & env);
|
blast::backward_rule_set get_backward_rule_set(environment const & env);
|
||||||
/** \brief Get backward rule set in the given namespace. */
|
/** \brief Get backward rule set in the given namespace. */
|
||||||
blast::backward_rule_set get_backward_rule_sets(environment const & env, io_state const & ios, name const & ns);
|
blast::backward_rule_set get_backward_rule_sets(environment const & env, options const & o, name const & ns);
|
||||||
|
|
||||||
io_state_stream const & operator<<(io_state_stream const & out, blast::backward_rule_set const & r);
|
io_state_stream const & operator<<(io_state_stream const & out, blast::backward_rule_set const & r);
|
||||||
|
|
||||||
|
|
|
@ -122,7 +122,7 @@ class blastenv {
|
||||||
std::vector<state::assignment_snapshot> m_stack;
|
std::vector<state::assignment_snapshot> m_stack;
|
||||||
public:
|
public:
|
||||||
tctx(blastenv & benv):
|
tctx(blastenv & benv):
|
||||||
type_context(benv.m_env, benv.m_ios, benv.m_tmp_local_generator),
|
type_context(benv.m_env, benv.m_ios.get_options(), benv.m_tmp_local_generator),
|
||||||
m_benv(benv) {}
|
m_benv(benv) {}
|
||||||
|
|
||||||
virtual bool is_extra_opaque(name const & n) const override {
|
virtual bool is_extra_opaque(name const & n) const override {
|
||||||
|
@ -1067,8 +1067,8 @@ scope_debug::~scope_debug() {}
|
||||||
and blast meta-variables are stored in the blast state */
|
and blast meta-variables are stored in the blast state */
|
||||||
class tmp_tctx : public tmp_type_context {
|
class tmp_tctx : public tmp_type_context {
|
||||||
public:
|
public:
|
||||||
tmp_tctx(environment const & env, io_state const & ios, tmp_local_generator & gen):
|
tmp_tctx(environment const & env, options const & o, tmp_local_generator & gen):
|
||||||
tmp_type_context(env, ios, gen) {}
|
tmp_type_context(env, o, gen) {}
|
||||||
|
|
||||||
/** \brief Return the type of a local constant (local or not).
|
/** \brief Return the type of a local constant (local or not).
|
||||||
\remark This method allows the customer to store the type of local constants
|
\remark This method allows the customer to store the type of local constants
|
||||||
|
@ -1101,7 +1101,7 @@ public:
|
||||||
tmp_type_context * blastenv::mk_tmp_type_context() {
|
tmp_type_context * blastenv::mk_tmp_type_context() {
|
||||||
tmp_type_context * r;
|
tmp_type_context * r;
|
||||||
if (m_tmp_ctx_pool.empty()) {
|
if (m_tmp_ctx_pool.empty()) {
|
||||||
r = new tmp_tctx(m_env, m_ios, m_tmp_local_generator);
|
r = new tmp_tctx(m_env, m_ios.get_options(), m_tmp_local_generator);
|
||||||
// Design decision: in the blast tactic, we only consider the instances that were
|
// Design decision: in the blast tactic, we only consider the instances that were
|
||||||
// available in initial goal provided to the blast tactic.
|
// available in initial goal provided to the blast tactic.
|
||||||
// So, we only need to setup the local instances when we create a new (temporary) type context.
|
// So, we only need to setup the local instances when we create a new (temporary) type context.
|
||||||
|
|
|
@ -88,7 +88,7 @@ optional<name> get_intro_target(tmp_type_context & ctx, name const & c) {
|
||||||
}
|
}
|
||||||
|
|
||||||
environment add_intro_lemma(environment const & env, io_state const & ios, name const & c, unsigned prio, name const & ns, bool persistent) {
|
environment add_intro_lemma(environment const & env, io_state const & ios, name const & c, unsigned prio, name const & ns, bool persistent) {
|
||||||
tmp_type_context ctx(env, ios);
|
tmp_type_context ctx(env, ios.get_options());
|
||||||
if (!get_intro_target(ctx, c))
|
if (!get_intro_target(ctx, c))
|
||||||
throw exception(sstream() << "invalid [intro] attribute for '" << c << "', head symbol of resulting type must be a constant");
|
throw exception(sstream() << "invalid [intro] attribute for '" << c << "', head symbol of resulting type must be a constant");
|
||||||
return intro_elim_ext::add_entry(env, ios, intro_elim_entry(false, prio, c), ns, persistent);
|
return intro_elim_ext::add_entry(env, ios, intro_elim_entry(false, prio, c), ns, persistent);
|
||||||
|
|
|
@ -475,13 +475,13 @@ struct rrs_state {
|
||||||
name_set m_congr_names;
|
name_set m_congr_names;
|
||||||
|
|
||||||
void add_simp(environment const & env, io_state const & ios, name const & cname, unsigned prio) {
|
void add_simp(environment const & env, io_state const & ios, name const & cname, unsigned prio) {
|
||||||
tmp_type_context tctx{env, ios};
|
tmp_type_context tctx(env, ios.get_options());
|
||||||
m_sets = add_core(tctx, m_sets, cname, prio);
|
m_sets = add_core(tctx, m_sets, cname, prio);
|
||||||
m_simp_names.insert(cname);
|
m_simp_names.insert(cname);
|
||||||
}
|
}
|
||||||
|
|
||||||
void add_congr(environment const & env, io_state const & ios, name const & n, unsigned prio) {
|
void add_congr(environment const & env, io_state const & ios, name const & n, unsigned prio) {
|
||||||
tmp_type_context tctx{env, ios};
|
tmp_type_context tctx(env, ios.get_options());
|
||||||
add_congr_core(tctx, m_sets, n, prio);
|
add_congr_core(tctx, m_sets, n, prio);
|
||||||
m_congr_names.insert(n);
|
m_congr_names.insert(n);
|
||||||
}
|
}
|
||||||
|
@ -544,25 +544,25 @@ simp_rule_sets get_simp_rule_sets(environment const & env) {
|
||||||
return rrs_ext::get_state(env).m_sets;
|
return rrs_ext::get_state(env).m_sets;
|
||||||
}
|
}
|
||||||
|
|
||||||
simp_rule_sets get_simp_rule_sets(environment const & env, io_state const & ios, name const & ns) {
|
simp_rule_sets get_simp_rule_sets(environment const & env, options const & o, name const & ns) {
|
||||||
simp_rule_sets set;
|
simp_rule_sets set;
|
||||||
list<rrs_entry> const * entries = rrs_ext::get_entries(env, ns);
|
list<rrs_entry> const * entries = rrs_ext::get_entries(env, ns);
|
||||||
if (entries) {
|
if (entries) {
|
||||||
for (auto const & e : *entries) {
|
for (auto const & e : *entries) {
|
||||||
tmp_type_context tctx(env, ios);
|
tmp_type_context tctx(env, o);
|
||||||
set = add_core(tctx, set, e.m_name, e.m_priority);
|
set = add_core(tctx, set, e.m_name, e.m_priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
|
|
||||||
simp_rule_sets get_simp_rule_sets(environment const & env, io_state const & ios, std::initializer_list<name> const & nss) {
|
simp_rule_sets get_simp_rule_sets(environment const & env, options const & o, std::initializer_list<name> const & nss) {
|
||||||
simp_rule_sets set;
|
simp_rule_sets set;
|
||||||
for (name const & ns : nss) {
|
for (name const & ns : nss) {
|
||||||
list<rrs_entry> const * entries = rrs_ext::get_entries(env, ns);
|
list<rrs_entry> const * entries = rrs_ext::get_entries(env, ns);
|
||||||
if (entries) {
|
if (entries) {
|
||||||
for (auto const & e : *entries) {
|
for (auto const & e : *entries) {
|
||||||
tmp_type_context tctx(env, ios);
|
tmp_type_context tctx(env, o);
|
||||||
set = add_core(tctx, set, e.m_name, e.m_priority);
|
set = add_core(tctx, set, e.m_name, e.m_priority);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -144,9 +144,9 @@ bool is_congr_rule(environment const & env, name const & n);
|
||||||
/** \brief Get current simplification rule sets */
|
/** \brief Get current simplification rule sets */
|
||||||
simp_rule_sets get_simp_rule_sets(environment const & env);
|
simp_rule_sets get_simp_rule_sets(environment const & env);
|
||||||
/** \brief Get simplification rule sets in the given namespace. */
|
/** \brief Get simplification rule sets in the given namespace. */
|
||||||
simp_rule_sets get_simp_rule_sets(environment const & env, io_state const & ios, name const & ns);
|
simp_rule_sets get_simp_rule_sets(environment const & env, options const & o, name const & ns);
|
||||||
/** \brief Get simplification rule sets in the given namespaces. */
|
/** \brief Get simplification rule sets in the given namespaces. */
|
||||||
simp_rule_sets get_simp_rule_sets(environment const & env, io_state const & ios, std::initializer_list<name> const & nss);
|
simp_rule_sets get_simp_rule_sets(environment const & env, options const & o, std::initializer_list<name> const & nss);
|
||||||
|
|
||||||
io_state_stream const & operator<<(io_state_stream const & out, simp_rule_sets const & s);
|
io_state_stream const & operator<<(io_state_stream const & out, simp_rule_sets const & s);
|
||||||
|
|
||||||
|
|
|
@ -188,10 +188,10 @@ class simplifier {
|
||||||
simp_rule_sets srss = _srss;
|
simp_rule_sets srss = _srss;
|
||||||
for (unsigned i = 0; i < ls.size(); i++) {
|
for (unsigned i = 0; i < ls.size(); i++) {
|
||||||
expr & l = ls[i];
|
expr & l = ls[i];
|
||||||
tmp_type_context tctx(env(), ios());
|
blast_tmp_type_context tctx;
|
||||||
try {
|
try {
|
||||||
// TODO(Leo,Daniel): should we allow the user to set the priority of local lemmas
|
// TODO(Leo,Daniel): should we allow the user to set the priority of local lemmas
|
||||||
srss = add(tctx, srss, mlocal_name(l), tctx.infer(l), l, LEAN_SIMP_DEFAULT_PRIORITY);
|
srss = add(*tctx, srss, mlocal_name(l), tctx->infer(l), l, LEAN_SIMP_DEFAULT_PRIORITY);
|
||||||
} catch (exception e) {
|
} catch (exception e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -976,9 +976,9 @@ result simplifier::fuse(expr const & e) {
|
||||||
/* Prove (1) == (3) using simplify with [ac] */
|
/* Prove (1) == (3) using simplify with [ac] */
|
||||||
flet<bool> no_simplify_numerals(m_numerals, false);
|
flet<bool> no_simplify_numerals(m_numerals, false);
|
||||||
auto pf_1_3 = prove(get_app_builder().mk_eq(e, e_grp),
|
auto pf_1_3 = prove(get_app_builder().mk_eq(e, e_grp),
|
||||||
get_simp_rule_sets(env(), ios(),
|
get_simp_rule_sets(env(), ios().get_options(),
|
||||||
{*g_simplify_prove_namespace, *g_simplify_unit_namespace,
|
{*g_simplify_prove_namespace, *g_simplify_unit_namespace,
|
||||||
*g_simplify_neg_namespace, *g_simplify_ac_namespace}));
|
*g_simplify_neg_namespace, *g_simplify_ac_namespace}));
|
||||||
if (!pf_1_3) {
|
if (!pf_1_3) {
|
||||||
diagnostic(env(), ios()) << ppb(e) << "\n\n =?=\n\n" << ppb(e_grp) << "\n";
|
diagnostic(env(), ios()) << ppb(e) << "\n\n =?=\n\n" << ppb(e_grp) << "\n";
|
||||||
throw blast_exception("Failed to prove (1) == (3) during fusion", e);
|
throw blast_exception("Failed to prove (1) == (3) during fusion", e);
|
||||||
|
@ -986,10 +986,10 @@ result simplifier::fuse(expr const & e) {
|
||||||
|
|
||||||
/* Prove (4) == (5) using simplify with [som] */
|
/* Prove (4) == (5) using simplify with [som] */
|
||||||
auto pf_4_5 = prove(get_app_builder().mk_eq(e_grp_ls, e_fused_ls),
|
auto pf_4_5 = prove(get_app_builder().mk_eq(e_grp_ls, e_fused_ls),
|
||||||
get_simp_rule_sets(env(), ios(),
|
get_simp_rule_sets(env(), ios().get_options(),
|
||||||
{*g_simplify_prove_namespace, *g_simplify_unit_namespace,
|
{*g_simplify_prove_namespace, *g_simplify_unit_namespace,
|
||||||
*g_simplify_neg_namespace, *g_simplify_ac_namespace,
|
*g_simplify_neg_namespace, *g_simplify_ac_namespace,
|
||||||
*g_simplify_distrib_namespace}));
|
*g_simplify_distrib_namespace}));
|
||||||
if (!pf_4_5) {
|
if (!pf_4_5) {
|
||||||
diagnostic(env(), ios()) << ppb(e_grp_ls) << "\n\n =?=\n\n" << ppb(e_fused_ls) << "\n";
|
diagnostic(env(), ios()) << ppb(e_grp_ls) << "\n\n =?=\n\n" << ppb(e_fused_ls) << "\n";
|
||||||
throw blast_exception("Failed to prove (4) == (5) during fusion", e);
|
throw blast_exception("Failed to prove (4) == (5) during fusion", e);
|
||||||
|
@ -997,9 +997,9 @@ result simplifier::fuse(expr const & e) {
|
||||||
|
|
||||||
/* Prove (5) == (6) using simplify with [numeral] */
|
/* Prove (5) == (6) using simplify with [numeral] */
|
||||||
flet<bool> simplify_numerals(m_numerals, true);
|
flet<bool> simplify_numerals(m_numerals, true);
|
||||||
result r_simp_ls = simplify(e_fused_ls, get_simp_rule_sets(env(), ios(),
|
result r_simp_ls = simplify(e_fused_ls, get_simp_rule_sets(env(), ios().get_options(),
|
||||||
{*g_simplify_unit_namespace, *g_simplify_neg_namespace,
|
{*g_simplify_unit_namespace, *g_simplify_neg_namespace,
|
||||||
*g_simplify_ac_namespace}));
|
*g_simplify_ac_namespace}));
|
||||||
|
|
||||||
/* Prove (4) == (6) by transitivity of proofs (2) and (3) */
|
/* Prove (4) == (6) by transitivity of proofs (2) and (3) */
|
||||||
expr pf_4_6;
|
expr pf_4_6;
|
||||||
|
|
|
@ -50,7 +50,7 @@ action_result unit_preprocess(unsigned hidx) {
|
||||||
return action_result::failed();
|
return action_result::failed();
|
||||||
}
|
}
|
||||||
|
|
||||||
simp_rule_sets srss = get_simp_rule_sets(env(), ios(), *g_simplify_unit_simp_namespace);
|
simp_rule_sets srss = get_simp_rule_sets(env(), ios().get_options(), *g_simplify_unit_simp_namespace);
|
||||||
// TODO(dhs): disable contextual rewriting
|
// TODO(dhs): disable contextual rewriting
|
||||||
auto r = simplify(get_iff_name(), h.get_type(), srss, is_propositional);
|
auto r = simplify(get_iff_name(), h.get_type(), srss, is_propositional);
|
||||||
|
|
||||||
|
|
|
@ -44,8 +44,8 @@ struct cienv {
|
||||||
typedef std::unique_ptr<default_type_context> ti_ptr;
|
typedef std::unique_ptr<default_type_context> ti_ptr;
|
||||||
ti_ptr m_ti_ptr;
|
ti_ptr m_ti_ptr;
|
||||||
|
|
||||||
void reset(environment const & env, io_state const & ios, list<expr> const & ctx) {
|
void reset(environment const & env, options const & o, list<expr> const & ctx) {
|
||||||
m_ti_ptr.reset(new default_type_context(env, ios, ctx));
|
m_ti_ptr.reset(new default_type_context(env, o, ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool compatible_env(environment const & env) {
|
bool compatible_env(environment const & env) {
|
||||||
|
@ -53,17 +53,17 @@ struct cienv {
|
||||||
return env.is_descendant(curr_env) && curr_env.is_descendant(env);
|
return env.is_descendant(curr_env) && curr_env.is_descendant(env);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ensure_compatible(environment const & env, io_state const & ios, list<expr> const & ctx) {
|
void ensure_compatible(environment const & env, options const & o, list<expr> const & ctx) {
|
||||||
if (!m_ti_ptr || !compatible_env(env) || !m_ti_ptr->compatible_local_instances(ctx))
|
if (!m_ti_ptr || !compatible_env(env) || !m_ti_ptr->compatible_local_instances(ctx))
|
||||||
reset(env, ios, ctx);
|
reset(env, o, ctx);
|
||||||
if (!m_ti_ptr->update_options(ios.get_options()))
|
if (!m_ti_ptr->update_options(o))
|
||||||
m_ti_ptr->clear_cache();
|
m_ti_ptr->clear_cache();
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> operator()(environment const & env, io_state const & ios,
|
optional<expr> operator()(environment const & env, options const & o,
|
||||||
pos_info_provider const * pip, list<expr> const & ctx, expr const & type,
|
pos_info_provider const * pip, list<expr> const & ctx, expr const & type,
|
||||||
expr const & pos_ref) {
|
expr const & pos_ref) {
|
||||||
ensure_compatible(env, ios, ctx);
|
ensure_compatible(env, o, ctx);
|
||||||
type_context::scope_pos_info scope(*m_ti_ptr, pip, pos_ref);
|
type_context::scope_pos_info scope(*m_ti_ptr, pip, pos_ref);
|
||||||
return m_ti_ptr->mk_class_instance(type);
|
return m_ti_ptr->mk_class_instance(type);
|
||||||
}
|
}
|
||||||
|
@ -71,18 +71,19 @@ struct cienv {
|
||||||
|
|
||||||
MK_THREAD_LOCAL_GET_DEF(cienv, get_cienv);
|
MK_THREAD_LOCAL_GET_DEF(cienv, get_cienv);
|
||||||
|
|
||||||
static optional<expr> mk_class_instance(environment const & env, io_state const & ios, list<expr> const & ctx,
|
static optional<expr> mk_class_instance(environment const & env, options const & o, list<expr> const & ctx,
|
||||||
expr const & e, pos_info_provider const * pip, expr const & pos_ref) {
|
expr const & e, pos_info_provider const * pip, expr const & pos_ref) {
|
||||||
return get_cienv()(env, ios, pip, ctx, e, pos_ref);
|
return get_cienv()(env, o, pip, ctx, e, pos_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> mk_class_instance(environment const & env, io_state const & ios, list<expr> const & ctx,
|
optional<expr> mk_class_instance(environment const & env, options const & o, list<expr> const & ctx,
|
||||||
expr const & e, pos_info_provider const * pip) {
|
expr const & e, pos_info_provider const * pip) {
|
||||||
return mk_class_instance(env, ios, ctx, e, pip, e);
|
return mk_class_instance(env, o, ctx, e, pip, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> mk_class_instance(environment const & env, list<expr> const & ctx, expr const & e, pos_info_provider const * pip) {
|
optional<expr> mk_class_instance(environment const & env, list<expr> const & ctx, expr const & e,
|
||||||
return mk_class_instance(env, get_dummy_ios(), ctx, e, pip);
|
pos_info_provider const * pip) {
|
||||||
|
return mk_class_instance(env, options(), ctx, e, pip);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auxiliary class for generating a lazy-stream of instances.
|
// Auxiliary class for generating a lazy-stream of instances.
|
||||||
|
@ -100,7 +101,7 @@ public:
|
||||||
bool is_strict):
|
bool is_strict):
|
||||||
choice_iterator(!is_strict),
|
choice_iterator(!is_strict),
|
||||||
m_ios(ios),
|
m_ios(ios),
|
||||||
m_ti(env, ios, ctx, true),
|
m_ti(env, ios.get_options(), ctx, true),
|
||||||
m_scope_pos_info(m_ti, pip, pos_ref),
|
m_scope_pos_info(m_ti, pip, pos_ref),
|
||||||
m_new_meta(new_meta),
|
m_new_meta(new_meta),
|
||||||
m_new_j(new_j) {
|
m_new_j(new_j) {
|
||||||
|
@ -134,7 +135,7 @@ static constraint mk_class_instance_root_cnstr(environment const & env, io_state
|
||||||
if (use_local_instances)
|
if (use_local_instances)
|
||||||
ctx = _ctx.instantiate(substitution(s));
|
ctx = _ctx.instantiate(substitution(s));
|
||||||
cienv & cenv = get_cienv();
|
cienv & cenv = get_cienv();
|
||||||
cenv.ensure_compatible(env, ios, ctx.get_data());
|
cenv.ensure_compatible(env, ios.get_options(), ctx.get_data());
|
||||||
auto cls_name = cenv.m_ti_ptr->is_class(meta_type);
|
auto cls_name = cenv.m_ti_ptr->is_class(meta_type);
|
||||||
if (!cls_name) {
|
if (!cls_name) {
|
||||||
// do nothing, since type is not a class.
|
// do nothing, since type is not a class.
|
||||||
|
@ -149,7 +150,7 @@ static constraint mk_class_instance_root_cnstr(environment const & env, io_state
|
||||||
meta_type, pip, meta,
|
meta_type, pip, meta,
|
||||||
new_meta, new_j, is_strict)));
|
new_meta, new_j, is_strict)));
|
||||||
} else {
|
} else {
|
||||||
if (auto r = mk_class_instance(env, ios, ctx.get_data(), meta_type, pip, meta)) {
|
if (auto r = mk_class_instance(env, ios.get_options(), ctx.get_data(), meta_type, pip, meta)) {
|
||||||
constraint c = mk_eq_cnstr(new_meta, *r, new_j);
|
constraint c = mk_eq_cnstr(new_meta, *r, new_j);
|
||||||
return lazy_list<constraints>(constraints(c));
|
return lazy_list<constraints>(constraints(c));
|
||||||
} else if (is_strict) {
|
} else if (is_strict) {
|
||||||
|
@ -189,15 +190,15 @@ optional<expr> mk_class_instance(environment const & env, local_context const &
|
||||||
return mk_class_instance(env, ctx.get_data(), type, nullptr);
|
return mk_class_instance(env, ctx.get_data(), type, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> mk_hset_instance(type_checker & tc, io_state const & ios, list<expr> const & ctx, expr const & type) {
|
optional<expr> mk_hset_instance(type_checker & tc, options const & o, list<expr> const & ctx, expr const & type) {
|
||||||
level lvl = sort_level(tc.ensure_type(type).first);
|
level lvl = sort_level(tc.ensure_type(type).first);
|
||||||
expr is_hset = tc.whnf(mk_app(mk_constant(get_is_trunc_is_hset_name(), {lvl}), type)).first;
|
expr is_hset = tc.whnf(mk_app(mk_constant(get_is_trunc_is_hset_name(), {lvl}), type)).first;
|
||||||
return mk_class_instance(tc.env(), ios, ctx, is_hset);
|
return mk_class_instance(tc.env(), o, ctx, is_hset);
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<expr> mk_subsingleton_instance(environment const & env, io_state const & ios, list<expr> const & ctx, expr const & type) {
|
optional<expr> mk_subsingleton_instance(environment const & env, options const & o, list<expr> const & ctx, expr const & type) {
|
||||||
cienv & cenv = get_cienv();
|
cienv & cenv = get_cienv();
|
||||||
cenv.ensure_compatible(env, ios, ctx);
|
cenv.ensure_compatible(env, o, ctx);
|
||||||
return cenv.m_ti_ptr->mk_subsingleton_instance(type);
|
return cenv.m_ti_ptr->mk_subsingleton_instance(type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,8 +12,10 @@ Author: Leonardo de Moura
|
||||||
#include "library/local_context.h"
|
#include "library/local_context.h"
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
optional<expr> mk_class_instance(environment const & env, io_state const & ios, list<expr> const & ctx, expr const & e, pos_info_provider const * pip = nullptr);
|
optional<expr> mk_class_instance(environment const & env, options const & o,
|
||||||
optional<expr> mk_class_instance(environment const & env, list<expr> const & ctx, expr const & e, pos_info_provider const * pip = nullptr);
|
list<expr> const & ctx, expr const & e, pos_info_provider const * pip = nullptr);
|
||||||
|
optional<expr> mk_class_instance(environment const & env, list<expr> const & ctx, expr const & e,
|
||||||
|
pos_info_provider const * pip = nullptr);
|
||||||
|
|
||||||
// Old API
|
// Old API
|
||||||
|
|
||||||
|
@ -37,8 +39,9 @@ pair<expr, constraint> mk_class_instance_elaborator(
|
||||||
|
|
||||||
optional<expr> mk_class_instance(environment const & env, io_state const & ios, local_context const & ctx, expr const & type, bool use_local_instances);
|
optional<expr> mk_class_instance(environment const & env, io_state const & ios, local_context const & ctx, expr const & type, bool use_local_instances);
|
||||||
optional<expr> mk_class_instance(environment const & env, local_context const & ctx, expr const & type);
|
optional<expr> mk_class_instance(environment const & env, local_context const & ctx, expr const & type);
|
||||||
optional<expr> mk_hset_instance(type_checker & tc, io_state const & ios, list<expr> const & ctx, expr const & type);
|
optional<expr> mk_hset_instance(type_checker & tc, options const & o, list<expr> const & ctx, expr const & type);
|
||||||
optional<expr> mk_subsingleton_instance(environment const & env, io_state const & ios, list<expr> const & ctx, expr const & type);
|
optional<expr> mk_subsingleton_instance(environment const & env, options const & o,
|
||||||
|
list<expr> const & ctx, expr const & type);
|
||||||
|
|
||||||
void initialize_class_instance_resolution();
|
void initialize_class_instance_resolution();
|
||||||
void finalize_class_instance_resolution();
|
void finalize_class_instance_resolution();
|
||||||
|
|
|
@ -50,7 +50,7 @@ optional<expr> mk_congr_subsingleton_thm(type_checker & tc, io_state const & ios
|
||||||
if (prop.back()) {
|
if (prop.back()) {
|
||||||
ss.push_back(true);
|
ss.push_back(true);
|
||||||
} else {
|
} else {
|
||||||
ss.push_back(static_cast<bool>(mk_subsingleton_instance(tc.env(), ios, ctx, mlocal_type(d))));
|
ss.push_back(static_cast<bool>(mk_subsingleton_instance(tc.env(), ios.get_options(), ctx, mlocal_type(d))));
|
||||||
}
|
}
|
||||||
codomain_deps_on.push_back(depends_on(codomain, d));
|
codomain_deps_on.push_back(depends_on(codomain, d));
|
||||||
ctx = cons(d, ctx);
|
ctx = cons(d, ctx);
|
||||||
|
@ -145,7 +145,7 @@ optional<expr> mk_congr_subsingleton_thm(type_checker & tc, io_state const & ios
|
||||||
return none_expr();
|
return none_expr();
|
||||||
buffer<expr> hyps;
|
buffer<expr> hyps;
|
||||||
g.get_hyps(hyps);
|
g.get_hyps(hyps);
|
||||||
auto spr = mk_subsingleton_instance(tc.env(), ios, to_list(hyps), mlocal_type(new_lhs));
|
auto spr = mk_subsingleton_instance(tc.env(), ios.get_options(), to_list(hyps), mlocal_type(new_lhs));
|
||||||
if (!spr)
|
if (!spr)
|
||||||
return none_expr();
|
return none_expr();
|
||||||
expr new_eq = mk_local(get_unused_name(name(h, eqidx), hyps), mk_eq(tc, new_rhs, new_lhs));
|
expr new_eq = mk_local(get_unused_name(name(h, eqidx), hyps), mk_eq(tc, new_rhs, new_lhs));
|
||||||
|
|
|
@ -55,7 +55,7 @@ optional<expr> apply_eq_rec_eq(type_checker & tc, io_state const & ios, list<exp
|
||||||
if (!is_local(p) || !is_eq_a_a(tc, mlocal_type(p)))
|
if (!is_local(p) || !is_eq_a_a(tc, mlocal_type(p)))
|
||||||
return none_expr();
|
return none_expr();
|
||||||
expr const & A = args[0];
|
expr const & A = args[0];
|
||||||
auto is_hset_A = mk_hset_instance(tc, ios, ctx, A);
|
auto is_hset_A = mk_hset_instance(tc, ios.get_options(), ctx, A);
|
||||||
if (!is_hset_A)
|
if (!is_hset_A)
|
||||||
return none_expr();
|
return none_expr();
|
||||||
levels ls = const_levels(eq_rec_fn);
|
levels ls = const_levels(eq_rec_fn);
|
||||||
|
|
|
@ -16,13 +16,14 @@ void tmp_type_context::init(environment const & env, reducible_behavior b) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp_type_context::tmp_type_context(environment const & env, io_state const & ios, reducible_behavior b):
|
tmp_type_context::tmp_type_context(environment const & env, options const & o, reducible_behavior b):
|
||||||
type_context(env, ios) {
|
type_context(env, o) {
|
||||||
init(env, b);
|
init(env, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp_type_context::tmp_type_context(environment const & env, io_state const & ios, tmp_local_generator & gen, reducible_behavior b):
|
tmp_type_context::tmp_type_context(environment const & env, options const & o, tmp_local_generator & gen,
|
||||||
type_context(env, ios, gen) {
|
reducible_behavior b):
|
||||||
|
type_context(env, o, gen) {
|
||||||
init(env, b);
|
init(env, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,9 @@ class tmp_type_context : public type_context {
|
||||||
std::vector<scope> m_scopes;
|
std::vector<scope> m_scopes;
|
||||||
void init(environment const & env, reducible_behavior b);
|
void init(environment const & env, reducible_behavior b);
|
||||||
public:
|
public:
|
||||||
tmp_type_context(environment const & env, io_state const & ios, reducible_behavior b = UnfoldReducible);
|
tmp_type_context(environment const & env, options const & o, reducible_behavior b = UnfoldReducible);
|
||||||
tmp_type_context(environment const & env, io_state const & ios, tmp_local_generator & gen, reducible_behavior b = UnfoldReducible);
|
tmp_type_context(environment const & env, options const & o,
|
||||||
|
tmp_local_generator & gen, reducible_behavior b = UnfoldReducible);
|
||||||
virtual ~tmp_type_context();
|
virtual ~tmp_type_context();
|
||||||
|
|
||||||
/** \brief Reset the state: backtracking stack, indices and assignment. */
|
/** \brief Reset the state: backtracking stack, indices and assignment. */
|
||||||
|
|
|
@ -32,7 +32,7 @@ public:
|
||||||
void activate();
|
void activate();
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LEAN_MERGE_(a,b) a##b
|
#define LEAN_MERGE_(a, b) a##b
|
||||||
#define LEAN_LABEL_(a) LEAN_MERGE_(unique_name_, a)
|
#define LEAN_LABEL_(a) LEAN_MERGE_(unique_name_, a)
|
||||||
#define LEAN_UNIQUE_NAME LEAN_LABEL_(__LINE__)
|
#define LEAN_UNIQUE_NAME LEAN_LABEL_(__LINE__)
|
||||||
|
|
||||||
|
|
|
@ -99,7 +99,7 @@ struct type_context::ext_ctx : public extension_context {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
type_context::type_context(environment const & env, io_state const & ios, tmp_local_generator * gen,
|
type_context::type_context(environment const & env, options const & o, tmp_local_generator * gen,
|
||||||
bool gen_owner, bool multiple_instances):
|
bool gen_owner, bool multiple_instances):
|
||||||
m_env(env),
|
m_env(env),
|
||||||
m_ngen(*g_prefix),
|
m_ngen(*g_prefix),
|
||||||
|
@ -115,7 +115,7 @@ type_context::type_context(environment const & env, io_state const & ios, tmp_lo
|
||||||
// TODO(Leo): use compilation options for setting config
|
// TODO(Leo): use compilation options for setting config
|
||||||
m_ci_max_depth = 32;
|
m_ci_max_depth = 32;
|
||||||
m_ci_trans_instances = true;
|
m_ci_trans_instances = true;
|
||||||
update_options(ios.get_options());
|
update_options(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
type_context::~type_context() {
|
type_context::~type_context() {
|
||||||
|
@ -1739,9 +1739,9 @@ type_context::scope_pos_info::~scope_pos_info() {
|
||||||
m_owner.m_ci_pos = m_old_pos;
|
m_owner.m_ci_pos = m_old_pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
default_type_context::default_type_context(environment const & env, io_state const & ios,
|
default_type_context::default_type_context(environment const & env, options const & o,
|
||||||
list<expr> const & insts, bool multiple_instances):
|
list<expr> const & insts, bool multiple_instances):
|
||||||
type_context(env, ios, multiple_instances),
|
type_context(env, o, multiple_instances),
|
||||||
m_not_reducible_pred(mk_not_reducible_pred(env)) {
|
m_not_reducible_pred(mk_not_reducible_pred(env)) {
|
||||||
m_ignore_if_zero = false;
|
m_ignore_if_zero = false;
|
||||||
m_next_uvar_idx = 0;
|
m_next_uvar_idx = 0;
|
||||||
|
|
|
@ -296,14 +296,14 @@ class type_context {
|
||||||
optional<expr> mk_class_instance_core(expr const & type);
|
optional<expr> mk_class_instance_core(expr const & type);
|
||||||
optional<expr> check_ci_cache(expr const & type) const;
|
optional<expr> check_ci_cache(expr const & type) const;
|
||||||
void cache_ci_result(expr const & type, expr const & inst);
|
void cache_ci_result(expr const & type, expr const & inst);
|
||||||
type_context(environment const & env, io_state const & ios, tmp_local_generator * gen,
|
type_context(environment const & env, options const & o, tmp_local_generator * gen,
|
||||||
bool gen_owner, bool multiple_instances);
|
bool gen_owner, bool multiple_instances);
|
||||||
public:
|
public:
|
||||||
type_context(environment const & env, io_state const & ios, bool multiple_instances = false):
|
type_context(environment const & env, options const & o, bool multiple_instances = false):
|
||||||
type_context(env, ios, new tmp_local_generator(), true, multiple_instances) {}
|
type_context(env, o, new tmp_local_generator(), true, multiple_instances) {}
|
||||||
type_context(environment const & env, io_state const & ios, tmp_local_generator & gen,
|
type_context(environment const & env, options const & o, tmp_local_generator & gen,
|
||||||
bool multiple_instances = false):
|
bool multiple_instances = false):
|
||||||
type_context(env, ios, &gen, false, multiple_instances) {}
|
type_context(env, o, &gen, false, multiple_instances) {}
|
||||||
virtual ~type_context();
|
virtual ~type_context();
|
||||||
|
|
||||||
void set_local_instances(list<expr> const & insts);
|
void set_local_instances(list<expr> const & insts);
|
||||||
|
@ -551,7 +551,7 @@ class default_type_context : public type_context {
|
||||||
unsigned mvar_idx(expr const & m) const;
|
unsigned mvar_idx(expr const & m) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
default_type_context(environment const & env, io_state const & ios,
|
default_type_context(environment const & env, options const & o,
|
||||||
list<expr> const & insts = list<expr>(), bool multiple_instances = false);
|
list<expr> const & insts = list<expr>(), bool multiple_instances = false);
|
||||||
virtual ~default_type_context();
|
virtual ~default_type_context();
|
||||||
virtual bool is_extra_opaque(name const & n) const { return m_not_reducible_pred(n); }
|
virtual bool is_extra_opaque(name const & n) const { return m_not_reducible_pred(n); }
|
||||||
|
|
|
@ -17,7 +17,7 @@ is_iso.mk (inverse f) f
|
||||||
|
|
||||||
constant a : A
|
constant a : A
|
||||||
|
|
||||||
set_option class.trace_instances true
|
set_option trace.class_instances true
|
||||||
|
|
||||||
definition foo := inverse (id a)
|
definition foo := inverse (id a)
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ intro : A -> inh A
|
||||||
theorem inh_bool [instance] : inh Prop
|
theorem inh_bool [instance] : inh Prop
|
||||||
:= inh.intro true
|
:= inh.intro true
|
||||||
|
|
||||||
set_option class.trace_instances true
|
set_option trace.class_instances true
|
||||||
|
|
||||||
theorem inh_fun [instance] {A B : Type} [H : inh B] : inh (A → B)
|
theorem inh_fun [instance] {A B : Type} [H : inh B] : inh (A → B)
|
||||||
:= inh.rec (λ b, inh.intro (λ a : A, b)) H
|
:= inh.rec (λ b, inh.intro (λ a : A, b)) H
|
||||||
|
|
|
@ -25,7 +25,7 @@ definition assump := eassumption
|
||||||
tactic_hint assump
|
tactic_hint assump
|
||||||
|
|
||||||
theorem tst {A B : Type} (H : inh B) : inh (A → B → B)
|
theorem tst {A B : Type} (H : inh B) : inh (A → B → B)
|
||||||
set_option class.trace_instances true
|
set_option trace.class_instances true
|
||||||
|
|
||||||
theorem T1 {A B C D : Type} {P : C → Prop} (a : A) (H1 : inh B) (H2 : ∃x, P x) : inh ((A → A) × B × (D → C) × Prop) :=
|
theorem T1 {A B C D : Type} {P : C → Prop} (a : A) (H1 : inh B) (H2 : ∃x, P x) : inh ((A → A) × B × (D → C) × Prop) :=
|
||||||
have h1 [visible] : inh A, from inh.intro a,
|
have h1 [visible] : inh A, from inh.intro a,
|
||||||
|
|
|
@ -6,7 +6,7 @@ attribute C [multiple_instances]
|
||||||
definition c1 [instance] : C := C.mk 1
|
definition c1 [instance] : C := C.mk 1
|
||||||
definition c2 [instance] : C := C.mk 2
|
definition c2 [instance] : C := C.mk 2
|
||||||
|
|
||||||
set_option class.trace_instances true
|
set_option trace.class_instances true
|
||||||
|
|
||||||
definition f [s : C] : nat := C.val
|
definition f [s : C] : nat := C.val
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue