parent
a071012346
commit
f48cdccd20
8 changed files with 83 additions and 20 deletions
|
@ -532,6 +532,8 @@ optional<name> pretty_fn::is_abbreviated(expr const & e) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto pretty_fn::pp_const(expr const & e, optional<unsigned> const & num_ref_univ_params) -> result {
|
auto pretty_fn::pp_const(expr const & e, optional<unsigned> const & num_ref_univ_params) -> result {
|
||||||
|
if (auto it = is_abbreviated(e))
|
||||||
|
return pp_abbreviation(e, *it, false);
|
||||||
if (!num_ref_univ_params) {
|
if (!num_ref_univ_params) {
|
||||||
if (auto r = pp_local_ref(e))
|
if (auto r = pp_local_ref(e))
|
||||||
return *r;
|
return *r;
|
||||||
|
|
|
@ -12,6 +12,7 @@ Author: Leonardo de Moura
|
||||||
#include "library/scoped_ext.h"
|
#include "library/scoped_ext.h"
|
||||||
#include "library/expr_lt.h"
|
#include "library/expr_lt.h"
|
||||||
#include "library/util.h"
|
#include "library/util.h"
|
||||||
|
#include "library/normalize.h"
|
||||||
|
|
||||||
namespace lean {
|
namespace lean {
|
||||||
typedef pair<name, bool> abbrev_entry;
|
typedef pair<name, bool> abbrev_entry;
|
||||||
|
@ -26,7 +27,8 @@ struct abbrev_state {
|
||||||
throw exception(sstream() << "invalid abbreviation '" << n << "', it is not a definition");
|
throw exception(sstream() << "invalid abbreviation '" << n << "', it is not a definition");
|
||||||
m_abbrevs.insert(n, parsing_only);
|
m_abbrevs.insert(n, parsing_only);
|
||||||
if (!parsing_only) {
|
if (!parsing_only) {
|
||||||
m_inv_map.insert(d.get_value(), n);
|
expr v = try_eta(d.get_value());
|
||||||
|
m_inv_map.insert(v, n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -164,6 +164,28 @@ void finalize_normalize() {
|
||||||
delete g_key;
|
delete g_key;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
expr try_eta(expr const & e) {
|
||||||
|
if (is_lambda(e)) {
|
||||||
|
expr const & b = binding_body(e);
|
||||||
|
if (is_lambda(b)) {
|
||||||
|
expr new_b = try_eta(b);
|
||||||
|
if (is_eqp(b, new_b)) {
|
||||||
|
return e;
|
||||||
|
} else if (is_app(new_b) && is_var(app_arg(new_b), 0) && !has_free_var(app_fn(new_b), 0)) {
|
||||||
|
return lower_free_vars(app_fn(new_b), 1);
|
||||||
|
} else {
|
||||||
|
return update_binding(e, binding_domain(e), new_b);
|
||||||
|
}
|
||||||
|
} else if (is_app(b) && is_var(app_arg(b), 0) && !has_free_var(app_fn(b), 0)) {
|
||||||
|
return lower_free_vars(app_fn(b), 1);
|
||||||
|
} else {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class normalize_fn {
|
class normalize_fn {
|
||||||
type_checker & m_tc;
|
type_checker & m_tc;
|
||||||
name_generator m_ngen;
|
name_generator m_ngen;
|
||||||
|
@ -267,25 +289,6 @@ class normalize_fn {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expr try_eta(expr const & e) {
|
|
||||||
lean_assert(is_lambda(e));
|
|
||||||
expr const & b = binding_body(e);
|
|
||||||
if (is_lambda(b)) {
|
|
||||||
expr new_b = try_eta(b);
|
|
||||||
if (is_eqp(b, new_b)) {
|
|
||||||
return e;
|
|
||||||
} else if (is_app(new_b) && is_var(app_arg(new_b), 0) && !has_free_var(app_fn(new_b), 0)) {
|
|
||||||
return lower_free_vars(app_fn(new_b), 1);
|
|
||||||
} else {
|
|
||||||
return update_binding(e, binding_domain(e), new_b);
|
|
||||||
}
|
|
||||||
} else if (is_app(b) && is_var(app_arg(b), 0) && !has_free_var(app_fn(b), 0)) {
|
|
||||||
return lower_free_vars(app_fn(b), 1);
|
|
||||||
} else {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
expr normalize(expr e) {
|
expr normalize(expr e) {
|
||||||
check_system("normalize");
|
check_system("normalize");
|
||||||
if (!m_pred(e))
|
if (!m_pred(e))
|
||||||
|
|
|
@ -60,6 +60,8 @@ environment erase_constructor_hint(environment const & env, name const & n, bool
|
||||||
/** \brief Retrieve the hint added with the procedure add_constructor_hint. */
|
/** \brief Retrieve the hint added with the procedure add_constructor_hint. */
|
||||||
optional<unsigned> has_constructor_hint(environment const & env, name const & d);
|
optional<unsigned> has_constructor_hint(environment const & env, name const & d);
|
||||||
|
|
||||||
|
expr try_eta(expr const & e);
|
||||||
|
|
||||||
void initialize_normalize();
|
void initialize_normalize();
|
||||||
void finalize_normalize();
|
void finalize_normalize();
|
||||||
}
|
}
|
||||||
|
|
40
tests/lean/640a.hlean
Normal file
40
tests/lean/640a.hlean
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
section
|
||||||
|
parameter {A : Type}
|
||||||
|
definition relation : A → A → Type := λa b, a = b
|
||||||
|
local abbreviation R := relation
|
||||||
|
local abbreviation S [parsing-only] := relation
|
||||||
|
variable {a : A}
|
||||||
|
check relation a a
|
||||||
|
check R a a
|
||||||
|
check S a a
|
||||||
|
end
|
||||||
|
|
||||||
|
section
|
||||||
|
parameter {A : Type}
|
||||||
|
definition relation' : A → A → Type := λa b, a = b
|
||||||
|
local infix `~1`:50 := relation'
|
||||||
|
local infix [parsing-only] `~2`:50 := relation'
|
||||||
|
variable {a : A}
|
||||||
|
check relation' a a
|
||||||
|
check a ~1 a
|
||||||
|
check a ~2 a
|
||||||
|
end
|
||||||
|
|
||||||
|
section
|
||||||
|
parameter {A : Type}
|
||||||
|
definition relation'' : A → A → Type := λa b, a = b
|
||||||
|
local infix [parsing-only] `~2`:50 := relation''
|
||||||
|
variable {a : A}
|
||||||
|
check relation'' a a
|
||||||
|
check a ~2 a
|
||||||
|
check a ~2 a
|
||||||
|
end
|
||||||
|
|
||||||
|
section
|
||||||
|
parameter {A : Type}
|
||||||
|
definition relation''' : A → A → Type := λa b, a = b
|
||||||
|
local abbreviation S [parsing-only] := relation'''
|
||||||
|
variable {a : A}
|
||||||
|
check relation''' a a
|
||||||
|
check S a a
|
||||||
|
end
|
11
tests/lean/640a.hlean.expected.out
Normal file
11
tests/lean/640a.hlean.expected.out
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
R a a : Type
|
||||||
|
R a a : Type
|
||||||
|
R a a : Type
|
||||||
|
a ~1 a : Type
|
||||||
|
a ~1 a : Type
|
||||||
|
a ~1 a : Type
|
||||||
|
relation'' a a : Type
|
||||||
|
relation'' a a : Type
|
||||||
|
relation'' a a : Type
|
||||||
|
relation''' a a : Type
|
||||||
|
relation''' a a : Type
|
2
tests/lean/640b.lean
Normal file
2
tests/lean/640b.lean
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
abbreviation bar [parsing-only] := @eq
|
||||||
|
check @bar
|
1
tests/lean/640b.lean.expected.out
Normal file
1
tests/lean/640b.lean.expected.out
Normal file
|
@ -0,0 +1 @@
|
||||||
|
eq : Π {A : Type}, A → A → Prop
|
Loading…
Reference in a new issue