你的任务是证明自定义的列表反转函数与内置的List.reverse相等。
由于本练习的性质,我们不依赖传统的运行时测试,而是通过定理check来检查证明。
如果这个定理能通过类型检查,你就可以认为测试通过了。
如果你在本地或 Lean 的在线演练场中工作,就能通过 Lean InfoView 立即得到反馈,了解某个定理是成功还是失败,以及失败的原因。 它是一个非常宝贵的工具,能显示你的证明中用到的所有局部值,以及你当前的目标。
sorry策略会让任何证明看起来都是正确的。
因此,在实际写出任何证明之前,check定理可能看起来就自动通过了类型检查。
一旦你从证明中移除sorry,Lean InfoView 就会显示正确的反馈。
定理证明是 Lean 不可分割的一部分。 它让程序员能够证明自己程序的属性,对程序的行为进行推理,并在类型层面编码约束和规范。
这一章很好地介绍了 Lean 中的定理证明。 如果想更深入地学习,Lean 官网把这本书列为官方资源。
Lean 提供了许多策略,可以自动完成证明,或者证明的一部分。 你也许想查阅一下语言参考。
我们可以对证明两个定义相等的定理使用编译器属性csimp。
这个属性指示编译器用第二个定义代替第一个:
@[csimp]
theorem custom_reverse_eq_spec_reverse : @Extra.custom_reverse = @List.reverse := by
... -- proof here
-- now any occurrence of `Extra.custom_reverse` may now compile to `List.reverse`.
在某个实现更高效但不够清晰的情况下,它特别有用。
我们可以写一个简单的规范,让编译后的代码改用更高效的实现。
许多List和Array函数都使用这种模式。