Coq 如何引导归纳到不同的论点?

Coq 如何引导归纳到不同的论点?,coq,Coq,以下是我在Idris中解决的一个问题的解决方案 data Subseq : List a -> List a -> Type where Base : Subseq [] [] There : Subseq seq l -> Subseq seq (x :: l) Here : Subseq seq l -> Subseq (x :: seq) (x :: l) subseq_trans : Subseq a b -> Subseq b c

以下是我在Idris中解决的一个问题的解决方案

data Subseq : List a -> List a -> Type where
    Base : Subseq [] []
    There : Subseq seq l -> Subseq seq (x :: l)
    Here : Subseq seq l -> Subseq (x :: seq) (x :: l)

subseq_trans : Subseq a b -> Subseq b c -> Subseq a c
subseq_trans x Base = x
subseq_trans x (There z) = There (subseq_trans x z)
subseq_trans (There x) (Here z) = There (subseq_trans x z)
subseq_trans (Here x) (Here z) = Here (subseq_trans x z)
然而,对于Coq,我不知道如何证明这一点。这个问题昨天花了我几个小时才关掉自动驾驶仪,试着非正式地推理。这就是我已经走了多远

Inductive subseq : list nat -> list nat -> Prop :=
  | subseq_base : subseq [] []
  | subseq_there : forall seq l x, subseq seq l -> subseq seq (x :: l)
  | subseq_here : forall seq l x, subseq seq l -> subseq (x :: seq) (x :: l).

Theorem subseq_trans : forall l1 l2 l3,
  subseq l1 l2 -> subseq l2 l3 -> subseq l1 l3.
Proof.
intros.
induction H0.
- apply H.
- apply subseq_there, IHsubseq, H.
- inversion H.
  + apply subseq_there, IHsubseq, H3.
  + 
为了解决最后一种情况,我真的需要将归纳假设设为
subseq-seq0-seq->subseq-seq0-l
。这将使我能够提供等同于伊德里斯证据的证据。事实上,我被困住了

这里应该做什么

Theorem subseq_trans : forall l1 l2 l3,
  subseq l1 l2 -> subseq l2 l3 -> subseq l1 l3.
Proof.
intros.
generalize dependent l1.
induction H0.
- intros. apply H.
- intros. apply subseq_there, IHsubseq, H.
- intros. inversion H.
  + apply subseq_there, IHsubseq, H3.
  + apply subseq_here, IHsubseq, H3.
Qed.
我犯了一个错误。由于某种原因,我认为推广
l1
在这里不起作用,因为它在另一个前提下与
l2
相关联。有了这一点洞察力,解决方案变得简单明了

我犯了一个错误。由于某种原因,我认为推广
l1
在这里不起作用,因为它在另一个前提下与
l2
相关联。有了这一点洞察力,解决方案变得简单明了

Theorem subseq_trans : forall l1 l2 l3,
  subseq l1 l2 -> subseq l2 l3 -> subseq l1 l3.
Proof.
intros.
generalize dependent l1.
induction H0.
- intros. apply H.
- intros. apply subseq_there, IHsubseq, H.
- intros. inversion H.
  + apply subseq_there, IHsubseq, H3.
  + apply subseq_here, IHsubseq, H3.
Qed.