lean4-htt/tests/lean/interactive/terminationBySuggestion.lean
Joachim Breitner fb0c46a011
feat: termination_by structural (#4542)
This implements the `termination_by structural` syntax proposed in
#3909.

I went with `termination_by structural` over, say,
`termination_by (config := {method := .structural})` mainly because it
was
easier to get going (otherwise I’d have to look into how to define
recursive
parsers, as `Parser.config` depends on `term` and `termination_by` is
part of
term. But also because I find it more ergonomic and aesthetic as a user.
But syntax can still change.

The `termination_by?` syntax will no longer force well-founded
recursion,
and instead the inferred `termination_by structurally` annotation will
be shown
if structural termination is possible.

While I was it, this fixes #4546 the easy way (log errors about but
otherwise
ignore incomplete `termination_by` sets for mutual recursion). Maybe we
get
multiple replacements (#4551), but even then this this good behavior.

Involves a bit of shuffling around `TerimationHints` (now validated for
a
clique already by `PreDefinition.main`) and `TerminationArguments` (now
lifted
out of the `WF` namespace, and a bit simplified).

Fixes #3909

---------

Co-authored-by: Richard Kiss <him@richardkiss.com>
2024-07-01 16:51:30 +00:00

34 lines
877 B
Text

def ackermann (n m : Nat) := match n, m with
| 0, m => m + 1
| .succ n, 0 => ackermann n 1
| .succ n, .succ m => ackermann n (ackermann (n + 1) m)
termination_by?
--^ codeAction
-- Check hat we print this even if there is only one plausible measure
def onlyOneMeasure (n : Nat) := match n with
| 0 => 0
| .succ n => onlyOneMeasure n
termination_by?
--^ codeAction
def anonymousMeasure : Nat → Nat
| 0 => 0
| .succ n => anonymousMeasure n
termination_by?
--^ codeAction
-- Check hat we print this even if there is only one plausible measure
def onlyOneMeasureWF (n : Nat) := match n with
| 0 => 0
| .succ n => onlyOneMeasureWF n
termination_by?
--^ codeAction
decreasing_by decreasing_tactic
def anonymousMeasureWF : Nat → Nat
| 0 => 0
| .succ n => anonymousMeasureWF n
termination_by?
--^ codeAction
decreasing_by decreasing_tactic