在Coq中证明是否接着

时间:2013-05-15 00:45:36

标签: coq

我是Coq的新手,我正试图证明一些非常基本的东西

  

引理eq_if_eq:forall a1 a2,(如果beq_nat a1 a2则a2否a1)= a1。

我努力通过下面发布的解决方案,但我认为必须有更好的方法。理想情况下,我想在beq_nat a1 a2上干净利用案例值,同时将案例值放在假设列表中。是否存在一种策略t,使用t (beq_nat a1 a2)会产生两个子句,一个位于beq_nat a1 a2 = true而另一个位于beq_nat a1 a2 = false?显然,induction非常接近但它失去了它的历史。

以下是我努力解决的证据:

Proof.
Hint Resolve beq_nat_refl.
Hint Resolve beq_nat_eq.
Hint Resolve beq_nat_true.
Hint Resolve beq_nat_false.
intros.
compare (beq_nat a1 a2) true.
intros. assert (a1 = a2). auto. 
replace (beq_nat a1 a2) with true. auto.
intros. assert (a1 <> a2). apply beq_nat_false.
apply not_true_is_false. auto.
assert (beq_nat a1 a2 = false). apply not_true_is_false. auto.
replace (beq_nat a1 a2) with false. auto.
Qed.

3 个答案:

答案 0 :(得分:3)

通常对于这类事情,我使用des eqn变体。它看起来像这样:

destruct (beq_nat a1 a2) as []_eqn. (* Coq <= 8.3 *)

destruct (beq_nat a1 a2) as []eqn:? (* Coq >= 8.4 *)

它将平等作为一个假设。在8.4变体中,您可以使用名称替换问号以提供假设。

答案 1 :(得分:2)

执行你要求的策略是case_eq。以下脚本证明了8.4pl3中的引理:

intros.
case_eq (beq_nat a1 a2).
intuition.
apply beq_nat_true_iff in H.
intuition.
intuition.

答案 2 :(得分:0)

事实证明,简单的remember策略就是我所需要的。类似remember (beq_nat a1 a2) as e; induction e; etc

的内容