我试图理解在Coq中使用不等式的逻辑。
当目标中出现<>
时,执行intros contra.
会将目标更改为False
并将目标移至假设,但<>
切换为{ {1}}。我想我明白这是怎么回事。如果我的目标是=
,则a <> b
作为假设会产生矛盾。
但是,我不能在Coq做相反的事情。如果我的目标为a = b
,我可以a = b
以intros 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个相关问题标记为以粗体显示。
答案 0 :(得分:4)
intros
[目标a = b
]的逻辑上是否合理?
如果我理解你的问题,你想知道是否可以
有一个目标a = b
,请致电intros contra
,然后将其转换为目标H : a <> b |- False
。这是合理的,但在Coq的任意类型的a
和b
的基本构造逻辑中是不可推导的:它断言命题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))
那样宽松,并且没有像我上面解释的那样扩展到影响上。