Logic Coq中的'true=false'是什么意思?
[我不确定这是否适用于堆栈溢出,但这里还有许多其他Coq问题,因此也许有人可以提供帮助。] 我正在从下面介绍案例的地方完成以下内容。请注意,我是一个完全的初学者在这方面,我在家工作-我不是一个学生Logic Coq中的'true=false'是什么意思?,logic,coq,Logic,Coq,[我不确定这是否适用于堆栈溢出,但这里还有许多其他Coq问题,因此也许有人可以提供帮助。] 我正在从下面介绍案例的地方完成以下内容。请注意,我是一个完全的初学者在这方面,我在家工作-我不是一个学生 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.
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.
然后
重写一般来说,当你们在定理证明器中进行案例分析时,很多案例归结为“不可能发生”。例如,如果要证明有关整数的某些事实,可能需要对整数i
是正、零还是负进行案例分析。但在你的上下文中,或者你的目标的某个部分,可能有其他假设与其中一个案例相矛盾。例如,您可能从前面的断言中知道,i
永远不能为负
然而,Coq并不是那么聪明。因此,你仍然需要通过力学来证明,这两个相互矛盾的假设可以粘在一起,证明荒谬,从而证明你的定理
把它想象成一个计算机程序:
switch (k) {
case X:
/* do stuff */
break;
case Y:
/* do other stuff */
break;
default:
assert(false, "can't ever happen");
}
false=true
的目标是“永远不会发生”。但你不能只是在Coq中坚持你的出路。实际上你必须写下一个证明词
因此,在上面,你必须证明荒谬的目标false=true
。你唯一需要处理的就是hyothesisH:andb false c=true
。片刻的思考会告诉你,实际上这是一个荒谬的假设(因为对于任何y
来说,和b false y
都会变成false,因此不可能是真的)。因此,你用唯一可以支配的东西(即H
)来实现目标,而你的新目标是false=andb false c
所以你运用了一个荒谬的假设试图达到一个荒谬的目标。瞧,你最终得到了一些你可以通过反身性表现出来的东西。Qed
正式更新下面是发生的事情
回想一下,Coq中的每个归纳定义都有一个归纳原则。以下是平等归纳原则的类型和False
命题(与bool
类型的False
相对):
False
的归纳原则是,如果你给我一个False
的证明,我可以给你一个任何命题的证明
eq
的归纳原理更为复杂。让我们把它局限在<代码> BOOL 。特别是false
。它说:
Check eq_ind false.
eq_ind false
: forall P : bool -> Prop, P false -> forall y : bool, false = y -> P y
因此,如果你从一个依赖于一个布尔值的命题p(b)
开始,并且你有一个p(false)
的证明,那么对于任何其他等于false
的布尔值y
,你就有了p(y)
的证明
这听起来并不十分令人兴奋,但我们可以将其应用于我们想要的任何命题p
。我们想要一个特别讨厌的
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
稍微简化一下,它所说的是True->forall y:bool,false=y->(如果y那么false,否则True)
所以这需要一个True
的证明,然后是一个布尔值y
,我们可以选择它。那我们就这么做吧
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
我们在这里:false=true->false
结合我们对False
归纳原理的了解,我们有:如果你给我一个False=true
的证明,我可以证明任何命题
所以回到和b_true_elim1
。我们有一个假设H
,即false=true
。我们想证明某种目标。正如我在上面所展示的,存在一个证明术语,它将false=true
的证明转化为您想要的任何证明。因此,特别是H
是false=true
的证明,因此您现在可以证明您想要的任何目标
这些策略基本上是建立证明项的机器。true=false
是一个等于两个不同布尔值的语句。由于这些值是不同的,所以该语句显然是不可证明的(在空上下文中)
考虑到你的证明:你到达了目标是false=true
的阶段,所以很明显你无法证明它。。。但问题是你的背景(假设)也是矛盾的。例如,当你进行案例分析时,经常会发生这种情况,其中一个案例与你的其他假设相矛盾。我意识到这是老生常谈,但我想澄清Lambdageek答案背后的一些直觉(以防有人发现)
我注意到关键点似乎是我们定义了一个函数F:bool->Prop
,在每个点上使用不同的值(即true=>true
和false=>false
)。然而,从平等的归纳原则eq_ind
可以很容易地看出,直观的想法(这实际上是定义平等的“方式”)是
但这意味着从true=false
和I:true
,我们可以得出false
我们在这里使用的另一个基本属性是定义F
的能力,这是由bool的递归原则给出的,bool\u rect
:
forall P:bool -> Type, P true -> P false -> (forall b:bool, P b)
通过选择p:=(乐趣b:bool=>Prop)
,我们得到
(bool_rect P) : Prop -> Prop -> (bool -> Prop),
在这里,我们输入True
和False
以获得函数F
如果我们把这些放在一起,我们会
(eq_ind true (bool_rect (fun b => Prop) True False) I false) : true = false -> False
还值得指出的是,Coq采用归纳/递归原则,如eq\u ind
或bool\u rect
作为定义标识和布尔类型的公理。谢谢,这很有意义,但我仍然不明白如何将两个既“错误”又“荒谬”的东西结合起来以某种方式使事情变得“正确”。我可以看出它是有效的-证明公司
forall P:bool -> Prop, forall x,y:bool, (x = y) -> (P x) -> (P y),
forall P:bool -> Type, P true -> P false -> (forall b:bool, P b)
(bool_rect P) : Prop -> Prop -> (bool -> Prop),
(eq_ind true (bool_rect (fun b => Prop) True False) I false) : true = false -> False