Coq:使用不等式(<>)

时间:2018-06-05 06:18:09

标签: coq proof theorem-proving coq-tactic

我试图理解在Coq中使用不等式的逻辑。

  • 当目标中出现<>时,执行intros contra.会将目标更改为False并将目标移至假设,但<>切换为{ {1}}。我想我明白这是怎么回事。如果我的目标是=,则a <> b作为假设会产生矛盾。

    但是,我不能在Coq做相反的事情。如果我的目标为a = b,我可以a = bintros contra.为目标,False为假设。 这个a <> b在逻辑上是否合理?它是否不受支持只是因为完成证据永远不需要它?

  • intros处于假设<>时,执行H会删除假设(我无法destruct H.)并且会切换destruct (H) eqn:H.H切换为<>的任何目标。 我不明白这里的逻辑。如果我有一个不平等的假设,我不知道如何将它与平等作为目标相同。

    =如何使用不等式归纳?

    如果我有一个矛盾的假设G destruct,为了完成证明并告诉它是一个矛盾,我需要做0 <> 0 为什么不能做某事像destruct G. (* now the goal is 0 = 0 *). reflexivity.一样,就像假设inversion G.一样?

事实上,我有4个相关问题标记为以粗体显示

1 个答案:

答案 0 :(得分:4)

  

intros [目标a = b]的逻辑上是否合理?

如果我理解你的问题,你想知道是否可以 有一个目标a = b,请致电intros contra,然后将其转换为目标H : a <> b |- False。这是合理的,但在Coq的任意类型的ab的基本构造逻辑中是不可推导的:它断言命题a = b支持双否定消除(~ (~ a = b) -> a = b )。 Coq不支持这一点,因为它意味着以不同的逻辑形式主义工作。

  

destruct如何使用不等式归纳?

正如周围人所说,a <> b被定义为a = b -> False,虚假被归纳为没有构造者的命题;因此,破坏False类型的东西只会完成证明。此外,在destruct类型的某些内容上调用A -> B大致会产生类型A的目标,将该证据提供给含义以获取B的证明,然后在destruct的证明上调用B。在您的情况下,这意味着完全按照您的描述进行操作。

  

为什么不能像inversion G.那样做S n = 0这样的事情,就像假设inversion一样?

我的猜测是destruct并不像def seeAllData(request): template = loader.get_template('seeAllData.html') context = { 'From1' : Form1(), 'Form2' : Form2(), 'Form3' : Form3(), } return HttpResponse(template.render(context, request)) 那样宽松,并且没有像我上面解释的那样扩展到影响上。