Lean 4.28.0 (2026-02-17)
此版本有 309 项更改。除了下面列出的 94 项功能添加和 65 项修复之外,还有 19 项重构更改、8 项文档改进、34 项性能改进、12 项测试套件改进和 77 项其他更改。
亮点
Lean v4.28 版本包含模块系统修复、性能
改进,特别是在 bv_decide 中,以及持续扩展
grind 跨标准库的注释。主要新功能
下面介绍。
符号模拟框架
新的轻量级符号仿真框架与 grind 集成
并启用验证条件生成器的实现
和符号执行引擎。
#12143 定义
该框架的核心API。
有关设计说明和实现细节,请参阅:
用户定义的研磨属性
#11765 实现
用户定义的 grind 属性。它们对于想要的用户很有用
使用 grind 基础设施(例如,
埃涅阿斯中的 progress*)。新的 grind 属性使用
命令
register_grind_attr my_grind
该命令类似于 register_simp_attr。回想一下,类似于
register_simp_attr,新属性不能在同一个属性中使用
文件已声明。
opaque f : Nat → Nat opaque g : Nat → Nat @[my_grind] theorem fax : f (f x) = f x := sorry example theorem fax2 : f (f (f x)) = f x := by fail_if_success grind grind [my_grind]
#11770 实现
支持 grind_pattern 处的用户定义属性。之后
使用 register_grind_attr my_grind 声明 grind 属性,一
可以写:
opaque f : Nat → Nat opaque g : Nat → Nat axiom fg : g (f x) = x grind_pattern [my_grind] fg => g (f x)
Grind 中可配置的标准化和预处理
#11776 添加
属性 [grind norm] 和 [grind unfold] 用于控制
grind 标准化器和预处理器。
norm 修饰符指示 grind 使用定理作为
规范化规则。也就是说,该定理适用于
预处理步骤。此功能适用于高级用户
了解预处理器和 grind 的搜索过程如何
彼此互动。新用户仍然可以从中受益
通过限制其使用完全消除了定理的功能
来自目标的符号。例子:
theorem max_def : max n m = if n ≤ m then m else n
unfold 修饰符指示 grind 展开给定的定义
在预处理步骤中。例子:
@[grind unfold] def h (x : Nat) := 2 * x
example : 6 ∣ 3*h x := x:Nat⊢ 6 ∣ 3 * h x All goals completed! 🐙
请参阅 PR 描述以获取完整的讨论。
Grind 和 Simp 中的局部定义
#11946 添加一个
+locals grind策略的配置选项
自动将当前文件中的所有定义添加为电子匹配
定理。这提供了手动添加的便捷替代方法
[local grind] 每个定义的属性。在形式上
grind? +locals,对于发现哪个本地也有帮助
添加 [local grind] 属性可能有用的声明。
#11947 添加一个
+locals simp、simp_all 和 dsimp 的配置选项
策略。
bv_decide 中的求解器模式
#11847 添加了一个新的
solverMode 字段到 bv_decide 的配置,允许用户
为不同类型的工作负载配置 SAT 求解器。解算器模式
可以设置为:
-
proof,改进证明搜索; -
counterexample,改进反例搜索; -
default,其中没有额外的 SAT 求解器标志。
并行策略组合器
#11949 添加了一个新的
first_par策略并行运行多个策略组合器
并返回第一个成功的结果(取消其他结果)。
try?策略的 atomicSuggestions 步骤现在使用 first_par
并行尝试三种研磨变体:
-
grind? +suggestions̵ 使用库建议引擎 -
grind? +locals̵ 从当前文件展开本地定义 -
grind? +locals +suggestions̵ 结合了两者
依赖管理工具
外部检查器
#11887 使
外部检查器lean4checker可用作现有的leanchecker
elan 已知的二进制文件,允许开箱即用地访问
它。
图书馆亮点
范围
-
#11438 重命名 namespace
Std.RangetoStd.Legacy.Range. Instead of usingStd.Range和[a:b]表示法,新范围类型Std.Rco和 应使用其相应的a...b符号。
迭代器
位向量
异步框架
-
#11499 添加
Context类型,用于通过上下文传播取消。它有效 通过存储主上下文的分叉树,提供了一种方法 控制取消。
语言
-
#11553 使匹配方程生成器中使用的
simpH生成一个 证明术语。这是为了在 #11512 中进行更大的重构做准备。 -
#11666 确保当使用稀疏情况编译匹配器时, 该方程生成还使用稀疏情况进行分割。 这修复了#11665。
-
#11669 确保有关
ctorIdx的证明传递到grinddebug.grind检查,尽管减少了semireducible定义。 -
#11670 修复了
grind对Nat.ctorIdx的支持。 Nat 构造函数 在grind中作为偏移量或文字出现,而不是作为标记的节点.constr,所以也处理这个情况。 -
#11673 修复了公共范围内的
by可能会创建 类型与预期不匹配的证明的辅助定理 输入公共范围。 -
#11698 使
mvcgen在简化判别式后提前返回, 避免对格式错误的match进行重写。 -
#11714 当用户尝试命名 示例,并调整尝试定义多个的错误消息 立即不透明的名称。
-
#11718 添加了针对问题 #11655 的测试,该问题似乎已由 #11695 修复
-
#11721 提高了生成函数的性能 同余引理,由
simp使用 和一些其他组件。 -
#11726 从 Mathlib 上游依赖管理命令:
-
#import_path Foo打印传递导入链,带来Foo纳入范围 -
如果声明
Foo存在,则assert_not_exists Foo错误(对于 依赖管理) -
如果
Module是可传递的,assert_not_imported Module会发出警告 进口的 -
#check_assertions验证所有未决断言最终是否 满意
-
-
#11731 使 expreqfn 中的缓存使用 mimalloc 进行小型 性能全面获胜。
-
#11748 修复了某些策略不允许访问的边缘情况 模块系统下私有证明内的私有声明
-
#11756 修复了尝试展开
grind时失败的问题 由模式匹配定义,由import all导入(或从 非module)。 -
#11780 确保统一提示的漂亮打印插入 |- 后有空格。 ⊢。
-
#11871 会使
mvcgen with tac在tac于某个 VC 上失败时失败, 正如如果tac在其中之一上失败,induction ... with tac也会失败 目标。可以改写为mvcgen with try tac来恢复旧行为。 -
#11875 添加目录
Meta/DiscrTree并重新组织代码 到不同的文件中。动机:我们将为 检索新结构简化器的简化定理。 -
#11882 向
TagDeclarationExtension.tag添加一个防护以检查是否 声明名称是匿名的,如果是的话,请提前返回。这可以防止 当meta或noncomputable等修饰符被 与语法错误结合使用。 -
#11896 修复了当定理具有文档字符串时发生的恐慌
where子句中的辅助定义。 -
#11908 向消息测试命令添加了两个功能: 如果嵌套命令生成,则新的
#guard_panic命令会成功 一条恐慌消息(对于测试预期会出现恐慌的命令很有用),以及#guard_msgs的substring := true选项,用于检查文档字符串是否 显示为输出的子字符串,而不需要精确匹配。 -
#11919 改进了
initialize(或opaque)失败时的错误消息 查找Inhabited或Nonempty实例。 -
#11926 向现有辅助函数用户添加
unsafe修饰符unsafeEIO,并且也将该函数保留为私有。 -
#11933 添加了用于在期间管理消息日志的实用程序函数 策略 评估,并重构现有代码以使用它们。
-
#11940 修复了尝试声明模块时的模块系统可见性问题 共同块内的公共感应。
-
#11991 修复了
declare_syntax_cat声明本地类别导致 import errors when used inmodulewithoutpublic section. -
#12026 修复了
@[irreducible]等属性不会出现的问题 除非与@[exposed]组合,否则在模块系统下允许, 但如果没有后者,前者可能会有所帮助,以确保下游 非module也会受到影响。 -
#12045 禁用跨包边界的
import all检查。现在 任何模块都可以import all任何其他模块。 -
#12048 修复了
mvcgen丢失 VC 导致未分配的错误 元变量。通过将所有发出的 VC 设为合成不透明来修复此问题。 -
#12122 在
where子句中添加了对 Verso 文档字符串的支持。 -
#12148 恢复 #12000,这引入了回归,其中
simp错误地拒绝对 perm 引理的有效重写。
图书馆
-
#11257 添加了
BitVec.cpop的定义,该定义依赖于更多 概括BitVec.cpopNatRec,并围绕它建立一些理论。名称cpop与 RISCV ISA 命名法。 -
#11438 将命名空间
Std.Range重命名为Std.Legacy.Range。相反 使用Std.Range和[a:b]表示法,新范围类型Std.Rco并应使用其相应的a...b符号。还有 其他具有开放/封闭/无限边界形状的范围Std.Data.Range.Polymorphic和新的范围符号也适用于Int、Int8、UInt8、Fin等 -
#11446 将迭代器 API 的许多常量从
Std.Iterators移动到Std命名空间,以便使它们更方便使用。这些 常量包括但不限于Iter、IterM和IteratorLoop。这是一个突破性的改变。如果出现问题,请尝试 添加open Std以使这些常量再次可用。如果 无法找到Std.Iterators命名空间中的某些常量,它们 现在可以直接在Std中找到。 -
#11499 添加
Context类型以通过上下文取消 传播。它的工作原理是存储主上下文的分叉树, 提供一种控制取消的方法。 -
#11532 添加新操作
MonadAttach.attach,该操作附加一个 证明后置条件保持一元函数的返回值 操作。标准库中的大多数非 CPS monad 都支持此功能 以一种不平凡的方式进行操作。 PR 还更改了filterMapM,mapM和flatMapM组合器,以便它们将后置条件附加到 用户提供的一元函数传递给他们。这使得 可以证明其中一些未终止的终止 以前可能。此外,PR 添加了许多缺失的引理 本 PR 过程中需要filterMap(M)和map(M)。 -
#11693 可以验证迭代器上的循环。它提供 关于
for在纯迭代器上循环的 MPL 规范引理。它还提供 重写mapM、filterMapM或filterM循环的规范引理 迭代器组合器进入其基本迭代器的循环中。 -
#11705 提供了许多关于
Int范围的引理,类似于那些 大约Nat范围。添加了一些必要的基本Int引理。公关 还删除了Rcc.toList_eq_toList_rco上的simp注释,Nat.toList_rcc_eq_toList_rco和配偶。 -
#11706 删除了
IteratorCollect类型类并由此简化 迭代器 API。其有限的优势并不能证明其复杂性是合理的 成本。 -
#11710 扩展了范围的 get-elem策略,以便它支持 子数组。例子:
example {a : Array Nat} (h : a.size = 28) : Id Unit := do let mut x := 0 for h : i in *...(3 : Nat) do x := a[1...4][i] -
#11716 为
for循环的所有组合添加更多 MPL 规范引理,fold(M)和filter(M)/filterMap(M)/map(M)迭代器组合器。 这些组合器上的这些类型的循环(例如it.mapM)首先 转换为对其基本迭代器 (it) 的循环,并且如果基本迭代器 迭代器的类型为Iter _或IterM Id _,则另一个规范引理 存在用于使用不变量证明霍尔三元组,并且 底层列表 (it.toList)。 PR 还修复了 MPL 始终存在的错误 如果Std.Tactic.Do.Syntax为,则将默认优先级分配给规范引理 未导入并且优先考虑低优先级引理的错误 高优先级的。 -
#11724 添加更多
event_loop_lock来修复竞争条件。 -
#11728 引入了一些有关
BitVec.extractLsb'的附加引理 和BitVec.extractLsb。 -
#11760 允许
grind使用List.eq_nil_of_length_eq_zero(并且Array.eq_empty_of_size_eq_zero),但仅当它已经被证明时 长度为零。 -
#11761 添加了一些
grind_patternguard条件 昂贵的定理。 -
#11762 将研磨图案从
Sublist.eq_of_length移动到 稍微更通用的Sublist.eq_of_length_le,并增加了研磨 模式保护,因此只有当我们有假设的证明时它才会激活。 -
#11767 引入了两个位向量归纳原理,基于 concat 和 cons 操作。我们展示了这一原则如何有用 通过重构两个人口计数引理来推理位向量 (
cpopNatRec_zero_le和toNat_cpop_append)并引入新的 引理 (toNat_cpop_not)。 为了使用感应原理,我们还移动cpopNatRec_cons_of_le和cpopNatRec_cons_of_lt位于 popcount 部分的前面(它们是 构建模块使我们能够利用新的归纳 原则)。 -
#11772 修复了优化且不安全的实现中的错误
Array.foldlM。 -
#11774 修复了
foldlM和foldlM的行为之间的不匹配问题foldlMUnsafe在三个数组中 类型。仅当手动指定stop时才会暴露这种不匹配 值大于尺寸 阵列的且只能通过native_decide进行利用。 -
#11779 修复了最初的 #11772 PR 中的一个疏忽。
-
#11784 只是添加一个可选的起始位置参数
PersistentArray.forM -
#11789 生成
FinitenessRelation结构,这在以下情况下很有帮助: 证明迭代器的有限性,部分公开API。此前, 它被标记为内部和实验性的。 -
#11794 实现用于实现
SymM的函数getMaxFVar?基元。 -
#11834 将
num?参数添加到mkPatternFromTheorem来控制如何 创建模式时,许多前导量词都会被删除。这个 允许匹配定理,其中只有一些量词应该是 转换为模式变量。 -
#11848 修复了
Name.beq报告的错误 加油站codemanager@gmail.com -
#11852 更改迭代器组合器
takeWhileM的定义 和dropWhileM,以便他们使用MonadAttach。这只是相关的 在极少数情况下,但有时可以证明这样的组合子 当有限性取决于一元的属性时是有限的 谓词。 -
#11901 为
Nat和Int添加gcd_left_comm引理:-
Nat.gcd_left_comm:gcd m (gcd n k) = gcd n (gcd m k) -
Int.gcd_left_comm:gcd a (gcd b c) = gcd b (gcd a c)
-
-
#11905 为
Nat.isPowerOfTwo提供基于 公式为(n ≠ 0) ∧ (n &&& (n - 1)) = 0。 -
#11907 实现
PersistentHashMap.findKeyD和PersistentHashSet.findD。动机是避免两次记忆 当集合包含时的分配(Prod.mk和Option.some) 关键。 -
#11945 更改
Decidable (xs = #[])的运行时实现 和Decidable (#[] = xs)实例以使用Array.isEmpty。此前,decide (xs = #[])首先将xs转换为列表,然后 将其与List.nil进行比较。 -
#11979 添加
suggest_for注释,使得Int*.toNatClamp为 建议用于Int*.toNat。 -
#11989 从中删除剩余的
examplesrc/Std/Tactic/BVDecide/Bitblast/BVExpr/Circuit/Lemmas/Operations/Clz.lean。 -
#11993 将
grind注释添加到有关Subarray的引理中,并且ListSlice。 -
#12058 在
Fin和Char的范围内实现迭代。 -
#12139 将
«term_⁻¹»添加到recommended_spelling中,作为inv, 匹配 包括该函数的所有其他运算符使用的模式 以及拼写列表中的语法。
策略
-
#11664 在
grind linarith中添加了对Nat.cast的支持。现在它使用Grind.OrderedRing.natCast_nonneg。例子: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
-
#11677 在
grind linarith中添加了对相等传播的基本支持 适用于IntModule外壳。这仅涵盖基例。请参阅注释 代码。 我们注意到此功能与CommRing无关,因为grind ring已经对平等传播有了更好的支持。 -
#11678 修复了用于实现的
registerNonlinearOccsAt中的错误grind lia。此问题最初报告于: https://leanprover.zulipchat.com/#narrow/channel/113489-new-members/topic/Weirdness.20with.20cutsat/near/562099515 -
#11691 修复了
grind以支持声明中的点表示法 引理列表。 -
#11700 添加指向
grind文档字符串的链接。该链接将用户引导至 参考手册中描述grind的部分。 -
#11712 避免调用 TC 合成和其他推理机制
bv_decide的 simprocs。这可以显着加速 给这些模拟过程带来压力的问题。 -
#11717 提高了
bv_decide重写器在大型数据上的性能 问题。 -
#11736 修复了
exact?不建议私有的问题 当前模块中定义的声明。 -
#11739 变成了更常用的
bv_decide定理,需要 统一为快速 simprocs 使用句法相等。这推动了整体性能 sage/app7 至 <= 1min10s 每个问题。 -
#11749 修复了
grind中使用的函数selectNextSplit?中的错误。 它错误地计算了每个候选人的代数。 -
#11758 改进了对非标准
Int/Nat实例的支持grind和simp +arith。 -
#11765 实现用户定义的
grind属性。它们对于 想要使用grind基础设施实施策略的用户 (例如《埃涅阿斯记》中的progress*)。新的grind属性使用以下方式声明 命令register_grind_attr my_grind
该命令类似于
register_simp_attr。回想一下,类似于register_simp_attr,新属性不能在同一文件中使用 它被宣布了。opaque f : Nat → Nat opaque g : Nat → Nat @[my_grind] theorem fax : f (f x) = f x := sorry example theorem fax2 : f (f (f x)) = f x := by fail_if_success grind grind [my_grind]
-
#11769 使用对用户定义的
grind属性的新支持来 实现默认的[grind]属性。 -
#11770 实现对用户定义属性的支持
grind_pattern。声明grind属性后register_grind_attr my_grind,可以写:grind_pattern [my_grind] fg => g (f x)
-
#11776 添加属性
[grind norm]和[grind unfold]控制grind标准化器/预处理器。 -
#11785 禁用反射项中使用的封闭项提取
bv_decide。这些条款做 封闭式提取根本不会带来任何好处,但实际上可能会导致 数千个新的封闭学期 声明反过来又会减慢编译器的速度。 -
#11787 添加了对增量处理本地声明的支持
grind。而不是在目标过程中一次处理所有假设 初始化,grind现在跟踪哪些本地声明已被 通过Goal.nextDeclIdx进行处理,并提供 API 来处理新的 逐步提出假设。 新的SymMmonad 将使用此功能来实现高效的符号 模拟。 -
#11788 引入了
SymM,一个用于实现符号的新 monad Lean 中的模拟器(例如验证条件生成器)。单子 解决了在顶部构建的符号模拟器中发现的性能问题 面向用户的策略(如apply和intros)。 -
#11792 添加
isDebugEnabled用于检查grind.debug是否设置 当grind初始化时,为true。 -
#11793 添加了用于创建最大共享术语的功能 最大限度地共享条款。它比创建表达式更有效 然后调用
shareCommon。我们将使用这些函数 实现符号模拟原语。 -
#11797 通过分离持久性来简化
AlphaShareCommon.State和状态的瞬态部分。 -
#11800 添加函数
Sym.replaceS,类似于replace_fn在内核中可用,但假设输入最大 共享并确保输出也得到最大程度的共享。公关还 概括了AlphaShareBuilderAPI。 -
#11802 添加了函数
Sym.instantiateS及其变体,它们是 与Expr.instantiate类似,但假设输入最大程度共享 并确保输出也得到最大程度的共享。 -
#11803 为
SymM实现intro(及其变体)。这些版本 不要使用归约或推断类型,并确保表达式是 最大限度地共享。 -
#11806 重构了
grind中使用的Goal类型。新的 表示允许具有不同元变量的多个目标 共享相同的GoalState。这对于自动化很有用,例如 符号模拟器,应用定理创建多个目标 继承相同的 E-graph、同余闭包和求解器状态,并且 其他积累的事实。 -
#11810 添加了新的透明模式
.none,其中没有任何定义 展开。 -
#11813 推出快速模式匹配和统一模块 符号模拟框架(
Sym)。设计优先考虑 使用两阶段方法来提高性能:阶段 1(语法匹配)
-
模式使用 de Bruijn 索引作为表达式变量并重命名 Universe 变量的级别参数(
_uvar.0、_uvar.1,...) -
展开可简化定义后,匹配纯粹是结构性的 预处理期间
-
宇宙层级 将
max和imax视为未解释的函数(无 交流推理) -
活页夹和术语元变量被推迟到第 2 阶段
第 2 阶段(待定限制)
-
处理绑定器(米勒模式)和元变量统一
-
将剩余的 de Bruijn 变量转换为元变量
-
必要时回退到
isDefEq
-
-
#11814 实现
instantiateRevBetaS,类似于instantiateRevS但 beta 减少了其功能的嵌套应用程序 替换后变为 lambda。 -
#11815 通过跳过证明和实例来优化模式匹配 第一阶段(语法匹配)期间的参数。
-
#11819 为结构添加了一些基本基础设施(并且更便宜)
isDefEq模式匹配谓词和Sym中的统一。 -
#11820 添加了优化的
abstractFVars和abstractFVarsRange在模式期间将自由变量转换为 de Bruijn 索引 匹配/统一。 -
#11824 实现
isDefEqS,一种轻量级结构定义 符号模拟框架的平等性。与完整的不同isDefEq,它避免了昂贵的操作,同时仍然支持 Miller 模式统一。 -
#11825 完成新的模式匹配和统一程序 使用两阶段方法的符号模拟框架。
-
#11833 修复了一些拼写错误,添加了缺失的文档字符串,并添加了(简单的) 缺少优化。
-
#11837 添加
BackwardRule以实现高效的目标转换SymM中的向后链接。 -
#11847 在
bv_decide的配置中添加了新的solverMode字段, 允许用户配置 适用于不同类型工作负载的 SAT 求解器。 -
#11849 修复了该模式中缺失的 zetaDelta 支持 新 Sym 框架中的匹配/统一过程。
-
#11850 修复了 Sym 的新模式匹配过程中的错误 框架。在期间它没有正确处理分配的元变量 模式匹配。
-
#11851 修复了
Sym/Intro.lean对have声明的支持。 -
#11856 添加了所用结构简化器的基础设施 通过符号模拟(
Sym)框架。 -
#11857 为表达式添加
shareCommon的增量变体 由已经共享的子项构建。当表达式e由 Lean API(例如inferType、mkApp4)生成 不保留最大共享,但 API 的输入已经 最大限度地共享。与shareCommon不同,该函数不使用 本地Std.HashMap ExprPtr Expr来跟踪访问过的节点。这更 当新(非共享)节点数量较少时,效率较高,即 包装构建一些构造函数节点的 API 调用时的常见情况 围绕共享输入。 -
#11858 更改了
bv_decide对于哪种结构的启发式 拆分也允许 在字段具有独立类型宽度的结构上进行拆分。 例如:structure Byte (w : Nat) where /-- A two's complement integer value of width `w`. -/ val : BitVec w /-- A per-bit poison mask of width `w`. -/ poison : BitVec w
这是为了允许处理诸如
(x : Byte 8)之类的情况,其中 宽度变为混凝土后 分割完成。 -
#11860 添加了对函数应用程序的
CongrInfo分析 符号模拟器框架。CongrInfo确定如何构建 有效重写子项的同余证明,分类 函数为:-
none:没有参数可以重写(例如,证明) -
fixedPrefix:隐式/实例参数形成的常见情况 固定前缀和显式参数可以重写(例如,HAdd.hAdd,Eq) -
interlaced:可重写和不可重写参数交替(例如,HEq) -
congrTheorem:使用自动生成的函数同余定理 具有依赖证明参数(例如,Array.eraseIdx)
-
-
#11866 实现
Sym框架的核心简化循环, 通过有效的基于同余的参数重写。 -
#11868 实现
Sym.Simp.Theorem.rewrite?来重写术语Sym中的方程定理。 -
#11869 添加配置标志
Meta.Context.cacheInferType。你可以 使用它可以禁用MetaM处的inferType缓存。我们使用这个标志来 实现SymM因为它有自己的基于指针相等的缓存。 -
#11878 记录符号模拟框架所做的假设 关于结构匹配和定义等价。
-
#11880 添加一个用于设置透明度的
with_unfolding_none策略 模式为.none,其中未展开任何定义。这补充了 现有的with_unfolding_all和策略提供策略级别 访问添加的TransparencyMode.nonehttps://github.com/leanprover/lean4/pull/11810. -
#11881 修复了
grind无法从f * r 证明f ≠ 0的问题 ≠ 0when usingLean.Grind.CommSemiring,但成功了Lean.Grind.Semiring。 -
#11884 为符号模拟添加判别树支持 框架。 新的
DiscrTree.lean模块将Pattern值转换为 歧视 树键,将证明/实例参数和模式变量视为 通配符 (Key.star)。动机:重写期间有效的模式检索。 -
#11886 添加
getMatch和getMatchWithExtra用于检索模式 来自 符号模拟框架中的判别树。 PR 还添加了使用DiscrTree在Sym.simp中实现索引。 -
#11888 重构了
Sym.simp,使其更加通用和可定制。 它还移动了代码 到其自己的子目录Meta/Sym/Simp。 -
#11889 改进了使用的判别树检索性能
Sym.simp。 -
#11890 确保
Sym.simp检查最大递归阈值 深度和最大步数。它还调用checkSystem。 此外,此 PR 还简化了主循环。分配的元变量 和zetaDelta减少现在通过安装pre/post来处理 方法。 -
#11892 优化了
simp中同余证明的构造。 它使用了Sym.simp中使用的一些想法。 -
#11898 添加了对简化
Sym.simp中 lambda 表达式的支持。 对于非常大的 lambda 来说,它比标准 simpl 更有效 具有许多活页夹的表达式。关键思想是生成一个自定义的 lambda 类型的函数外延定理 简化。 -
#11900 将
done标志添加到Simprocs 返回的结果中Sym.simp。 -
#11906 尝试最大程度地减少创建的表达式数量
AlphaShareCommon。 -
#11909 重新组织 monad 层次结构以进行符号计算 Lean。
-
#11911 最大限度地减少由
replaceS和instantiateRevBetaS。 -
#11914 分解出
simp中使用的have望远镜支架,以及 使用MonadSimp接口实现它。目标是 对Meta.simp和Sym.simp使用这个良好的基础设施。 -
#11918 从
exact?和rw?建议中过滤已弃用的引理。 -
#11920 实现了对简化
have望远镜的支持Sym.simp。 -
#11923 向函数
simpHaveTelescope添加了一个新选项,其中have望远镜被简化为两遍:-
在第一遍中,仅简化值和主体。
-
在第二遍中,未使用的声明被消除。
-
-
#11932 消除了超线性内核类型检查开销 简化 lambda 表达式。我改进了产生的证明项
mkFunext。Sym.simp简化 lambda 时使用此函数 表达式。 -
#11946 将
+locals配置选项添加到grind策略 自动将当前文件中的所有定义添加为电子匹配 定理。这提供了手动添加的便捷替代方法 为每个定义添加[local grind]属性。以grind? +locals的形式使用时,它也有助于发现哪些本地声明 添加[local grind]属性可能很有用。 -
#11947 向
simp、simp_all添加了+locals配置选项, 和dsimp策略自动添加来自 要展开的当前文件。 -
#11949 添加了一个新的
first_par策略组合器,可运行多个 策略并行并返回第一个成功的结果(取消 其他人)。 -
#11950 在
Sym.simp中实现simpForall和simpArrow。 -
#11962 修复了库建议以包含私有证明值 structure fields.
-
#11967 实施了一种新策略,用于简化
have望远镜Sym.simp实现线性内核类型检查时间,而不是 二次的。 -
#11974 通过以下方式优化
Sym.simp中的同余证明构造 回避inferType调用不太可能被缓存的表达式。 而不是 推断表达式的类型,例如@HAdd.hAdd Nat Nat Nat instAdd 5, 我们推断 函数前缀@HAdd.hAdd Nat Nat Nat instAdd的类型和 遍历 福尔望远镜。 -
#11976 在模式期间添加了对模式变量的缺失类型检查 匹配/统一以防止错误匹配。
-
#11985 实现对自动生成同余定理的支持
Sym.simp,可以简化具有复杂参数的函数 依赖项,例如证明参数和Decidable实例。 -
#11999 添加了对简化过度应用和
Sym.simp中未应用的功能应用条款,完成 所有三种同余策略的实现(固定前缀, 交错定理和同余定理)。 -
#12006 修复了
extract_lets策略的漂亮打印。 以前,漂亮的打印机会期望在extract_lets策略,当它后面跟着另一个策略时 同一行:例如,extract_lets; exact foo将更改为extract_lets ; exact foo。 -
#12012 实现了对过度应用术语重写的支持
Sym.simp。示例:使用id_eq重写id f a。 -
#12031 添加了
Sym.Simp.evalGround,这是一个简化过程 评估内置数字类型的基本术语。它是专为Sym.simp。 -
#12032 将
Discharger添加到Sym.simp,并确保缓存结果 是一致的。 -
#12033 向
Sym.simp添加了对条件重写规则的支持。 -
#12035 添加了
simpControl,一个处理控制流的 simproc 表达式如if-then-else。它简化了条件,同时 避免在不会被采用的分支上进行不必要的工作。 -
#12039 对
Sym.simp实现match表达式简化。 -
#12040 添加 simprocs 以简化
cond和依赖项if-then-else中的Sym.simp。 -
#12053 添加了对
SymM中偏移项的支持。这对于 处理自然模式匹配函数的方程定理Sym.simp中的编号。如果没有这个,它就无法处理简单的例子 例如pw (a + 2),其中pw模式与n+1匹配。 -
#12077 为
String和Char实现 simproc。它还确保 可简化的定义在SymM中展开 -
#12096 清理应用时生成的临时元变量 重写
Sym.simp中的规则。 -
#12099 确保
Sym.simpGoal不使用mkAppM。也增加了Sym.simp中默认的最大步数。 -
#12100 添加了
MetaM和SymM之间的比较,基准测试为 在 Lean@Google 黑客马拉松期间提出。 -
#12101 改进了
Sym.simpAPI。现在更容易重用 不同简化步骤之间的简化器缓存。我们使用 API 将基准提高到#12100。 -
#12134 添加了新基准
shallow_add_sub_cancel.lean演示使用浅嵌入到单子中的符号模拟do表示法,与深度嵌入方法相反add_sub_cancel.lean。 -
#12143 添加了用于构建符号模拟引擎的 API 验证 利用
grind的条件生成器。 API 包裹Sym操作到 与grind的Goal类型配合使用,实现轻量级符号执行 同时 携带grind状态用于放电步骤。 -
#12145 将预共享常用表达式从
GrindM移至SymM。 -
#12147 添加了新的 API,用于帮助用户编写有针对性的重写。
编译器
-
#11479 使专门化器也能够递归地专门化于某些 非平凡的高阶情况。
-
#11729 在 LCNF 转换期间内化 Quot.lift 的所有参数, 防止某些地区出现恐慌 使用商的重要程序。
-
#11874 通过合并锁定提高了
getLine的性能 基础FILE*的。 -
#11916 向运行时添加一个符号用于标记
Array非线性。这应该允许用户 在配置文件中更轻松地发现它们或使用调试器捕获它们。 -
#11983 修复了
floatLetIn传递,以防止移动变量 可能会破坏线性(拥有的变量通过 RC 1 传递)。这个 主要改善了解析器中的情况,以前有很多 就ParserState而言应该是线性的函数,但是 编译器使它们成为非线性的。有关这如何影响的示例 解析器:def optionalFn (p : ParserFn) : ParserFn := fun c s => let iniSz := s.stackSize let iniPos := s.pos let s := p c s let s := if s.hasError && s.pos == iniPos then s.restore iniSz iniPos else s s.mkNode nullKind iniSz
之前将
let iniSz := ...声明移至hasError分支。然而,这意味着在调用内部时 解析器(p c s),原始状态s需要 RC>1,因为它 稍后在hasError分支中使用,破坏了线性。这个修复 防止此类移动,在p c s调用之前保留iniSz。 -
#12003 将编译器管理的 SCC 拆分为(可能) 之后有多个 执行 lambda 提升。这有助于封闭术语提取器和 elimDeadBranches 传递为 当申报数量超过要求时,它们都会受到负面影响 位于一个 SCC 内。
-
#12008 确保 LCNF 简化器已经恒定折叠决策 程序(
Decidable操作)在基础阶段。 -
#12010 修复了封闭子项提取器中的超线性行为。
-
#12123 修复了可能偶尔触发 ASAN 进入 通过
IO.Process.spawn运行子进程时发生死锁 框架。
文档
-
#11737 将
ffi.md替换为指向相应部分的链接 手册,因此我们不必使两份文档保持最新。 -
#11912 为迭代器库的某些部分添加了缺失的文档字符串,其中 删除手册中的警告和空内容。
-
#12047 使策略文档中的自动第一个令牌检测更加有效 除了使其在模块和其他上下文中工作之外,更加健壮 其中内置策略不在环境中。它还添加了 能够覆盖策略的第一个令牌作为用户可见的名称。
-
#12072 启用策略补全和
let rec策略的文档, 在 #12047 之后需要进行 stage0 更新。 -
#12093 使 Verso 模块文档字符串 API 更像 Markdown 模块文档字符串API,使下游消费者能够相同地使用它们 方式。
服务器
-
#11536 更正了 JSON 架构
src/lake/schemas/lakefile-toml-schema.json允许表变体lakefile.toml中的require.git字段的 参考。 -
#11630 通过以下方式改进了自动完成和模糊匹配的性能 将 ASCII 快速路径引入其核心循环之一,并使 Char.toLower/toUpper 更高效。
-
#12000 修复了转到定义会跳转到错误的问题 存在异步定理时的位置。
-
#12004 允许“转到定义”查看可简化定义 当寻找类型类实例投影时。
-
#12046 修复了未知标识符代码操作的错误 NeoVim 中由于语言服务器未正确设置而损坏 它生成的所有代码操作项的
data?字段。 -
#12119 修复了
where声明下的调用层次结构 模块系统
Lake
-
#11683 修复了 Lake 和 Lean 查看方式不一致的问题
meta import的传递性。 Lake 现在按照 Lean 的预期工作,并且 包括meta import的所有传递导入的元段 在其传递轨迹中。 -
#11859 无需为数字选项编写
.ofNatlakefile.lean。请注意,lake translate-config错误地假设 这在早期的修订中已经是合法的。 -
#11921 添加
lake shake作为内置 Lake 命令,移动抖动 功能从script/Shake.lean转移到 Lake CLI。 -
#12034 更改
enableArtifactCache的默认值以使用 如果包是依赖项,则工作区的enableArtifactCache设置 并且LAKE_ARTIFACT_CACHE未设置。这意味着a的依赖关系 默认情况下,具有enableArtifactCache集的项目也将使用 Lake 的 本地工件缓存。 -
#12037 修复了两个 Lake 缓存问题:上传失败会导致 不产生错误并且在缓存的
--wfail检查中出现错误 命令。 -
#12076 将额外的调试信息添加到
lake build 的运行中 --no-buildvia a.nobuild跟踪文件。当构建由于以下原因失败时 需要重建,Lake 接下来发出新的预期跟踪,即.nobuild文件位于旧版本的.trace旁边。这些输入记录在 然后可以比较文件以调试导致不匹配的原因。 -
#12086 修复了
lake build --no-build会退出并显示代码的错误3如果用于获取 GitHub 或 Reservoir 版本的可选作业 包失败(即使没有其他需要重建的东西)。 -
#12105 修复了产生以下结果的目标的
lake query输出:Array或List具有自定义QueryText或QueryJson的值 instance (e.g.,depsandtransDeps). -
#12112 恢复了通过以下方式在依赖项中指定模块的能力 基本
+mod目标键。
其他
菲菲
-
#12098 删除了针对Lean编译库的要求 标头必须使用
-fwrapv。