簡體   English   中英

用無法證實的子目標證明了引理

[英]Stuck proving lemma with unprovable subgoals

我試圖證明一個基於以下定義的引理。

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不可能是真的。 這是一件好事,如果你可以證明是假的,你可以證明什么。 所以我接下來會contradict H (你不需要最后一次split )。

總的來說,你的證據對我來說似乎有些混亂。 我建議考慮如何在紙上證明這個引理並試圖在Coq中做到這一點。 我不是Coq的專家,但我認為這也有助於你意識到,在這種情況下你需要使用矛盾。

(編輯:BTW其他答案暗示這個引理不成立是錯誤的,但我無法評論我的1個聲譽)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM