Coq.Lists.List

# Module Coq.Lists.List

``

THIS IS A OLD CONTRIB. IT IS NO LONGER MAINTAINED **

`

`Require` Le.

`Parameter` List_Dom:Set.
`Definition` A := List_Dom.

`Inductive` list : Set := nil : list | cons : A -> list -> list.

`Fixpoint` app [l:list] : list -> list
:= [m:list]<list>Cases l of
nil => m
| (cons a l1) => (cons a (app l1 m))
end.

`Lemma` app_nil_end : (l:list)(l=(app l nil)).
`Proof`.
Intro l ; Elim l ; Simpl ; Auto.
Induction 1; Auto.
`Qed`.
`Hints` Resolve app_nil_end : list v62.

`Lemma` app_ass : (l,m,n : list)(app (app l m) n)=(app l (app m n)).
`Proof`.
Intros l m n ; Elim l ; Simpl ; Auto with list.
Induction 1; Auto with list.
`Qed`.
`Hints` Resolve app_ass : list v62.

`Lemma` ass_app : (l,m,n : list)(app l (app m n))=(app (app l m) n).
`Proof`.
Auto with list.
`Qed`.
`Hints` Resolve ass_app : list v62.

`Definition` tail :=
[l:list] <list>Cases l of (cons _ m) => m | _ => nil end : list->list.

`Lemma` nil_cons : (a:A)(m:list)~nil=(cons a m).
Intros; Discriminate.
`Qed`.

`Fixpoint` length [l:list] : nat
:= <nat>Cases l of (cons _ m) => (S (length m)) | _ => O end.

`Section` length_order.
`Definition` lel := [l,m:list](le (length l) (length m)).

`Hints` Unfold lel : list.

`Variables` a,b:A.
`Variables` l,m,n:list.

`Lemma` lel_refl : (lel l l).
`Proof`.
Unfold lel ; Auto with list.
`Qed`.

`Lemma` lel_trans : (lel l m)->(lel m n)->(lel l n).
`Proof`.
Unfold lel ; Intros.
Apply le_trans with (length m) ; Auto with list.
`Qed`.

`Lemma` lel_cons_cons : (lel l m)->(lel (cons a l) (cons b m)).
`Proof`.
Unfold lel ; Simpl ; Auto with list arith.
`Qed`.

`Lemma` lel_cons : (lel l m)->(lel l (cons b m)).
`Proof`.
Unfold lel ; Simpl ; Auto with list arith.
`Qed`.

`Lemma` lel_tail : (lel (cons a l) (cons b m)) -> (lel l m).
`Proof`.
Unfold lel ; Simpl ; Auto with list arith.
`Qed`.

`Lemma` lel_nil : (l':list)(lel l' nil)->(nil=l').
`Proof`.
Intro l' ; Elim l' ; Auto with list arith.
Intros a' y H H0.
Absurd (le (S (length y)) O); Auto with list arith.
`Qed`.
`End` length_order.

`Hints` Resolve lel_refl lel_cons_cons lel_cons lel_nil lel_nil nil_cons : list v62.

`Fixpoint` In [a:A;l:list] : Prop :=
Cases l of
nil => False
| (cons b m) => (b=a)\/(In a m)
end.

`Lemma` in_eq : (a:A)(l:list)(In a (cons a l)).
`Proof`.
Simpl ; Auto with list.
`Qed`.
`Hints` Resolve in_eq : list v62.

`Lemma` in_cons : (a,b:A)(l:list)(In b l)->(In b (cons a l)).
`Proof`.
Simpl ; Auto with list.
`Qed`.
`Hints` Resolve in_cons : list v62.

`Lemma` in_app_or : (l,m:list)(a:A)(In a (app l m))->((In a l)\/(In a m)).
`Proof`.
Intros l m a.
Elim l ; Simpl ; Auto with list.
Intros a0 y H H0.
Elim H0 ; Auto with list.
Intro H1.
Elim (H H1) ; Auto with list.
`Qed`.
`Hints` `Immediate` in_app_or : list v62.

`Lemma` in_or_app : (l,m:list)(a:A)((In a l)\/(In a m))->(In a (app l m)).
`Proof`.
Intros l m a.
Elim l ; Simpl ; Intro H.
Elim H ; Auto with list ; Intro H0.
Elim H0.
Intros y H0 H1.
Elim H1 ; Auto 4 with list.
Intro H2.
Elim H2 ; Auto with list.
`Qed`.
`Hints` Resolve in_or_app : list v62.

`Definition` incl := [l,m:list](a:A)(In a l)->(In a m).

`Hints` Unfold incl : list v62.

`Lemma` incl_refl : (l:list)(incl l l).
`Proof`.
Auto with list.
`Qed`.
`Hints` Resolve incl_refl : list v62.

`Lemma` incl_tl : (a:A)(l,m:list)(incl l m)->(incl l (cons a m)).
`Proof`.
Auto with list.
`Qed`.
`Hints` `Immediate` incl_tl : list v62.

`Lemma` incl_tran : (l,m,n:list)(incl l m)->(incl m n)->(incl l n).
`Proof`.
Auto with list.
`Qed`.

`Lemma` incl_appl : (l,m,n:list)(incl l n)->(incl l (app n m)).
`Proof`.
Auto with list.
`Qed`.
`Hints` `Immediate` incl_appl : list v62.

`Lemma` incl_appr : (l,m,n:list)(incl l n)->(incl l (app m n)).
`Proof`.
Auto with list.
`Qed`.
`Hints` `Immediate` incl_appr : list v62.

`Lemma` incl_cons : (a:A)(l,m:list)(In a m)->(incl l m)->(incl (cons a l) m).
`Proof`.
Unfold incl ; Simpl ; Intros a l m H H0 a0 H1.
Elim H1.
Elim H1 ; Auto with list ; Intro H2.
Elim H2 ; Auto with list.
Auto with list.
`Qed`.
`Hints` Resolve incl_cons : list v62.

`Lemma` incl_app : (l,m,n:list)(incl l n)->(incl m n)->(incl (app l m) n).
`Proof`.
Unfold incl ; Simpl ; Intros l m n H H0 a H1.
Elim (in_app_or l m a) ; Auto with list.
`Qed`.
`Hints` Resolve incl_app : list v62.

`

Index