证明中的原始操作
Primitive operations in proofs
为了学习依赖类型,我正在用 Idris 重写我的旧 Haskell 游戏。目前游戏“引擎”使用内置的整数类型,例如 Word8
。我想证明一些涉及这些数字的数值属性的引理(例如,双重否定是同一性)。但是,无法说明原始算术运算的行为。什么会更好,只使用 believe_me
或其他 handwaving(至少对于最基本的属性),或者使用 Nat
、Fin
和其他“高级”重写我的代码数值类型?
我认为目前最好尽可能使用 Nat
。 Idris 开发人员最终计划实施一种通用机制,用于在编译中用快速原始类型替换证明友好类型,但目前只发生在 Nat
上。如果你真的想要,你可以 believe_me
通过,但你最终会得到在证明中不太容易使用的函数。请注意,如果您决定使用 believe_me
,那么您还应该考虑 really_believe_me
,这显然会使类型检查器更可信。
我建议对您需要的任何原始属性使用 postulate
,注意只使用对所讨论的数字类型实际为真的东西,当然(这基本上只是意味着要小心关于溢出)。所以你可以这样说:
postulate add_commutes : (x, y : Int) -> x + y = y + x
believe_me
最好避免使用,除非您需要证明的某些计算行为。但是,老实说,在对原语进行推理时,我们仍在努力解决这些问题...
为了学习依赖类型,我正在用 Idris 重写我的旧 Haskell 游戏。目前游戏“引擎”使用内置的整数类型,例如 Word8
。我想证明一些涉及这些数字的数值属性的引理(例如,双重否定是同一性)。但是,无法说明原始算术运算的行为。什么会更好,只使用 believe_me
或其他 handwaving(至少对于最基本的属性),或者使用 Nat
、Fin
和其他“高级”重写我的代码数值类型?
我认为目前最好尽可能使用 Nat
。 Idris 开发人员最终计划实施一种通用机制,用于在编译中用快速原始类型替换证明友好类型,但目前只发生在 Nat
上。如果你真的想要,你可以 believe_me
通过,但你最终会得到在证明中不太容易使用的函数。请注意,如果您决定使用 believe_me
,那么您还应该考虑 really_believe_me
,这显然会使类型检查器更可信。
我建议对您需要的任何原始属性使用 postulate
,注意只使用对所讨论的数字类型实际为真的东西,当然(这基本上只是意味着要小心关于溢出)。所以你可以这样说:
postulate add_commutes : (x, y : Int) -> x + y = y + x
believe_me
最好避免使用,除非您需要证明的某些计算行为。但是,老实说,在对原语进行推理时,我们仍在努力解决这些问题...