What does `true = false` mean in Coq?
[我不确定这是否适合堆栈溢出,但是这里还有许多其他Coq问题,也许有人可以提供帮助。]
我正在通过http://www.cis.upenn.edu/~bcpierce/sf/Basics.html#lab28(下面介绍Case的地方)进行以下操作。请注意,我是一个完全的初学者,并且正在家里工作-我不是学生。
1 2 3 4 5 6 7 8 9 10 | Theorem andb_true_elim1 : forall b c : bool, andb b c = true -> b = true. Proof. intros b c H. destruct b. Case"b = true". reflexivity. Case"b = false". rewrite <- H. reflexivity. Qed. |
我正在查看重写的作用:
1 2 3 4 5 | Case :="b = false" : String.string c : bool H : andb false c = true ============================ false = true |
然后应用
1 2 3 4 5 | Case :="b = false" : String.string c : bool H : andb false c = true ============================ false = andb false c |
很明显,证明将如何成功。
我可以看到如何以机械方式操纵符号来获得证明。没关系。但是我对"含义"感到不安。特别是,如何在证明中间包含
似乎我在提出一些有矛盾的论点,但我不确定是什么。我觉得我一直在盲目遵循规则,并以某种方式到达了我胡说八道的地步。
我在上面做什么?
我希望问题清楚。
通常,当您在一个定理证明者中进行案例分析时,很多案例会归结为"无法发生"。例如,如果要证明有关整数的某些事实,则可能需要对整数
但是Coq并不那么聪明。因此,您仍然必须仔细研究一下这样的机制,即可以将两个矛盾的假设粘合在一起,成为荒谬的证明,从而证明您的定理。
像在计算机程序中那样思考:
1 2 3 4 5 6 7 8 9 10 | switch (k) { case X: /* do stuff */ break; case Y: /* do other stuff */ break; default: assert(false,"can't ever happen"); } |
因此,您必须证明荒谬的目标
因此您运用了一个荒谬的假设,试图实现一个荒谬的目标。看得出您最终会得到一些可以通过反射实际显示的东西。 Qed。
更新正式地,这是发生了什么。
回想一下,Coq中的每个归纳定义都带有归纳原理。以下是等式和
1 2 3 4 5 6 7 | Check eq_ind. eq_ind : forall (A : Type) (x : A) (P : A -> Prop), P x -> forall y : A, x = y -> P y Check False_ind. False_ind : forall P : Prop, False -> P |
1 2 3 | Check eq_ind false. eq_ind false : forall P : bool -> Prop, P false -> forall y : bool, false = y -> P y |
因此,如果您从某个依赖于布尔
的证明
这听起来并不很有趣,但是我们可以将其应用于我们想要的任何命题
1 2 3 4 5 | Check eq_ind false (fun b : bool => if b then False else True). eq_ind false (fun b : bool => if b then False else True) : (fun b : bool => if b then False else True) false -> forall y : bool, false = y -> (fun b : bool => if b then False else True) y |
简化一下,这就是
所以这想要一个
1 2 3 | Check eq_ind false (fun b : bool => if b then False else True) I true. eq_ind false (fun b : bool => if b then False else True) I true : false = true -> (fun b : bool => if b then False else True) true |
这里是:
结合我们对
回到
战术基本上是建立证明条件的机制。
考虑您的证明:您到达了目标为
我意识到这很老了,但我想澄清一下Lambdageek回答背后的一些直觉(以防万一有人发现了这个问题)
我注意到关键点似乎是我们定义了一个在每个点上具有不同值的函数
的直观思想(实际上,这是定义等式的" Leibniz"方式)
1 | forall P:bool -> Prop, forall x,y:bool, (x = y) -> (P x) -> (P y), |
但这意味着从
我们在这里使用的另一个基本属性是定义
给出
1 | forall P:bool -> Type, P true -> P false -> (forall b:bool, P b) |
通过选择
1 | (bool_rect P) : Prop -> Prop -> (bool -> Prop), |
我们在其中输入
如果将所有这些放在一起,我们将得到
1 | (eq_ind true (bool_rect (fun b => Prop) True False) I false) : true = false -> False |
还值得指出的是,Coq将归纳/递归原理(如