Skip to content

Releases: leanprover/lean4

v4.10.0-rc2

09 Jul 15:27
Compare
Choose a tag to compare
v4.10.0-rc2 Pre-release
Pre-release
fix: calculate error suppression per snapshot (#4657)

Generalizes #3556 to not suppressing errors in tactic steps either when
the parse error is in a later step, as otherwise changes to the end of a
proof would affect (correctness or effectiveness of) incrementality of
preceding steps.

Fixes #4623, in combination with #4643

v4.9.1

09 Jul 22:56
Compare
Choose a tag to compare

Bugfixes for incremental compilation. Otherwise identical to v4.9.0.

v4.10.0-rc1

30 Jun 23:57
Compare
Choose a tag to compare
v4.10.0-rc1 Pre-release
Pre-release
update RELEASES.md and CMakeLists.txt for release branch

v4.9.0

01 Jul 00:21
Compare
Choose a tag to compare

Language features, tactics, and metaprograms

  • Definition transparency
    • #4053 adds the seal and unseal commands, which make definitions locally be irreducible or semireducible.
    • #4061 marks functions defined by well-founded recursion with @[irreducible] by default,
      which should prevent the expensive and often unfruitful unfolding of such definitions (see breaking changes below).
  • Incrementality
    • #3940 extends incremental elaboration into various steps inside of declarations:
      definition headers, bodies, and tactics.
      Recording 2024-05-10.
    • 250994 and 67338b add @[incremental] attribute to mark an elaborator as supporting incremental elaboration.
    • #4259 improves resilience by ensuring incremental commands and tactics are reached only in supported ways.
    • #4268 adds special handling for := by so that stray tokens in tactic blocks do not inhibit incrementality.
    • #4308 adds incremental have tactic.
    • #4340 fixes incorrect info tree reuse.
    • #4364 adds incrementality for careful command macros such as set_option in theorem, theorem foo.bar, and lemma.
    • #4395 adds conservative fix for whitespace handling to avoid incremental reuse leading to goals in front of the text cursor being shown.
    • #4407 fixes non-incremental commands in macros blocking further incremental reporting.
    • #4436 fixes incremental reporting when there are nested tactics in terms.
  • Functional induction
    • #4135 ensures that the names used for functional induction are reserved.
    • #4327 adds support for structural recursion on reflexive types.
      For example,
      inductive Many (α : Type u) where
        | none : Many α
        | more : α → (Unit → Many α) → Many α
      
      def Many.map {α β : Type u} (f : α → β) : Many α → Many β
        | .none => .none
        | .more x xs => .more (f x) (fun _ => (xs ()).map f)
      
      #check Many.map.induct
      /-
      Many.map.induct {α β : Type u} (f : α → β) (motive : Many α → Prop)
        (case1 : motive Many.none)
        (case2 : ∀ (x : α) (xs : Unit → Many α), motive (xs ()) → motive (Many.more x xs)) :
        ∀ (a : Many α), motive a
      -/
      
  • #3903 makes the Lean frontend normalize all line endings to LF before processing.
    This lets Lean be insensitive to CRLF vs LF line endings, improving the cross-platform experience and making Lake hashes be faithful to what Lean processes.
  • #4130 makes the tactic framework be able to recover from runtime errors (for example, deterministic timeouts or maximum recursion depth errors).
  • split tactic
    • #4211 fixes split at h when h has forward dependencies.
    • #4349 allows split for if-expressions to work on non-propositional goals.
  • apply tactic
    • #3929 makes error message for apply show implicit arguments in unification errors as needed.
      Modifies MessageData type (see breaking changes below).
  • cases tactic
    • #4224 adds support for unification of offsets such as x + 20000 = 20001 in cases tactic.
  • omega tactic
    • #4073 lets omega fall back to using classical Decidable instances when setting up contradiction proofs.
    • #4141 and #4184 fix bugs.
    • #4264 improves omega error message if no facts found in local context.
    • #4358 improves expression matching in omega by using match_expr.
  • simp tactic
    • #4176 makes names of erased lemmas clickable.

    • #4208 adds a pretty printer for discrimination tree keys.

    • #4202 adds Simp.Config.index configuration option,
      which controls whether to use the full discrimination tree when selecting candidate simp lemmas.
      When index := false, only the head function is taken into account, like in Lean 3.
      This feature can help users diagnose tricky simp failures or issues in code from libraries
      developed using Lean 3 and then ported to Lean 4.

      In the following example, it will report that foo is a problematic theorem.

      opaque f : Nat → Nat → Nat
      
      @[simp] theorem foo : f x (x, y).2 = y := by sorry
      
      example : f a b ≤ b := by
        set_option diagnostics true in
        simp (config := { index := false })
      /-
      [simp] theorems with bad keys
        foo, key: f _ (@Prod.mk ℕ ℕ _ _).2
      -/

      With the information above, users can annotate theorems such as foo using no_index for problematic subterms. Example:

      opaque f : Nat → Nat → Nat
      
      @[simp] theorem foo : f x (no_index (x, y).2) = y := by sorry
      
      example : f a b ≤ b := by
        simp -- `foo` is still applied with `index := true`
    • #4274 prevents internal match equational theorems from appearing in simp trace.

    • #4177 and #4359 make simp continue even if a simp lemma does not elaborate, if the tactic state is in recovery mode.

    • #4341 fixes panic when applying @[simp] to malformed theorem syntax.

    • #4345 fixes simp so that it does not use the forward version of a user-specified backward theorem.

    • #4352 adds missing dsimp simplifications for fixed parameters of generated congruence theorems.

    • #4362 improves trace messages for simp so that constants are hoverable.

  • Elaboration
    • #4046 makes subst notation (he ▸ h) try rewriting in both directions even when there is no expected type available.
    • #3328 adds support for identifiers in autoparams (for example, rfl in (h : x = y := by exact rfl)).
    • #4096 changes how the type in let and have is elaborated, requiring that any tactics in the type be evaluated before proceeding, improving performance.
    • #4215 ensures the expression tree elaborator commits to the computed "max type" for the entire arithmetic expression.
    • #4267 cases signature elaboration errors to show even if there are parse errors in the body.
    • #4368 improves error messages when numeric literals fail to synthesize an OfNat instance,
      including special messages warning when the expected type of the numeral can be a proposition.
  • Metaprogramming
    • #4167 adds Lean.MVarId.revertAll to revert all free variables.
    • #4169 adds Lean.MVarId.ensureNoMVar to ensure the goal's target contains no expression metavariables.
    • #4180 adds cleanupAnnotations parameter to forallTelescope methods.
    • #4307 adds support for parser aliases in syntax quotations.
  • Work toward implementing grind tactic
    • 0a515e and #4164 add grind_norm and grind_norm_proc attributes and @[grind_norm] theorems.
    • #4170, #4221, and #4249 create grind preprocessor and core module.
    • #4235 and d6709e add special cases tactic to grind along with @[grind_cases] attribute to mark types that this cases tactic should automatically apply to.
    • #4243 adds special injection? tactic to grind.
  • Other fixes or improvements
    • #4065 fixes a bug in the Nat.reduceLeDiff simproc.
    • #3969 makes deprecation warnings activate even for general...
Read more

v4.9.0-rc3

24 Jun 02:11
Compare
Choose a tag to compare
v4.9.0-rc3 Pre-release
Pre-release
chore: mark releases as prerelease

v4.9.0-rc2

14 Jun 01:24
Compare
Choose a tag to compare
v4.9.0-rc2 Pre-release
Pre-release
feat: lake: reliably cache logs and hashes (#4402)

Moves the cached log into the trace file (no more `.log.json`). This
means logs are no longer cached on fatal errors and this ensures that an
out-of-date log is not associated with an up-to-date trace. Separately,
`.hash` file generation was changed to be more reliable as well. `.hash`
files are deleted as part of the build and always regenerate with
`--rehash`.

Closes #2751.

(cherry picked from commit db74ee9e83c631dd4bab9b7b6a10d0793cb0cbef)

v4.9.0-rc1

06 Jun 12:56
Compare
Choose a tag to compare
v4.9.0-rc1 Pre-release
Pre-release
chore: set LEAN_VERSION_IS_RELEASE to 1

v4.8.0

05 Jun 03:24
Compare
Choose a tag to compare

Language features, tactics, and metaprograms

  • Functional induction principles.
    #3432, #3620, #3754, #3762, #3738, #3776, #3898.

    Derived from the definition of a (possibly mutually) recursive function,
    a functional induction principle is created that is tailored to proofs about that function.

    For example from:

    def ackermann : Nat → Nat → Nat
      | 0, m => m + 1
      | n+1, 0 => ackermann n 1
      | n+1, m+1 => ackermann n (ackermann (n + 1) m)
    

    we get

    ackermann.induct (motive : Nat → Nat → Prop) (case1 : ∀ (m : Nat), motive 0 m)
      (case2 : ∀ (n : Nat), motive n 1 → motive (Nat.succ n) 0)
      (case3 : ∀ (n m : Nat), motive (n + 1) m → motive n (ackermann (n + 1) m) → motive (Nat.succ n) (Nat.succ m))
      (x x : Nat) : motive x x
    

    It can be used in the induction tactic using the using syntax:

    induction n, m using ackermann.induct
    
  • The termination checker now recognizes more recursion patterns without an
    explicit termination_by. In particular the idiom of counting up to an upper
    bound, as in

    def Array.sum (arr : Array Nat) (i acc : Nat) : Nat :=
      if _ : i < arr.size then
        Array.sum arr (i+1) (acc + arr[i])
      else
        acc
    

    is recognized without having to say termination_by arr.size - i.

    • #3630 makes termination_by? not use sizeOf when not needed
    • #3652 improves the termination_by syntax.
    • #3658 changes how termination arguments are elaborated.
    • #3665 refactors GuessLex to allow inferring more complex termination arguments
    • #3666 infers termination arguments such as xs.size - i
  • #3629, #3655, #3747:
    Adds @[induction_eliminator] and @[cases_eliminator] attributes to be able to define custom eliminators
    for the induction and cases tactics, replacing the @[eliminator] attribute.
    Gives custom eliminators for Nat so that induction and cases put goal states into terms of 0 and n + 1
    rather than Nat.zero and Nat.succ n.
    Added option tactic.customEliminators to control whether to use custom eliminators.
    Added a hack for rcases/rintro/obtain to use the custom eliminator for Nat.

  • Shorter instances names. There is a new algorithm for generating names for anonymous instances.
    Across Std and Mathlib, the median ratio between lengths of new names and of old names is about 72%.
    With the old algorithm, the longest name was 1660 characters, and now the longest name is 202 characters.
    The new algorithm's 95th percentile name length is 67 characters, versus 278 for the old algorithm.
    While the new algorithm produces names that are 1.2% less unique,
    it avoids cross-project collisions by adding a module-based suffix
    when it does not refer to declarations from the same "project" (modules that share the same root). #3089 and #3934.

  • 8d2adf Importing two different files containing proofs of the same theorem is no longer considered an error.
    This feature is particularly useful for theorems that are automatically generated on demand (e.g., equational theorems).

  • 84b091 Lean now generates an error if the type of a theorem is not a proposition.

  • Definition transparency. 47a343. @[reducible], @[semireducible], and @[irreducible] are now scoped and able to be set for imported declarations.

  • simp/dsimp

    • #3607 enables kernel projection reduction in dsimp
    • b24fbf and acdb00: dsimproc command to define defeq-preserving simplification procedures.
    • #3624 makes dsimp normalize raw nat literals as OfNat.ofNat applications.
    • #3628 makes simp correctly handle OfScientific.ofScientific literals.
    • #3654 makes dsimp? report used simprocs.
    • dee074 fixes equation theorem handling in simp for non-recursive definitions.
    • #3819 improved performance when simp encounters a loop.
    • #3821 fixes discharger/cache interaction.
    • #3824 keeps simp from breaking Char literals.
    • #3838 allows Nat instances matching to be more lenient.
    • #3870 documentation for simp configuration options.
    • #3972 fixes simp caching.
    • #4044 improves cache behavior for "well-behaved" dischargers.
  • omega

    • #3639, #3766, #3853, #3875: introduces a term canonicalizer.
    • #3736 improves handling of positivity for the modulo operator for Int.
    • #3828 makes it work as a simp discharger.
    • #3847 adds helpful error messages.
  • rfl

    • #3671, #3708: upstreams the @[refl] attribute and the rfl tactic.
    • #3751 makes apply_rfl not operate on Eq itself.
    • #4067 improves error message when there are no goals.
  • #3719 upstreams the rw? tactic, with fixes and improvements in #3783, #3794, #3911.

  • conv

    • #3659 adds a conv version of the calc tactic.
    • #3763 makes conv clean up using try with_reducible rfl instead of try rfl.
  • #guard_msgs

    • #3617 introduces whitespace protection using the character.
    • #3883: The #guard_msgs command now has options to change whitespace normalization and sensitivity to message ordering.
      For example, #guard_msgs (whitespace := lax) in cmd collapses whitespace before checking messages,
      and #guard_msgs (ordering := sorted) in cmd sorts the messages in lexicographic order before checking.
    • #3931 adds an unused variables ignore function for #guard_msgs.
    • #3912 adds a diff between the expected and actual outputs. This feature is currently
      disabled by default, but can be enabled with set_option guard_msgs.diff true.
      Depending on user feedback, this option may default to true in a future version of Lean.
  • do notation

    • #3820 makes it an error to lift (<- ...) out of a pure if ... then ... else ...
  • Lazy discrimination trees

    • #3610 fixes a name collision for LazyDiscrTree that could lead to cache poisoning.
    • #3677 simplifies and fixes LazyDiscrTree handling for exact?/apply?.
    • #3685 moves general exact?/apply? functionality into LazyDiscrTree.
    • #3769 has lemma selection improvements for rw? and LazyDiscrTree.
    • #3818 improves ordering of matches.
  • #3590 adds inductive.autoPromoteIndices option to be able to disable auto promotion of indices in the inductive command.

  • Miscellaneous bug fixes and improvements

Read more

v4.8.0-rc2

22 May 00:07
Compare
Choose a tag to compare
v4.8.0-rc2 Pre-release
Pre-release

Update to v4.8.0-rc1 with improvements to lake's build monitor.

v4.8.0-rc1

02 May 11:26
Compare
Choose a tag to compare
v4.8.0-rc1 Pre-release
Pre-release
chore: set release flag