feat(library/coercion): add simple trick for defining coercions to function-class in a convenient way, closes #31
This commit is contained in:
parent
abdd784729
commit
bd1bc336fb
3 changed files with 10 additions and 13 deletions
|
@ -45,17 +45,12 @@ Equiv_mk : Π
|
||||||
(equiv_isequiv : IsEquiv equiv_fun),
|
(equiv_isequiv : IsEquiv equiv_fun),
|
||||||
Equiv A B
|
Equiv A B
|
||||||
|
|
||||||
definition equiv_fun {A B : Type} (e : Equiv A B) : A → B :=
|
definition equiv_fun [coercion] {A B : Type} (e : Equiv A B) : A → B :=
|
||||||
Equiv.rec (λequiv_fun equiv_isequiv, equiv_fun) e
|
Equiv.rec (λequiv_fun equiv_isequiv, equiv_fun) e
|
||||||
|
|
||||||
-- TODO: use a type class instead?
|
|
||||||
coercion equiv_fun : Equiv
|
|
||||||
|
|
||||||
definition equiv_isequiv [coercion] {A B : Type} (e : Equiv A B) : IsEquiv (equiv_fun e) :=
|
definition equiv_isequiv [coercion] {A B : Type} (e : Equiv A B) : IsEquiv (equiv_fun e) :=
|
||||||
Equiv.rec (λequiv_fun equiv_isequiv, equiv_isequiv) e
|
Equiv.rec (λequiv_fun equiv_isequiv, equiv_isequiv) e
|
||||||
|
|
||||||
-- coercion equiv_isequiv
|
|
||||||
|
|
||||||
-- TODO: better symbol
|
-- TODO: better symbol
|
||||||
infix `<~>`:25 := Equiv
|
infix `<~>`:25 := Equiv
|
||||||
notation e `⁻¹` := equiv_inv e
|
notation e `⁻¹` := equiv_inv e
|
||||||
|
|
|
@ -99,7 +99,5 @@ end decidable
|
||||||
inductive decidable_eq [class] (A : Type) : Type :=
|
inductive decidable_eq [class] (A : Type) : Type :=
|
||||||
intro : (Π x y : A, decidable (x = y)) → decidable_eq A
|
intro : (Π x y : A, decidable (x = y)) → decidable_eq A
|
||||||
|
|
||||||
theorem of_decidable_eq [instance] {A : Type} (H : decidable_eq A) (x y : A) : decidable (x = y) :=
|
theorem of_decidable_eq [instance] [coercion] {A : Type} (H : decidable_eq A) (x y : A) : decidable (x = y) :=
|
||||||
decidable_eq.rec (λ H, H) H x y
|
decidable_eq.rec (λ H, H) H x y
|
||||||
|
|
||||||
coercion of_decidable_eq : decidable_eq
|
|
||||||
|
|
|
@ -344,12 +344,16 @@ environment add_coercion(environment const & env, name const & f, io_state const
|
||||||
declaration d = env.get(f);
|
declaration d = env.get(f);
|
||||||
expr t = d.get_type();
|
expr t = d.get_type();
|
||||||
check_pi(f, t);
|
check_pi(f, t);
|
||||||
while (is_pi(binding_body(t)))
|
optional<name> C;
|
||||||
|
while (is_pi(t)) {
|
||||||
|
expr d = get_app_fn(binding_domain(t));
|
||||||
|
if (is_constant(d))
|
||||||
|
C = const_name(d);
|
||||||
t = binding_body(t);
|
t = binding_body(t);
|
||||||
expr C = get_app_fn(binding_domain(t));
|
}
|
||||||
if (!is_constant(C))
|
if (!C)
|
||||||
throw exception(sstream() << "invalid coercion, '" << f << "' cannot be used as a coercion");
|
throw exception(sstream() << "invalid coercion, '" << f << "' cannot be used as a coercion");
|
||||||
return add_coercion(env, f, const_name(C), ios);
|
return add_coercion(env, f, *C, ios);
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<pair<name, unsigned>> is_coercion(environment const & env, name const & f) {
|
optional<pair<name, unsigned>> is_coercion(environment const & env, name const & f) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue