This PR changes how sparse case expressions represent the none-of-the-above information. Instead of of many `x.ctorIdx ≠ i` hypotheses, it introduces a single `Nat.hasNotBit mask x.ctorIdx` hypothesis which compresses that information into a bitmask. This avoids a quadratic overhead during splitter generation, where all n assumptions would be refined through `.subst` and `.cases` constructions for all n assumption of the splitter alternative. The definition of `Nat.hasNotBit` uses `Nat.rightShift` which is fiddly to get to reduce well, especially on open terms and with `Meta.whnf`. Some experimentation was needed to find proof terms that work, these are all put together in the `Lean.Meta.HasNotBit` module. Fixes #11183 --------- Co-authored-by: Rob23oba <152706811+Rob23oba@users.noreply.github.com> |
||
|---|---|---|
| .. | ||
| bench | ||
| compiler | ||
| elabissues | ||
| ir | ||
| lake | ||
| lean | ||
| pkg | ||
| playground | ||
| plugin | ||
| simpperf | ||
| .gitignore | ||
| common.sh | ||
| lakefile.toml | ||
| lean-toolchain | ||