我在第11章中关于数学/声明性证明语言的Coq 8.5p1参考手册中关注(不完整)示例。在下面的示例中,对于迭代的等式(~=
和=~
),我收到了警告Insufficient Justification
,用于将4
重写为2+2
,并最终收到错误消息:
没有更多的子目标,但有非实例化的存在主义 变量:
?目标:[x:R H:x = 2 _eq0:4 = x * x | - 2 + 2 = 4]
您可以使用Grab Existential Variables。
示例:
Goal forall x, x = 2 -> x + x = x * x.
Proof.
proof. Show.
let x:R.
assume H: (x = 2). Show.
have ( 4 = 4). Show.
~= (2*2). Show.
~= (x*x) by H. Show.
=~ (2+2). Show. (*Problem Here: Insufficient Justification*)
=~ H':(x + x) by H.
thus thesis by H'.
end proof.
Fail Qed.
我不熟悉Coq中的数学证明语言,也无法理解为什么会这样。有人可以帮助解释如何解决错误吗?
- EDIT-- @Vinz
我在示例之前有这些随机导入:
Require Import Reals.
Require Import Fourier.
答案 0 :(得分:2)
您的证明适用于nat
或Z
,但如果R
则失败。
来自Coq Reference Manual(v8.5):
声明性证明语言的目的是采用相反的方法,即用户总是给出中间状态,但系统的转换尽可能自动化。
4 = 2 + 2
看起来自动化失败了。我不知道什么样的自动化使用声明性校对引擎,但是,例如,auto
策略无法证明几乎所有简单的等式,如下所示:
Open Scope R_scope.
Goal 2 + 2 = 4. auto. Fail Qed.
正如@ejgallego points out我们只能偶然使用2 * 2 = 4
证明auto
:
Open Scope R_scope.
Goal 2 * 2 = 4. auto. Qed.
(* `reflexivity.` would do here *)
然而,field
战术就像一个魅力。因此,一种方法是使用field
策略建议声明性证明引擎:
Require Import Coq.Reals.Reals.
Open Scope R_scope.
Unset Printing Notations. (* to better understand what we prove *)
Goal forall x, x = 2 -> x + x = x * x.
Proof.
proof.
let x : R.
assume H: (x = 2).
have (4 = 4).
~= (x*x) by H.
=~ (2+2) using field. (* we're using the `field` tactic here *)
=~ H':(x + x) by H.
thus thesis by H'.
end proof.
Qed.
答案 1 :(得分:2)
这里的问题是Coq的标准实数是以公理的方式定义的。
因此,+ : R -> R -> R
和*
等等是抽象操作,永远不会计算。这是什么意思?这意味着Coq没有关于如何处理+
的规则,例如与nat案例相反,Coq知道:
0 + n ~> 0
S n + m ~> S (n + m)
因此,操纵+
实数的唯一方法是手动应用表征运算符的相应公理,参见:
https://coq.inria.fr/library/Coq.Reals.Rdefinitions.html https://coq.inria.fr/library/Coq.Reals.Raxioms.html
这是field, omega
等等。即使0 + 1 = 1
也不可能通过计算。
Anton的例子2 + 2 = 4
偶然发挥作用。实际上,Coq必须使用真实公理将数字4解析为合适的表示,并且事实证明4被解析为Rmult (Rplus R1 R1) (Rplus R1 R1)
(更高效),这与前一个的左侧相同。平等。