“没有更多的子目标,但Coq证明语言中存在非实例化的存在变量”?

时间:2016-06-21 05:39:06

标签: coq

我在第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.

2 个答案:

答案 0 :(得分:2)

您的证明适用于natZ,但如果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)(更高效),这与前一个的左侧相同。平等。