Fixpoint allNatsLt (n : nat) :=
  match n with
    | 0 => nil
    | S n' => allNatsLt n' ++ (n' :: nil)
  end.

(* Specifications: *)
Lemma allNatsLt_length : forall n, length (allNatsLt n) = n.
Lemma allNatsLt_lt : forall n v, In v (allNatsLt n) -> v < n.
Lemma app_NoDup : forall(A : Set)(ls1 ls2 : list A), NoDup ls1 -> NoDup ls2 -> (forall a, In a ls1 -> ~In a ls2) -> (forall a, In a ls2 -> ~In a ls1) -> NoDup (ls1 ++ ls2).
Lemma allNatsLt_NoDup : forall (n : nat), NoDup (allNatsLt n).
Lemma allNatsLt_lt_if : forall (n i : nat), i < n -> In i (allNatsLt n).
Lemma nth_allNatsLt_lt : forall k n, n < k -> nth n (allNatsLt k) n = n.
Lemma nth_allNatsLt : forall k n, nth n (allNatsLt k) n = n.
Theorem allNatsLt_filter_lt : forall (p n : nat), (n <= p)%nat-> filter (fun z => if (lt_dec z n) then true else false) (allNatsLt p) = allNatsLt n.
Theorem map_eq_all : forall (A B : Type)(ls : list A)(f1 f2 : A -> B), map f1 ls = map f2 ls -> (forall a, In a ls -> f1 a = f2 a).
Theorem map_eq_if_all : forall (A B : Type)(ls : list A)(f1 f2 : A -> B), (forall a, In a ls -> f1 a = f2 a) -> map f1 ls = map f2 ls.
Theorem map_eq_subset : forall (A B : Type)(ls2 ls1 : list A)(f1 f2 : A -> B), map f1 ls1 = map f2 ls1 -> (forall a, In a ls2 -> In a ls1) -> map f1 ls2 = map f2 ls2.