Coq的数学证明语言:在条件下重写

时间:2016-11-21 14:53:29

标签: coq

我正在尝试学习Coq的数学证明语言,但是在尝试证明我贬低为以下愚蠢的陈述时遇到了一些麻烦:

Lemma foo: forall b: bool, b = true -> (if b then 0 else 1) = 0.

这是我的尝试:

proof.
  let b: bool.
  let H: (b = true).

此时证明状态为:

  b : bool
  H : b = true
  ============================
  thesis := 
   (if b then 0 else 1) = 0

现在我想将if条件b重写为true,以便能够证明论文。然而,这两个小步骤"的

  have ((if b then 0 else 1) = (if true then 0 else 1)) by H.

和更大的步骤"的

  have ((if b then 0 else 1) = 0) by H.

Warning: Insufficient justification.失败我不认为在这种情况下重写有任何问题,因为正常的rewrite -> H策略会做同样的事情。

通过将if包装在函数中,我也可以毫无问题地使用它:

Definition ite (cond: bool) (a b: nat) := if cond then a else b.
Lemma bar: forall b: bool, b = true -> (ite b 0 1) = 0.
proof.
  let b: bool. let H: (b = true).
  have (ite b 0 1 = ite true 0 1) by H. thus ~= 0.
end proof.

当然,这不是很好。我做错了吗?有没有办法拯救我原来的证据?这只是数学证明语言实施的一个缺点吗?

我注意到手册的第11.3.3节中有一个可能相关的例子(https://coq.inria.fr/doc/Reference-Manual013.html):

  a := false : bool
  b := true : bool
  H : False
  ============================
  thesis :=
  if b then True else False

Coq <  reconsider thesis as True.

但我不知道如何将b := true部分纳入上下文。

2 个答案:

答案 0 :(得分:3)

一种可能的解决方案是在Realtime Database上使用per cases(请参阅sect. 11.3.12):

b

我还尝试重新创建参考手册示例的证明状态,您可以使用Lemma foo: forall b: bool, b = true -> (if b then 0 else 1) = 0. proof. let b : bool. per cases on b. suppose it is true. thus thesis. suppose it is false. thus thesis. end cases. end proof. Qed.

define

答案 1 :(得分:-1)

关键字Proof似乎进入了声明性的证明模式。相反,关键字Lemma foo: forall b: bool, b = true -> (if b then 0 else 1) = 0. Proof. intros b H. rewrite H. reflexivity. Qed. 进入必要的证明模式。在第二种情况下,我们可以很容易地证明如下。

{{1}}

在第一种情况下,我没有答案。我尝试了许多类似于你的方法,但一次又一次地发现了同样的问题。或许更熟悉声明性证明的人可以给出完整的答案。如果您找到解决方案,请告诉我们!