void initialize_revert_tactic() { auto fn = [](type_checker &, elaborate_fn const &, expr const & e, pos_info_provider const *) { buffer<name> ns; get_tactic_id_list_elements(app_arg(e), ns, "invalid 'reverts' tactic, list of identifiers expected"); tactic r = revert_tactic(ns[0]); for (unsigned i = 1; i < ns.size(); i++) r = then(revert_tactic(ns[i]), r); return r; }; register_tac(get_tactic_revert_name(), fn); register_tac(get_tactic_reverts_name(), fn); }
void initialize_intros_tactic() { register_tac(get_tactic_intro_name(), [](type_checker &, elaborate_fn const &, expr const & e, pos_info_provider const *) { name const & id = tactic_expr_to_id(app_arg(e), "invalid 'intro' tactic, argument must be an identifier"); return intros_tactic(to_list(id)); }); register_tac(get_tactic_intros_name(), [](type_checker &, elaborate_fn const &, expr const & e, pos_info_provider const *) { buffer<name> ns; get_tactic_id_list_elements(app_arg(e), ns, "invalid 'intros' tactic, arguments must be identifiers"); return intros_tactic(to_list(ns.begin(), ns.end())); }); }
void initialize_contradiction_tactic() { register_tac(name{"tactic", "contradiction"}, [](type_checker &, elaborate_fn const &, expr const &, pos_info_provider const *) { list<name> empty; return then(orelse(intros_tactic(empty), id_tactic()), contradiction_tactic()); }); }
void initialize_change_tactic() { register_tac(get_tactic_change_name(), [](type_checker &, elaborate_fn const & fn, expr const & e, pos_info_provider const *) { check_tactic_expr(app_arg(e), "invalid 'change' tactic, invalid argument"); return change_goal_tactic(fn, get_tactic_expr_expr(app_arg(e))); }); }
void initialize_clear_tactic() { register_tac(get_tactic_clear_name(), [](type_checker &, elaborate_fn const &, expr const & e, pos_info_provider const *) { name n = tactic_expr_to_id(app_arg(e), "invalid 'clear' tactic, argument must be an identifier"); return clear_tactic(n); }); register_tac(get_tactic_clears_name(), [](type_checker &, elaborate_fn const &, expr const & e, pos_info_provider const *) { buffer<name> ns; get_tactic_id_list_elements(app_arg(e), ns, "invalid 'clears' tactic, list of identifiers expected"); tactic r = clear_tactic(ns.back()); ns.pop_back(); while (!ns.empty()) { r = then(clear_tactic(ns.back()), r); ns.pop_back(); } return r; }); }
void initialize_check_expr_tactic() { register_tac(get_tactic_check_expr_name(), [](type_checker &, elaborate_fn const & fn, expr const & e, pos_info_provider const * p) { check_tactic_expr(app_arg(e), "invalid 'check_expr' tactic, invalid argument"); expr arg = get_tactic_expr_expr(app_arg(e)); if (p) { if (auto it = p->get_pos_info(e)) return check_expr_tactic(fn, arg, std::string(p->get_file_name()), *it); } return check_expr_tactic(fn, arg, "<unknown file>", mk_pair(0, 0)); }); }
void initialize_apply_tactic() { g_apply_class_instance = new name{"apply", "class_instance"}; register_bool_option(*g_apply_class_instance, LEAN_DEFAULT_APPLY_CLASS_INSTANCE, "(apply tactic) if true apply tactic uses class-instances " "resolution for instance implicit arguments"); register_tac(get_tactic_apply_name(), [](type_checker &, elaborate_fn const & fn, expr const & e, pos_info_provider const *) { check_tactic_expr(app_arg(e), "invalid 'apply' tactic, invalid argument"); return apply_tactic(fn, get_tactic_expr_expr(app_arg(e))); }); register_tac(get_tactic_eapply_name(), [](type_checker &, elaborate_fn const & fn, expr const & e, pos_info_provider const *) { check_tactic_expr(app_arg(e), "invalid 'eapply' tactic, invalid argument"); return eapply_tactic(fn, get_tactic_expr_expr(app_arg(e))); }); register_tac(get_tactic_fapply_name(), [](type_checker &, elaborate_fn const & fn, expr const & e, pos_info_provider const *) { check_tactic_expr(app_arg(e), "invalid 'fapply' tactic, invalid argument"); return fapply_tactic(fn, get_tactic_expr_expr(app_arg(e))); }); }
void initialize_whnf_tactic() { register_tac(name({"tactic", "whnf"}), [](type_checker &, elaborate_fn const &, expr const &, pos_info_provider const *) { return whnf_tactic(); }); }