the support for mutual structural recursion (new since #4575) is extended so that Lean tries to infer it even without annotations. * The error message when termination checking fails looks quite different now. Maybe a bit better, maybe with more room for improvements. * If there are too many combinations (with an arbitrary cut-off) for a given argument type, it will just give up and ask the user to use `termination_by structural`. * It is now legal to specify `termination_by structural` on not necessarily all functions of a clique; this simply restricts the combinations of arguments that Lean considers. --------- Co-authored-by: Tobias Grosser <tobias@grosser.es>
62 lines
1.8 KiB
Text
62 lines
1.8 KiB
Text
Inferred termination argument:
|
|
termination_by (n, m)
|
|
Inferred termination argument:
|
|
termination_by (m, n)
|
|
Inferred termination argument:
|
|
termination_by (n, m)
|
|
Inferred termination argument:
|
|
termination_by x1 x2 => (x2, x1)
|
|
Inferred termination argument:
|
|
termination_by x1 => x1
|
|
Inferred termination argument:
|
|
termination_by x1 => x1
|
|
Inferred termination argument:
|
|
termination_by x1 => x1
|
|
Inferred termination argument:
|
|
termination_by x1 => x1
|
|
Inferred termination argument:
|
|
termination_by x1 => (x1, 0)
|
|
Inferred termination argument:
|
|
termination_by (n, 1)
|
|
Inferred termination argument:
|
|
termination_by (m, n)
|
|
Inferred termination argument:
|
|
termination_by x1 x2 x3 x4 x5 x6 x7 x8 => (x8, x7, x6, x5, x4, x3, x2, x1)
|
|
Inferred termination argument:
|
|
termination_by x1 => x1
|
|
Inferred termination argument:
|
|
termination_by x1 => sizeOf x1
|
|
Inferred termination argument:
|
|
termination_by n m => (n, sizeOf m)
|
|
Inferred termination argument:
|
|
termination_by m => m
|
|
Inferred termination argument:
|
|
termination_by (sizeOf a, 1)
|
|
Inferred termination argument:
|
|
termination_by (sizeOf a, 0)
|
|
Inferred termination argument:
|
|
termination_by x2' => x2'
|
|
Inferred termination argument:
|
|
termination_by x2 => x2
|
|
Inferred termination argument:
|
|
termination_by _ x2 => x2
|
|
Inferred termination argument:
|
|
termination_by x1 => sizeOf x1
|
|
Inferred termination argument:
|
|
termination_by x2 => SizeOf.sizeOf x2
|
|
Inferred termination argument:
|
|
termination_by x1 => SizeOf.sizeOf x1
|
|
Inferred termination argument:
|
|
termination_by x2 => SizeOf.sizeOf x2
|
|
Inferred termination argument:
|
|
termination_by x1 => x1
|
|
Inferred termination argument:
|
|
termination_by x1 => sizeOf x1
|
|
Inferred termination argument:
|
|
termination_by x1 => x1
|
|
Inferred termination argument:
|
|
termination_by sizeOf o
|
|
Inferred termination argument:
|
|
termination_by x1 => x1
|
|
Inferred termination argument:
|
|
termination_by x1 => sizeOf x1
|