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

时间:2019-05-03 08:05:42

标签: 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 -> 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.
  + 
1 subgoal
l1, seq : list nat
x : nat
H : subseq l1 (x :: seq)
l : list nat
H0 : subseq seq l
IHsubseq : subseq l1 seq -> subseq l1 l
seq0, l0 : list nat
x0 : nat
H3 : subseq seq0 seq
H2 : x0 :: seq0 = l1
H1 : x0 = x
H4 : l0 = seq
______________________________________(1/1)
subseq (x :: seq0) (x :: l)

为了解决最后一种情况,我真的需要归纳假设为subseq seq0 seq -> subseq seq0 l。那将使我产生与Idris证明等效的证据。因为它卡住了。

在这里应该做什么?

1 个答案:

答案 0 :(得分:1)

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捆绑在一起。有了这些见识,解决方案就变得简单了。