证明中的原始操作

Primitive operations in proofs

为了学习依赖类型,我正在用 Idris 重写我的旧 Haskell 游戏。目前游戏“引擎”使用内置的整数类型,例如 Word8。我想证明一些涉及这些数字的数值属性的引理(例如,双重否定是同一性)。但是,无法说明原始算术运算的行为。什么会更好,只使用 believe_me 或其他 handwaving(至少对于最基本的属性),或者使用 NatFin 和其他“高级”重写我的代码数值类型?

我认为目前最好尽可能使用 Nat。 Idris 开发人员最终计划实施一种通用机制,用于在编译中用快速原始类型替换证明友好类型,但目前只发生在 Nat 上。如果你真的想要,你可以 believe_me 通过,但你最终会得到在证明中不太容易使用的函数。请注意,如果您决定使用 believe_me,那么您还应该考虑 really_believe_me,这显然会使类型检查器更可信。

我建议对您需要的任何原始属性使用 postulate,注意只使用对所讨论的数字类型实际为真的东西,当然(这基本上只是意味着要小心关于溢出)。所以你可以这样说:

postulate add_commutes : (x, y : Int) -> x + y = y + x

believe_me 最好避免使用,除非您需要证明的某些计算行为。但是,老实说,在对原语进行推理时,我们仍在努力解决这些问题...