Commit graph

40408 commits

Author SHA1 Message Date
Maximus Gorog
ba016b2130 Phase 0: fork infrastructure
Some checks failed
CI / configure (push) Has been cancelled
Update stage0 / update-stage0 (push) Has been cancelled
CI / build (push) Has been cancelled
CI / build-secondary (push) Has been cancelled
CI / Build matrix complete (push) Has been cancelled
CI / release (push) Has been cancelled
CI / release-nightly (push) Has been cancelled
Add FORK_STRATEGY.md documenting:
- Purpose: HoTT-compatible kernel extensions (Path types without UIP,
  transport, HITs) for polytropos's meta-theory.
- Why kernel-level: library encodings via Quot leak UIP, incompatible
  with univalence. Mirrors Cubical Agda's precedent.
- Sync strategy: track upstream leanprover/lean4, merge (not rebase),
  preserve HoTT additions on conflict.
- Modification strategy: locality principle (new files under hott/
  + src/kernel/hott/ + src/Init/HoTT/); LEAN4-HTT: tag for modifications
  to upstream files; compile-time feature flag (LEAN_HOTT) gates HoTT.
- Patch-series organization for phased primitive additions.
- Forbidden moves: no UIP at kernel level, no Quot.sound dependency for
  HoTT reductions, no Classical.choice in HoTT primitives.

Add hott/ directory structure:
- hott/README.md describing the fork-specific directory's purpose.
- hott/design/ for architectural decisions per phase.
- hott/tests/ for HoTT-specific test suites.

No kernel modifications in this phase. Subsequent phases:
  Phase 1: Path + Refl + J primitives
  Phase 2: transport with computational behavior
  Phase 3: HIT support
  Phase 4: cubical primitives if needed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:43:41 -06:00
