Coq 用矛盾技巧证明

Coq 用矛盾技巧证明,coq,Coq,我有以下目标: f : bool -> bool b : bool H1 : f true = true H2 : f true = false H3 : f false = false ============================ false = true 现在使用H1和H2,我想用矛盾来证明目标。我知道反转战术,但我认为我不能在这里应用它。你知道怎么从这里开始吗 这是完全可复制的代码,您可以在其中实现上述目标: Theorem bool_fn

我有以下目标:

  f : bool -> bool
  b : bool
  H1 : f true = true
  H2 : f true = false
  H3 : f false = false
  ============================
   false = true
现在使用H1和H2,我想用矛盾来证明目标。我知道反转战术,但我认为我不能在这里应用它。你知道怎么从这里开始吗

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

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上使用析构函数,这在5次使用析构函数后实际上证明了定理。

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

事实上,H1和H2相互矛盾

在这一点上,我希望您知道的方法是使用重写。例如,在H2中重写H1。将在H2中用true替换f true,得到H2:true=false。然后,您可以执行反转H2或判别


我不确定是否有一个最好的方法来证明,基本上有8种情况需要考虑,而且只有很少的空间可用于捷径。

这是答案。感谢@ pTiValv注意到这是来自SF的一项练习。OP:在没有链接到消息来源的情况下发布关于这种练习的问题是不诚实的。我们现在有很多这样的问题,这些问题都是关于科幻小说的,但我们没有告诉它@Zimmi48我看不出有什么问题。我在读那本书,每当我有空余时间不做日常工作时,我就会解决这些问题。为什么你认为在没有链接到来源的情况下发布问题是不诚实的?这个词有点太强了,但你为什么不在一开始就添加链接?不引用来源可能会被认为对作者/版权侵权不公平,并且当作者要求人们不要将解决方案放在互联网上时,存在一些答案包含完整解决方案的风险。例如,如果还没有一个答案,我可能会在不知道来源的情况下做这件事。这个问题以前也发生过。>作者要求人们不要在互联网上发布解决方案我同意这一点。但我不知道问问题的最佳方式是什么。事实上,皮特瓦尔的回答足以为我找到解决办法。同样是现在,已经有很多解决方案在网上SF图书。因此,如果有人真的在寻找答案,那么他会得到答案。我倾向于使用判别法而不是倒置法,原因有几个:判别法表明结果是通过矛盾得到的,这是一种更简单的策略,生成的证明项要简单得多。当然,还有一种解决方案,只需对目标和假设进行一次重写,但它看起来不像是矛盾的证明。