feat(library/tactic): refine 'get_unused_name'
This commit is contained in:
parent
c2602baf2b
commit
6768c76b52
3 changed files with 28 additions and 14 deletions
|
@ -144,36 +144,48 @@ void goal::get_hyps(buffer<expr> & r) const {
|
||||||
get_app_args(m_meta, r);
|
get_app_args(m_meta, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool uses_name(name const & n, buffer<expr> const & locals) {
|
||||||
|
for (expr const & local : locals) {
|
||||||
|
if (is_local(local) && local_pp_name(local) == n)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
name get_unused_name(name const & prefix, unsigned & idx, buffer<expr> const & locals) {
|
name get_unused_name(name const & prefix, unsigned & idx, buffer<expr> const & locals) {
|
||||||
while (true) {
|
while (true) {
|
||||||
bool used = false;
|
|
||||||
name curr = prefix.append_after(idx);
|
name curr = prefix.append_after(idx);
|
||||||
idx++;
|
idx++;
|
||||||
for (expr const & local : locals) {
|
if (!uses_name(curr, locals))
|
||||||
if (is_local(local) && local_pp_name(local) == curr) {
|
|
||||||
used = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!used)
|
|
||||||
return curr;
|
return curr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
name get_unused_name(name const & prefix, buffer<expr> const & locals) {
|
name get_unused_name(name const & prefix, buffer<expr> const & locals) {
|
||||||
|
if (!uses_name(prefix, locals))
|
||||||
|
return prefix;
|
||||||
unsigned idx = 1;
|
unsigned idx = 1;
|
||||||
return get_unused_name(prefix, idx, locals);
|
return get_unused_name(prefix, idx, locals);
|
||||||
}
|
}
|
||||||
|
|
||||||
name goal::get_unused_name(name const & prefix, unsigned & idx) const {
|
name get_unused_name(name const & prefix, unsigned & idx, expr const & meta) {
|
||||||
buffer<expr> locals;
|
buffer<expr> locals;
|
||||||
get_app_rev_args(get_meta(), locals);
|
get_app_rev_args(meta, locals);
|
||||||
return ::lean::get_unused_name(prefix, idx, locals);
|
return get_unused_name(prefix, idx, locals);
|
||||||
|
}
|
||||||
|
|
||||||
|
name get_unused_name(name const & prefix, expr const & meta) {
|
||||||
|
buffer<expr> locals;
|
||||||
|
get_app_rev_args(meta, locals);
|
||||||
|
return get_unused_name(prefix, locals);
|
||||||
|
}
|
||||||
|
|
||||||
|
name goal::get_unused_name(name const & prefix, unsigned & idx) const {
|
||||||
|
return ::lean::get_unused_name(prefix, idx, m_meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
name goal::get_unused_name(name const & prefix) const {
|
name goal::get_unused_name(name const & prefix) const {
|
||||||
unsigned idx = 1;
|
return ::lean::get_unused_name(prefix, m_meta);
|
||||||
return get_unused_name(prefix, idx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
io_state_stream const & operator<<(io_state_stream const & out, goal const & g) {
|
io_state_stream const & operator<<(io_state_stream const & out, goal const & g) {
|
||||||
|
|
|
@ -99,6 +99,8 @@ public:
|
||||||
|
|
||||||
name get_unused_name(name const & prefix, unsigned & idx, buffer<expr> const & locals);
|
name get_unused_name(name const & prefix, unsigned & idx, buffer<expr> const & locals);
|
||||||
name get_unused_name(name const & prefix, buffer<expr> const & locals);
|
name get_unused_name(name const & prefix, buffer<expr> const & locals);
|
||||||
|
name get_unused_name(name const & prefix, unsigned & idx, expr const & meta);
|
||||||
|
name get_unused_name(name const & prefix, expr const & meta);
|
||||||
|
|
||||||
io_state_stream const & operator<<(io_state_stream const & out, goal const & g);
|
io_state_stream const & operator<<(io_state_stream const & out, goal const & g);
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ tactic intros_tactic(list<name> _ns, bool relax_main_opaque) {
|
||||||
new_name = head(ns);
|
new_name = head(ns);
|
||||||
ns = tail(ns);
|
ns = tail(ns);
|
||||||
} else {
|
} else {
|
||||||
new_name = g.get_unused_name(binding_name(t));
|
new_name = get_unused_name(binding_name(t), m);
|
||||||
}
|
}
|
||||||
expr new_local = mk_local(ngen.next(), new_name, binding_domain(t), binding_info(t));
|
expr new_local = mk_local(ngen.next(), new_name, binding_domain(t), binding_info(t));
|
||||||
t = instantiate(binding_body(t), new_local);
|
t = instantiate(binding_body(t), new_local);
|
||||||
|
|
Loading…
Reference in a new issue