fix(frontends/lean/elaborator): try to synthesize pending type class instances before processing eliminator/recursor
This commit is contained in:
parent
fab357dd94
commit
10f4a22fff
2 changed files with 8 additions and 5 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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 :=
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue