Commit graph

39442 commits

Author SHA1 Message Date
Henrik Böving
e5f0d6283a
chore: update to c++20 (#12117)
This PR upgrades Lean's internal toolchain to use C++20 as a preparatory
step for #12044.
2026-02-11 01:17:40 +00:00
Lean stage0 autoupdater
d886be121e chore: update stage0 2026-02-10 22:17:26 +00:00
Kim Morrison
5115b8f361
doc: add test suite documentation to .claude/CLAUDE.md (#12421)
This PR adds comprehensive test running instructions to
`.claude/CLAUDE.md`,
replacing the single `test_single.sh` example with the full range of
test
commands documented in `doc/dev/testing.md`: full suite, filtered by
name,
rerun failures, and direct ctest usage.

🤖 Prepared with Claude Code

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-10 21:42:06 +00:00
Eric Wieser
c5d2796069
fix: avoid unaligned pointer dereference (#12318)
This PR avoids undefined behavior in `String.Slice.hash` on unaligned
substrings.
This could produce a SIGILL on some Arm platforms.

Closes #12317
2026-02-10 20:40:24 +00:00
Leonardo de Moura
c4d85b7622
chore: revert reducibility change PartialOrder.rel (#12407)
This PR is similar to #12403.

We previously conjectured that "all type class fields that are types
should be marked as reducible." The problem is that propositions are
types, but they are also used as data (with `Decidable`). For example,
we often see the proposition `x <= y` as a Boolean. So, we refined the
conjecture to:

"All type class fields that are types (and not propositions) should be
marked as reducible."
2026-02-10 19:46:36 +00:00
Leonardo de Moura
14b595e952
feat: better support for eta expanded terms in grind (#12415)
This PR improves the support for eta expanded terms in `grind` patterns.

Closes #12390
2026-02-10 19:46:00 +00:00
crStiv
80257a6901
doc: fix typos (#12418)
Nothing fancy, just fixed some typos of different importance
2026-02-10 19:26:49 +00:00
Wojciech Różowski
a6ba7312cc
chore: make toBetaApp public (#12416)
This PR makes `Sym.Simp.toBetaApp` public. This is necessary for the
refactor of the main `cbv` simproc in #12417.
2026-02-10 19:02:01 +00:00
Sebastian Graf
fc4f51d759
feat: pick up specs from the local context in mvcgen (#12395)
This PR adds `mvcgen` support for specifications in the local context.
Example:

```lean
import Std.Tactic.Do

open Std.Do

set_option mvcgen.warning false

def foo (x : Id Nat → Id Nat) : Id Nat := do
  let r₁ ← x (pure 42)
  let r₂ ← x (pure 26)
  pure (r₁ + r₂)

theorem foo_spec
    (x : Id Nat → Id Nat)
    (x_spec : ∀ (k : Id Nat) (_ : ⦃⌜True⌝⦄ k ⦃⇓r => ⌜r % 2 = 0⌝⦄), ⦃⌜True⌝⦄ x k ⦃⇓r => ⌜r % 2 = 0⌝⦄) :
    ⦃⌜True⌝⦄ foo x ⦃⇓r => ⌜r % 2 = 0⌝⦄ := by
  mvcgen [foo, x_spec] <;> grind

def bar (k : Id Nat) : Id Nat := do
  let r ← k
  if r > 30 then return 12 else return r

example : ⦃⌜True⌝⦄ foo bar ⦃⇓r => ⌜r % 2 = 0⌝⦄ := by
  mvcgen [foo_spec, bar] -- unfold `bar` and automatically apply the spec for the higher-order argument `k`
```
2026-02-10 15:51:26 +00:00
Wojciech Różowski
7d32030729
feat: add cbv_eval attribute (#12296)
This PR adds `cbv_eval` attribute that allows to evaluate functions in
`cbv` tactic using pre-registered theorems.
2026-02-10 15:41:42 +00:00
Sebastian Ullrich
bc30710c67
fix: LCNF.getImpureSignature? on imported decls (#12410) 2026-02-10 14:43:31 +00:00
Garmelon
d29407b481
chore: remove outdated trust0 test (#12401) 2026-02-10 13:07:10 +00:00
Paul Reichert
df26bea7c1
feat: upstream slice API improvements from human-eval-lean (#12352)
This PR improves the slice API with lemmas for `drop`/`take` operations
on `Subarray` and more lemmas about `Std.Slice.fold`, `Std.Slice.foldM`
and `Std.Slice.forIn`. It also changes the `simp` and `grind`
annotations for `Slice`-related lemmas. Lemmas converting between slices
of different shapes are no longer `simp`/`grind`-annotated because they
often complicated lemmas and hindered automation.
2026-02-10 10:54:07 +00:00
Wojciech Różowski
82d90b4cdc
fix: force unfolding of the Decidable instace in Decidable.rec (#12399)
This PR adds a custom simproc to handle `Decidable.rec`, where we force
the rewrite in the argument of the `Decidable` type, that normally is
not rewritten due to being a subsingleton.

Closes #12386
2026-02-10 10:49:19 +00:00
Henrik Böving
611337ecee
doc: the different chunks of the pass manager (#12400) 2026-02-10 08:48:36 +00:00
Henrik Böving
7488201604
refactor: port IR.SimpCase to LCNF (#12384)
This PR ports the IR SimpCase pass to LCNF.
2026-02-10 08:35:31 +00:00
Kim Morrison
4cdc199f77
chore: revert reducibility change to HasSSubset for now (#12403)
This PR reverts `attribute [reducible] HasSSubset.SSubset` from #12368,
as it is not immediately needed, and causes breakages in Mathlib.
2026-02-10 06:33:38 +00:00
Wojciech Różowski
af2444a140
perf: always zeta reduce let expressions in cbv (#12397)
This PR adds zeta reduction simproc to the pre step of `cbv`.
2026-02-09 18:45:58 +00:00
Wojciech Różowski
57c5efe309
fix: handling of ite/dite expressions in cbv tactic (#12361)
This PR develops custom simprocs for dealing with `ite`/`dite`
expressions in `cbv` tactics, based on equivalent simprocs from
`Sym.simp`, with the difference that if the condition is not reduced to
`True`/`False`, we make use of the decidable instance and calculate to
what the condition reduces to.

Stacked on top of #12391.
2026-02-09 15:00:10 +00:00
Mac Malone
919721c758
feat: IO.FS.Metadata.numLinks (#12277)
This PR adds `IO.FS.Metadata.numLinks`, which contains the number of
hard links to a file.

This changes the implementation of `System.FilePath.metadata` and
`System.FilePath.symlinkMetadata` to use libuv. Otherwise, `st_nlink`
was not properly set on Windows. This also has the side benefit of
provided sub-second precision for file times on Windows (fulfilling an
old TODO). Also, while libuv supports `lstat` for Windows, enabling that
is left to a future PR.
2026-02-09 14:28:56 +00:00
Mac Malone
9a15df5e28
fix: IO.FS.removeFile should delete read-only files on Windows (#12282)
This PR fixes a platform inconsistency in `IO.FS.removeFile` where it
could not delete read-only files on Windows.

The implementation now uses `uv_fs_unlink` instead of `std::remove`, as
libuv can delete read-only files. The PR also fixes a inconsistency in
`IO_test.lean` where it would generate files in the wrong directory when
run interactively.

---------

Co-authored-by: Markus Himmel <markus@himmel-villmar.de>
2026-02-09 14:28:31 +00:00
Wojciech Różowski
4401117a6a
chore: make simpCond public (#12391)
This PR makes `simpCond` public. It is needed to avoid code duplication
in #12361
2026-02-09 13:54:36 +00:00
Sebastian Graf
7a8e011603
test: support ite splitting and lifting through ExceptT to Sym mvcgen (#12392) 2026-02-09 13:41:35 +00:00
Henrik Böving
892475dcac
fix: LCNF casesOnCtor can only act if type correct (#12387)
This PR fixes an issue in LCNF simp where it would attempt to act on
type incorrect `cases`
statements and look for a branch, otherwise panic. This issue did not
yet manifest in production as
various other invariants upheld by LCNF simp help mask it but will start
to become an issue with the
upcoming changes.

This is the proper fix for #6957.
2026-02-09 12:44:01 +00:00
Sebastian Ullrich
b4a254de69 chore: revert "chore: CI: avoid fetching full repo in PR Release (#12309)"
This reverts commit 12ad957bd5.
2026-02-09 13:12:35 +00:00
Markus Himmel
5ba467d920
feat: LawfulForwardPatternModel for string patterns (#12360)
This PR provides a `LawfulForwardPatternModel` instance for string
patterns, i.e., it proves correctness of the `dropPrefix?` and
`startsWith` functions for string patterns.

Note that this is "just" the correctness proof; there isn't a way to
actually use it yet. API lemmas will follow.
2026-02-09 09:27:47 +00:00
Paul Reichert
d2c738c4bd
feat: vector iterator (#12363)
This PR introduces iterators for vectors via `Vector.iter` and
`Vector.iterM`, together with the usual lemmas.
2026-02-09 07:45:42 +00:00
Mac Malone
a31e68715c
fix: lake: include module identifiers in trace (#12377)
This PR adds identifying information about a module available to `lean`
(e.g., its name and package identifier) to the module's dependency
trace. This ensures modules with different identification have different
input hashes even if their source files and imports are identical.
2026-02-09 05:59:51 +00:00
Sebastian Ullrich
12ad957bd5
chore: CI: avoid fetching full repo in PR Release (#12309) 2026-02-09 05:14:33 +00:00
Leonardo de Moura
690648d943
chore: missing annotations (#12368)
This PR adds missing annotations for feature
[#12179](https://github.com/leanprover/lean4/pull/12179). PR #12179 is
quite challenging, and we are breaking it into smaller pieces.
2026-02-09 04:52:13 +00:00
Leonardo de Moura
6f4e711171
feat: some unification hints (#12341)
This PR adds a few unification hints that we will need after
`backward.isDefEq.respectTransparency` is `true` by default.

See #12338
It was part of #12179.
2026-02-09 04:51:13 +00:00
Sebastian Ullrich
23dc467ef5
chore: do not rely on Name.lt for ordering fvars in acLt (#12306)
Also relands #12000, fixing #12150
2026-02-08 14:25:31 +00:00
Mac Malone
39c26fce1d
feat: lake: disabling the artifact cache also disables fetching (#12300)
This PR makes disabling the artifact cache (e.g., via
`LAKE_ARTIFACT_CACHE=false` or `enableArtifactCache = false`) now stop
Lake from fetching from the cache (whereas it previously only stopped
writing to it).

There are now 3 possible configuration of the local artifact cache for a
package:
* `true`: Artifacts will be fetched from the cache before building (if
available) and built artifacts will be cached.
* `false:`: Lake will neither fetch artifacts from the cache or store
them into it.
* **default** (no configuration set): Lake will fetch artifacts from the
cache but not store them into it. A key motivation for this is to, by
default, reuse artifacts downloaded into the cache from a remote
service.
2026-02-07 18:07:05 +00:00
Rob23oba
f2ed53a3d6
fix: expose reduceOption (#12376)
This PR tags `List.reduceOption` with `@[expose]`. #12348 accidentally
moved the definition out of an `@[expose] section` which caused problems
in mathlib because `List.reduceOption` was expected to be exposed.
2026-02-07 17:24:59 +00:00
Sebastian Ullrich
da62a81e5e
feat: shake: track simpset/grindset uses (#12375)
This PR extends shake with tracking of attribute names passed to
`simp`/`grind`.

On the way there, it also fixes `register_simp/grind_attr` uses outside
`public meta section` as well as go-to-definition on declaration-level
uses of the created attributes (tactic-level goto would be a separate
todo).
2026-02-07 15:19:15 +00:00
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