This PR takes Array-specific lemmas at the end of `Array/Lemmas.lean` (i.e. material that does not have exact correspondences with `List/Lemmas.lean`) and moves them to more appropriate homes. More to come.
111 lines
3.9 KiB
Text
111 lines
3.9 KiB
Text
attribute [grind =] Array.size_set Array.getElem_set_self Array.getElem_set_ne
|
||
|
||
set_option grind.debug true
|
||
set_option trace.grind.ematch.pattern true
|
||
set_option trace.grind.ematch.instance true
|
||
|
||
example (as bs cs : Array α) (v₁ v₂ : α)
|
||
(i₁ i₂ j : Nat)
|
||
(h₁ : i₁ < as.size)
|
||
(h₂ : bs = as.set i₁ v₁)
|
||
(h₃ : i₂ < bs.size)
|
||
(h₃ : cs = bs.set i₂ v₂)
|
||
(h₄ : i₁ ≠ j ∧ i₂ ≠ j)
|
||
(h₅ : j < cs.size)
|
||
(h₆ : j < as.size)
|
||
: cs[j] = as[j] := by
|
||
grind
|
||
|
||
example (as bs cs : Array α) (v₁ v₂ : α)
|
||
(i₁ i₂ j : Nat)
|
||
(h₁ : i₁ < as.size)
|
||
(h₂ : as.set i₁ v₁ = bs)
|
||
(h₃ : i₂ < bs.size)
|
||
(h₃ : bs.set i₂ v₂ = cs)
|
||
(h₄ : i₁ ≠ j ∧ j ≠ i₂)
|
||
(h₅ : j < cs.size)
|
||
(h₆ : j < as.size)
|
||
: cs[j] = as[j] := by
|
||
grind
|
||
|
||
example (as bs cs : Array α) (v₁ v₂ : α)
|
||
(i₁ i₂ j : Nat)
|
||
(h₁ : i₁ < as.size)
|
||
(h₂ : as.set i₁ v₁ = bs)
|
||
(h₃ : i₂ < bs.size)
|
||
(h₃ : bs.set i₂ v₂ = cs)
|
||
(h₄ : j ≠ i₁ ∧ j ≠ i₂)
|
||
(h₅ : j < cs.size)
|
||
(h₆ : j < as.size)
|
||
: cs[j] = as[j] := by
|
||
grind
|
||
|
||
/--
|
||
info: [grind] Diagnostics
|
||
[thm] E-Matching instances
|
||
[thm] Array.getElem_set_ne ↦ 3
|
||
[thm] Array.size_set ↦ 3
|
||
[grind] Simplifier
|
||
[simp] tried theorems (max: 30, num: 2):
|
||
[simp] eq_self ↦ 30 ❌️
|
||
[simp] Lean.Grind.gt_eq ↦ 28 ❌️
|
||
use `set_option diagnostics.threshold <num>` to control threshold for reporting counters
|
||
---
|
||
info: [diag] Diagnostics
|
||
[reduction] unfolded declarations (max: 11519, num: 3):
|
||
[reduction] LT.lt ↦ 11519
|
||
[reduction] getElem ↦ 76
|
||
[reduction] Nat.lt ↦ 34
|
||
[reduction] unfolded instances (max: 38, num: 1):
|
||
[reduction] Array.instGetElemNatLtSize ↦ 38
|
||
[reduction] unfolded reducible declarations (max: 6907, num: 7):
|
||
[reduction] Array.size ↦ 6907
|
||
[reduction] Array.toList ↦ 1851
|
||
[reduction] autoParam ↦ 1675
|
||
[reduction] outParam ↦ 168
|
||
[reduction] Ne ↦ 60
|
||
[reduction] GT.gt ↦ 46
|
||
[reduction] List.casesOn ↦ 24
|
||
[def_eq] heuristic for solving `f a =?= f b` (max: 4929, num: 2):
|
||
[def_eq] Nat.lt ↦ 4929
|
||
[def_eq] List.length ↦ 1645
|
||
[kernel] unfolded declarations (max: 106, num: 5):
|
||
[kernel] LT.lt ↦ 106
|
||
[kernel] outParam ↦ 46
|
||
[kernel] Array.size ↦ 36
|
||
[kernel] Array.toList ↦ 31
|
||
[kernel] autoParam ↦ 26
|
||
use `set_option diagnostics.threshold <num>` to control threshold for reporting counters
|
||
---
|
||
info: [grind.ematch.instance] Array.size_set: (cs.set i₃ v₃ ⋯).size = cs.size
|
||
[grind.ematch.instance] Array.size_set: (bs.set i₂ v₂ ⋯).size = bs.size
|
||
[grind.ematch.instance] Array.size_set: (as.set i₁ v₁ ⋯).size = as.size
|
||
[grind.ematch.instance] Array.getElem_set_ne: ∀ (pj : j < cs.size), i₃ ≠ j → (cs.set i₃ v₃ ⋯)[j] = cs[j]
|
||
[grind.ematch.instance] Array.getElem_set_ne: ∀ (pj : j < bs.size), i₂ ≠ j → (bs.set i₂ v₂ ⋯)[j] = bs[j]
|
||
[grind.ematch.instance] Array.getElem_set_ne: ∀ (pj : j < as.size), i₁ ≠ j → (as.set i₁ v₁ ⋯)[j] = as[j]
|
||
-/
|
||
#guard_msgs (info) in
|
||
example (as bs cs ds : Array α) (v₁ v₂ v₃ : α)
|
||
(i₁ i₂ i₃ j : Nat)
|
||
(h₁ : i₁ < as.size)
|
||
(h₂ : as.set i₁ v₁ = bs)
|
||
(h₃ : i₂ < bs.size)
|
||
(h₃ : bs.set i₂ v₂ = cs)
|
||
(h₄ : i₃ < cs.size)
|
||
(h₅ : ds = cs.set i₃ v₃)
|
||
(h₆ : j ≠ i₁ ∧ j ≠ i₂ ∧ i₃ ≠ j)
|
||
(h₇ : j < ds.size)
|
||
(h₈ : j < as.size)
|
||
: ds[j] = as[j] := by
|
||
set_option diagnostics true in
|
||
grind
|
||
|
||
opaque f (a b : α) : α := a
|
||
@[grind =] theorem fx : f x (f x x) = x := sorry
|
||
|
||
/--
|
||
info: [grind.ematch.instance] fx: f a (f a a) = a
|
||
-/
|
||
#guard_msgs (info) in
|
||
example : a = b₁ → c = f b₁ b₂ → f a c ≠ a → a = b₂ → False := by
|
||
grind
|