Module Test.
Variable A : Type.
Print counterexample.
End Test.
Fixpoint add_list l:=
match l with
| nil => 0
| h::tl => h + (add_list tl)
end.
Inductive subseq {A: Type}: list A -> list A -> Prop :=
| nil_subseq : subseq nil nil
| hd_subseq: forall a l1 l2, subseq l1 l2 -> subseq (a :: l1) (a :: l2)
| tl_subseq: forall a l1 l2, subseq l1 l2 -> subseq l1 (a :: l2)
.
Inductive subseq' {A: Type}: list A -> list A -> Prop :=
| nilss : forall l, subseq' nil l
| hdss: forall a l l1 l2, subseq' l l2 -> subseq' (a :: l) (l1 ++ a :: l2)
.
split.
+ intros H; induction H; try constructor.
replace (a::l2) with (nil ++ a::l2) by auto; constructor; auto.
replace (cons a l2) with (app (cons a nil) l2) by auto.
inversion IHsubseq. constructor. rewrite app_assoc. constructor.
auto.
+ intros. induction H.
induction l; constructor; auto.
induction l1.
simpl; constructor; auto.
simpl.
constructor; auto.
Qed.

Lemma subseq_trans: forall {A} (l1 l2 l3: list A), subseq l1 l2 -> subseq l2 l3 -> subseq l1 l3.