Logic Coq中的'true=false'是什么意思?

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.

[我不确定这是否适用于堆栈溢出,但这里还有许多其他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.
  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
。你唯一需要处理的就是hyothesis
H: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