fix(frontends/lean/elaborator): try to synthesize pending type class instances before processing eliminator/recursor

This commit is contained in:
Leonardo de Moura 2016-09-19 11:14:49 -07:00
parent fab357dd94
commit 10f4a22fff
2 changed files with 8 additions and 5 deletions

View file

@ -717,7 +717,7 @@ expr elaborator::visit_elim_app(expr const & fn, elim_info const & info, buffer<
format("(it is handled as an \"eliminator\"), ") +
format("but the expected type must be known"));
}
synthesize_type_class_instances();
expr expected_type = instantiate_mvars(*_expected_type);
if (has_expr_metavar(expected_type)) {
auto pp_fn = mk_pp_ctx();

View file

@ -1,17 +1,20 @@
set_option new_elaborator true
open nat well_founded decidable prod
set_option pp.all true
-- Auxiliary lemma used to justify recursive call
private definition lt_aux {x y : nat} (H : 0 < y ∧ y ≤ x) : x - y < x :=
and.rec_on H (λ ypos ylex,
sub_lt (nat.lt_of_lt_of_le ypos ylex) ypos)
definition wdiv.F (x : nat) (f : Π x₁, x₁ < x → nat → nat) (y : nat) : nat :=
if H : 0 < y ∧ y ≤ x then f (x - y) (lt_aux H) y + 1 else zero
if H : 0 < y ∧ y ≤ x then f (x - y) (lt_aux H) y + 1 else 0
definition wdiv (x y : nat) :=
fix lt_wf wdiv.F x y
theorem wdiv_def (x y : nat) : wdiv x y = if 0 < y ∧ y ≤ x then wdiv (x - y) y + 1 else 0 :=
theorem wdiv_def (x y : nat) : wdiv x y = if H : 0 < y ∧ y ≤ x then wdiv (x - y) y + 1 else 0 :=
congr_fun (well_founded.fix_eq lt_wf wdiv.F x) y
example : wdiv 5 2 = 2 :=
@ -36,12 +39,12 @@ lex.left _ _ _ (lt_aux H)
definition pdiv.F (p₁ : nat × nat) : (Π p₂ : nat × nat, p₂ ≺ p₁ → nat) → nat :=
prod.cases_on p₁ (λ x y f,
if H : 0 < y ∧ y ≤ x then f (x - y, y) (plt_aux x y H) + 1 else zero)
if H : 0 < y ∧ y ≤ x then f (x - y, y) (plt_aux x y H) + 1 else 0)
definition pdiv (x y : nat) :=
fix pair_nat.lt.wf pdiv.F (x, y)
theorem pdiv_def (x y : nat) : pdiv x y = if 0 < y ∧ y ≤ x then pdiv (x - y) y + 1 else zero :=
theorem pdiv_def (x y : nat) : pdiv x y = if H : 0 < y ∧ y ≤ x then pdiv (x - y) y + 1 else 0 :=
well_founded.fix_eq pair_nat.lt.wf pdiv.F (x, y)
example : pdiv 17 2 = 8 :=