coq改变前提'否定'不等于''等于'

时间:2013-03-03 14:16:38

标签: coq

假设我有这样一个前提:

H2: ~ a b c <> a b c

我希望将其更改为:

a b c = a b c

其中

a是术语 - &gt;术语 - &gt;术语

b和c都是Term

我该怎么办?谢谢!

2 个答案:

答案 0 :(得分:3)

如果您展开~<>的定义,则您的假设具有以下类型:

H2: (a b c = a b c -> False) -> False

因此,您希望实现的是逻辑学家通常所说的“双重否定消除”。它不是一个直观可证明的定理,因此在Coq的Classical模块中定义(详见http://coq.inria.fr/distrib/V8.4/stdlib/Coq.Logic.Classical_Prop.html):

Classical.NNPP : forall (p : Prop), ~ ~ p -> p

我认为你的实际问题比a b c = a b c更复杂,但为了提及它,如果你真的关心得到那个特定的假设,你甚至可以在没有看到H2的情况下安全地证明它:

assert (abc_refl : a b c = a b c) by reflexivity.

如果你的实际例子没有立即反身,而且平等实际上是假的,那么你可能想要将目标转变为显示H2是荒谬的。您可以通过消除H2(elim H2.,这基本上是对False类型进行切割)来实现,您将最终进入上下文:

H2 : ~ a b c <> a b c
EQ : a b c = a b c
=====================
False

我不确定这一切是否有所帮助,但您可能会过度简化您的问题,以至于我无法提供有关您真正问题的更多信息。

答案 1 :(得分:1)

只是稍微考虑添加Ptival的答案 - 如果reflexivity没有轻易解决你想要的目标,只要你Term上有可判的平等,你仍然可以取得进步,例如通过申请这个小小的引理:

Section S.
  Parameter T : Type.
  Parameter T_eq_dec : forall (x y : T), {x = y} + {x <> y}.

  Lemma not_ne : forall (x y : T), ~ (x <> y) -> x = y.
  Proof.
    intros.
    destruct (T_eq_dec x y); auto.
    unfold not in *.
    assert False.
    apply (H n).
    contradiction.
  Qed.
End S.