refactor(library/blast): hypothesis activation protocol
This commit is contained in:
parent
1bd827dffc
commit
0fcf8ed7d2
6 changed files with 47 additions and 28 deletions
|
@ -52,15 +52,15 @@ static backward_branch_extension & get_extension() {
|
||||||
class backward_strategy : public strategy {
|
class backward_strategy : public strategy {
|
||||||
virtual optional<expr> preprocess() override { return none_expr(); }
|
virtual optional<expr> preprocess() override { return none_expr(); }
|
||||||
|
|
||||||
action_result activate_hypothesis() {
|
virtual action_result hypothesis_pre_activation(hypothesis_idx hidx) override {
|
||||||
optional<hypothesis_idx> hidx = curr_state().activate_hypothesis();
|
Try(assumption_contradiction_actions(hidx));
|
||||||
if (!hidx) return action_result::failed();
|
Try(subst_action(hidx));
|
||||||
trace_action("activate");
|
Try(no_confusion_action(hidx));
|
||||||
|
Try(discard_action(hidx));
|
||||||
|
return action_result::new_branch();
|
||||||
|
}
|
||||||
|
|
||||||
Try(assumption_contradiction_actions(*hidx));
|
virtual action_result hypothesis_post_activation(hypothesis_idx hidx) override {
|
||||||
Try(subst_action(*hidx));
|
|
||||||
Try(no_confusion_action(*hidx));
|
|
||||||
Try(discard_action(*hidx));
|
|
||||||
return action_result::new_branch();
|
return action_result::new_branch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,28 +26,27 @@ namespace blast {
|
||||||
/** \brief Implement a simple proof strategy for blast.
|
/** \brief Implement a simple proof strategy for blast.
|
||||||
We use it mainly for testing new actions and the whole blast infra-structure. */
|
We use it mainly for testing new actions and the whole blast infra-structure. */
|
||||||
class simple_strategy : public strategy {
|
class simple_strategy : public strategy {
|
||||||
action_result activate_hypothesis(bool preprocess) {
|
|
||||||
scope_trace scope(!preprocess && get_config().m_trace);
|
|
||||||
|
|
||||||
auto hidx = curr_state().activate_hypothesis();
|
action_result hypothesis_pre_activation(hypothesis_idx hidx) override {
|
||||||
if (!hidx) return action_result::failed();
|
Try(assumption_contradiction_actions(hidx));
|
||||||
trace_action("activate");
|
Try(simplify_hypothesis_action(hidx));
|
||||||
|
Try(no_confusion_action(hidx));
|
||||||
|
TrySolve(assert_cc_action(hidx));
|
||||||
|
Try(discard_action(hidx));
|
||||||
|
Try(subst_action(hidx));
|
||||||
|
return action_result::new_branch();
|
||||||
|
}
|
||||||
|
|
||||||
Try(assumption_contradiction_actions(*hidx));
|
action_result hypothesis_post_activation(hypothesis_idx hidx) override {
|
||||||
Try(simplify_hypothesis_action(*hidx));
|
Try(forward_action(hidx));
|
||||||
TrySolve(assert_cc_action(*hidx));
|
Try(recursor_preprocess_action(hidx));
|
||||||
Try(subst_action(*hidx));
|
|
||||||
Try(no_confusion_action(*hidx));
|
|
||||||
Try(discard_action(*hidx));
|
|
||||||
Try(forward_action(*hidx));
|
|
||||||
Try(recursor_preprocess_action(*hidx));
|
|
||||||
return action_result::new_branch();
|
return action_result::new_branch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* \brief Preprocess state
|
/* \brief Preprocess state
|
||||||
It keeps applying intros, activating and finally simplify target.
|
It keeps applying intros, activating and finally simplify target.
|
||||||
Return an expression if the goal has been proved during preprocessing step. */
|
Return an expression if the goal has been proved during preprocessing step. */
|
||||||
virtual optional<expr> preprocess() {
|
virtual optional<expr> preprocess() override {
|
||||||
trace("* Preprocess");
|
trace("* Preprocess");
|
||||||
while (true) {
|
while (true) {
|
||||||
if (!failed(intros_action()))
|
if (!failed(intros_action()))
|
||||||
|
@ -61,7 +60,7 @@ class simple_strategy : public strategy {
|
||||||
return none_expr();
|
return none_expr();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual action_result next_action() {
|
virtual action_result next_action() override {
|
||||||
Try(intros_action());
|
Try(intros_action());
|
||||||
Try(activate_hypothesis(false));
|
Try(activate_hypothesis(false));
|
||||||
Try(trivial_action());
|
Try(trivial_action());
|
||||||
|
|
|
@ -765,20 +765,23 @@ void state::remove_from_indices(hypothesis const & h, hypothesis_idx hidx) {
|
||||||
m_branch.m_head_to_hyps.erase(*i, hidx);
|
m_branch.m_head_to_hyps.erase(*i, hidx);
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<unsigned> state::activate_hypothesis() {
|
optional<unsigned> state::select_hypothesis_to_activate() {
|
||||||
while (true) {
|
while (true) {
|
||||||
if (m_branch.m_todo_queue.empty())
|
if (m_branch.m_todo_queue.empty())
|
||||||
return optional<unsigned>();
|
return optional<unsigned>();
|
||||||
unsigned hidx = m_branch.m_todo_queue.erase_min();
|
unsigned hidx = m_branch.m_todo_queue.erase_min();
|
||||||
hypothesis const & h_decl = get_hypothesis_decl(hidx);
|
hypothesis const & h_decl = get_hypothesis_decl(hidx);
|
||||||
if (!h_decl.is_dead()) {
|
if (!h_decl.is_dead()) {
|
||||||
m_branch.m_active.insert(hidx);
|
|
||||||
update_indices(hidx);
|
|
||||||
return optional<unsigned>(hidx);
|
return optional<unsigned>(hidx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void state::activate_hypothesis(hypothesis_idx hidx) {
|
||||||
|
m_branch.m_active.insert(hidx);
|
||||||
|
update_indices(hidx);
|
||||||
|
}
|
||||||
|
|
||||||
bool state::hidx_depends_on(unsigned hidx_user, unsigned hidx_provider) const {
|
bool state::hidx_depends_on(unsigned hidx_user, unsigned hidx_provider) const {
|
||||||
if (auto s = m_branch.m_forward_deps.find(hidx_provider)) {
|
if (auto s = m_branch.m_forward_deps.find(hidx_provider)) {
|
||||||
return s->contains(hidx_user);
|
return s->contains(hidx_user);
|
||||||
|
|
|
@ -293,8 +293,9 @@ public:
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/** \brief Activate the next hypothesis in the TODO queue, return none if the TODO queue is empty. */
|
/** \brief Select next hypothesis in the TODO queue, return none if the TODO queue is empty. */
|
||||||
optional<hypothesis_idx> activate_hypothesis();
|
optional<hypothesis_idx> select_hypothesis_to_activate();
|
||||||
|
void activate_hypothesis(hypothesis_idx hidx);
|
||||||
|
|
||||||
/** \brief Store in \c r the hypotheses in this branch sorted by dependency depth */
|
/** \brief Store in \c r the hypotheses in this branch sorted by dependency depth */
|
||||||
void get_sorted_hypotheses(hypothesis_idx_buffer & r) const;
|
void get_sorted_hypotheses(hypothesis_idx_buffer & r) const;
|
||||||
|
|
|
@ -14,6 +14,19 @@ namespace lean {
|
||||||
namespace blast {
|
namespace blast {
|
||||||
strategy::strategy() {}
|
strategy::strategy() {}
|
||||||
|
|
||||||
|
action_result strategy::activate_hypothesis(bool preprocess) {
|
||||||
|
scope_trace scope(!preprocess && get_config().m_trace);
|
||||||
|
auto hidx = curr_state().select_hypothesis_to_activate();
|
||||||
|
if (!hidx) return action_result::failed();
|
||||||
|
auto r = hypothesis_pre_activation(*hidx);
|
||||||
|
if (!solved(r) && !failed(r)) {
|
||||||
|
curr_state().activate_hypothesis(*hidx);
|
||||||
|
return hypothesis_post_activation(*hidx);
|
||||||
|
} else {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
action_result strategy::next_branch(expr pr) {
|
action_result strategy::next_branch(expr pr) {
|
||||||
while (curr_state().has_proof_steps()) {
|
while (curr_state().has_proof_steps()) {
|
||||||
proof_step s = curr_state().top_proof_step();
|
proof_step s = curr_state().top_proof_step();
|
||||||
|
|
|
@ -24,7 +24,10 @@ class strategy {
|
||||||
protected:
|
protected:
|
||||||
virtual optional<expr> preprocess() = 0;
|
virtual optional<expr> preprocess() = 0;
|
||||||
virtual action_result next_action() = 0;
|
virtual action_result next_action() = 0;
|
||||||
|
virtual action_result hypothesis_pre_activation(hypothesis_idx hidx) = 0;
|
||||||
|
virtual action_result hypothesis_post_activation(hypothesis_idx hidx) = 0;
|
||||||
|
|
||||||
|
action_result activate_hypothesis(bool preprocess = false);
|
||||||
action_result next_branch(expr pr);
|
action_result next_branch(expr pr);
|
||||||
optional<expr> search_upto(unsigned depth);
|
optional<expr> search_upto(unsigned depth);
|
||||||
optional<expr> search();
|
optional<expr> search();
|
||||||
|
|
Loading…
Reference in a new issue