Commit graph

38924 commits

Author SHA1 Message Date
Leonardo de Moura
62b900e8ef
feat: basic equality propagation for IntModule in grind (#11677)
This PR adds basic support for equality propagation in `grind linarith`
for the `IntModule` case. This covers only the basic case. See note in
the code.
We remark this feature is irrelevant for `CommRing` since `grind ring`
already has much better support for equality propagation.
2025-12-14 22:40:11 +00:00
Evan Chen
429e09cd82
doc: trivial typo in Grind/Attr.lean (#11676)
This PR fixes typo "the the custom pattern" -> "the custom pattern".
2025-12-14 20:12:47 +00:00
Sebastian Ullrich
c4d67c22e6
chore: CI: disable problematic bv_decide tests under fsanitize (#11675) 2025-12-14 19:02:20 +00:00
Sebastian Ullrich
923d7e1ed6
fix: ensure by uses expected instead of given type for modsys aux decl (#11673)
This PR fixes an issue where a `by` in the public scope could create an
auxiliary theorem for the proof whose type does not match the expected
type in the public scope.

Fixes #11672
2025-12-14 17:44:38 +00:00
Joachim Breitner
5db865ea2f
fix: make grind support for ctorIdx debug.grind-safe (#11669)
This PR makes sure that proofs about `ctorIdx` passed to `grind` pass
the `debug.grind` checks, despite reducing a `semireducible` definition.
2025-12-14 14:59:57 +00:00
Joachim Breitner
0f2ac0b099
feat: sparse sparse casesOn splitting in match equations (#11666)
This PR makes sure that when a matcher is compiled using a sparse cases,
that equation generation also uses sparse cases to split.
This fixes #11665.
2025-12-14 14:59:45 +00:00
Kim Morrison
b7ff463358
chore: begin development cycle for v4.28.0 (#11667)
This PR bumps the version from v4.27.0 to v4.28.0-pre to begin the next
development cycle.

🤖 Prepared with Claude Code
2025-12-14 12:42:12 +00:00
Leonardo de Moura
799c6b5ff8
feat: add support for OrderedRing.natCast_nonneg in grind (#11664)
This PR adds support for `Nat.cast` in `grind linarith`. It now uses
`Grind.OrderedRing.natCast_nonneg`. Example:
```lean
open Lean Grind Std
attribute [instance] Semiring.natCast

variable [Lean.Grind.CommRing R] [LE R] [LT R] [LawfulOrderLT R] [IsLinearOrder R] [OrderedRing R]

example (a : Nat) : 0 ≤ (a : R) := by grind
example (a b : Nat) : 0 ≤ (a : R) + (b : R) := by grind
example (a : Nat) : 0 ≤ 2 * (a : R) := by grind
example (a : Nat) : 0 ≥ -3 * (a : R) := by grind
```
2025-12-14 09:09:42 +00:00
Leonardo de Moura
2d0c62c767
fix: grind pattern validation (#11663)
This PR fixes the `grind` pattern validator. It covers the case where an
instance is not tagged with the implicit instance binder. This happens
in declarations such as
```lean
ZeroMemClass.zero_mem {S : Type} {M : outParam Type} {inst1 : Zero M} {inst2 : SetLike S M}
  [self : @ZeroMemClass S M inst1 inst2] (s : S) : 0 ∈ s
```
2025-12-14 07:41:19 +00:00
Junyan Xu
fb6c96e54b
chore: expose Nat.log2 (#11401)
Necessary for kernel reduction of `binaryRec`, see
leanprover-community/mathlib4#30144
2025-12-14 05:19:29 +00:00
Kim Morrison
c20378682e
chore: add guidance to not merge PRs autonomously in release command (#11661)
This PR adds explicit guidance to the `/release` command that Claude
should never merge PRs autonomously during the release process - always
wait for the user to do it.

🤖 Prepared with Claude Code
2025-12-14 05:17:42 +00:00
Kim Morrison
b7e6862163
fix: remove obsolete docs directory handling for cslib in release_steps.py (#11649)
This PR updates the release checklist script. The cslib repository no
longer has a docs subdirectory, so the release script was failing when
trying to update lakefile.toml and lean-toolchain in that nonexistent
directory.
2025-12-14 05:15:38 +00:00
Leonardo de Moura
983d64395a
fix: theorem activation in grind (#11660)
This PR fixes another theorem activation issue in `grind`.
2025-12-13 18:35:30 +00:00
Leonardo de Moura
6db52f0aa9
fix: use naming context in grind pattern suggestions (#11659)
This PR adds `MessageData.withNamingContext` when generating pattern
suggestions at `@[grind]`. It fixes another issue reported during
ItaLean.
2025-12-13 18:15:23 +00:00
Leonardo de Moura
e489c342d7
fix: literal internalization in grind (#11658)
This PR fixes a bug in the internalization of parametric literals in
`grind`. That is, literals whose type is `BitVec _` or `Fin _`.

Closes #11545
2025-12-13 17:47:23 +00:00
Joachim Breitner
0bfbb71796
perf: restore kernel-reduction friendly Nat.hasNotBit definition (#11657)
This PR improves upon #11652 by keeping the kernel-reduction-optimized
definition.
2025-12-13 17:00:33 +00:00
Leonardo de Moura
38c401cf3b
feat: new Int operations in grind (#11656)
This PR adds support for `Int.sign`, `Int.fdiv`, `Int.tdiv`, `Int.fmod`,
`Int.tmod`, and `Int.bmod` to `grind`. These operations are just
preprocessed away. We assume that they are not very common in practice.
Examples:
```lean
example {x y : Int} : y = 0 → (x.fdiv y) = 0 := by grind
example {x y : Int} : y = 0 → (x.tdiv y) = 0 := by grind
example {x y : Int} : y = 0 → (x.fmod y) = x := by grind
example {x y : Int} : y = 1 → (x.fdiv (2 - y)) = x := by grind
example {x : Int} : x > 0 → x.sign = 1 := by grind
example {x : Int} : x < 0 → x.sign = -1 := by grind
example {x y : Int} : x.sign = 0 → x*y = 0 := by grind
```

See #11622
2025-12-13 14:55:34 +00:00
Leonardo de Moura
a2ceebe200
feat: semiring * propagators in grind (#11653)
This PR adds propagation rules corresponding to the `Semiring`
normalization rules introduced in #11628. The new rules apply only to
non-commutative semirings, since support for them in `grind` is limited.
The normalization rules introduced unexpected behavior in Mathlib
because they neutralize parameters such as `one_mul`: any theorem
instance associated with such a parameter is reduced to `True` by the
normalizer.
2025-12-13 14:32:34 +00:00
Leonardo de Moura
292b74b0a4
chore: update grind docstring (#11654)
This PR updates the `grind` docstring. It was still mentioning `cutsat`
which has been renamed to `lia`. This issue was reported during ItaLean.
2025-12-13 14:32:30 +00:00
Joachim Breitner
d76752ffb8
feat: grind support for .ctorIdx (#11652)
This PR teaches `grind` how to reduce `.ctorIdx` applied to
constructors. It can also handle tasks like
```
xs ≍ Vec.cons x xs' → xs.ctorIdx = 1
```
thanks to a `.ctorIdx.hinj` theorem (generated on demand).
2025-12-13 13:32:19 +00:00
Kim Morrison
d4463ce549
chore: fix CMakeLists.txt CI check (#11650) 2025-12-13 11:49:20 +00:00
Kim Morrison
074dc60bea
chore: update release docs/scripts for lean-fro.org (#11648) 2025-12-13 11:06:17 +00:00
Lean stage0 autoupdater
6d8a16f137 chore: update stage0 2025-12-13 09:57:36 +00:00
Joachim Breitner
f0e594d5db
refactor: make .ctorIdx not an abbrev (#11644)
This PR makes `.ctorIdx` not an abbrev; we don't want `grind` to unfold
it.
2025-12-13 09:14:59 +00:00
Joachim Breitner
32d22075dc
doc: fix docstring of propagateForallPropUp (#11645)
This PR fixes the docstring of `propagateForallPropUp`. It was
copy’n’pasta before.
2025-12-13 08:14:04 +00:00
Lean stage0 autoupdater
902226642f chore: update stage0 2025-12-13 03:28:09 +00:00
Kim Morrison
67ba4da71f
fix: avoid SIGFPE on x86_64 for signed integer division overflow (#11624)
This PR fixes a SIGFPE crash on x86_64 when evaluating `INT_MIN / -1` or
`INT_MIN % -1` for signed integer types.

On x86_64, the `idiv` instruction traps when the quotient overflows the
destination register. For signed integers, `INT_MIN / -1` produces a
result that overflows (e.g., `-2147483648 / -1 = 2147483648` which
doesn't fit in Int32). ARM64's `sdiv` instruction wraps instead of
trapping.

The fix:
- For Int8/Int16/Int32: widen to the next larger type before
dividing/modding, then truncate back
- For Int64: explicitly check for the overflow case and return the
wrapped result

Fixes #11612

🤖 Prepared with Claude Code
2025-12-13 02:42:33 +00:00
Thomas R. Murrills
0eed450b86
chore: fix typo LeanLib.sharedLibLeanLib.sharedFacet (#11641)
This PR fixes a typo in the docstring of `LeanLibConfig.defaultFacets`
and the Lake README that erroneously referred to `LeanLib.sharedLib`
instead of `LeanLib.sharedFacet`.

See e.g. `tests/lake/tests/targets/lakefile.lean` to verify that
`LeanLib.sharedFacet` is correct usage; `LeanLib.sharedLib` does not
exist.
2025-12-12 23:17:33 +00:00
Joachim Breitner
834886bca2
chore: remove comment from wrong stdlib_flags.h (#11646)
This PR again removes a comment from wrong `stdlib_flags.h`. Only the
one in `stage0/` should be edited.
2025-12-12 22:59:38 +00:00
Henrik Böving
5339c47555
chore: benchmark for charactersIn (#11643) 2025-12-12 22:23:51 +00:00
Sebastian Ullrich
1f80b3ffbe
feat: module system is no longer experimental (#11637)
This PR declares the module system as no longer experimental and makes
the `experimental.module` option a no-op, to be removed.
2025-12-12 21:20:26 +00:00
Sebastian Ullrich
de388a7e6d
feat: unknown identifier code action and the module system (#11164)
This PR ensures that the code action provided on unknown identifiers
correctly inserts `public` and/or `meta` in `module`s
2025-12-12 21:19:34 +00:00
Sebastian Ullrich
5fff9fb228
perf: remove obsolete old codegen workaround (#9311) 2025-12-12 20:51:34 +00:00
Henrik Böving
59045c6227
chore: make workspaceSymbols benchmark independent of sorry search (#11642) 2025-12-12 20:10:27 +00:00
Joe Hendrix
ac7b95da86
feat: port Batteries.WF for executable well-founded fixpoints (#11620)
This PR ports Batteries.WF to Init.WFC for executable well-founded
fixpoints. It introduces `csimp` theorems to replace the recursors and
non-executable definitions with executable definitions.

This ocassionally comes up on Zulip as it prevents admiting definitions
generated from well-founded induction. (e.g., [#lean4 > Computable
WellFounded.fix](https://leanprover.zulipchat.com/#narrow/channel/270676-lean4/topic/Computable.20WellFounded.2Efix/with/529347861)
and [#mathlib4 > Why Nat.find is computable, when Wellfounded.fix
isn't?](https://leanprover.zulipchat.com/#narrow/channel/287929-mathlib4/topic/Why.20Nat.2Efind.20is.20computable.2C.20when.20Wellfounded.2Efix.20isn't.3F/with/545143617)).

This was motivated by running into poor elaboration performance with
recursive definitions involving complex inductive types generated by a
custom elaborator. It would be helpful to explore bypassing the
elaborator and generating elaborated terms directly, but this requires
an executable fixpoint (such as `WellFounded.fixC` introduced in
batteries).
2025-12-12 18:22:54 +00:00
Leonardo de Moura
bb264e1ff0
feat: BitVec.ofNat in grind lia (#11640)
This PR adds support for `BitVec.ofNat` in `grind lia`. Example:

```lean
example (x y : BitVec 8) : y < 254#8 → x > 2#8 + y → x > 1#8 + y := by
  grind
```
2025-12-12 17:50:38 +00:00
Leonardo de Moura
28fca70cb7
feat: BitVec.ofNat in grind ring (#11639)
This PR adds support for `BitVec.ofNat` in `grind ring`. Example:

```lean
example (x : BitVec 8) : (x - 16#8)*(x + 272#8) = x^2 := by
  grind
```
2025-12-12 17:41:32 +00:00
Leonardo de Moura
5e4c90c3d1
feat: bitvec literal internalization in grind (#11638)
This PR fixes bitvector literal internalization in `grind`. The fix
ensures theorems indexed by `BitVec.ofNat` are properly activated.
2025-12-12 17:28:35 +00:00
Lean stage0 autoupdater
9df8a80c7d chore: update stage0 2025-12-12 16:00:39 +00:00
Paul Reichert
9d7d15b276
feat: lint coercions that are deprecated or banned in core (#11511)
This PR implements a linter that warns when a deprecated coercion is
applied. It also warns when the `Option` coercion or the
`Subarray`-to-`Array` coercion is used in `Init` or `Std`. The linter is
currently limited to `Coe` instances; `CoeFun` instances etc. are not
considered.

The linter works by collecting the `Coe` instance declaration names that
are being expanded in `expandCoe?` and storing them in the info tree.
The linter itself then analyzes the info tree and checks for banned or
deprecated coercions.
2025-12-12 15:09:13 +00:00
Sebastian Ullrich
7f5e28ac89
chore: shake: keep-downstream and import privacy (#11634) 2025-12-12 14:09:50 +00:00
Leonardo de Moura
9be007ad70
fix: enforce Grind.genPattern and Grind.getHEqPattern assumptions (#11635)
This PR ensures the pattern normalizer used in `grind` does violate
assumptions made by the gadgets `Grind.genPattern` and
`Grind.getHEqPattern`.

Closes #11633
2025-12-12 14:05:46 +00:00
Sebastian Ullrich
0c7169efa9
perf: more environment blocking avoidance (#11616) 2025-12-12 13:44:58 +00:00
Wojciech Różowski
73d389f358
feat: add decidable equality to DTreeMap/TreeMap/TreeSet and their extensional variants (#11527)
This PR adds decidable equality to `DTreeMap`/`TreeMap`/`TreeSet` and
their extensional variants.

Stacked on top #11404.
2025-12-12 12:47:57 +00:00
Robert J. Simmons
0158172871
chore: remove NameMapExtension abbreviation (#11632)
This PR avoids a conflict with Mathlib by inlining an abbreviation,
NameMapExtension, that wasn't referred to outside the file.
2025-12-12 12:34:53 +00:00
Sebastian Ullrich
520cdb2038
feat: do not have meta imply partial (#11587)
This PR adjusts the new `meta` keyword of the experimental module system
not to imply `partial` for general consistency.

As the previous behavior can create confusion return types that are not
known to be `Nonempty` and few `def`s should be `meta` in the first
case, this special case does not appear to be worth the minor
convenience.
2025-12-12 11:42:42 +00:00
Sebastian Ullrich
9f74e71f10
perf: avoid kernel env block in realizeConst (#11617) 2025-12-12 11:20:20 +00:00
Kim Morrison
ad02aa159c
chore: remove ≥6 month old deprecations (#11627) 2025-12-12 10:40:04 +00:00
Wojciech Różowski
07645775e6
feat: add decidable equality to DHashMap/HashMap/HashSet and their extensional variants (#11421)
This PR adds decidable equality to `DHashMap`/`HashMap`/`HashSet` and
their extensional variants.

Stacked on top of #11266.
2025-12-12 09:55:55 +00:00
Leonardo de Moura
a984e17913
fix: missing condition at normalizePattern in grind (#11629)
This PR adds a missing condition in the pattern normalization code used
in `grind`. It should ignore support ground terms.
2025-12-12 09:32:31 +00:00