[英]How to apply a constructor in an hypothesis?
我試圖證明以下定理
Theorem subseq_subset : forall l1 l2, subseq l1 l2 -> sublist l1 l2.
使用感應類型 subseq :
Inductive subseq {A:Type} : list A -> list A -> Prop :=
| SubNil : forall (l:list A), subseq nil l
| Sub_both : forall (s l:list A) (x:A), subseq s l -> subseq s (x::l)
| Sub_right : forall (s l: list A) (x:A), subseq s l -> subseq (x::s) (x::l).
和子列表的定義:
Definition sublist (l1 l2 : list A) : Prop := forall x : A, In x l1 -> In x l2.
這是我開始做的證明
Theorem subseq_subset : forall l1 l2, subseq l1 l2 -> sublist l1 l2.
Proof.
intros.
unfold sublist. intros.
induction l2.
+ inversion H in H0. simpl. simpl in H0. assumption.
+ apply in_cons. apply IHl2.
Qed.
我現在有這個背景
1 subgoals
l1 : list A
a : A
l2 : list A
H : subseq l1 (a :: l2)
x : A
H0 : In x l1
IHl2 : subseq l1 l2 -> In x l2
______________________________________(1/1)
subseq l1 l2
我想在 H 上應用 sub_right,所以我可以用假設結束證明,但apply sub_right in H
不起作用。 這可能嗎? 我怎樣才能結束這個證明?
謝謝。
首先請注意,您說明了定義
Inductive subseq {A:Type} : list A -> list A -> Prop :=
| SubNil : forall (l:list A), subseq nil l
| Sub_both : forall (s l:list A) (x:A), subseq s l -> subseq s (x::l)
| Sub_right : forall (s l: list A) (x:A), subseq s l -> subseq (x::s) (x::l).
對分支使用大寫字母,因此它將apply Sub_right in H
。 此外,我認為您切換了both
分支和right
分支。 對於這個答案的其余部分,我將假設定義是
Inductive subseq {A:Type} : list A -> list A -> Prop :=
| subNil : forall (l:list A), subseq nil l
| sub_right : forall (s l:list A) (x:A), subseq s l -> subseq s (x::l)
| sub_both : forall (s l: list A) (x:A), subseq s l -> subseq (x::s) (x::l).
現在到你的實際問題。 當你說apply sub_right in H
不起作用時,你得到什么錯誤信息? Coq 告訴我它找不到x
。 這是有道理的:如果你申請的是有一個定理x
上右手邊,無x
上的左手側,然后勒柯克無法猜測其x
使用。 您可以通過apply (sub_right _ _ x) in H
說apply (sub_right _ _ x) in H
來明確選擇一個x
。
也就是說,我不知道如何從你所在的地方完成你的證明。 我認為你需要一個歸納假設。 例如,如果您試圖證明subseq l1 (x :: l2) -> sublist l1 (x :: l2)
,那么知道subseq l1 l2 -> sublist l1 l2
會很好。 您可以通過在 subseq l1 l2 的證明上使用歸納而不是在列表之一上來實現這一點:
intros l1 l2 subseql1l2.
unfold sublist.
induction subseql1l2.
...
這為您提供了三個很好的案例,可以直觀地看到它們是真實的。 為了證明它們,您需要一些關於In
和列表的事實,您可以使用例如Search In (_ :: _).
來查找這些事實Search In (_ :: _).
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.