Coq 如何在假设中应用构造函数?

Coq 如何在假设中应用构造函数?,coq,proof,coq-tactic,Coq,Proof,Coq Tactic,我试图证明下面的定理 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), subse

我试图证明下面的定理

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_权利,这样我就可以用假设来结束证明,但是
在H中应用sub_权利
不起作用。这可能吗?我怎样才能结束这个证明呢


谢谢。

首先请注意,您声明了定义

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).
分支使用大写字母,因此在H中应该是
apply Sub\u 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).
现在谈谈你的实际问题。当您说H中的
apply sub_不起作用时,您会收到什么错误消息?Coq告诉我它找不到
x
。这是有意义的:如果你应用的定理在右手边有一个
x
,而在左手边没有
x
,那么Coq就无法猜测使用哪个
x
。您可以通过在H
中说
apply(sub_right uuux)来明确选择
x

也就是说,我不知道如何从你现在的位置来完成你的证明。我想你需要一个归纳假设。例如,如果您试图证明
subseq l1(x::l2)->子列表l1(x::l2)
,最好知道
subseq l1 l2->子列表l1 l2
。您可以通过在子类l1 l2的证明上使用归纳法,而不是在以下列表之一上使用归纳法来实现这一点:

intros l1 l2 subseql1l2.
unfold sublist.
induction subseql1l2.
...
这给了你三个很好的例子,可以直观地看到是真的。为了证明它们,您需要一些关于
和列表中的
的事实,您可以使用(::uu)中的
搜索来查找这些事实。