簡體   English   中英

如何在假設中應用構造函數?

[英]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 Happly (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.

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