refactor(library): add suffixes.h with commonly used suffixes such as brec_on

This commit is contained in:
Leonardo de Moura 2019-03-20 12:46:31 -07:00
parent 9d5ab01647
commit 039e7fab48
16 changed files with 327 additions and 298 deletions

View file

@ -21,6 +21,7 @@ Author: Leonardo de Moura
#include "library/aux_recursors.h"
#include "library/app_builder.h"
#include "library/constants.h"
#include "library/suffixes.h"
#include "library/placeholder.h"
#include "library/explicit.h"
#include "library/string.h"
@ -398,7 +399,7 @@ auto elaborator::get_elim_info_for_builtin(name const & fn) -> elim_info {
nminors = length(I_val.get_cnstrs());
elim_info r;
if (fn.get_string() == "brec_on" || fn.get_string() == "binduction_on") {
if (fn.get_string() == g_brec_on || fn.get_string() == g_binduction_on) {
r.m_arity = nparams + 1 /* motive */ + nindices + 1 /* major */ + 1;
} else {
r.m_arity = nparams + 1 /* motive */ + nindices + 1 /* major */ + nminors;

View file

@ -37,6 +37,7 @@ Author: Leonardo de Moura
#include "library/aux_recursors.h"
#include "library/type_context.h"
#include "library/app_builder.h"
#include "library/suffixes.h"
#include "library/compiler/compiler.h"
#include "library/constructions/rec_on.h"
#include "library/constructions/projection.h"
@ -1149,7 +1150,7 @@ struct structure_cmd_fn {
}
void add_rec_on_alias(name const & n) {
name rec_on_name(m_name, "rec_on");
name rec_on_name(m_name, g_rec_on);
constant_info rec_on_decl = m_env.get(rec_on_name);
declaration new_decl = mk_definition_inferring_unsafe(m_env, n, rec_on_decl.get_lparams(),
rec_on_decl.get_type(), rec_on_decl.get_value(),
@ -1161,10 +1162,10 @@ struct structure_cmd_fn {
void declare_auxiliary() {
m_env = mk_rec_on(m_env, m_name);
name rec_on_name(m_name, "rec_on");
name rec_on_name(m_name, g_rec_on);
add_rec_alias(rec_on_name);
m_env = add_aux_recursor(m_env, rec_on_name);
name cases_on_name(m_name, "cases_on");
name cases_on_name(m_name, g_cases_on);
add_rec_on_alias(cases_on_name);
m_env = add_aux_recursor(m_env, cases_on_name);
}
@ -1264,7 +1265,7 @@ struct structure_cmd_fn {
if (!has_heq_decls(m_env))
return;
m_env = mk_no_confusion(m_env, m_name);
name no_confusion_name(m_name, "no_confusion");
name no_confusion_name(m_name, g_no_confusion);
add_alias(no_confusion_name);
}

View file

@ -581,7 +581,7 @@ class to_lambda_pure_fn {
expr reachable_case;
unsigned num_reachable = 0;
expr some_reachable;
/* We use `is_id` to track whether this "cases_on"-application is of the form
/* We use `is_id` to track whether this "g_cases_on"-application is of the form
```
C.cases_on major (fun ..., _cnstr.0.0) ... (fun ..., _cnstr.(n-1).0)
```
@ -638,7 +638,7 @@ class to_lambda_pure_fn {
minor = ensure_terminal(minor);
minor = visit(minor);
if (!is_enf_unreachable(minor)) {
/* If `minor` is not the constructor `i`, then this "cases_on" application is not the identity. */
/* If `minor` is not the constructor `i`, then this "g_cases_on" application is not the identity. */
unsigned cidx, nusizes, ssz;
if (!(is_llnf_cnstr(minor, cidx, nusizes, ssz) && cidx == i && nusizes == 0 && ssz == 0)) {
is_id = false;

View file

@ -16,6 +16,7 @@ Author: Leonardo de Moura
#include "kernel/instantiate.h"
#include "kernel/kernel_exception.h"
#include "library/util.h"
#include "library/suffixes.h"
#include "library/attribute_manager.h"
#include "library/aux_recursors.h"
#include "library/replace_visitor.h"
@ -196,7 +197,7 @@ expr unfold_macro_defs(environment const & env, expr const & e) {
}
bool is_cases_on_recursor(environment const & env, name const & n) {
return ::lean::is_aux_recursor(env, n) && n.get_string() == "cases_on";
return ::lean::is_aux_recursor(env, n) && n.get_string() == g_cases_on;
}
unsigned get_cases_on_arity(environment const & env, name const & c, bool before_erasure) {

View file

@ -22,15 +22,15 @@ name const * g_bin_tree_node = nullptr;
name const * g_bool = nullptr;
name const * g_bool_ff = nullptr;
name const * g_bool_tt = nullptr;
name const * g_combinator_K = nullptr;
name const * g_combinator_k = nullptr;
name const * g_cast = nullptr;
name const * g_char = nullptr;
name const * g_char_mk = nullptr;
name const * g_char_ne_of_vne = nullptr;
name const * g_char_of_nat = nullptr;
name const * g_char_of_nat_ne_of_ne = nullptr;
name const * g_is_valid_char_range_1 = nullptr;
name const * g_is_valid_char_range_2 = nullptr;
name const * g_is_valid_char_range1 = nullptr;
name const * g_is_valid_char_range2 = nullptr;
name const * g_coe = nullptr;
name const * g_coe_fn = nullptr;
name const * g_coe_sort = nullptr;
@ -45,7 +45,7 @@ name const * g_decidable_is_true = nullptr;
name const * g_decidable_is_false = nullptr;
name const * g_dite = nullptr;
name const * g_empty = nullptr;
name const * g_Exists = nullptr;
name const * g_exists = nullptr;
name const * g_eq = nullptr;
name const * g_eq_cases_on = nullptr;
name const * g_eq_rec_on = nullptr;
@ -288,288 +288,288 @@ name const * g_well_founded_tactics_dec_tac = nullptr;
name const * g_wf_term_hack = nullptr;
void initialize_constants() {
g_absurd = new name{"absurd"};
g_acc_cases_on = new name{"acc", "cases_on"};
g_acc_rec = new name{"acc", "rec"};
g_acc_cases_on = new name{"Acc", "casesOn"};
g_acc_rec = new name{"Acc", "rec"};
g_and = new name{"and"};
g_and_elim_left = new name{"and", "elim_left"};
g_and_elim_right = new name{"and", "elim_right"};
g_and_elim_left = new name{"and", "elimLeft"};
g_and_elim_right = new name{"and", "elimRight"};
g_and_intro = new name{"and", "intro"};
g_and_rec = new name{"and", "rec"};
g_and_cases_on = new name{"and", "cases_on"};
g_array = new name{"array"};
g_auto_param = new name{"auto_param"};
g_and_cases_on = new name{"and", "casesOn"};
g_array = new name{"Array"};
g_auto_param = new name{"autoParam"};
g_bit0 = new name{"bit0"};
g_bit1 = new name{"bit1"};
g_bin_tree_empty = new name{"bin_tree", "empty"};
g_bin_tree_leaf = new name{"bin_tree", "leaf"};
g_bin_tree_node = new name{"bin_tree", "node"};
g_bool = new name{"bool"};
g_bool_ff = new name{"bool", "ff"};
g_bool_tt = new name{"bool", "tt"};
g_combinator_K = new name{"combinator", "K"};
g_bin_tree_empty = new name{"BinTree", "Empty"};
g_bin_tree_leaf = new name{"BinTree", "leaf"};
g_bin_tree_node = new name{"BinTree", "Node"};
g_bool = new name{"Bool"};
g_bool_ff = new name{"Bool", "ff"};
g_bool_tt = new name{"Bool", "tt"};
g_combinator_k = new name{"Combinator", "K"};
g_cast = new name{"cast"};
g_char = new name{"char"};
g_char_mk = new name{"char", "mk"};
g_char_ne_of_vne = new name{"char", "ne_of_vne"};
g_char_of_nat = new name{"char", "of_nat"};
g_char_of_nat_ne_of_ne = new name{"char", "of_nat_ne_of_ne"};
g_is_valid_char_range_1 = new name{"is_valid_char_range_1"};
g_is_valid_char_range_2 = new name{"is_valid_char_range_2"};
g_char = new name{"Char"};
g_char_mk = new name{"Char", "mk"};
g_char_ne_of_vne = new name{"Char", "neOfVne"};
g_char_of_nat = new name{"Char", "ofNat"};
g_char_of_nat_ne_of_ne = new name{"Char", "ofNatNeOfNe"};
g_is_valid_char_range1 = new name{"isValidCharRange1"};
g_is_valid_char_range2 = new name{"isValidCharRange2"};
g_coe = new name{"coe"};
g_coe_fn = new name{"coe_fn"};
g_coe_sort = new name{"coe_sort"};
g_coe_to_lift = new name{"coe_to_lift"};
g_coe_fn = new name{"coeFn"};
g_coe_sort = new name{"coeSort"};
g_coe_to_lift = new name{"coeToLift"};
g_congr = new name{"congr"};
g_congr_arg = new name{"congr_arg"};
g_congr_fun = new name{"congr_fun"};
g_decidable = new name{"decidable"};
g_decidable_cases_on = new name{"decidable", "cases_on"};
g_decidable_to_bool = new name{"decidable", "to_bool"};
g_decidable_is_true = new name{"decidable", "is_true"};
g_decidable_is_false = new name{"decidable", "is_false"};
g_congr_arg = new name{"congrArg"};
g_congr_fun = new name{"congrFun"};
g_decidable = new name{"Decidable"};
g_decidable_cases_on = new name{"Decidable", "casesOn"};
g_decidable_to_bool = new name{"Decidable", "toBool"};
g_decidable_is_true = new name{"Decidable", "isTrue"};
g_decidable_is_false = new name{"Decidable", "isFalse"};
g_dite = new name{"dite"};
g_empty = new name{"empty"};
g_Exists = new name{"Exists"};
g_eq = new name{"eq"};
g_eq_cases_on = new name{"eq", "cases_on"};
g_eq_rec_on = new name{"eq", "rec_on"};
g_eq_rec = new name{"eq", "rec"};
g_eq_mp = new name{"eq", "mp"};
g_eq_mpr = new name{"eq", "mpr"};
g_eq_ndrec = new name{"eq", "ndrec"};
g_eq_refl = new name{"eq", "refl"};
g_eq_subst = new name{"eq", "subst"};
g_eq_symm = new name{"eq", "symm"};
g_eq_trans = new name{"eq", "trans"};
g_eq_of_heq = new name{"eq_of_heq"};
g_eq_true_intro = new name{"eq_true_intro"};
g_eq_false_intro = new name{"eq_false_intro"};
g_eq_self_iff_true = new name{"eq_self_iff_true"};
g_lean_level = new name{"lean", "level"};
g_lean_expr = new name{"lean", "expr"};
g_lean_expr_subst = new name{"lean", "expr", "subst"};
g_false = new name{"false"};
g_false_of_true_iff_false = new name{"false_of_true_iff_false"};
g_false_of_true_eq_false = new name{"false_of_true_eq_false"};
g_false_rec = new name{"false", "rec"};
g_false_cases_on = new name{"false", "cases_on"};
g_fin_mk = new name{"fin", "mk"};
g_fin_ne_of_vne = new name{"fin", "ne_of_vne"};
g_forall_congr = new name{"forall_congr"};
g_forall_congr_eq = new name{"forall_congr_eq"};
g_empty = new name{"Empty"};
g_exists = new name{"Exists"};
g_eq = new name{"Eq"};
g_eq_cases_on = new name{"Eq", "casesOn"};
g_eq_rec_on = new name{"Eq", "recOn"};
g_eq_rec = new name{"Eq", "rec"};
g_eq_mp = new name{"Eq", "mp"};
g_eq_mpr = new name{"Eq", "mpr"};
g_eq_ndrec = new name{"Eq", "ndrec"};
g_eq_refl = new name{"Eq", "refl"};
g_eq_subst = new name{"Eq", "subst"};
g_eq_symm = new name{"Eq", "symm"};
g_eq_trans = new name{"Eq", "trans"};
g_eq_of_heq = new name{"eqOfHeq"};
g_eq_true_intro = new name{"eqTrueIntro"};
g_eq_false_intro = new name{"eqFalseIntro"};
g_eq_self_iff_true = new name{"eqSelfIffTrue"};
g_lean_level = new name{"Lean", "Level"};
g_lean_expr = new name{"Lean", "Expr"};
g_lean_expr_subst = new name{"Lean", "Expr", "subst"};
g_false = new name{"False"};
g_false_of_true_iff_false = new name{"falseOfTrueIffFalse"};
g_false_of_true_eq_false = new name{"falseOfTrueEqFalse"};
g_false_rec = new name{"False", "rec"};
g_false_cases_on = new name{"False", "casesOn"};
g_fin_mk = new name{"Fin", "mk"};
g_fin_ne_of_vne = new name{"Fin", "neOfVne"};
g_forall_congr = new name{"forallCongr"};
g_forall_congr_eq = new name{"forallCongrEq"};
g_funext = new name{"funext"};
g_has_add = new name{"has_add"};
g_has_add_add = new name{"has_add", "add"};
g_has_andthen_andthen = new name{"has_andthen", "andthen"};
g_has_bind_and_then = new name{"has_bind", "and_then"};
g_has_bind_seq = new name{"has_bind", "seq"};
g_has_div_div = new name{"has_div", "div"};
g_has_emptyc_emptyc = new name{"has_emptyc", "emptyc"};
g_has_eval = new name{"has_eval"};
g_has_eval_eval = new name{"has_eval", "eval"};
g_has_insert_insert = new name{"has_insert", "insert"};
g_has_neg_neg = new name{"has_neg", "neg"};
g_has_one = new name{"has_one"};
g_has_one_one = new name{"has_one", "one"};
g_has_orelse_orelse = new name{"has_orelse", "orelse"};
g_has_sep_sep = new name{"has_sep", "sep"};
g_has_sizeof = new name{"has_sizeof"};
g_has_sizeof_mk = new name{"has_sizeof", "mk"};
g_has_sub_sub = new name{"has_sub", "sub"};
g_has_repr = new name{"has_repr"};
g_has_well_founded = new name{"has_well_founded"};
g_has_well_founded_r = new name{"has_well_founded", "r"};
g_has_well_founded_wf = new name{"has_well_founded", "wf"};
g_has_zero = new name{"has_zero"};
g_has_zero_zero = new name{"has_zero", "zero"};
g_has_coe_t = new name{"has_coe_t"};
g_heq = new name{"heq"};
g_heq_refl = new name{"heq", "refl"};
g_heq_symm = new name{"heq", "symm"};
g_heq_trans = new name{"heq", "trans"};
g_heq_of_eq = new name{"heq_of_eq"};
g_has_add = new name{"HasAdd"};
g_has_add_add = new name{"HasAdd", "add"};
g_has_andthen_andthen = new name{"HasAndthen", "andthen"};
g_has_bind_and_then = new name{"HasBind", "andThen"};
g_has_bind_seq = new name{"HasBind", "Seq"};
g_has_div_div = new name{"HasDiv", "div"};
g_has_emptyc_emptyc = new name{"HasEmptyc", "emptyc"};
g_has_eval = new name{"HasEval"};
g_has_eval_eval = new name{"HasEval", "eval"};
g_has_insert_insert = new name{"HasInsert", "insert"};
g_has_neg_neg = new name{"HasNeg", "neg"};
g_has_one = new name{"HasOne"};
g_has_one_one = new name{"HasOne", "one"};
g_has_orelse_orelse = new name{"HasOrelse", "orelse"};
g_has_sep_sep = new name{"HasSep", "sep"};
g_has_sizeof = new name{"HasSizeof"};
g_has_sizeof_mk = new name{"HasSizeof", "mk"};
g_has_sub_sub = new name{"HasSub", "sub"};
g_has_repr = new name{"HasRepr"};
g_has_well_founded = new name{"HasWellFounded"};
g_has_well_founded_r = new name{"HasWellFounded", "r"};
g_has_well_founded_wf = new name{"HasWellFounded", "wf"};
g_has_zero = new name{"HasZero"};
g_has_zero_zero = new name{"HasZero", "zero"};
g_has_coe_t = new name{"HasCoeT"};
g_heq = new name{"Heq"};
g_heq_refl = new name{"Heq", "refl"};
g_heq_symm = new name{"Heq", "symm"};
g_heq_trans = new name{"Heq", "trans"};
g_heq_of_eq = new name{"heqOfEq"};
g_id = new name{"id"};
g_id_rhs = new name{"id_rhs"};
g_id_delta = new name{"id_delta"};
g_if_neg = new name{"if_neg"};
g_if_pos = new name{"if_pos"};
g_iff = new name{"iff"};
g_iff_false_intro = new name{"iff_false_intro"};
g_iff_intro = new name{"iff", "intro"};
g_iff_mp = new name{"iff", "mp"};
g_iff_mpr = new name{"iff", "mpr"};
g_iff_refl = new name{"iff", "refl"};
g_iff_symm = new name{"iff", "symm"};
g_iff_trans = new name{"iff", "trans"};
g_iff_true_intro = new name{"iff_true_intro"};
g_imp_congr = new name{"imp_congr"};
g_imp_congr_eq = new name{"imp_congr_eq"};
g_imp_congr_ctx = new name{"imp_congr_ctx"};
g_imp_congr_ctx_eq = new name{"imp_congr_ctx_eq"};
g_id_rhs = new name{"idRhs"};
g_id_delta = new name{"idDelta"};
g_if_neg = new name{"ifNeg"};
g_if_pos = new name{"ifPos"};
g_iff = new name{"Iff"};
g_iff_false_intro = new name{"iffFalseIntro"};
g_iff_intro = new name{"Iff", "intro"};
g_iff_mp = new name{"Iff", "mp"};
g_iff_mpr = new name{"Iff", "mpr"};
g_iff_refl = new name{"Iff", "refl"};
g_iff_symm = new name{"Iff", "symm"};
g_iff_trans = new name{"Iff", "trans"};
g_iff_true_intro = new name{"iffTrueIntro"};
g_imp_congr = new name{"impCongr"};
g_imp_congr_eq = new name{"impCongrEq"};
g_imp_congr_ctx = new name{"impCongrCtx"};
g_imp_congr_ctx_eq = new name{"impCongrCtxEq"};
g_implies = new name{"implies"};
g_implies_of_if_neg = new name{"implies_of_if_neg"};
g_implies_of_if_pos = new name{"implies_of_if_pos"};
g_int = new name{"int"};
g_int_nat_abs = new name{"int", "nat_abs"};
g_int_lt = new name{"int", "lt"};
g_int_dec_lt = new name{"int", "dec_lt"};
g_int_of_nat = new name{"int", "of_nat"};
g_int_neg_succ_of_nat = new name{"int", "neg_succ_of_nat"};
g_interactive_param_desc = new name{"interactive", "param_desc"};
g_implies_of_if_neg = new name{"impliesOfIfNeg"};
g_implies_of_if_pos = new name{"impliesOfIfPos"};
g_int = new name{"Int"};
g_int_nat_abs = new name{"Int", "natAbs"};
g_int_lt = new name{"Int", "lt"};
g_int_dec_lt = new name{"Int", "decLt"};
g_int_of_nat = new name{"Int", "ofNat"};
g_int_neg_succ_of_nat = new name{"Int", "negSuccOfNat"};
g_interactive_param_desc = new name{"interactive", "paramDesc"};
g_interactive_parse = new name{"interactive", "parse"};
g_io_core = new name{"io_core"};
g_monad_io_impl = new name{"monad_io_impl"};
g_monad_io_terminal_impl = new name{"monad_io_terminal_impl"};
g_monad_io_file_system_impl = new name{"monad_io_file_system_impl"};
g_monad_io_environment_impl = new name{"monad_io_environment_impl"};
g_monad_io_process_impl = new name{"monad_io_process_impl"};
g_monad_io_random_impl = new name{"monad_io_random_impl"};
g_io_core = new name{"ioCore"};
g_monad_io_impl = new name{"monadIoImpl"};
g_monad_io_terminal_impl = new name{"monadIoTerminalImpl"};
g_monad_io_file_system_impl = new name{"monadIoFileSystemImpl"};
g_monad_io_environment_impl = new name{"monadIoEnvironmentImpl"};
g_monad_io_process_impl = new name{"monadIoProcessImpl"};
g_monad_io_random_impl = new name{"monadIoRandomImpl"};
g_inline = new name{"inline"};
g_io = new name{"io"};
g_io = new name{"Io"};
g_ite = new name{"ite"};
g_lc_proof = new name{"lc_proof"};
g_lc_unreachable = new name{"lc_unreachable"};
g_list = new name{"list"};
g_list_nil = new name{"list", "nil"};
g_list_cons = new name{"list", "cons"};
g_match_failed = new name{"match_failed"};
g_monad = new name{"monad"};
g_monad_fail = new name{"monad_fail"};
g_lean_name = new name{"lean", "name"};
g_lean_name_anonymous = new name{"lean", "name", "anonymous"};
g_lean_name_mk_numeral = new name{"lean", "name", "mk_numeral"};
g_lean_name_mk_string = new name{"lean", "name", "mk_string"};
g_lean_name_no_confusion = new name{"lean", "name", "no_confusion"};
g_lean_name_mk_string_ne_mk_string_of_ne_prefix = new name{"lean", "name", "mk_string_ne_mk_string_of_ne_prefix"};
g_lean_name_mk_string_ne_mk_string_of_ne_string = new name{"lean", "name", "mk_string_ne_mk_string_of_ne_string"};
g_lean_name_mk_numeral_ne_mk_numeral_of_ne_prefix = new name{"lean", "name", "mk_numeral_ne_mk_numeral_of_ne_prefix"};
g_lean_name_mk_numeral_ne_mk_numeral_of_ne_numeral = new name{"lean", "name", "mk_numeral_ne_mk_numeral_of_ne_numeral"};
g_nat = new name{"nat"};
g_nat_succ = new name{"nat", "succ"};
g_nat_zero = new name{"nat", "zero"};
g_nat_has_zero = new name{"nat", "has_zero"};
g_nat_has_one = new name{"nat", "has_one"};
g_nat_has_add = new name{"nat", "has_add"};
g_nat_add = new name{"nat", "add"};
g_nat_cases_on = new name{"nat", "cases_on"};
g_nat_bit0_ne = new name{"nat", "bit0_ne"};
g_nat_bit0_ne_bit1 = new name{"nat", "bit0_ne_bit1"};
g_nat_bit0_ne_zero = new name{"nat", "bit0_ne_zero"};
g_nat_bit0_ne_one = new name{"nat", "bit0_ne_one"};
g_nat_bit1_ne = new name{"nat", "bit1_ne"};
g_nat_bit1_ne_bit0 = new name{"nat", "bit1_ne_bit0"};
g_nat_bit1_ne_zero = new name{"nat", "bit1_ne_zero"};
g_nat_bit1_ne_one = new name{"nat", "bit1_ne_one"};
g_nat_zero_ne_one = new name{"nat", "zero_ne_one"};
g_nat_zero_ne_bit0 = new name{"nat", "zero_ne_bit0"};
g_nat_zero_ne_bit1 = new name{"nat", "zero_ne_bit1"};
g_nat_one_ne_zero = new name{"nat", "one_ne_zero"};
g_nat_one_ne_bit0 = new name{"nat", "one_ne_bit0"};
g_nat_one_ne_bit1 = new name{"nat", "one_ne_bit1"};
g_nat_bit0_lt = new name{"nat", "bit0_lt"};
g_nat_bit1_lt = new name{"nat", "bit1_lt"};
g_nat_bit0_lt_bit1 = new name{"nat", "bit0_lt_bit1"};
g_nat_bit1_lt_bit0 = new name{"nat", "bit1_lt_bit0"};
g_nat_zero_lt_one = new name{"nat", "zero_lt_one"};
g_nat_zero_lt_bit1 = new name{"nat", "zero_lt_bit1"};
g_nat_zero_lt_bit0 = new name{"nat", "zero_lt_bit0"};
g_nat_one_lt_bit0 = new name{"nat", "one_lt_bit0"};
g_nat_one_lt_bit1 = new name{"nat", "one_lt_bit1"};
g_nat_le_of_lt = new name{"nat", "le_of_lt"};
g_nat_le_refl = new name{"nat", "le_refl"};
g_nat_decidable_lt = new name{"nat", "decidable_lt"};
g_nat_dec_eq = new name{"nat", "dec_eq"};
g_nat_mul = new name{"nat", "mul"};
g_nat_sub = new name{"nat", "sub"};
g_nat_beq = new name{"nat", "beq"};
g_nat_ble = new name{"nat", "ble"};
g_lc_proof = new name{"lcProof"};
g_lc_unreachable = new name{"lcUnreachable"};
g_list = new name{"List"};
g_list_nil = new name{"List", "nil"};
g_list_cons = new name{"List", "cons"};
g_match_failed = new name{"matchFailed"};
g_monad = new name{"Monad"};
g_monad_fail = new name{"MonadFail"};
g_lean_name = new name{"Lean", "Name"};
g_lean_name_anonymous = new name{"Lean", "Name", "anonymous"};
g_lean_name_mk_numeral = new name{"Lean", "Name", "mkNumeral"};
g_lean_name_mk_string = new name{"Lean", "Name", "mkString"};
g_lean_name_no_confusion = new name{"Lean", "Name", "noConfusion"};
g_lean_name_mk_string_ne_mk_string_of_ne_prefix = new name{"Lean", "Name", "mkStringNeMkStringOfNePrefix"};
g_lean_name_mk_string_ne_mk_string_of_ne_string = new name{"Lean", "Name", "mkStringNeMkStringOfNeString"};
g_lean_name_mk_numeral_ne_mk_numeral_of_ne_prefix = new name{"Lean", "Name", "mkNumeralNeMkNumeralOfNePrefix"};
g_lean_name_mk_numeral_ne_mk_numeral_of_ne_numeral = new name{"Lean", "Name", "mkNumeralNeMkNumeralOfNeNumeral"};
g_nat = new name{"Nat"};
g_nat_succ = new name{"Nat", "succ"};
g_nat_zero = new name{"Nat", "zero"};
g_nat_has_zero = new name{"Nat", "HasZero"};
g_nat_has_one = new name{"Nat", "HasOne"};
g_nat_has_add = new name{"Nat", "HasAdd"};
g_nat_add = new name{"Nat", "add"};
g_nat_cases_on = new name{"Nat", "casesOn"};
g_nat_bit0_ne = new name{"Nat", "bit0Ne"};
g_nat_bit0_ne_bit1 = new name{"Nat", "bit0NeBit1"};
g_nat_bit0_ne_zero = new name{"Nat", "bit0NeZero"};
g_nat_bit0_ne_one = new name{"Nat", "bit0NeOne"};
g_nat_bit1_ne = new name{"Nat", "bit1Ne"};
g_nat_bit1_ne_bit0 = new name{"Nat", "bit1NeBit0"};
g_nat_bit1_ne_zero = new name{"Nat", "bit1NeZero"};
g_nat_bit1_ne_one = new name{"Nat", "bit1NeOne"};
g_nat_zero_ne_one = new name{"Nat", "zeroNeOne"};
g_nat_zero_ne_bit0 = new name{"Nat", "zeroNeBit0"};
g_nat_zero_ne_bit1 = new name{"Nat", "zeroNeBit1"};
g_nat_one_ne_zero = new name{"Nat", "oneNeZero"};
g_nat_one_ne_bit0 = new name{"Nat", "oneNeBit0"};
g_nat_one_ne_bit1 = new name{"Nat", "oneNeBit1"};
g_nat_bit0_lt = new name{"Nat", "bit0Lt"};
g_nat_bit1_lt = new name{"Nat", "bit1Lt"};
g_nat_bit0_lt_bit1 = new name{"Nat", "bit0LtBit1"};
g_nat_bit1_lt_bit0 = new name{"Nat", "bit1LtBit0"};
g_nat_zero_lt_one = new name{"Nat", "zeroLtOne"};
g_nat_zero_lt_bit1 = new name{"Nat", "zeroLtBit1"};
g_nat_zero_lt_bit0 = new name{"Nat", "zeroLtBit0"};
g_nat_one_lt_bit0 = new name{"Nat", "oneLtBit0"};
g_nat_one_lt_bit1 = new name{"Nat", "oneLtBit1"};
g_nat_le_of_lt = new name{"Nat", "leOfLt"};
g_nat_le_refl = new name{"Nat", "leRefl"};
g_nat_decidable_lt = new name{"Nat", "decidableLt"};
g_nat_dec_eq = new name{"Nat", "decEq"};
g_nat_mul = new name{"Nat", "mul"};
g_nat_sub = new name{"Nat", "sub"};
g_nat_beq = new name{"Nat", "beq"};
g_nat_ble = new name{"Nat", "ble"};
g_ne = new name{"ne"};
g_neq_of_not_iff = new name{"neq_of_not_iff"};
g_neq_of_not_iff = new name{"neqOfNotIff"};
g_not = new name{"not"};
g_not_of_iff_false = new name{"not_of_iff_false"};
g_not_of_eq_false = new name{"not_of_eq_false"};
g_of_eq_true = new name{"of_eq_true"};
g_of_iff_true = new name{"of_iff_true"};
g_opt_param = new name{"opt_param"};
g_not_of_iff_false = new name{"notOfIffFalse"};
g_not_of_eq_false = new name{"notOfEqFalse"};
g_of_eq_true = new name{"ofEqTrue"};
g_of_iff_true = new name{"ofIffTrue"};
g_opt_param = new name{"optParam"};
g_or = new name{"or"};
g_out_param = new name{"out_param"};
g_out_param = new name{"outParam"};
g_pexpr = new name{"pexpr"};
g_pexpr_subst = new name{"pexpr", "subst"};
g_punit = new name{"punit"};
g_punit_cases_on = new name{"punit", "cases_on"};
g_punit_star = new name{"punit", "star"};
g_prod_mk = new name{"prod", "mk"};
g_pprod = new name{"pprod"};
g_pprod_mk = new name{"pprod", "mk"};
g_pprod_fst = new name{"pprod", "fst"};
g_pprod_snd = new name{"pprod", "snd"};
g_punit = new name{"Punit"};
g_punit_cases_on = new name{"Punit", "casesOn"};
g_punit_star = new name{"Punit", "star"};
g_prod_mk = new name{"Prod", "mk"};
g_pprod = new name{"Pprod"};
g_pprod_mk = new name{"Pprod", "mk"};
g_pprod_fst = new name{"Pprod", "fst"};
g_pprod_snd = new name{"Pprod", "snd"};
g_propext = new name{"propext"};
g_to_pexpr = new name{"to_pexpr"};
g_quot_mk = new name{"quot", "mk"};
g_quot_lift = new name{"quot", "lift"};
g_to_pexpr = new name{"toPexpr"};
g_quot_mk = new name{"Quot", "mk"};
g_quot_lift = new name{"Quot", "lift"};
g_reflected = new name{"reflected"};
g_reflected_subst = new name{"reflected", "subst"};
g_repr = new name{"repr"};
g_rfl = new name{"rfl"};
g_scope_trace = new name{"scope_trace"};
g_set_of = new name{"set_of"};
g_psigma = new name{"psigma"};
g_psigma_cases_on = new name{"psigma", "cases_on"};
g_psigma_mk = new name{"psigma", "mk"};
g_psigma_fst = new name{"psigma", "fst"};
g_psigma_snd = new name{"psigma", "snd"};
g_scope_trace = new name{"scopeTrace"};
g_set_of = new name{"setOf"};
g_psigma = new name{"Psigma"};
g_psigma_cases_on = new name{"Psigma", "casesOn"};
g_psigma_mk = new name{"Psigma", "mk"};
g_psigma_fst = new name{"Psigma", "fst"};
g_psigma_snd = new name{"Psigma", "snd"};
g_singleton = new name{"singleton"};
g_sizeof = new name{"sizeof"};
g_sorry_ax = new name{"sorry_ax"};
g_string = new name{"string"};
g_string_decidable_eq = new name{"string", "decidable_eq"};
g_string_mk = new name{"string", "mk"};
g_string_data = new name{"string", "data"};
g_string_empty = new name{"string", "empty"};
g_string_str = new name{"string", "str"};
g_string_empty_ne_str = new name{"string", "empty_ne_str"};
g_string_str_ne_empty = new name{"string", "str_ne_empty"};
g_string_str_ne_str_left = new name{"string", "str_ne_str_left"};
g_string_str_ne_str_right = new name{"string", "str_ne_str_right"};
g_sorry_ax = new name{"sorryAx"};
g_string = new name{"String"};
g_string_decidable_eq = new name{"String", "DecidableEq"};
g_string_mk = new name{"String", "mk"};
g_string_data = new name{"String", "data"};
g_string_empty = new name{"String", "Empty"};
g_string_str = new name{"String", "str"};
g_string_empty_ne_str = new name{"String", "emptyNeStr"};
g_string_str_ne_empty = new name{"String", "strNeEmpty"};
g_string_str_ne_str_left = new name{"String", "strNeStrLeft"};
g_string_str_ne_str_right = new name{"String", "strNeStrRight"};
g_subsingleton = new name{"subsingleton"};
g_subsingleton_elim = new name{"subsingleton", "elim"};
g_subtype = new name{"subtype"};
g_subtype_mk = new name{"subtype", "mk"};
g_subtype_val = new name{"subtype", "val"};
g_subtype_rec = new name{"subtype", "rec"};
g_psum = new name{"psum"};
g_psum_cases_on = new name{"psum", "cases_on"};
g_psum_inl = new name{"psum", "inl"};
g_psum_inr = new name{"psum", "inr"};
g_subtype = new name{"Subtype"};
g_subtype_mk = new name{"Subtype", "mk"};
g_subtype_val = new name{"Subtype", "val"};
g_subtype_rec = new name{"Subtype", "rec"};
g_psum = new name{"Psum"};
g_psum_cases_on = new name{"Psum", "casesOn"};
g_psum_inl = new name{"Psum", "inl"};
g_psum_inr = new name{"Psum", "inr"};
g_tactic = new name{"tactic"};
g_tactic_try = new name{"tactic", "try"};
g_tactic_triv = new name{"tactic", "triv"};
g_tactic_mk_inj_eq = new name{"tactic", "mk_inj_eq"};
g_task = new name{"task"};
g_thunk = new name{"thunk"};
g_thunk_mk = new name{"thunk", "mk"};
g_trans_rel_left = new name{"trans_rel_left"};
g_trans_rel_right = new name{"trans_rel_right"};
g_true = new name{"true"};
g_true_intro = new name{"true", "intro"};
g_typed_expr = new name{"typed_expr"};
g_tactic_mk_inj_eq = new name{"tactic", "mkInjEq"};
g_task = new name{"Task"};
g_thunk = new name{"Thunk"};
g_thunk_mk = new name{"Thunk", "mk"};
g_trans_rel_left = new name{"transRelLeft"};
g_trans_rel_right = new name{"transRelRight"};
g_true = new name{"True"};
g_true_intro = new name{"True", "intro"};
g_typed_expr = new name{"typedExpr"};
g_unit = new name{"unit"};
g_unit_star = new name{"unit", "star"};
g_monad_from_pure_bind = new name{"monad_from_pure_bind"};
g_uint8 = new name{"uint8"};
g_uint16 = new name{"uint16"};
g_uint32 = new name{"uint32"};
g_uint64 = new name{"uint64"};
g_usize = new name{"usize"};
g_user_attribute = new name{"user_attribute"};
g_user_attribute_parse_reflect = new name{"user_attribute", "parse_reflect"};
g_well_founded_fix = new name{"well_founded", "fix"};
g_well_founded_fix_eq = new name{"well_founded", "fix_eq"};
g_well_founded_tactics = new name{"well_founded_tactics"};
g_well_founded_tactics_default = new name{"well_founded_tactics", "default"};
g_well_founded_tactics_rel_tac = new name{"well_founded_tactics", "rel_tac"};
g_well_founded_tactics_dec_tac = new name{"well_founded_tactics", "dec_tac"};
g_wf_term_hack = new name{"wf_term_hack"};
g_monad_from_pure_bind = new name{"monadFromPureBind"};
g_uint8 = new name{"Uint8"};
g_uint16 = new name{"Uint16"};
g_uint32 = new name{"Uint32"};
g_uint64 = new name{"Uint64"};
g_usize = new name{"Usize"};
g_user_attribute = new name{"userAttribute"};
g_user_attribute_parse_reflect = new name{"userAttribute", "parseReflect"};
g_well_founded_fix = new name{"WellFounded", "fix"};
g_well_founded_fix_eq = new name{"WellFounded", "fixEq"};
g_well_founded_tactics = new name{"wellFoundedTactics"};
g_well_founded_tactics_default = new name{"wellFoundedTactics", "default"};
g_well_founded_tactics_rel_tac = new name{"wellFoundedTactics", "relTac"};
g_well_founded_tactics_dec_tac = new name{"wellFoundedTactics", "decTac"};
g_wf_term_hack = new name{"wfTermHack"};
}
void finalize_constants() {
delete g_absurd;
@ -591,15 +591,15 @@ void finalize_constants() {
delete g_bool;
delete g_bool_ff;
delete g_bool_tt;
delete g_combinator_K;
delete g_combinator_k;
delete g_cast;
delete g_char;
delete g_char_mk;
delete g_char_ne_of_vne;
delete g_char_of_nat;
delete g_char_of_nat_ne_of_ne;
delete g_is_valid_char_range_1;
delete g_is_valid_char_range_2;
delete g_is_valid_char_range1;
delete g_is_valid_char_range2;
delete g_coe;
delete g_coe_fn;
delete g_coe_sort;
@ -614,7 +614,7 @@ void finalize_constants() {
delete g_decidable_is_false;
delete g_dite;
delete g_empty;
delete g_Exists;
delete g_exists;
delete g_eq;
delete g_eq_cases_on;
delete g_eq_rec_on;
@ -875,15 +875,15 @@ name const & get_bin_tree_node_name() { return *g_bin_tree_node; }
name const & get_bool_name() { return *g_bool; }
name const & get_bool_ff_name() { return *g_bool_ff; }
name const & get_bool_tt_name() { return *g_bool_tt; }
name const & get_combinator_K_name() { return *g_combinator_K; }
name const & get_combinator_k_name() { return *g_combinator_k; }
name const & get_cast_name() { return *g_cast; }
name const & get_char_name() { return *g_char; }
name const & get_char_mk_name() { return *g_char_mk; }
name const & get_char_ne_of_vne_name() { return *g_char_ne_of_vne; }
name const & get_char_of_nat_name() { return *g_char_of_nat; }
name const & get_char_of_nat_ne_of_ne_name() { return *g_char_of_nat_ne_of_ne; }
name const & get_is_valid_char_range_1_name() { return *g_is_valid_char_range_1; }
name const & get_is_valid_char_range_2_name() { return *g_is_valid_char_range_2; }
name const & get_is_valid_char_range1_name() { return *g_is_valid_char_range1; }
name const & get_is_valid_char_range2_name() { return *g_is_valid_char_range2; }
name const & get_coe_name() { return *g_coe; }
name const & get_coe_fn_name() { return *g_coe_fn; }
name const & get_coe_sort_name() { return *g_coe_sort; }
@ -898,7 +898,7 @@ name const & get_decidable_is_true_name() { return *g_decidable_is_true; }
name const & get_decidable_is_false_name() { return *g_decidable_is_false; }
name const & get_dite_name() { return *g_dite; }
name const & get_empty_name() { return *g_empty; }
name const & get_Exists_name() { return *g_Exists; }
name const & get_exists_name() { return *g_exists; }
name const & get_eq_name() { return *g_eq; }
name const & get_eq_cases_on_name() { return *g_eq_cases_on; }
name const & get_eq_rec_on_name() { return *g_eq_rec_on; }

View file

@ -24,15 +24,15 @@ name const & get_bin_tree_node_name();
name const & get_bool_name();
name const & get_bool_ff_name();
name const & get_bool_tt_name();
name const & get_combinator_K_name();
name const & get_combinator_k_name();
name const & get_cast_name();
name const & get_char_name();
name const & get_char_mk_name();
name const & get_char_ne_of_vne_name();
name const & get_char_of_nat_name();
name const & get_char_of_nat_ne_of_ne_name();
name const & get_is_valid_char_range_1_name();
name const & get_is_valid_char_range_2_name();
name const & get_is_valid_char_range1_name();
name const & get_is_valid_char_range2_name();
name const & get_coe_name();
name const & get_coe_fn_name();
name const & get_coe_sort_name();
@ -47,7 +47,7 @@ name const & get_decidable_is_true_name();
name const & get_decidable_is_false_name();
name const & get_dite_name();
name const & get_empty_name();
name const & get_Exists_name();
name const & get_exists_name();
name const & get_eq_name();
name const & get_eq_cases_on_name();
name const & get_eq_rec_on_name();

View file

@ -14,6 +14,7 @@ Author: Leonardo de Moura
#include "library/reducible.h"
#include "library/module.h"
#include "library/bin_app.h"
#include "library/suffixes.h"
#include "library/util.h"
#include "library/aux_recursors.h"
#include "library/constructions/util.h"
@ -335,7 +336,7 @@ static environment mk_brec_on(environment const & env, name const & n, bool ind)
rec = mk_app(rec, ref_args[i]);
type_checker tc(env, lctx);
name brec_on_name = name(n, ind ? "binduction_on" : "brec_on");
name brec_on_name = name(n, ind ? g_binduction_on : g_brec_on);
expr brec_on_type = lctx.mk_pi(args, result_type);
expr brec_on_value = lctx.mk_lambda(args, mk_pprod_fst(tc, rec, ind));

View file

@ -10,6 +10,7 @@ Author: Leonardo de Moura
#include "kernel/abstract.h"
#include "kernel/inductive.h"
#include "library/module.h"
#include "library/suffixes.h"
#include "library/protected.h"
#include "library/reducible.h"
#include "library/constants.h"
@ -43,8 +44,8 @@ static bool is_type_former_arg(buffer<name> const & C_ids, expr const & arg) {
environment mk_cases_on(environment const & env, name const & n) {
constant_info ind_info = env.get(n);
if (!ind_info.is_inductive())
throw exception(sstream() << "error in 'cases_on' generation, '" << n << "' is not an inductive datatype");
name cases_on_name(n, "cases_on");
throw exception(sstream() << "error in '" << g_cases_on << "' generation, '" << n << "' is not an inductive datatype");
name cases_on_name(n, g_cases_on);
local_ctx lctx;
inductive_val ind_val = ind_info.to_inductive_val();
name_generator ngen = mk_constructions_name_generator();

View file

@ -12,6 +12,7 @@ Author: Leonardo de Moura
#include "library/protected.h"
#include "library/module.h"
#include "library/util.h"
#include "library/suffixes.h"
#include "library/reducible.h"
#include "library/constants.h"
#include "library/aux_recursors.h"
@ -19,7 +20,7 @@ Author: Leonardo de Moura
namespace lean {
static void throw_corrupted(name const & n) {
throw exception(sstream() << "error in 'no_confusion' generation, '" << n << "' inductive datatype declaration is corrupted");
throw exception(sstream() << "error in '" << g_no_confusion << "' generation, '" << n << "' inductive datatype declaration is corrupted");
}
static optional<environment> mk_no_confusion_type(environment const & env, name const & n) {
@ -30,7 +31,7 @@ static optional<environment> mk_no_confusion_type(environment const & env, name
local_ctx lctx;
name_generator ngen = mk_constructions_name_generator();
unsigned nparams = ind_val.get_nparams();
constant_info cases_info = env.get(name(n, "cases_on"));
constant_info cases_info = env.get(name(n, g_cases_on));
names lps = cases_info.get_lparams();
level plvl = mk_univ_param(head(lps));
levels ilvls = lparams_to_levels(tail(lps));
@ -56,7 +57,7 @@ static optional<environment> mk_no_confusion_type(environment const & env, name
args.push_back(v2);
expr R = mk_sort(rlvl);
expr Pres = P;
name no_confusion_type_name{n, "no_confusion_type"};
name no_confusion_type_name{n, g_no_confusion_type};
expr no_confusion_type_type = lctx.mk_pi(args, R);
/* Create type former */
buffer<expr> type_former_args;
@ -135,8 +136,8 @@ environment mk_no_confusion(environment const & env, name const & n) {
constant_info ind_info = new_env.get(n);
inductive_val ind_val = ind_info.to_inductive_val();
unsigned nparams = ind_val.get_nparams();
constant_info no_confusion_type_info = new_env.get(name{n, "no_confusion_type"});
constant_info cases_info = new_env.get(name(n, "cases_on"));
constant_info no_confusion_type_info = new_env.get(name{n, g_no_confusion_type});
constant_info cases_info = new_env.get(name(n, g_cases_on));
names lps = no_confusion_type_info.get_lparams();
levels ls = lparams_to_levels(lps);
expr ind_type = instantiate_type_lparams(ind_info, tail(ls));
@ -156,7 +157,7 @@ environment mk_no_confusion(environment const & env, name const & n) {
expr eq_v = mk_app(mk_constant(get_eq_name(), levels(v_lvl)), v_type);
expr H12 = lctx.mk_local_decl(ngen, "h12", mk_app(eq_v, v1, v2), mk_binder_info());
args.push_back(H12);
name no_confusion_name{n, "no_confusion"};
name no_confusion_name{n, g_no_confusion};
expr no_confusion_ty = lctx.mk_pi(args, range);
// The gen proof is of the form
// (fun H11 : v1 = v1, cases_on Params (fun Indices v1, no_confusion_type Params Indices P v1 v1) Indices v1

View file

@ -12,6 +12,7 @@ Author: Leonardo de Moura
#include "library/module.h"
#include "library/reducible.h"
#include "library/protected.h"
#include "library/suffixes.h"
#include "library/aux_recursors.h"
#include "library/constructions/util.h"
@ -19,10 +20,10 @@ namespace lean {
environment mk_rec_on(environment const & env, name const & n) {
constant_info ind_info = env.get(n);
if (!ind_info.is_inductive())
throw exception(sstream() << "error in 'rec_on' generation, '" << n << "' is not an inductive datatype");
throw exception(sstream() << "error in '" << g_rec_on << "' generation, '" << n << "' is not an inductive datatype");
name_generator ngen = mk_constructions_name_generator();
local_ctx lctx;
name rec_on_name(n, "rec_on");
name rec_on_name(n, g_rec_on);
constant_info rec_info = env.get(mk_rec_name(n));
recursor_val rec_val = rec_info.to_recursor_val();
buffer<expr> locals;

View file

@ -11,6 +11,7 @@ Author: Leonardo de Moura
#include "library/locals.h"
#include "library/class.h"
#include "library/util.h"
#include "library/suffixes.h"
#include "library/pattern_attribute.h"
#include "library/app_builder.h"
#include "library/replace_visitor_with_tc.h"
@ -225,7 +226,7 @@ struct structural_rec_fn {
name I_name = const_name(I);
inductive_val I_val = m_env.get(I_name).to_inductive_val();
m_reflexive = I_val.is_reflexive();
if (!m_env.find(name(I_name, "brec_on"))) {
if (!m_env.find(name(I_name, g_brec_on))) {
trace_struct(tout() << "structural recursion on argument #" << (arg_idx+1) << " was not used "
<< "for '" << fn << "' because the inductive type '" << I << "' does have brec_on recursor\n "
<< arg_type << "\n";);
@ -550,8 +551,8 @@ struct structural_rec_fn {
}
void update_eqs(type_context_old & ctx, unpack_eqns & ues, expr const & fn, expr const & new_fn) {
/* C is a temporary "abstract" motive, we use it to access the "brec_on dictionary".
The "brec_on dictionary is an element of type below, and it is the last argument of the new function. */
/* C is a temporary "abstract" motive, we use it to access the "g_brec_on dictionary".
The g_brec_on dictionary is an element of type below, and it is the last argument of the new function. */
expr C = mk_local(ctx.next_name(), "_C", m_motive_type, mk_binder_info());
buffer<expr> & eqns = ues.get_eqns_of(0);
buffer<expr> new_eqns;
@ -677,7 +678,7 @@ struct structural_rec_fn {
buffer<expr> below_args;
expr below = get_app_args(below_type, below_args);
expr motive = below_args[nparams];
name brec_on_name = name(I_name, m_use_ibelow ? "binduction_on" : "brec_on");
name brec_on_name = name(I_name, m_use_ibelow ? g_binduction_on : g_brec_on);
expr brec_on_fn = mk_constant(brec_on_name, const_levels(below));
buffer<expr> brec_on_args;
buffer<expr> F_domain; /* domain for F argument for brec_on */

17
src/library/suffixes.h Normal file
View file

@ -0,0 +1,17 @@
/*
Copyright (c) 2019 Microsoft Corporation. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Author: Leonardo de Moura
*/
#pragma once
namespace lean {
constexpr char const * g_rec = "rec";
constexpr char const * g_rec_on = "recOn";
constexpr char const * g_brec_on = "brecOn";
constexpr char const * g_binduction_on = "binductionOn";
constexpr char const * g_cases_on = "casesOn";
constexpr char const * g_no_confusion = "noConfusion";
constexpr char const * g_no_confusion_type = "noConfusionType";
}

View file

@ -12,6 +12,7 @@ Author: Leonardo de Moura
#include "library/locals.h"
#include "library/app_builder.h"
#include "library/trace.h"
#include "library/suffixes.h"
#include "library/tactic/cases_tactic.h"
#include "library/tactic/intro_tactic.h"
#include "library/tactic/clear_tactic.h"
@ -104,7 +105,7 @@ struct cases_tactic_fn {
return false;
if (!is_inductive(m_env, const_name(fn)))
return false;
if (!m_env.find(name{const_name(fn), "cases_on"}) || !m_env.find(get_eq_name()))
if (!m_env.find(name{const_name(fn), g_cases_on}) || !m_env.find(get_eq_name()))
return false;
if (!m_env.find(get_heq_name()))
return false;
@ -386,7 +387,7 @@ struct cases_tactic_fn {
if (!A_info.is_inductive())
throw_ill_formed_datatype();
inductive_val A_val = A_info.to_inductive_val();
name no_confusion_name(const_name(A_fn), "no_confusion");
name no_confusion_name(const_name(A_fn), g_no_confusion);
if (!m_env.find(no_confusion_name)) {
throw exception(sstream() << "cases tactic failed, construction '"
<< no_confusion_name << "' is not available in the environment");

View file

@ -21,6 +21,7 @@ Author: Leonardo de Moura
#include "library/annotation.h"
#include "library/idx_metavar.h"
#include "library/reducible.h"
#include "library/suffixes.h"
#include "library/constants.h"
#include "library/metavar_util.h"
#include "library/exception.h"
@ -676,7 +677,7 @@ optional<expr> type_context_old::reduce_aux_recursor(expr const & e) {
This fix is a little bit hackish and non modular because `brec_on` auxiliary recursors are defined in
a completely different module, and type_context should not be aware of them.
*/
if (r && const_name(f).get_string() == "brec_on") {
if (r && const_name(f).get_string() == g_brec_on) {
if (auto r2 = reduce_projection(*r))
return r2;
}

View file

@ -15,6 +15,7 @@ Author: Leonardo de Moura
#include "library/user_recursors.h"
#include "library/aux_recursors.h"
#include "library/attribute_manager.h"
#include "library/suffixes.h"
namespace lean {
bool recursor_info::is_minor(unsigned pos) const {
@ -107,16 +108,16 @@ recursor_info mk_recursor_info(environment const & env, name const & r, optional
return recursor_info(r, I_name, universe_pos, has_dep_elim, is_rec,
num_args, major_pos, params_pos, indices_pos, produce_motive);
} else if (is_aux_recursor(env, r) &&
(r.get_string() == "cases_on" ||
r.get_string() == "rec_on" ||
r.get_string() == "brec_on")) {
(r.get_string() == g_cases_on ||
r.get_string() == g_rec_on ||
r.get_string() == g_brec_on)) {
name I_name = r.get_prefix();
inductive_val I_val = env.get(I_name).to_inductive_val();
unsigned num_indices = I_val.get_nindices();
unsigned num_params = I_val.get_nparams();
has_given_major_pos = true;
unsigned num_motives;
if (r.get_string() == "cases_on") {
if (r.get_string() == g_cases_on) {
num_motives = 1;
} else {
num_motives = env.get(mk_rec_name(I_name)).to_recursor_val().get_nmotives();

View file

@ -16,6 +16,7 @@ Author: Leonardo de Moura
#include "library/error_msgs.h"
#include "library/locals.h"
#include "library/util.h"
#include "library/suffixes.h"
#include "library/annotation.h"
#include "library/constants.h"
#include "library/pp_options.h"
@ -818,7 +819,7 @@ expr mk_absurd(abstract_type_context & ctx, expr const & t, expr const & e, expr
}
bool is_exists(expr const & e, expr & A, expr & p) {
if (is_app_of(e, get_Exists_name(), 2)) {
if (is_app_of(e, get_exists_name(), 2)) {
A = app_arg(app_fn(e));
p = app_arg(e);
return true;
@ -828,7 +829,7 @@ bool is_exists(expr const & e, expr & A, expr & p) {
}
bool is_exists(expr const & e) {
return is_app_of(e, get_Exists_name(), 2);
return is_app_of(e, get_exists_name(), 2);
}
optional<expr> get_binary_op(expr const & e) {
@ -984,11 +985,11 @@ expr mk_bool_ff() { return *g_bool_ff; }
expr to_bool_expr(bool b) { return b ? mk_bool_tt() : mk_bool_ff(); }
name get_dep_recursor(environment const &, name const & n) {
return name(n, "rec");
return name(n, g_rec);
}
name get_dep_cases_on(environment const &, name const & n) {
return name(n, "cases_on");
return name(n, g_cases_on);
}
static char const * g_unsafe_rec_prefix = "_unsafe_rec";