this makes `termination_by?` even slicker. The heuristics is agressive in the non-mutual case (will omit `sizeOf` if the argument is non-dependent and the `WellFoundedRelation` relation is via `sizeOfWFRel`. In the mutual case we'd also have to check the arguments, as they line up in the termination argument, have the same types. I did not bother at this point; in the mutual case we omit `sizeOf` only if the argument type is `Nat`. As a drive-by fix, `termination_by?` now also works on functions that have only one plausible measure.
13 lines
562 B
Text
13 lines
562 B
Text
Tactic is run (ideally only once)
|
|
Tactic is run (ideally only twice)
|
|
Tactic is run (ideally only twice)
|
|
Tactic is run (ideally only once, in most general context)
|
|
n : Nat
|
|
⊢ (invImage (fun a => a) instWellFoundedRelation).1 n (Nat.succ n)
|
|
Tactic is run (ideally only twice, in most general context)
|
|
Tactic is run (ideally only twice, in most general context)
|
|
n : Nat
|
|
⊢ sizeOf n < sizeOf (Nat.succ n)
|
|
n m : Nat
|
|
⊢ (invImage (fun a => PSigma.casesOn a fun x1 snd => x1) instWellFoundedRelation).1 { fst := n, snd := m + 1 }
|
|
{ fst := Nat.succ n, snd := m }
|