Kyle Miller
ad1c983a43
fix: run beforeElaboration attributes on inductives (#13813)
This PR fixes an issue where `beforeElaboration` attributes were not
being run on `inductive`/`structure`/`coinductive` commands. Closes
#13433.

There is also light refactoring of MutualInductive, as well as a mild
performance enhancement to avoid repeated re-elaboration of `variable`s.
2026-05-21 19:45:59 +00:00
Kyle Miller
47e96cd458
feat: add module features to #where command (#13811)
This PR updates the `#where` command to be able to report
`module`-related scope state, for example a `@[expose] public meta
section` line in the output.
2026-05-21 18:11:43 +00:00
Kyle Miller
1842bb5476
feat: improve performance of structure instance notation elaboration (#13760)
This PR improves elaboration performance for structure instance notation
with large numbers of fields. It also uses beta-reducing substitution
for structure parameters, which is already the case for structure
fields.

It substitutes field values into types when they are needed, avoiding
quadratic runtime complexity.
2026-05-21 16:53:33 +00:00
Sebastian Graf
ed790e99b0
fix: strip hypothesis-naming metadata from proof-mode targets (#13812)
This PR fixes `mconstructor`, `mleft`, and `mright` failing inside
`mhave` blocks (#13691), and `mspecialize` failing after a `mrevert;
mintro` round trip. Both cases stem from hypothesis-naming `Expr.mdata`
leaking from hypothesis-conjunction leaves into non-leaf positions (an
inner target, or the antecedent of an `SPred.imp` target), where
downstream pattern matches did not see through it.

Fixed by stripping the mdata at the offending non-leaf positions in
`elabMHave`, `elabMReplace`, and `mRevert`.
2026-05-21 16:18:17 +00:00
Christian Krause
df2a367958
doc: fix wrong example for String.split (#13787)
This PR fixes a small docsting error for `String.split`.
2026-05-21 10:17:58 +00:00
Julia Markus Himmel
8f49fe9864
chore: clean up string processing (#13802)
This PR removes some uses of `String.length`.
2026-05-21 08:46:57 +00:00
Kyle Miller
0db4ac18e5
feat: beta reduce while elaborating applications (#13807)
This PR modifies the app elaborator to beta reduce arguments while
substituting them into expected types for later arguments. This makes it
consistent with `inferType` and `instantiateMVars`, which both beta
reduce substitutions. In particular, this change ensures that the app
elaborator behaves as if it creates metavariables for each parameter and
assigns elaborated arguments to the metavariables. **Breaking change:**
tactic proofs may need to be modified to remove unnecessary steps, e.g.
`dsimp only` steps that were previously for beta reductions.
2026-05-21 07:26:00 +00:00
David Thrane Christiansen
acfe1d1a4b
fix: enforce proper meta discipline for Verso docstring extensions (#13808)
This PR enforces that Verso docstring extensions should always be meta
at attribute application time, giving better error messages, and ensures
that the generated argument parser helper is also meta and has the same
visibility.
2026-05-21 05:58:09 +00:00
Sebastian Graf
65b34530d3
feat: support more indexed monads in elabDoWith (#13801)
This PR adds two new fields to `DoOps`, `splitMonadApp?` and
`mkMonadApp`, so that callers of `elabDoWith` can use indexed monads
like `Measure α` (where `Measure : (α : Type u) → [MeasureSpace α] →
Type u` carries instance arguments) that the default `m α` decomposition
cannot handle. The existing behavior moves into `DoOps.default`.

`splitMonadApp?` replaces the hard-coded `.app m α` step inside the
`extractMonadInfo` recursion, and `mkMonadApp` replaces the hard-coded
`mkApp m α` used to construct the monadic type.

---------

Co-authored-by: Sebastian Graf <sg@lean-fro.org>
2026-05-20 17:59:25 +00:00
Sebastian Graf
da8bcf7916
refactor: rename mkMonadicType to mkMonadApp (#13800)
This PR renames the `do` elaborator's `mkMonadicType` to `mkMonadApp`,
aligning it with the existing `mkPureApp` / `mkBindApp` naming
convention in `DoOps`.

Co-authored-by: Sebastian Graf <sg@lean-fro.org>
2026-05-20 16:52:58 +00:00
Julia Markus Himmel
ada1696f04
chore: clean up string processing (#13797)
This PR drops some more `String.length` from the codebase.
2026-05-20 14:23:26 +00:00
Henrik Böving
a3fff15212
perf: optimize String.compare (#13796)
This PR optimizes `String.compare` to turn it into 1 instead of 2
`memcmp` calls.
2026-05-20 12:57:48 +00:00
Lean stage0 autoupdater
34df732066 chore: update stage0 2026-05-20 11:40:02 +00:00
Henrik Böving
8398048832
chore: preparation for String.compare optimization (#13795)
This PR takes the first step towards only doing one `memcmp` call per
`compare` on `String`.
2026-05-20 10:52:48 +00:00
Julia Markus Himmel
fa2384726f
chore: clean up string processing (#13785)
This PR improves some code involving strings in order to remove usage of
`String.length` and raw string positions.
2026-05-20 10:39:40 +00:00
Mac Malone
727b4aad2b
fix: lake: noRelease test flakiness (#13786)
This PR fixes flaky output checks in Lake's `tests/noRelease`.
2026-05-19 23:35:28 +00:00
Henrik Böving
1f23107ad9
perf: dec specialization (#13788)
This PR generates specialized code for invoking `dec` on values whose
shape is known. This puts branch prediction pressure off
`lean_dec_ref_cold` as the shape of the constructor should now be
compiled into the executable.
2026-05-19 19:56:34 +00:00
Garmelon
0a75e1d92f
chore: CI: fix stage2 release build (#13790)
If we're using the downloaded LLVM release and building stage2/stage3,
we need to also copy stage1 to stage2/stage3 respectively before
continuing the build. Previously, the CI did not do this in every case.
Now we do it unconditionally because the overhead is small enough.
2026-05-19 19:23:57 +00:00
Kyle Miller
29adf42309
refactor: use builtin command elaborators for configuration evaluation (part 2) (#13780)
This PR is part 2 to #13779. It completes the transition of the
configuration evaluation metaprograms into being builtin elaborators.

After this, building stage1 will not invoke the interpreter when
generating configuration evaluators. A tradeoff is that changes to
ConfigEval will not affect stage1 builds, but these changes ought to be
infrequent.
2026-05-19 18:16:21 +00:00
Lean stage0 autoupdater
731d0c4878 chore: update stage0 2026-05-19 17:02:51 +00:00
Julia Markus Himmel
690d27ebc7
chore: clean up string processing (#13789)
This PR eliminates some more uses of `String.length`.
2026-05-19 16:17:42 +00:00
Kyle Miller
e38c698392
refactor: use builtin command elaborators for configuration evaluation (#13779)
This PR makes the command elaborators for configuration evaluation
metaprogramming be builtins, to avoid bootstrapping ABI issues in core
Lean due to the interpreter evaluating large parts of the elaborator
before all builtin initializers are run. (This is part 1; #13780 will be
applied after a stage0 update.)
2026-05-19 16:08:11 +00:00
Kyle Miller
3bb1493139
refactor: remove use of liftCommandElabM from Coinductive (#13782)
This PR eliminates the use of `liftCommandElabM` from the coinductive
module.

Context: `liftCommandElabM` was decided to be deprecated in issue
#10674.
2026-05-19 10:53:44 +00:00
Kyle Miller
a0de9024e9
refactor: avoid liftCommandElabM in @[ext] (#13781)
This PR eliminates the use of `liftCommandElabM` in the `@[ext]`
attribute, since it is unnecessary — all the computations can stay in
`TermElabM`.

Context: `liftCommandElabM` was decided to be deprecated in issue
#10674.
2026-05-19 10:53:07 +00:00
Sebastian Ullrich
e09155b6f9
chore: CI: fold Linux Lake into Linux release (#13759)
Now that they both use Lake, there's little reason for the duplication
2026-05-18 22:52:22 +00:00
Joachim Breitner
ebbbec00f7
refactor: dispatch try? builtins via @[builtin_try_tactic] (#13766)
This PR moves the `evalSuggest` combinator and trace-handler dispatch
from a hardcoded `match` on syntax kinds to the existing
`tryTacticElabAttribute` registration mechanism, bringing `try?`'s
extensibility model in line with normal tactics and interactive `grind`.

Each built-in combinator (`<;>`, `first`, `paren`, `try`, `attempt_all`,
`attempt_all_par`, `first_par`, `seq1`) and trace handler (`grind?`,
`simp?`, `simp_all?`, `exact?`) is now registered as
`@[builtin_try_tactic <kind>]`. `evalSuggestImpl` becomes a thin
attribute-driven dispatcher mirroring `evalTactic`/`evalGrindTactic`.

The post-run "no unsolved goals in terminal mode" check is no longer
applied centrally by the dispatcher. Handlers that may leave goals
open (`simp?`, `simp_all?`, the atomic fallback) call the new
`checkTerminalGoals` helper themselves; handlers that close the goal
by construction (`grind?`, `exact?`) and combinators that delegate via
`evalSuggest` need no explicit call.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 19:41:24 +00:00
Joachim Breitner
705ba6404b
refactor: extract try? suggestions via TryThisInfo (#13774)
This PR makes `try?`'s `expandUserTactic` walk the info tree for
`TryThisInfo`
nodes (introduced in #10524) instead of parsing the rendered `Try this:`
message
text. The previous approach scraped lines prefixed with ` [apply] ` from
the
message log, which would break the moment that wire format changed.

The user tactic is run under `withSaveInfoContext` so the in-flight
trees come
out wrapped with a `PartialContextInfo.commandCtx`, which is what
`InfoTree.foldInfo` needs in order to descend; the structured
suggestions can
then be read directly from the `TryThisInfo` nodes that
`TryThis.addSuggestion`
already pushes. The prior manual `Core.setMessageLog` save/restore dance
is no
longer needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 18:41:55 +00:00
Kim Morrison
6d5ec050f4
fix: instantiate metavariables when collecting a goal's constants (#13748)
This PR fixes premise selection silently dropping relevant premises when
the goal was reached via `induction`.

`MVarId.getRelevantConstants` and `MVarId.getConstants` walked the raw
goal type returned by `getType`, which after `induction` is `?motive
arg` with `?motive` an assigned-but-unsubstituted metavariable. The
constant fold treats the metavariable as an opaque leaf, so every
constant in the goal predicate is lost. Instantiating metavariables
first recovers them.

Thanks to Xavier Généreux for the report.

🤖 Prepared with Claude Code

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 15:52:13 +00:00
Kyle Miller
5d22886aff
refactor: app elaborator refactoring and improvements (#13762)
This PR does some refactoring of the function application elaborator,
and it improves `trace.Elab.app` tracing. It also improves asymptotic
complexity by more carefully substituting arguments into the function's
type and by changing how named argument dependency suppression is
implemented. For dot notation, it now constructs base projections
directly rather than using the app elaborator. It fixes a bug in the eta
args feature where more explicit arguments would be turned into implicit
arguments than expected, and it improves expected type propagation by
following the rules from the main app elaborator.
2026-05-18 14:41:09 +00:00
Kim Morrison
3f3a26c53c
feat: filter MePo candidates to theorems and order output by iteration (#13750)
This PR refines MePo premise selection so that (1) candidates are
restricted to theorems, matching the convention already used by
`SineQuaNon` and `SymbolFrequency`, and (2) the result is ordered
lexicographically by `(iteration, score)` rather than by score alone.

Before the theorem filter, `mepoSelector` returned functions, recursors,
and casts (e.g. `Int.add`, `Eq.ndrec`, `cast`, `proof_irrel`) alongside
real premises. With it, those go away and the obvious lemmas — e.g.
`Int.add_comm` for `a + b = b + a` — rank well above the remaining
noise.

The `(iteration, score)` ordering preserves the iteration priority of
the original Meng–Paulson MePo: an iter-1 premise scoring 0.6 always
ranks above an iter-2 premise scoring 1.0, since later iterations score
against a strictly larger `relevant` set and a higher threshold, so
their raw scores are not comparable.

Thanks to Xavier Généreux for the report. Further tuning of the score
function (the remaining problem: small generic theorems still score 1.0)
is tracked in https://github.com/leanprover/lean4/issues/13749.

Depends on https://github.com/leanprover/lean4/pull/13747.

🤖 Prepared with Claude Code

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 14:15:06 +00:00
Mac Malone
2c38bb3306
fix: lake: rm examples/hello use in tests/env (#13769)
This PR an intermittent test failure in the Lake environment test caused
by its reuse of the hello test's configuration. The tests are now
properly independent.
2026-05-18 13:11:03 +00:00
Kim Morrison
8f508e3c91
fix: include zetaUnused in Meta.Config cache key (#13772)
This PR closes https://github.com/leanprover/lean4/issues/13770 by
including `Config.zetaUnused` in `Config.toKey`. Without this, two
configs that differ only in `zetaUnused` share a `WHNF`/`isDefEq` cache
key, so reductions performed under one setting can be returned for the
other. The new bit sits at position 22, immediately above `zetaHave`.

🤖 Prepared with Claude Code

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 12:47:19 +00:00
Kim Morrison
a68d753729
fix: widen transparency field to 3 bits in Meta.Config cache key (#13768)
This PR fixes a long-standing bug in `Meta.Config.toKey` and
`Context.setTransparency` where `TransparencyMode` was packed into only
2 bits of the cache key, even though it has 5 constructors (`.all`,
`.default`, `.reducible`, `.instances`, `.none`). The `.none` case
(value `4`, i.e. `0b100`) overlapped with the `foApprox` bit, so
configurations differing only in transparency vs. `foApprox` could
collide in the `isDefEq`/`WHNF` cache, and `Context.setTransparency`
corrupted the neighbouring bit when switching to/from `.none`.

The fix widens the transparency field to 3 bits and shifts every
subsequent flag up by one. Split out from
https://github.com/leanprover/lean4/pull/13637 where the same fix was
needed anyway to accommodate a 6th transparency constructor.

🤖 Prepared with Claude Code

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-18 10:51:59 +00:00
Wojciech Nawrocki
9df1caeb77
feat: add ToJson/FromJson for Unit (#13525)
This PR adds `FromJson`/`ToJson` instances for `Unit` - encoded as `{}`
- and documentation for `FromJson`/`ToJson`.
2026-05-18 10:03:30 +00:00
Kim Morrison
385efbbaa7
fix: drop stale .reverse in MePo premise selector (#13747)
This PR fixes the MePo premise selector returning its lowest-scoring
premises instead of its best ones.

Since https://github.com/leanprover/lean4/pull/10917 `mepo` returns
suggestions in score-descending order, but `mepoSelector` still applied
a `.reverse` that predated that change. The `.reverse` flipped the order
to score-ascending, so the subsequent `.take config.maxSuggestions` kept
the `maxSuggestions` worst premises.

Thanks to Xavier Généreux for the report.

🤖 Prepared with Claude Code

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 19:37:49 +00:00
Thomas R. Murrills
2bdc67756c
chore: remove addInfo flag from elabSetOption (#13736)
This PR removes the `addInfo` flag from `elabSetOption` introduced in
#11313, instead allowing callers to use `withEnableInfoTree` to control
whether infotrees are added.
2026-05-17 17:28:27 +00:00
Kyle Miller
ce5814043b
feat: add MessageData.withExprHover (#13763)
This PR adds `MessageData.withExprHover`, for creating messages that
show information about an expression when hovered over. A
`withExprHoverM` variant captures the current local context.
2026-05-17 13:39:49 +00:00
Kyle Miller
43ef70db63
fix: pp.universes should not affect constants with no universe levels (#13761)
This PR fixes an issue where the `pp.universes` option would cause
constants with no universes to not use unexpanders or dot notation. For
example, `p ↔ q` would pretty print as `Iff p q` even though `Iff` has
no universe levels.
2026-05-17 01:41:04 +00:00
Kyle Miller
5dea2142c3
feat: improve performance of instantiateBetaRevRange (#13758)
This PR improves `Expr.instantiateBetaRevRange` to be more efficient in
the common case where lambda functions are not being instantiated, and
it increases expression sharing in applications.

The motivation is that we would like to use this function more
pervasively in elaboration, so that users do not need to write `dsimp
only` as frequently in applications that involve higher-order functions,
plus `inferType` uses it so there is a UX inconsistency when the
elaborator is not using it.
2026-05-16 20:55:18 +00:00
Sebastian Ullrich
ef2dc0f66a
chore: CI: build everything with Lake (#13721) 2026-05-16 17:11:25 +00:00
Mac Malone
d64eaf4597
chore: CI: verify lake cache step (#13735)
This PR adds a CI step to the build job which verifies that the uploaded
Lake cache can be downloaded and used without issue.
2026-05-16 16:08:38 +00:00
Sebastian Ullrich
895752dc2e
feat: add Lean.CompactedRegion.save/read supporting cross-file object sharing (#13185)
This PR adds new incremental module serialization functions that
save/load a single module at a time with explicit sharing via dep
regions and compactor state, generalizing the existing batch
saveModuleDataParts API.

Two sharing mechanisms that can be mixed:
- `CompactedRegion` dep regions for sharing with loaded regions
- `CompactorState` for same-process chaining (pre-loaded `m_obj_table`)
2026-05-16 12:53:20 +00:00
Kim Morrison
1b8f1f140c
feat: add ByteArray indexing and set! lemmas (#13457)
This PR adds the missing `ByteArray` push and `set!` lemmas that are
still carried locally in `ZipForStd.ByteArray` downstream.

These lemmas provide one coherent API layer for reasoning about
`ByteArray` pushes and `set!` updates on top of the existing upstream
append, extract, and size lemmas. Previous downstream code had to keep
local compatibility lemmas for these common proof steps.

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 06:28:43 +00:00
Kim Morrison
c993d3f237
feat: add Dyadic.divAtPrec for round-down dyadic division at given precision (#13654)
This PR adds `Dyadic.divAtPrec a b prec`, returning the greatest dyadic
with precision at most `prec` which is less than or equal to `a/b` (and
`0` when `b = 0`). Mirroring the existing `invAtPrec`, the
characterising lemmas `divAtPrec_mul_le` and `lt_divAtPrec_add_inc_mul`
are also provided.

Compared to composing `invAtPrec` with multiplication, `divAtPrec`
rounds `a/b` down uniformly (no sign-dependent rounding flip), states
the precision at the output rather than requiring callers to back-solve
from `‖a‖`, and fuses the bignum division with renormalisation.
`invAtPrec` remains the right primitive when the reciprocal is reused.

Closes https://github.com/leanprover/lean4/issues/13653.

🤖 Prepared with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:47:39 +00:00
Sebastian Ullrich
d5bcec28e5
chore: adjust dev-release preset (#13741)
Use same output directory as `release` to avoid
lean-toolchain/CLAUDE.md/... issues, rename preset accordingly
2026-05-16 05:32:16 +00:00
Sebastian Ullrich
1708293920
feat: shake: precise reasons in --explain output (#13740)
This PR extends `lake shake --explain` to also cover reasons for keeping
imports that go beyond direct references, such as shake annotations.
2026-05-15 20:24:36 +00:00
Sebastian Ullrich
2acdaafcfe
chore: CI: fix jira-sync (#13739) 2026-05-15 09:55:25 +00:00
Lean stage0 autoupdater
6749463072 chore: update stage0 2026-05-15 09:14:30 +00:00
Mac Malone
f8b7f30f5c
fix: change plugin separator to = (#13737)
This PR changes the separator between the plugin file name and the
initialization function in `--plugin` from `:` to `=`. This prevents
clashes with the `:` in drive prefixes on Windows.
2026-05-15 08:28:21 +00:00