Commit graph

27674 commits

Author SHA1 Message Date
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
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
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
Kim Morrison
d49e5d8a3d Revert "chore: temporarily disable proofs for bootstrap"
This reverts commit c56a5732a5a215f7b74d3f7a5cefd8612cf50474.
2026-02-05 13:41:34 +11:00
Kim Morrison
8ca8138f8f feat: add maxSuggestions field to Simp.Config and Grind.Config
This adds a `maxSuggestions : Option Nat := none` field to both
`Simp.Config` and `Grind.Config`. When `suggestions` is enabled, this
field controls the maximum number of library suggestions to use. If
`none`, the default limit is used.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 13:41:34 +11:00
Kim Morrison
7b12b504df chore: temporarily disable proofs for bootstrap
This adds `set_option debug.byAsSorry true` and `decreasing_by sorry` to
various files to allow bootstrapping with Config structure changes. These
changes will be restored after the bootstrap dance is complete.
2026-02-05 13:41:34 +11:00
Kim Morrison
15e4af8f49 chore: add explicit type for robustness under bootstrapping 2026-02-05 13:41:34 +11:00
David Thrane Christiansen
b397d466b4
fix: report Verso docsring parse errors (#12314)
This PR fixes a problem where Verso docstring parse errors were being
swallowed in some circumstances.

Closes #12062.
2026-02-04 18:46:31 +00:00
Wojciech Różowski
ff93bb6b80
feat: add cbv_opaque attribute (#12283)
This PR introduces `cbv_opaque` attribute that allows one to mark
definitions not to be unfolded by the `cbv` tactic.

Stacked on top of #12279
2026-02-04 16:27:32 +00:00
David Thrane Christiansen
e93287137e
doc: review and add docstrings for syntax operators in manual and one range statement (#12271)
This PR adds and updates docstrings for syntax (and one for ranges).

The reference manual's section on syntax operators is gaining more
content, so the resulting docstrings were reviewed and the missing ones
added.
2026-02-04 15:14:59 +00:00
Wojciech Różowski
47a18a4bb4
feat: add experimental cbv tactic (#12279)
This PR adds an experimental `cbv` tactic that can be invoked from
`conv` mode. The tactic is not suitable for production use and an
appropriate warning is displayed.
2026-02-04 14:39:39 +00:00
Michael Sammler
635d5c1f59
fix: enable custom CCPO when using module system (#12311)
This PR exposes the chain and is_sup definitions such that other modules
can declare custom CCPO instances.

Resolves the issue discussed [on Zulip:
](https://leanprover.zulipchat.com/#narrow/channel/113488-general/topic/How.20to.20define.20CCPO.20with.20module.20system.20enabled.3F/with/571855195)[#general
> How to define CCPO with module system
enabled?](https://leanprover.zulipchat.com/#narrow/channel/113488-general/topic/How.20to.20define.20CCPO.20with.20module.20system.20enabled.3F/with/571855195).
2026-02-04 14:12:38 +00:00
Markus Himmel
35852a9fa9
chore: lemmas for basic types (#12305)
This PR adds various uninteresting lemmas about basic types, extracted
from the KMP verification.
2026-02-04 11:02:17 +00:00
Sebastian Ullrich
1ed3ce2005
chore: remove unused Lean.Data.Xml (#12302)
NB: This module is used in doc-gen for, uh, HTML parsing but should be
moved there or into a separate package for that purpose
2026-02-04 09:54:25 +00:00
Markus Himmel
8a9cb6def0
feat: Slice.posGE and Slice.posGT (#12301)
This PR introduces the functions `(String|Slice).posGE` and
`(String|Slice).posGT` will full verification and deprecates
`Slice.findNextPos` in favor of `Slice.posGT`.

The KMP implementation is adapted to use these two new functions.

Various useful string and order lemmas are added along the way.

Also add a `simp` attribute to `Std.le_refl` and fix the resulting
fallout (yes, this would have been better as a separate PR).
2026-02-04 09:45:44 +00:00
Henrik Böving
34620ec1f6
perf: speedup some fvar handling in LCNF (#12298) 2026-02-03 20:52:16 +00:00
Henrik Böving
7ba76bd33e
refactor: port push_proj to LCNF (#12294)
This PR ports the `push_proj` pass from IR to LCNF. Notably it cannot
delete it from IR yet as the pass is still used later on.
2026-02-03 19:21:45 +00:00
Sebastian Graf
d1671aa25b
fix: make PredTrans.apply semi-reducible (#12290)
This PR moves the `PredTrans.apply` structure field into a separate
`def`. Doing so improves kernel reduction speed because the kernel is
less likely to unfold definitions compared to structure field
projections. This causes minor shifts in `simp` normal forms.
2026-02-03 16:17:57 +00:00
Henrik Böving
3516b66019
chore: two typos in the impure refactoring (#12288) 2026-02-03 13:34:28 +00:00
Garmelon
a0cec1838e
chore: move test suite setup to tests/CMakeLists.txt (#12278)
In preparation for adding the bench suite to the cmake-based test suite,
this PR moves test-related cmake code into the `tests` directory.

It also fixes a warning by removing an obsolete bit of the cmake code.
2026-02-03 13:22:20 +00:00
Sebastian Ullrich
c09700d72a
fix: [local simp] on privately imported theorem (#12287)
This PR fixes an issue where `attribute [local simp]` was incorrectly
rejected on a theorem from a private import

Fixes #12198
2026-02-03 12:57:23 +00:00
Henrik Böving
26f6bc67ee
feat: lambda pure conversion in LCNF (#12272)
This PR shifts the conversion from LCNF mono to lambda pure into the
LCNF impure phase. This is preparatory work for the upcoming refactor of
IR into LCNF impure.

The LCNF impure phase differs from the other LCNF phases in two crucial
ways:
1. I decided to have `Decl.type` be the result type as opposed to an
arrows from the parameter types to the result type. This is done because
impure does not have a notion of arrows anymore so keeping them around
for this one particular purpose would be slightly odd.
2. In order to avoid cluttering up the olean size LCNF impure saves only
the signature persistently to the disk. This is possible because we no
longer have inlining/specialization at this point of compilation so all
we need is typing information (and potentially other environment
extensions) to guide our analyses.
2026-02-03 10:24:59 +00:00
Joachim Breitner
2907df22ec
feat: one axiom per native computation (#12217)
This PR implements RFC #12216: native computation (`native_decide`,
`bv_decide`) is represented in the logic as one axiom per computation,
asserting the equality that was obtained from the native computation.
`#print axiom` will no longer show `Lean.trustCompiler`, but rather the
auto-generated names of these axioms (with, for example,
`._native.bv_decide.` in the name). See the RFC for more information.


This PR introduces a common MetaM helper (`nativeEqTrue`) used by
`native_decide` and `bv_decide` alike that runs the computation and then
asserts the result using an axiom.

It also deprecated the `ofReduceBool` axioms etc.

Not included in this PR is infrastructure for enumerating these axioms,
prettier `#print axioms` (should we want his) and tactic concurrency.

Fixes #12216.
2026-02-03 10:15:01 +00:00
Leonardo de Moura
e02a140080
feat: @[instance_reducible] part 2 (#12263)
This PR implements the second part of #12247.

---------

Co-authored-by: Sebastian Ullrich <sebasti@nullri.ch>
2026-02-03 04:01:13 +00:00
Leonardo de Moura
3deba604bf
feat: cache output universe parameter positions (#12285)
This PR implements a cache for the positions of class universe level
parameters that only appear in output parameter types.

During type class resolution, the cache key for a query like
`HAppend.{0, 0, ?u} (BitVec 8) (BitVec 8) ?m` should be independent of
the specific metavariable IDs in output parameter positions. To achieve
this, output parameter arguments are erased from the cache key. However,
universe levels that only appear in output parameter types (e.g., `?u`
corresponding to the result type's universe) must also be erased to
avoid cache misses when the same query is issued with different universe
metavariable IDs.

This function identifies which universe level parameter positions are
"output-only" by collecting all level param names that appear in
non-output parameter domains, then returning the positions of any level
params not in that set.

**Remark**: This PR requires a manual update stage0 because it changes
the structure of our .olean files.
2026-02-02 19:56:33 -08:00
Joachim Breitner
c27ea08450
fix: set isRecursive only after adding the declaration (#12269)
This PR refines upon #12106, by setting the `isRecursive` env extension
after adding the declaration, but before processing attributes like
`macro_inline` that want to look at the flag. Fixes #12268.
2026-02-02 17:13:08 +00:00
Marcelo Lynch
5d41b3bdce
fix: avoid deadlock by not throttling workers when the task manager is shutting down (#12052)
This PR avoids a potential deadlock on shutdown of a Lean program when
the number of pooled threads has temporarily been pushed above the
limit.

There's a potential race between the finalizer "waking up everyone"
after setting `m_shutting_down = true` and a worker that is about to be
throttled because of concurrency limits.

- `m_max_std_workers = 1`, `m_std_workers.size() = 2`, and the queue
still has tasks.
- Finalizer sets `m_shutting_down = true` and calls `notify_all()` while
a worker is running a task (outside of the mutex).
- Worker finishes a task, re-enters the loop, sees work, and "should
wait" because `active >= max`.
- Worker then calls `wait()` after the notify and never wakes, so
`join()` in the finalizer hangs.

This PR avoids the worker being blocked by not `wait()`ing if we are
already shutting down. The code is restructured a bit for readability,
where the first section is "there's no work in the queue" and the next
section is "there is some work in the queue"
2026-02-02 16:14:32 +00:00
Wojciech Różowski
a966a192b7
fix: unification issue in proofs generated by Lean.Meta.MkIffOfInductiveProp (#12219)
This PR fixes a unification issue that appeared in
`Lean.Meta.MkIffOfInductiveProp` machinery that was upstreamed from
Mathlib. Inside of `toInductive`, wrong free variables were passed,
which made it impossible to perform a unification in certain cases.

Closes #12215
2026-02-02 10:37:44 +00:00
Paul Reichert
3c64f6a749
feat: lemmas about sums of lists/arrays/vectors (#11994)
This PR provides more lemmas about sums of lists/arrays/vectors,
especially sums of `Nat` or `Int` lists/arrays/vectors.

This change has been motivated by my experience solving
`human-eval-lean` problems. Sums, minima and maxima are frequently
required and the improvements provided in this PR make it easier to
verify such programming tasks.

Changes:
* Added lemmas that `sum` equals `foldl`/`foldr`.
* Generalized `sum_append_nat` and `sum_reverse_nat` lemmas so that they
are polymorphic, requiring only some type class instances about the list
elements' type. The polymorphic lemmas aren't simp- or grind-annotated
because I fear the instance synthesis overhead. However, the `Nat` and
`Int` specializations are annotated (see below). Note that as
`{Array,Vector}.min` do not exist, some lemmas can't be stated and were
omitted.
* Added `List.min_singleton` and `List.max_singleton` lemmas as they
were needed for some proofs.
* `Nat`-related:
* Moved all `{List,Array,Vector}.sum` lemmas that are specific for `Nat`
into their own module: `Init.Data.List.Nat.Sum`, `Init.Data.Array.Nat`
and `Int.Data.Vector.Nat`.
* Notably, moved `Nat.sum_pos_iff_exists_pos` and renamed it to
`List.sum_pos_iff_exists_pos_nat`. This is more consistent and made it
possible to add `Array` and `Vector` variants of this lemma.
* Added lemmas proving that `l.sum / l.length` lies between the minimum
and the maximum of a list.
* Added analogous lemmas for `Int` lists/arrays/vectors to parallel
modules: `Init.Data.List.Int.Sum`, `Init.Data.Array.Int` and
`Int.Data.Vector.Int`.
* Renamed `sum_eq_sum_toList` to `sum_toList`, which better represents
the theorem's content.
2026-02-02 07:52:36 +00:00
Sebastian Ullrich
a7b9a3def6
refactor: move getOriginalConstKind? into its own module to avoid future import cycle (#12265) 2026-02-01 16:18:51 +00:00
Paul Reichert
c25468f057
feat: various small list/array/vector API improvements (#12017)
This PR makes several small improvements to the list/array/vector API:
* It fixes typos in `Init.Core`.
* It adds `List.isSome_min_iff` and `List.isSome_max_iff`.
* It adds `grind` and `simp` annotations to various previously
unannotated lemmas.
* It adds lemmas for characterizing `∃ x ∈ xs, P x` using indices as `∃
(i : Nat), ∃ hi, P (xs[i])`, and similar universally quantified lemmas:
`exists_mem_iff_exists_getElem` and `forall_mem_iff_forall_getElem`.
* It adds `Vector.toList_zip`.
* It adds `map_ofFn` and `ofFn_getElem` for lists/arrays/vectors.
2026-02-01 13:21:38 +00:00
Leonardo de Moura
4606c35c40
feat: @[instance_reducible] (#12247)
This PR adds the new transparency setting `@[instance_reducible]`. We
used to check whether a declaration had `instance` reducibility by using
the `isInstance` predicate. However, this was not a robust solution
because:

- We have scoped instances, and `isInstance` returns `true` only if the
scope is active.

- We have auxiliary declarations used to construct instances manually,
such as:

```lean
    def lt_wfRel : WellFoundedRelation Nat
```
    
`isInstance` also returns `false` for this kind of declaration.

In both cases, the declaration may be (or may have been) used to
construct an instance, but `isInstance`
returns `false`. Thus, we claim it is a mistake to check the
reducibility status using `isInstance`.
`isInstance` indicates whether a declaration is available for the type
class resolution mechanism,
not its transparency status.

**We are decoupling whether a declaration is available for type class
resolution from its transparency status.**

**Remak**: We need a update stage0 to complete this feature.

---------

Co-authored-by: Sebastian Ullrich <sebasti@nullri.ch>
2026-02-01 03:03:16 +00:00
Mac Malone
89c01c9e7e
fix: lake: facet names in unknown facet errors (#12261)
This PR fixes a bug in Lake where the facet names printed in unknown
facet errors would contain the internal facet kind.
2026-01-31 20:57:13 +00:00
Mac Malone
ce980895b2
fix: IO.Process.spawn empty env var on Windows (#12220)
This PR fixes a bug on Windows with `IO.Process.spawn` where setting an
environment variable to the empty string would not set the environment
variable on the subprocess.
2026-01-31 19:17:26 +00:00
Wojciech Różowski
6c5de545f9
feat: add orElse combinator to Sym.Simp.Simproc (#12236)
This PR adds `orElse` combinator to simprocs of `Sym.Simp`.
2026-01-31 18:34:19 +00:00
Leonardo de Moura
21a281b496
fix: bug in instantiateRangeS' (#12260)
This PR fixes a bug in the function `instantiateRangeS'` in the `Sym`
framework.
2026-01-31 17:50:03 +00:00
Paul Reichert
7cd6b78a9c
feat: Std.Iter.isEmpty (#12212)
This PR adds the function `Std.Iter.isEmpty` and proves the
specification lemmas `Std.Iter.isEmpty_eq_match_step` and
`Std.Iter.isEmpty_toList` if the iterator is productive.

The monadic variant on `Std.IterM` is also provided.
2026-01-31 16:18:35 +00:00