Replaces `@[eliminator]` with two attributes `@[induction_eliminator]` and `@[cases_eliminator]` for defining custom eliminators for the `induction` and `cases` tactics, respectively. Adds `Nat.recAux` and `Nat.casesAuxOn`, which are eliminators that are defeq to `Nat.rec` and `Nat.casesOn`, but these use `0` and `n + 1` rather than `Nat.zero` and `Nat.succ n`. For example, using `induction` to prove that the factorial function is positive now has the following goal states (thanks also to #3616 for the goal state after unfolding). ```lean example : 0 < fact x := by induction x with | zero => decide | succ x ih => /- x : Nat ih : 0 < fact x ⊢ 0 < fact (x + 1) -/ unfold fact /- ... ⊢ 0 < (x + 1) * fact x -/ simpa using ih ``` Thanks to @adamtopaz for initial work on splitting the `@[eliminator]` attribute.
31 lines
1.2 KiB
Text
31 lines
1.2 KiB
Text
inductionErrors.lean:11:12-11:27: error: unsolved goals
|
|
case lower.h
|
|
p d : Nat
|
|
⊢ p ≤ p + Nat.succ d
|
|
inductionErrors.lean:12:12-12:27: error: unsolved goals
|
|
case upper.h
|
|
q d : Nat
|
|
⊢ q + Nat.succ d > q
|
|
inductionErrors.lean:16:19-16:26: error: unknown identifier 'elimEx2'
|
|
inductionErrors.lean:22:2-25:45: error: insufficient number of targets for 'elimEx'
|
|
inductionErrors.lean:28:16-28:23: error: unexpected eliminator resulting type
|
|
Nat
|
|
inductionErrors.lean:35:11-35:15: error: unsolved goals
|
|
x : Nat
|
|
⊢ 0 + 0 = 0
|
|
inductionErrors.lean:36:11-36:15: error: unsolved goals
|
|
x y : Nat
|
|
⊢ 0 + (y + 1) = y + 1
|
|
inductionErrors.lean:40:14-40:18: error: unsolved goals
|
|
case zero
|
|
⊢ 0 + 0 = 0
|
|
inductionErrors.lean:41:14-41:18: error: unsolved goals
|
|
case succ
|
|
y : Nat
|
|
⊢ 0 + (y + 1) = y + 1
|
|
inductionErrors.lean:50:2-50:16: error: alternative 'cons' is not needed
|
|
inductionErrors.lean:55:2-55:16: error: alternative 'cons' is not needed
|
|
inductionErrors.lean:60:2-60:40: error: invalid alternative name 'upper2'
|
|
inductionErrors.lean:66:2-66:28: error: invalid occurrence of wildcard alternative, it must be the last alternative
|
|
inductionErrors.lean:74:2-74:34: error: unused alternative
|
|
inductionErrors.lean:80:2-80:53: error: unused alternative
|