证明使用矛盾技术

时间:2017-04-01 00:45:57

标签: coq

我有以下目标:

  f : bool -> bool
  b : bool
  H1 : f true = true
  H2 : f true = false
  H3 : f false = false
  ============================
   false = true

现在使用H1和H2,我想用矛盾证明目标。我知道inversion战术,但我不认为我可以在这里应用它。关于如何从这里开始的任何想法?

这是完全可重现的代码,您可以在其中实现上述目标:

Theorem bool_fn_applied_thrice :
  forall (f : bool -> bool) (b : bool),
  f (f (f b)) = f b.
Proof.
  intros f b.
  destruct (f b) eqn:H1.
  - destruct (f true) eqn:H2.
    + rewrite -> H2.
      reflexivity.
    + destruct (f false) eqn:H3.
      * reflexivity.
      * destruct b in H1.
        {

        }

也有兴趣知道是否有一种比上述方法更简单的方法来解决上述定理(只是提示。另一种接近方式是在b上使用destruct,这实际证明了以后的定理5.破坏的用法)。

1 个答案:

答案 0 :(得分:1)

有很多方法可以继续,因为这是一个可以用作家庭作业的软件基础练习,我不会给出完整的答案。

确实H1和H2相互矛盾。

我希望你现在知道的方法是使用重写。例如,rewrite H1 in H2.会将f true替换为true中的H2,并产生H2 : true = false。然后,您可以执行inversion H2discriminate

我不确定是否有最好的证明方法,基本上有8种情况需要考虑,只有很少的空间来缩短这些。