Commit graph

39407 commits

Author SHA1 Message Date
Sebastian Ullrich
bbf72b9681
test: refine lake/tests/shake (#12374) 2026-02-07 15:17:07 +00:00
Sebastian Ullrich
ae79d14d27
feat: shake: track [csimp] uses (#12351)
This PR extends the `@[csimp]` attribute to be correctly tracked by
`lake shake`
2026-02-07 14:27:00 +00:00
David Thrane Christiansen
2a02685d95
fix: make classes appear as classes rather than structures in docs (#12373)
This PR moves the elaboration of structure/class Verso docstrings until
after the fact that it's a class is registered, so code samples in the
docstring can use it as a class. Redundant addition of structure and
constructor docstrings are also removed, because they're already handled
in MutualInductive.lean.

Closes #11651
2026-02-07 13:06:41 +00:00
Lean stage0 autoupdater
4a450bf01a chore: update stage0 2026-02-07 11:52:08 +00:00
Henrik Böving
ba9f475417
perf: use Array for CNF formulas (#11832)
This PR uses an `Array` instead of a `List` to store the clauses in
`Std.CNF`. This reduces the memory footprint and pressure on the
allocator, leading to noticeable performance changes with gigantic CNFs.
2026-02-07 11:28:06 +00:00
Markus Himmel
59d514d719
feat: more lemmas relating Bool and (d)ite (#12371)
This PR adds lemmas for simplifying situations involving `Bool` and
`ite`/`dite`.
2026-02-07 09:05:46 +00:00
David Thrane Christiansen
99b3ba12c9
fix: error messages from Verso docstring parser (#12372)
This PR extensively reworks the Verso docstring parser so that it gives
much better parser errors that provide more useful guidance.

Closes #12063
2026-02-07 07:49:06 +00:00
Leonardo de Moura
03dc334f73
fix: simp have in Sym (#12370)
This PR fixes a proof construction bug in `Sym.simp`.

Closes #12336
2026-02-07 00:24:30 +00:00
Henrik Böving
9f2f33bd65
perf: more brave dead variable elimination (#12365) 2026-02-06 22:36:17 +00:00
Henrik Böving
f5e5914b54
fix: placement of saveImpure (#12366) 2026-02-06 22:05:22 +00:00
David Thrane Christiansen
64c0555e0b
fix: parse indented Verso docstrings specially (#12331)
This PR treats the first character of the first line of a docstring as
being in the leftmost column, even if it physically is not. This allows
left-column items like headers to be used even after spaces. It also
detects the indentation of the entire docstring, using it as the
zero-point for indentation sensitive syntax such as headers.

Closes #12067.
2026-02-06 21:03:56 +00:00
David Thrane Christiansen
0e19692d0b
fix: handle Verso docstrings that don't consume all the docstring (#12362)
This PR fixes poor error reporting from Verso docstrings. Before, if the
Verso parser didn't consume the whole docstring, then Lean would try to
parse the closing -/ and fail; this would lead to backtracking and an
assumption that the docstring must be non-Verso, with only the non-Verso
commands like #guard_msgs as possibilities. Now, the input is always
consumed.

Closes #12118.
2026-02-06 20:00:49 +00:00
Paul Reichert
4070ee3b8e
fix: sigmaIterator benchmark (#12364)
This PR fixes breakage in the sigmaIterator benchmark.
2026-02-06 19:45:42 +00:00
Sebastian Graf
6ac96ecd41
feat: improve simp and grind rules for PredTrans.apply (#12358)
This PR improves the `simp` and `grind` rule framework for
`PredTrans.apply` and also renames the respective lemmas according to
convention.
2026-02-06 17:28:56 +00:00
Paul Reichert
61d7eb28b4
feat: simplify iterator step unfolding (#12234)
This PR introduces an `Iter.step_eq` lemma that fully unfolds an
`Iter.step` call, bypassing layers of unfolding.
2026-02-06 17:12:01 +00:00
Garmelon
76befb82e4
chore: remove orphaned *.expected.out files (#12357) 2026-02-06 17:05:43 +00:00
Henrik Böving
32fb1ccf1c
refactor: port IR elim_dead_vars to LCNF (#12356)
This PR moves the IR elim_dead_vars pass to LCNF. It cannot delete the
pass yet as it is still used
in later IR passes.
2026-02-06 17:01:59 +00:00
Lean stage0 autoupdater
85899ddd17 chore: update stage0 2026-02-06 17:11:00 +00:00
Leonardo de Moura
9ba41a692d
feat: unfold [reducible] class fields (part 1) (#12340)
This PR implements better support for unfolding class fields marked as
`reducible`. For example, we want to mark fields that are types such as
```lean
MonadControlT.stM : Type u -> Type u
```
The motivation is similar to our heuristic that type definitions should
be abbreviations.
Now, suppose we want to unfold `stM m (ExceptT ε m) α` using the
`.reducible` transparency setting, we want the result to be `stM m m
(MonadControl.stM m (ExceptT ε m) α)` instead of
`(instMonadControlTOfMonadControl m m (ExceptT ε m)).1 α`. The latter
would defeat the intent of marking the field as reducible, since the
instance `instMonadControlTOfMonadControl` is `[instance_reducible]` and
the resulting term would be stuck when using `.reducible` transparency
mode.

**Remark**: This feature introduces a few breakages in core and Mathlib.
So, it is disabled for now in this PR. To enable, we must use
`set_option backward.whnf.reducibleClassField true`
2026-02-06 16:18:33 +00:00
Sebastian Ullrich
fae768fb3e
fix: ensure List.filterMap is always csimped (#12348)
Shake accidentally broke this from missing dependency tracking (TBD)
2026-02-06 16:00:33 +00:00
Wojciech Różowski
faa2619e53
feat: add isBoolTrueExpr and isBoolFalseExpr (#12355)
This PR adds `isBoolTrueExpr` and `isBoolFalseExpr` functions to `SymM`
2026-02-06 15:47:40 +00:00
Sebastian Graf
5086a82ec7
fix: resurrect the dead Elab.resume trace message (#12353)
This PR ressurects the dead trace class `Elab.resume` by redirecting the
non-existant `Elab.resuming` to it.
2026-02-06 14:58:53 +00:00
Sebastian Graf
fa7f51038b
test: document Sym-based mvcGen and tidy up benchmark project (#12350) 2026-02-06 14:12:29 +00:00
Markus Himmel
36dd57aa06
feat: verification of character (predicate) patterns (#12349)
This PR builds on #12333 and proves that `Char` and `Char -> Bool`
patterns are lawful.
2026-02-06 14:04:07 +00:00
Sebastian Graf
8b5293382b
test: copy shallow_add_sub_cancel into mvcgen benchmark for precompilation (#12347) 2026-02-06 13:07:25 +00:00
Markus Himmel
57a6d89f57
feat: verification of BEq String.Slice (#12346)
This PR shows `s == t ↔ s.copy = t.copy` for `s t : String.Slice` and
establishes the right-hand side as the simp normal form.
2026-02-06 11:56:01 +00:00
Wojciech Różowski
d2176cb5fb
test: add tests and benchmarks for cbv tactic (#12345)
This PR adds two benchmarks (sieve of Eratosthenes, removing duplicates
from the list) and one test (a function with sublinear complexity
defined via well-founded recursion evaluated on large naturals with up
to `60` digits).

The tests have been suggested by @b-mehta.
2026-02-06 11:41:03 +00:00
Henrik Böving
8d29c591e6
refactor: behavior of inline annotations in the compiler (#12344)
This PR changes the semantics of `inline` annotations in the compiler.
The behavior of the original `@[inline]` attribute remains the same but
the function `inline` now comes with a restriction that it can only use
declarations that are local to the current module. This comes as a
preparation to pulling the compiler out into a separate process.

Closes: #12334
2026-02-06 10:38:14 +00:00
Rob23oba
9b7a8eb7c8
perf: improve over-applied cases in ToLCNF (#12284)
This PR changes the handling of over-applied cases expressions in
`ToLCNF` to avoid generating function declarations that are called
immediately. For example, `ToLCNF` previously produced this:
```lean-4
set_option trace.Compiler.init true
/--
trace: [Compiler.init] size: 4
    def test x y : Bool :=
      fun _y.1 _y.2 : Bool :=
        cases x : Bool
        | PUnit.unit =>
          fun _f.3 a : Bool :=
            return a;
          let _x.4 := _f.3 _y.2;
          return _x.4;
      let _x.5 := _y.1 y;
      return _x.5
-/
#guard_msgs in
def test (x : Unit) (y : Bool) : Bool :=
  x.casesOn (fun a => a) y
```
which is now simplified to
```lean-4
set_option trace.Compiler.init true
/--
trace: [Compiler.init] size: 3
    def test x y : Bool :=
      cases x : Bool
      | PUnit.unit =>
        let a := y;
        return a
-/
#guard_msgs in
def test (x : Unit) (y : Bool) : Bool :=
  x.casesOn (fun a => a) y
```
This is especially relevant for #8309 because there `dite` is defined as
an over-applied `Bool.casesOn`.
2026-02-06 09:27:15 +00:00
David Thrane Christiansen
71e340eb97
feat: allow Verso syntax for module docs to be controlled separately (#12329)
This PR adds the option `doc.verso.module`. If set, it controls whether
module docstrings use Verso syntax. If not set, it defaults to the value
of the `doc.verso` option.

Closes #12070.
2026-02-06 09:09:04 +00:00
Marc Huisinga
f4c5f8e422
fix: set data? field in eager code actions (#12332)
This PR fixes an issue on new NeoVim versions that would cause the
language server to display an error when using certain code actions.

(For some reason, NeoVim recently decided to diverge from VS Code in
terms of when it emits code action resolution requests, which means that
not setting the `data?` field won't preclude NeoVim from emitting a
request anymore, which in turn means that the server can't resolve the
code action.)
2026-02-06 08:57:27 +00:00
Lean stage0 autoupdater
6cf632bef2 chore: update stage0 2026-02-06 07:02:22 +00:00
Leonardo de Moura
dadc91de4b
feat: backward.isDefEq.respectTransparency (part 1) (#12338)
This PR implements preparatory work for #12179. It implements a new
feature in `isDefEq` to ensure it does not increase the transparency
level to `.default` when checking definitionally equality of implicit
arguments. This transparency level bump was introduced in Lean 3, but it
is not a performance issue and is affecting Mathlib. This PR adds the
new feature, but it is disabled by default.
2026-02-06 06:09:17 +00:00
Henrik Böving
8e5655516e
perf: put the compiler off the critical path (#12335) 2026-02-05 20:39:11 +00:00
Markus Himmel
52bc216351
feat: basic infrastructure for verification of string patterns (#12333)
This PR adds the basic typeclasses that will be used in the verification
of our string searching infrastructure.
2026-02-05 16:37:50 +00:00
Henrik Böving
c3779bc8d5
refactor: reset reuse pass to LCNF (#12315)
This PR migrates the IR ResetReuse pass to LCNF.
2026-02-05 15:54:46 +00:00
Wojciech Różowski
5345db8877
feat: make Theorem an Inhabited instance (#12324)
This PR adds a default `Inhabited` instance to `Theorem` type.

The need to do so came up in #12296 , as `Theorem` is one of the entries
of the structure which is the key entry of `SimpleScopedEnvExtension`.
2026-02-05 14:42:36 +00:00
David Thrane Christiansen
4046dd1e61
fix: docstring code suggestions take shadowing into account (#12321)
This PR makes suggestions for builtin docstring roles take shadowing
into account and improves the error message when this goes wrong.

Closes ##12291
2026-02-05 13:45:35 +00:00
Sebastian Ullrich
398c3622fc
doc: improve comments around asyncMayModify (#12270) 2026-02-05 12:43:02 +00:00
Sebastian Ullrich
2a1ba94caf
chore: ready shake for use on core (#12326) 2026-02-05 12:37:55 +00:00
Kim Morrison
abcb57d234
fix: use mathlib-lean-pr-testing app for PR comments (#12323)
This PR fixes the PR release workflow which was failing due to the
deprecated `MATHLIB4_COMMENT_BOT` PAT being invalid.

**Error:** `jq: error (at <stdin>:4): Cannot index string with string
"name"` when fetching labels - the API returned an error response
instead of labels array because the PAT credentials were bad.

**Changes:**
- Generate a token from the `mathlib-lean-pr-testing` GitHub App (ID:
2785182) for posting comments to Lean PRs about mathlib compatibility
- Use `GITHUB_TOKEN` for read-only label fetching (no special identity
needed)
- Update the bot username check from `leanprover-community-bot` to
`mathlib-lean-pr-testing[bot]`

**Secrets added:** `MATHLIB_LEAN_PR_TESTING_APP_ID` and
`MATHLIB_LEAN_PR_TESTING_PRIVATE_KEY` have been added to the repository.

Fixes the CI failure at
https://github.com/leanprover/lean4/actions/runs/21705647318/job/62595966115

🤖 Prepared with Claude Code

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 10:19:10 +00:00
Markus Himmel
f82c40857b
feat: String.Slice.Subslice (#12322)
This PR adds `String.Slice.Subslice`, which is an unbundled version of
`String.Slice`.

This type is of interest because it is the correct type for string
searching and splitting operations to land in.

This PR just adds the type with minimal API. Additional API and
subsequent refactoring of the searching and splitting API is left for
future PRs.
2026-02-05 10:09:04 +00:00
Sebastian Ullrich
b4d4e371d2
chore: shake core (#12276) 2026-02-05 09:10:32 +00:00
Sebastian Ullrich
96ef09186f
chore: delete dead C++ code (#12248) 2026-02-05 09:00:21 +00:00
Markus Himmel
54cba90dc5
refactor: derive string searcher from string pattern (#12312)
This PR reverses the relationship between the `ForwardPattern` and
`ToForwardSearcher` classes.

Previously, it was possible to derive `ForwardPattern` (i.e.,
`dropPrefix?`) from `ToForwardSearcher` (i.e., get an iterator of
`SearchStep (s)`). Now, we give the default instance in the other
direction: it is now possible to derive `ToForwardSearcher` from
`ForwardPattern`. Since it is usually much easier to provide
`ForwardPattern` than `ToForwardSearcher`, this means more shared code,
which pays off double since we will give a correctness proof for the
default implementation in an upcoming PR.

This PR also adds some string lemmas.
2026-02-05 07:38:31 +00:00
Kim Morrison
75d7f7eb22
feat: add Nat.ext_div_mod and Int.ext_ediv_emod (#12258)
This PR adds theorems that directly state that div and mod form an
injective pair: if `a / n = b / n` and `a % n = b % n` then `a = b`.
These complement existing div/mod lemmas and are useful for extension
arguments.

Upstreaming from
https://github.com/leanprover-community/mathlib4/pull/34201

🤖 Prepared with Claude Code

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 05:13:00 +00:00
Kim Morrison
5eeea8c6ef
fix: use GitHub App for Batteries/Mathlib checkout in PR release (#12320)
This PR fixes the PR release workflow which is failing to create
`lean-pr-testing` branches due to the deprecated `MATHLIB4_BOT` PAT (see
https://github.com/leanprover/lean4/actions/runs/21698772126/job/62574742680).

The fix uses `actions/create-github-app-token@v2` to generate a token
from the `mathlib-nightly-testing` GitHub App (ID: 2784211) instead,
which has write access to both `leanprover-community/batteries` and
`leanprover-community/mathlib4-nightly-testing`.

Requires adding `MATHLIB_NIGHTLY_TESTING_APP_ID` and
`MATHLIB_NIGHTLY_TESTING_PRIVATE_KEY` secrets to leanprover/lean4
(done).

🤖 Prepared with Claude Code
2026-02-05 04:55:29 +00:00
Leonardo de Moura
1695b940b1
feat: do not simp instances (#12244)
This PR ensures `simp` does not "simplify" instances by default. The old
behavior can be retrieved by using `simp +instances`. This PR is similar
to #12195, but for `dsimp`.
The backward compatibility flag for `dsimp` also deactivates this new
feature.

```
set_option backward.dsimp.instances true
```

Applying `simp` (and `dsimp`) to instances creates non-standard
instances, and this creates all sorts of problems in Mathlib.

---------

Co-authored-by: Henrik Böving <hargonix@gmail.com>
Co-authored-by: Sebastian Graf <sgraf1337@gmail.com>
Co-authored-by: Kim Morrison <kim@tqft.net>
2026-02-05 04:53:46 +00:00
Leonardo de Moura
7c350e33a0
feat: improve instantiateExtTheorem in grind (#12319)
This PR leverages the fact that expressions are type correct in `grind`
and the conclusion of extensionality theorems is of the form `?a = ?b`.

This PR is relevant for #12179 because it enables us to use a weaker
`isDefEq` that does not bump the transparency level when processing
implicit arguments.
2026-02-05 02:39:42 +00:00
Kim Morrison
0a431679a4 feat: implements maxSuggestions for grind and simp 2026-02-05 13:41:34 +11:00