This PR changes how the canonicalizer handles `forall` and `lambda`, replacing bvars with temporary fvars. Fixes a bug reported by @hrmacbeth on [zulip](https://leanprover.zulipchat.com/#narrow/channel/270676-lean4/topic/Quantifiers.20in.20CanonM/near/482483448).
22 lines
673 B
Text
22 lines
673 B
Text
import Lean.Meta.Canonicalizer
|
|
import Lean.Elab.Tactic
|
|
|
|
elab "foo" t:term : tactic => do
|
|
let e ← Lean.Elab.Tactic.elabTerm t none
|
|
trace[debug] "canonicalizing {e}"
|
|
let e' ← (Lean.Meta.canon e).run'
|
|
trace[debug] "canonicalized it to {e'}"
|
|
|
|
/-- info: ∃ f, ∀ (x : Nat), f x = 0 : Prop -/
|
|
#guard_msgs in
|
|
#check (∃ f : Nat → Nat, ∀ x, f x = 0) -- works fine
|
|
|
|
/--
|
|
info: [debug] canonicalizing ∃ f, ∀ (x : Nat), f x = 0
|
|
[debug] canonicalized it to ∃ f, ∀ (x : Nat), f x = 0
|
|
-/
|
|
#guard_msgs in
|
|
set_option trace.debug true in
|
|
example : True := by
|
|
foo (∃ f : Nat → Nat, ∀ x, f x = 0) -- used to fail with "unexpected bound variable #1"
|
|
trivial
|