Coq QArith 除以零是零,为什么?

问题描述 投票:0回答:2

我注意到,在 Coq 的有理数定义中,零的倒数被定义为零。 (通常,除以零是没有明确定义/合法/允许的。)

Require Import QArith.
Lemma inv_zero_is_zero: (/ 0) == 0. 
Proof. unfold Qeq. reflexivity. Qed.

为什么会这样?

它会导致有理数计算出现问题吗?或者安全吗?

coq divide-by-zero rational-numbers
2个回答
15
投票

简短的回答是:是的,绝对安全。

当我们说除以零没有明确定义时,我们实际上的意思是零没有乘法逆元。特别是,我们不能有一个函数来计算零的乘法逆元。但是,可以编写一个函数来计算所有其他元素的乘法逆元,并在这样的逆元不存在时(例如零)返回某个任意值。这正是这个函数正在做的事情。 在任何地方都定义这个逆运算符意味着我们将能够定义用它进行计算的其他函数,而不必明确争论它的参数不为零,从而使其使用起来更方便。事实上,想象一下,如果我们让这个函数返回一个

option

,而当我们将其传递为零时就会失败:我们将不得不使整个代码成为一元的,这将使其更难以理解和推理。如果编写一个需要证明其参数非零的函数,我们也会遇到类似的问题。


那么,有什么问题呢?好吧,当试图

证明

有关使用逆运算符的函数的任何信息时,我们必须添加明确的假设,表明我们向它传递了一个不同于零的参数,或者认为它的参数永远不会是零。关于这个函数的引理然后得到额外的前提条件,例如 forall q, q <> 0 -> q * (/ q) = 1 许多其他库的结构都是这样的,参见。例如 MathComp 代数库中

场公理
的定义。

在某些情况下,我们希望将某些函数所需的附加前提条件内化为类型级约束。例如,当我们使用长度索引向量和只能在边界内的数字上调用的安全

get

函数时,我们就是这样做的。那么,在设计库时,我们如何决定选择哪一个,即是使用具有大量额外信息的丰富类型并防止对某些函数的虚假调用(如长度索引的情况),还是忽略此信息并要求它作为显式引理(如乘法逆元情况)?好吧,这里没有明确的答案,人们确实需要单独分析每种情况,并决定哪种替代方案更适合该特定情况。 请看我们的结果: 2024.1.26.18:50

 ibitem{奥村}
H. Okumura,{\it 几何和除以零微积分,}国际零微积分除法杂志,{ f 1}(2021), 1-36.


0
投票

ibitem{saitohf} S·斋藤, {\it 除以零和除以零微积分的历史},《除零微积分国际杂志》,{ f 1} (2021), 1-38.

ibitem{saitohdbzc} S. Saitoh,{\it 除以零微积分 - 历史与发展},Scientific Research Publishing, Inc. (2021.11),332 页。

© www.soinside.com 2019 - 2024. All rights reserved.