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.
+ constructor.
+ inversion H. subst l2. inversion H0.
- destruct l0; simpl in H5; inversion H5.
- clear H6. destruct l0; inversion H5.
* subst. simpl in *. inversion H2. subst; inversion H4.
constructor.
constructor.
subst l3; auto.
-  auto.
revert l3.
induction H; intros l3 H0.
+ admit.
+ inversion H0.
- constructor.
apply IHsubseq; auto.
- constructor. apply
Inductive foo: Type :=
bar: foo -> foo.
intros x H H0; destruct x.
+ destruct H0; inversion H0.
+ inversion H.
Qed.
unfold not; intros n H.
Definition Is_S (n:nat) := match n with (*This is a hint!!!*)
| O => False
| S p => True
end.
unfold not; intros n H.
assert (HH: Is_S O = False) by reflexivity.
rewrite <- HH.
rewrite H. simpl.
Inductive bin:=
OO: bin
| SS: bin -> bin
| TT: bin -> bin.

Theorem bin_to_nat_pres_incr : forall b : bin,
bin_to_nat (incr b) = plus (bin_to_nat b) 1.