如何在假设中评估嵌套匹配取决于sumbool,在Coq的另一个假设中给出了sumbool的见证?

时间:2016-02-26 02:44:23

标签: coq

我有一个类似于下面所示的证明状态(我简化了一些,专注于我所遇到的问题的本质)。我几乎可以肯定我的假设存在矛盾。但是,假设H由嵌套匹配组成,该匹配取决于表达式“eq_nat_dec n n”的结果。 (我通过简化另一个eq_nat_dec函数到达了H的左侧。)

好的新闻是我有一个假设(n0),确保最内部匹配的“正确”分支应该触发,这也确保了“正确”的分支。外部匹配应该触发,导致值“坏”(“好”和“坏”是两个相同归纳类型的构造函数,因此假设好=坏将提供必要的矛盾)。

新闻是我不知道如何在假设H中“告知”关于假设n0的内部匹配。我尝试过在H上使用subst和inversion,但嵌套匹配仍然存在。

总结:如何使用n0中的信息强制H使用其匹配的正确分支?

  n, n' : nat
  H : 
    match
      match eq_nat_dec n n' with
      | left _ => inleft _
      | right _ => inright _
      end
    with
    | inleft _ => _
    | inright _ => bad
    end = good
  n0 : n <> n'
  ============================
  False

2 个答案:

答案 0 :(得分:2)

我所知道的唯一解决方案是破坏eq_nat_dec n n'并证明left分支因n <> n'而矛盾。它会给出类似的东西:

destruct (eq_nat_dec n n'); [contradiction | discriminate].

答案 1 :(得分:1)

事实上,正如之前的回答所说,破坏+同意会很好。

你可以试着引入一个引理:

Lemma eqn_rwN {x y : nat} (h : x <> y) : Nat.eq_dec x y = right h.
Proof.
destruct (Nat.eq_dec _ _); try congruence.
apply f_equal.
(* Use Eqdep_dec.eq_proofs_unicity? *)
Admitted.

这样你就可以重写比较,因为鉴于nat具有可判定的平等性,这种身份证明的唯一性应该是可证明的:

Lemma u2
      (n n' : nat)
      (H : match (match Nat.eq_dec n n' with
                 | left  x => inleft x
                 | right y => inright y
                 end)
           with
           | inleft  x => true
           | inright _ => false
           end = true)
      (hnn : n <> n') : False.
Proof. rewrite (eqn_rwN hnn) in H. congruence. Qed.

其他Coq库(例如mathcomp)采用不同的方法并将等式放在bool中,因此您可以直接重写:

From mathcomp Require Import ssreflect ssrfun ssrbool eqtype ssrnat.

Lemma u3 (n n' : nat)
      (H : (if n == n' then true else false) = true)
      (hnn : n != n') : False.
Proof. by rewrite (negbTE hnn) in H. Qed.

如果您要验证算法,IMVHO会更方便。