coq - 用无法证明的子目标卡住证明引理

标签 coq proof theorem-proving coq-tactic

我试图证明一个基于以下定义的引理。

Section lemma.

Variable A : Type.
Variable P : A -> Prop.

Variable P_dec : forall x, {P x}+{~P x}.

Inductive vector : nat -> Type :=
  | Vnil : vector O
  | Vcons : forall {n}, A -> vector n -> vector (S n).

  Arguments Vcons {_} _ _.

Fixpoint countPV {n: nat} (v : vector n): nat :=
match v with
| Vnil => O
| Vcons x v' => if P_dec x then S (countPV v') else countPV v'
end.

我要证明的引理如下

Lemma lem: forall (n:nat) (a:A) (v:vector n), 
      S n = countPV (Vcons a v) -> (P a /\ n = countPV v).

我已经尝试了很多东西,目前我正处于这一点。

Proof.
  intros n a v.
  unfold not in P_dec.
  simpl.
  destruct P_dec.
  - intros.
    split.
    * exact p.
    * apply eq_add_S.
      exact H.
  - intros.
    split.

此时的上下文:

2 subgoals
A : Type
P : A -> Prop
P_dec : forall x : A, {P x} + {P x -> False}
n : nat
a : A
v : vector n
f : P a -> False
H : S n = countPV v
______________________________________(1/2)
P a
______________________________________(2/2)
n = countPV v

我的问题是,我似乎被两个我无法证明的子目标困住了,而且可用的上下文似乎也没有帮助。任何人都可以为我提供一些继续前进的指导吗?

编辑:

我通过反驳 H 证明了引理:

assert (countPV v <= n).
* apply countNotBiggerThanConstructor.
* omega.
Qed.

countNotBiggerThanConstructor 在哪里:

Lemma countNotBiggerThanConstructor: forall {n : nat} (v: vector n), countPV v <= n.
Proof.
  intros n v.
  induction v.
  - reflexivity.
  - simpl.
    destruct P_dec.
    + apply le_n_S in IHv.
      assumption.
    + apply le_S.
      assumption.
Qed.

最佳答案

注意 H 不可能为真。这是一件好事,如果你能证明 False,你就可以证明任何事情。所以接下来我会做 contradict H(你不需要最后一个 split)。

总的来说,我觉得你的证明有点乱。我建议考虑如何在纸上证明这个引理并尝试在 Coq 中做到这一点。我不是 Coq 方面的专家,但我认为它也会帮助您认识到,在这种情况下您需要使用矛盾。

(编辑:顺便说一句,其他暗示这个引理不成立的答案是错误的,但我不能用我的 1 声誉发表评论)

关于coq - 用无法证明的子目标卡住证明引理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56130258/

相关文章:

coq - ltac 中的展开表示法

coq - 在归纳的递归步骤中使用 Fixpoint 的 'unfold'

algorithm - 证明 f(n) = Θ(g(n)) 当且仅当 g(n) = Θ(f(n))

coq - 使用 3 个符号表示法 [constr :operconstr] expected after [constr:operconstr]

coq - 了解 Coq 中 intros 关键字的工作

proof - 在编写作为传递链接步骤的长链的相等性证明时跟踪 "state"

algorithm - 证明多线程算法的正确性

big-o - (log n)^k = O(n)?对于 k 大于或等于 1

if-statement - ATS 证明 : Why does this static if need greater than or equal to?

coq - coq 中 "less than"关系的证据归纳