lean4-htt/tests/lean/run/decreasingTacticUpdatedEnvIssue.lean
Joachim Breitner b5122b6a7b feat: per-function termination hints
This change

 * moves `termination_by` and `decreasing_by` next to the function they
   apply to
 * simplify the syntax of `termination_by`
 * apply the `decreasing_by` goal to all goals at once, for better
   interactive use.

See the section in `RELEASES.md` for more details and migration advise.

This is a hard breaking change, requiring developers to touch every
`termination_by` in their code base. We decided to still do it as a
hard-breaking change, because supporting both old and new syntax at the
same time would be non-trivial, and not save that much. Moreover, this
requires changes to some metaprograms that developers might have
written, and supporting both syntaxes at the same time would make
_their_ migration harder.
2024-01-10 17:27:35 +01:00

24 lines
574 B
Text

def g (x : Nat) (b : Bool) :=
if b then
x - 1
else
x + 1
theorem g_eq (x : Nat) (h : ¬ x = 0) : g x (x > 0) = x - 1 ∧ g x false = x + 1 := by
have : x > 0 := by match x with
| 0 => contradiction
| x+1 => apply Nat.zero_lt_succ
simp [g, this]
macro_rules
| `(tactic| decreasing_tactic) =>
`(tactic|
(simp [invImage, InvImage, Prod.lex, sizeOfWFRel, measure, Nat.lt_wfRel, WellFoundedRelation.rel, g_eq, *]
apply Nat.pred_lt; assumption))
def f (x : Nat) : Nat :=
if h : x = 0 then
1
else
f (g x (x > 0)) + 2
termination_by x