我有一个类似于下面所示的证明状态(我简化了一些,专注于我所遇到的问题的本质)。我几乎可以肯定我的假设存在矛盾。但是,假设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
答案 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会更方便。