feat(library/tactic): implement assumption tactic in Lean

This commit is contained in:
Leonardo de Moura 2016-06-17 09:06:35 -07:00
parent b24795b2b1
commit c8c43a866b
5 changed files with 8 additions and 59 deletions

View file

@ -65,7 +65,6 @@ meta_constant format_result : tactic format
meta_constant target : tactic expr
meta_constant intro : name → tactic unit
meta_constant intron : nat → tactic unit
meta_constant assumption : tactic unit
meta_constant rename : name → name → tactic unit
meta_constant clear : name → tactic unit
meta_constant revert_lst : list name → tactic unit
@ -148,4 +147,11 @@ meta_definition find_same_type : expr → list expr → tactic expr
if b = tt then return H
else find_same_type e Hs
meta_definition assumption : tactic unit :=
do { ctx ← local_context,
t ← target,
H ← find_same_type t ctx,
exact H }
<|> fail "assumption tactic failed"
end tactic

View file

@ -1,4 +1,4 @@
add_library(tactic OBJECT tactic_state.cpp intro_tactic.cpp assumption_tactic.cpp
add_library(tactic OBJECT tactic_state.cpp intro_tactic.cpp
revert_tactic.cpp rename_tactic.cpp clear_tactic.cpp
app_builder_tactics.cpp subst_tactic.cpp exact_tactic.cpp
elaborate.cpp init_module.cpp)

View file

@ -1,40 +0,0 @@
/*
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#include "library/tactic/tactic_state.h"
namespace lean {
optional<tactic_state> assumption(tactic_state const & s) {
optional<metavar_decl> g = s.get_main_goal_decl();
lean_assert(g);
metavar_context mctx = s.mctx();
type_context ctx = mk_type_context_for(s, mctx, transparency_mode::Reducible);
local_context const & lctx = g->get_context();
expr const & type = g->get_type();
optional<local_decl> d = lctx.back_find_if([&](local_decl const & d) {
return ctx.is_def_eq(type, d.get_type());
});
if (!d) return none_tactic_state();
mctx.assign(head(s.goals()), d->mk_ref());
return some_tactic_state(set_mctx_goals(s, mctx, tail(s.goals())));
}
vm_obj tactic_assumption(vm_obj const & s) {
optional<metavar_decl> g = to_tactic_state(s).get_main_goal_decl();
if (!g) return mk_no_goals_exception(to_tactic_state(s));
if (auto r = assumption(to_tactic_state(s)))
return mk_tactic_success(*r);
else
return mk_tactic_exception("assumption tactic failed", to_tactic_state(s));
}
void initialize_assumption_tactic() {
DECLARE_VM_BUILTIN(name({"tactic", "assumption"}), tactic_assumption);
}
void finalize_assumption_tactic() {
}
}

View file

@ -1,14 +0,0 @@
/*
Copyright (c) 2016 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#pragma once
#include "library/tactic/tactic_state.h"
namespace lean {
optional<tactic_state> assumption(tactic_state const & s);
void initialize_assumption_tactic();
void finalize_assumption_tactic();
}

View file

@ -6,7 +6,6 @@ Author: Leonardo de Moura
*/
#include "library/tactic/tactic_state.h"
#include "library/tactic/intro_tactic.h"
#include "library/tactic/assumption_tactic.h"
#include "library/tactic/revert_tactic.h"
#include "library/tactic/rename_tactic.h"
#include "library/tactic/clear_tactic.h"
@ -19,7 +18,6 @@ namespace lean {
void initialize_tactic_module() {
initialize_tactic_state();
initialize_intro_tactic();
initialize_assumption_tactic();
initialize_revert_tactic();
initialize_rename_tactic();
initialize_clear_tactic();
@ -36,7 +34,6 @@ void finalize_tactic_module() {
finalize_clear_tactic();
finalize_rename_tactic();
finalize_revert_tactic();
finalize_assumption_tactic();
finalize_intro_tactic();
finalize_tactic_state();
}