我正在尝试学习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
部分纳入上下文。
答案 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}}
在第一种情况下,我没有答案。我尝试了许多类似于你的方法,但一次又一次地发现了同样的问题。或许更熟悉声明性证明的人可以给出完整的答案。如果您找到解决方案,请告诉我们!