Compare commits

...

1 Commits

Author SHA1 Message Date
Kim Morrison
8c0043f646 chore: grind test case for matching Nat arguments 2025-07-01 17:08:29 +10:00

View File

@@ -0,0 +1,45 @@
abbrev := Nat
def hyperoperation :
| 0, _, k => k + 1
| 1, m, 0 => m
| 2, _, 0 => 0
| _ + 3, _, 0 => 1
| n + 1, m, k + 1 => hyperoperation n m (hyperoperation (n + 1) m k)
attribute [local grind] hyperoperation
@[grind =]
theorem hyperoperation_zero (m k : ) : hyperoperation 0 m k = k + 1 := by
grind
@[grind =]
theorem hyperoperation_recursion (n m k : ) :
hyperoperation (n + 1) m (k + 1) = hyperoperation n m (hyperoperation (n + 1) m k) := by
grind
@[grind =]
theorem hyperoperation_one (m k : ) : hyperoperation 1 m k = m + k := by
induction k with grind
@[grind =]
theorem hyperoperation_two (m k : ) : hyperoperation 2 m k = m * k := by
induction k with grind
@[grind =]
theorem hyperoperation_three (m k : ) : hyperoperation 3 m k = m ^ k := by
induction k with grind [Nat.pow_succ] -- Ouch, this is a bad `grind` lemma.
@[grind =]
theorem hyperoperation_ge_three_one (n k : ) : hyperoperation (n + 3) 1 k = 1 := by
induction n generalizing k with
| zero => grind
| succ n ih =>
cases k
· grind
· fail_if_success
-- This doesn't instantiate `hyperoperation_recursion`
-- because the goal contains `hyperoperation (n.succ + 3)`
-- but the lemma has `hyperoperation (n + 1)`.
grind [hyperoperation_recursion]
rw [hyperoperation_recursion, ih]