在Coq我有两个假设H
和H0
,这相互矛盾。问题是,他们只是为了一些专业而互相矛盾,在这个证明的背景下,情况并不那么专业化。Coq矛盾的假设
这时我的证明背景是这样的:
color : Vertex -> bool
v : V_set
a : A_set
x0, x1 : Vertex
H : v x0 -> v x1 -> a (A_ends x0 x1) \/ a (A_ends x1 x0) -> color x0 <> color x1
H0 : v x0 -> v x1 -> a (A_ends x0 x1) \/ a (A_ends x1 x0) -> color x0 = color x1
______________________________________
False
由于这方面的证据是关于图(v
=组顶点,a
=集弧,color
的=顶点的颜色),我可以容易显示自然语言中的矛盾:假设某个图形包含顶点x0
和x1
(且它们相邻),则x0
和x1
不能同时具有相同和不同的颜色。因此H
和H0
不能都是真实的,因此目标被当前上下文隐含。
我应该如何在Coq中进行这项工作,而不会一直生成v x0
,v x1
和a (A_ends x0 x1) \/ a (A_ends x1 x0)
作为新的子目标?棘手的部分是:“假设某些图形存在v
和a
这样和那样的形式”。
到目前为止,我试过auto, eauto, trivial, intuition, apply H in H0, contradiction H, omega
。
恐怕你必须产生缺失的证明义务,否则证明为什么他们不需要。 Coq是关于_proof verification_所以你不能指望非正式推理在这里继续工作。如果不知道更多信息,很难知道,但是关键可能在于您遵循该目标的路径。你写下“假设”,以便假设,应该出现在某个地方,对吗? – ejgallego
证明自动化的第一步是手动证明。所以,现在忽略了产生子目标的烦恼,你怎么证明'v x0','v x1'和'a ... \/a ...'? –
我想我需要像'v'和'a'这样的_specialization_,它具有所需的形式。非正式地说,这应该再好,“当这些假设一般存在时,那么他们必须为这个特殊情况而持有”。但是Coq在这里不允许有这样的专业化,因为在其他假设中使用'v'和'a'。 –