(* Specifications: *)
Lemma finite_bases_always_equally_big : forall (n : Nat) (beta : basis V), has_n_elements n beta -> forall Sset : part_set V, lin_indep Sset -> has_n_elements n Sset -> is_basis Sset.
Lemma finite_basis_bounds_lin_indep_set_size : forall (n : Nat) (beta : basis V), has_n_elements n beta -> forall Sset : part_set V, has_at_least_n_elements (S n) Sset -> lin_dep Sset.
Lemma finite_basis_bounds_lin_indep_set_size' : forall (n : Nat) (beta : basis V), has_n_elements n beta -> forall Sset : part_set V, lin_indep Sset -> has_at_most_n_elements n Sset.
Lemma all_finite_bases_equally_big : forall (n : Nat) (beta : basis V), has_n_elements n beta -> forall Sset : basis V, has_n_elements n Sset.
Lemma lin_dep_vs_span_lemma : forall (F : field) (V : vectorspace F) (s : part_set V), lin_indep s -> forall x : V, ~ in_part x s -> (lin_dep (union s (single x)) <-> in_part x (span s)).
Lemma max_lin_indep_subset_generates_set : forall (F : field) (V : vectorspace F) (W W' : part_set V), max_lin_indep W' W -> forall w : W, is_lin_comb (subtype_elt w) W'.
Lemma seq_has_max_lin_indep_subseq : forall (F : field) (V : vectorspace F) (n : Nat) (v : seq n V), exists k : Nat, (exists w : seq k V, is_subseq w v /\ max_lin_indep (seq_set w) (seq_set v)).
Lemma every_finite_generating_set_has_a_subset_that_is_a_basis : exists W : part_set W0, is_basis (inject_subsets W).
Lemma every_finite_generating_set_includes_a_basis : exists W : basis V, included W W0.
Lemma every_finitely_generated_vectorspace_has_a_finite_basis : exists W : part_set V, is_finite_subset W /\ is_basis W.
Lemma replacement_theorem : forall (F : field) (V : vectorspace F) (beta : basis V) (n : Nat), has_n_elements n beta -> forall Sset : part_set V, lin_indep Sset -> forall m : Nat, m <= n -> has_n_elements m Sset -> exists S1 : part_set beta, has_n_elements (n - m) S1 /\ generates (union Sset (inject_subsets S1)) (full V).
Lemma span_preserves_inclusion : forall S S' : part_set V, included S S' -> included (span S) (span S').
Lemma inclusion_generates : forall S S' : part_set V, included S S' -> generates S (full V) -> generates S' (full V).
Lemma subspace_contains_all_lin_combs : forall (W : subspace V) (x : V), is_lin_comb x W -> in_part x W.
Lemma span_intersect : forall S S' : part_set V, included (span (inter S S')) (inter (span S) (span S')).
Lemma generates_inject_subsets : forall (F : field) (V : vectorspace F) (W : subspace V) (S X : part_set W), generates S X -> generates (inject_subsets S) (inject_subsets X).
Lemma lin_comb_casting : forall (F : field) (V : vectorspace F) (W W' : part_set V) (x : V), is_lin_comb x W -> (forall w : W, is_lin_comb (subtype_elt w) W') -> is_lin_comb x W'.
Lemma span_casting : forall (F : field) (V : vectorspace F) (W W' : part_set V), (forall w : W, is_lin_comb (subtype_elt w) W') -> included (span W) (span W').
Lemma group_inverse_inj : forall (G : GROUP) (g g' : G), Equal (group_inverse _ g) (group_inverse _ g') -> Equal g g'.
Lemma seq_equal_refl : forall (A : Setoid) (n : Nat) (v : seq n A), seq_equal v v.
Lemma seq_equal_symm : forall (A : Setoid) (n m : Nat) (v : seq n A) (w : seq m A), seq_equal v w -> seq_equal w v.
Lemma seq_equal_trans : forall (A : Setoid) (n m l : Nat) (v : seq n A) (w : seq m A) (u : seq l A), seq_equal v w -> seq_equal w u -> seq_equal v u.
Lemma subseqs_are_not_longer : forall (m n : Nat) (w : seq m A) (v : seq n A), is_subseq w v -> m <= n.
Lemma full_preserves_has_n_elements : forall (A : Setoid) (n : Nat), has_n_elements n A -> has_n_elements n (full A).
Lemma has_extra_element : forall (A : Setoid) (B C : part_set A) (m n : Nat), has_n_elements n B -> has_n_elements m C -> m < n -> exists a : A, in_part a B /\ ~ in_part a C.
Lemma inject_subsets_preserves_has_n_elements : forall (A : Setoid) (B : part_set A) (C : part_set B) (n : Nat), has_n_elements n C -> has_n_elements n (inject_subsets C).
Lemma inject_subsets_respects_has_n_elements : forall (A : Setoid) (B : part_set A) (C : part_set B) (n : Nat), has_n_elements n (inject_subsets C) -> has_n_elements n C.
Lemma seq_equal_seqtl : forall (A : Setoid) (n m : Nat) (v : seq n A) (w : seq m A), seq_equal v w -> seq_equal (Seqtl v) (Seqtl w).
Lemma seq_equal_concat : forall (A : Setoid) (n m p q : Nat) (v : seq n A) (w : seq m A) (a : seq p A) (b : seq q A), seq_equal v w -> seq_equal a b -> seq_equal (v ++ a) (w ++ b).
Lemma seq_equal_omit : forall (A : Setoid) (n m : Nat) (v : seq n A) (w : seq m A) (i : fin n) (j : fin m), index i = index j -> seq_equal v w -> seq_equal (omit v i) (omit w j).
Lemma is_finite_subset_then_is_finite : forall (A : Setoid) (B : part_set A), is_finite_subset B -> is_finite_set B.
Lemma is_finite_set_then_is_finite_subset : forall (A : Setoid) (B : part_set A), is_finite_set B -> is_finite_subset B.
Lemma seq_set_is_finite_subset : forall (A : Setoid) (n : Nat) (v : seq n A), is_finite_subset (seq_set v).
Lemma included_reflects_is_finite_subset : forall (A : Setoid) (B C : part_set A), is_finite_subset C -> included B C -> is_finite_subset B.
Lemma omit_concat_second_part' : forall (n m : Nat) (A : Setoid) (v : seq n A) (w : seq m A) (i : Nat) (Hi : i < m) (Hi' : n + i < n + m) (H : n + pred m = pred (n + m)), seq_equal (omit (v ++ w) (Build_finiteT Hi')) (v ++ omit w (Build_finiteT Hi)).
Lemma omit_seq_in_seq_set : forall (n : Nat) (A : Setoid) (v : seq n A) (i : fin n) (j : fin (pred n)), in_part (omit v i j) (seq_set v).
Lemma Seqtl_preserves_distinct : forall (A : Setoid) (n : Nat) (v : seq n A), distinct v -> distinct (Seqtl v).
Lemma omit_preserves_distinct : forall (A : Setoid) (n : Nat) (v : seq (S n) A), distinct v -> forall i : fin (S n), distinct (omit v i).
Lemma Map_embed_preserves_distinct : forall (A : Setoid) (n : Nat) (B : part_set A) (v : seq n B), distinct v -> distinct (Map_embed v).
Lemma Map_embed_reflects_distinct : forall (A : Setoid) (n : Nat) (B : part_set A) (v : seq n B), distinct (Map_embed v) -> distinct v.
Lemma seq_set_seq_preserves_distinct : forall (A : Setoid) (n : Nat) (v : seq n A), distinct v -> distinct (seq_set_seq v).
Lemma seq_set_seq_respects_distinct : forall (A : Setoid) (n : Nat) (v : seq n A), distinct (seq_set_seq v) -> distinct v.
Lemma concat_prop_per_part : forall P : Predicate A, (forall (i : Nat) (Hi : i < n), Pred_fun P (v (Build_finiteT Hi))) -> (forall (j : nat) (Hj : j < m), Pred_fun P (w (Build_finiteT Hj))) -> forall (k : nat) (Hk : k < n + m), Pred_fun P ((v ++ w) (Build_finiteT Hk)).
Lemma concat_prop_per_element : forall P : Predicate A, (forall (i : Nat) (Hi : i < n) (Hi' : i < n + m), Pred_fun P ((v ++ w) (Build_finiteT Hi'))) -> (forall (j : Nat) (Hj : j < m) (Hj' : n + j < n + m), Pred_fun P ((v ++ w) (Build_finiteT Hj'))) -> forall (k : Nat) (Hk : k < n + m), Pred_fun P ((v ++ w) (Build_finiteT Hk)).