forked from leanprover/lean4
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix: process delayed assignment metavariables correctly in Lean.Meta.…
…Closure This PR fixes a bug in `Lean.Meta.Closure` that would introduce under-applied delayed assignment metavariables, which would keep them from ever getting instantiated. This bug affected `match` elaboration when the expected type contains postponed elaboration problems, for example tactic blocks. Closes leanprover#6354
- Loading branch information
Showing
2 changed files
with
75 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,62 @@ | ||
/-! | ||
# Proper handling of delayed assignment metavariables in `match` elaboration | ||
https://github.com/leanprover/lean4/issues/6354 | ||
-/ | ||
|
||
namespace Test1 | ||
/-! | ||
Simplified version of example from issue 6354. | ||
Previously, had error `(kernel) declaration has metavariables '_example'` | ||
-/ | ||
|
||
structure A where | ||
p: Prop | ||
q: True | ||
|
||
example := (λ ⟨_,_⟩ ↦ True.intro : (A.mk (And True True) (by exact True.intro)).p → True) | ||
|
||
end Test1 | ||
|
||
|
||
namespace Test2 | ||
/-! | ||
Example from issue (by @roos-j) | ||
-/ | ||
|
||
structure A where | ||
p: Prop | ||
q: True | ||
|
||
structure B extends A where | ||
q': p → True | ||
|
||
example: B where | ||
p := True ∧ True | ||
q := by exact True.intro | ||
q' := λ ⟨_,_⟩ ↦ True.intro | ||
|
||
end Test2 | ||
|
||
|
||
namespace Test3 | ||
/-! | ||
Example from issue comment (by @b-mehta) | ||
-/ | ||
|
||
class Preorder (α : Type) extends LE α, LT α where | ||
le_refl : ∀ a : α, a ≤ a | ||
lt := fun a b => a ≤ b ∧ ¬b ≤ a | ||
|
||
class PartialOrder (α : Type) extends Preorder α where | ||
le_antisymm : ∀ a b : α, a ≤ b → b ≤ a → a = b | ||
|
||
inductive MyOrder : Nat × Nat → Nat × Nat → Prop | ||
| within {x u m : Nat} : x ≤ u → MyOrder (x, m) (u, m) | ||
|
||
instance : PartialOrder (Nat × Nat) where | ||
le := MyOrder | ||
le_refl x := .within (Nat.le_refl _) | ||
le_antisymm | _, _, .within _, .within _ => Prod.ext (Nat.le_antisymm ‹_› ‹_›) rfl | ||
|
||
end Test3 |