通过简单的定理证明来理解Coq

时间:2018-04-30 08:57:46

标签: coq theorem-proving

我对Coq很陌生,现在我很难理解Coq如何用一个简单的定理“推理”:

Theorem andb_true_elim2 : forall b c : bool,
  andb b c = true -> c = true.

我认为证据只是:

Proof.
  intros b c.
  destruct c.
    - destruct b.
     + reflexivity.
     + reflexivity.
    - destruct b.
     + reflexivity.
     + reflexivity.
  Qed.

但它失败了:

In environtment
H: true && false = true
Unable to unify "true" with "false"

子目标失败是第三个reflexivity,其中cfalsebtrue

1 subgoal
______________________________________(1/1)
true && false = true -> false = true

为什么?它不等同于暗示吗?

true && (false = true) -> (false = true)
true && false -> false
false -> false
true

1 个答案:

答案 0 :(得分:4)

此证明存在一些问题。首先,你误解了Coq想要的东西;实际目标如下:

((true && false) = true) -> (false = true)

遵循反身性,因为这个公式false = true的结论是两个语法不同的表达式之间的相等。

其次,Coq不会以您描述的方式简化运算符->=。 Coq的理论允许在一些选择表达式中自动简化,例如由案例分析定义的表达式。例如,&&andb函数的语法糖,它在标准库中定义如下:

Definition andb b c :=
  if b then c else false.

当Coq看到false && true这样的表达式时,它会将其扩展为等效的if false then true else false,而后者又会简化为else分支true。您可以通过调用有问题的分支上的simpl策略来测试这一点。

另一方面,->=运算符的定义不同:第一个是逻辑中的原语,而另一个是所谓的归纳命题。这些都不能在Coq中自动简化,因为它们表达的概念通常是不可计算的:例如,我们可以使用=来表达两个函数fg的相等性将无限多个自然数作为输入。 This question更详细地讨论了这种差异。

如果你愿意,你可以用一种纯粹可计算的方式用暗示和平等的替代定义来陈述你的定理:

Definition negb b := if b then false else true.

Definition eqb b c := if b then c else negb c.

Definition implb b c := if b then c else true.

Lemma test : forall b c, (implb (eqb (andb b c) true) (eqb c true))
                         = true.
Proof. intros [] []; reflexivity. Qed.

然而,像这样的陈述通常在Coq中使用起来更难。