This introduces the `ArgsPacker` module and abstraction, to replace the exising `PackDomain`/`PackMutual` code. The motivation was that we now have more uses besides `Fix.lean` (`GuessLex` and `FunInd`), and the code was spread in various places. The goals are * consistent function naming withing the the `PSigma` handling, the `PSum` handling, and the combined interface * avoid taking a type apart just based on the `PSigma`/`PSum` nesting, to be robust in case the user happens to be using `PSigma`/`PSum` somewhere. Therefore, always pass an `arity` or `numFuncs` or `varNames` around. * keep all the `PSigma`/`PSum` encoding logic contained within one module (`ArgsPacker`), and keep that module independent of its users (so no `EqnInfos` visible here). * pick good variable names when matching on a packed argument * the unary function now is either called `fun1._unary` or `fun1._mutual`, never `fun1._unary._mutual`. This file has less heavy dependencies than `PackMutual` had, so build parallelism is improved as well.
28 lines
466 B
Text
28 lines
466 B
Text
namespace Ex1
|
|
mutual
|
|
def foo : Nat → Nat
|
|
| 0 => 1
|
|
| n+1 => bar n
|
|
termination_by n => n
|
|
|
|
def bar : Nat → Nat
|
|
| 0 => 1
|
|
| n+1 => foo n
|
|
termination_by n => n > 2
|
|
end
|
|
end Ex1
|
|
|
|
namespace Ex2
|
|
-- With dependency on fixed parameter
|
|
mutual
|
|
def foo (fixed : Nat) : Nat → Nat
|
|
| 0 => 1
|
|
| n+1 => bar fixed n
|
|
termination_by n => n
|
|
|
|
def bar (fixed : Nat) : Nat → Nat
|
|
| 0 => 1
|
|
| n+1 => foo fixed n
|
|
termination_by n => (⟨n, sorry⟩ : Fin fixed)
|
|
end
|
|
end Ex2
|