This PR fixes a local declaration internalization in `grind` that was exposed when using `grind -revert`. This bug was affecting a `grind` proof in Mathlib.
38 lines
962 B
Text
38 lines
962 B
Text
namespace List
|
||
|
||
/-
|
||
This example exposed a bug in the `grind` internalizer when `grind -revert`
|
||
is used.
|
||
-/
|
||
|
||
variable {α : Type} {β : α → Type}
|
||
|
||
def keys : List (Sigma β) → List α :=
|
||
map Sigma.fst
|
||
|
||
@[grind =]
|
||
theorem keys_cons {s} {l : List (Sigma β)} : (s :: l).keys = s.1 :: l.keys :=
|
||
rfl
|
||
|
||
variable [DecidableEq α]
|
||
|
||
def dlookup (a : α) : List (Sigma β) → Option (β a)
|
||
| [] => none
|
||
| ⟨a', b⟩ :: l => if h : a' = a then some (Eq.recOn h b) else dlookup a l
|
||
|
||
@[grind =]
|
||
theorem dlookup_cons_eq (l) (a : α) (b : β a) : dlookup a (⟨a, b⟩ :: l) = some b :=
|
||
dif_pos rfl
|
||
|
||
@[grind =]
|
||
theorem dlookup_cons_ne (l) {a} : ∀ s : Sigma β, a ≠ s.1 → dlookup a (s :: l) = dlookup a l
|
||
| ⟨_, _⟩, h => dif_neg h.symm
|
||
|
||
@[grind =]
|
||
theorem dlookup_isSome {a : α} {l : List (Sigma β)} : (dlookup a l).isSome ↔ a ∈ l.keys := by
|
||
induction l with
|
||
| nil => sorry
|
||
| cons s _ _ =>
|
||
by_cases a = s.fst
|
||
· grind
|
||
· sorry
|