lemma isomorphism_expand: "f ∘ g = id ∧ g ∘ f = id ⟷ (∀x. f (g x) = x) ∧ (∀x. g (f x) = x)" by (simp add: fun_eq_iff o_def id_def)
lemma left_right_inverse_eq: assumes fg: "f ∘ g = id" and gh: "g ∘ h = id" shows"f = h" proof - have"f = f ∘ (g ∘ h)" unfolding gh by simp alsohave"… = (f ∘ g) ∘ h" by (simp add: o_assoc) finallyshow"f = h" unfolding fg by simp qed
lemma ordLeq3_finite_infinite: assumes A: "finite A"and B: "infinite B"shows"ordLeq3 (card_of A) (card_of B)" proof - have‹ordLeq3 (card_of A) (card_of B) ∨ ordLeq3 (card_of B) (card_of A)› by (intro ordLeq_total card_of_Well_order) moreoverhave"¬ ordLeq3 (card_of B) (card_of A)" using B A card_of_ordLeq_finite[of B A] by auto ultimatelyshow ?thesis by auto qed
locale vector_space = fixes scale :: "'a::field → 'b::ab_group_add → 'b" (infixr‹*s›75) assumes vector_space_assms:―‹re-stating the assumptions of ‹module› instead of extending ‹module›
allows us to rewrite in the sublocale.› "a *s (x + y) = a *s x + a *s y" "(a + b) *s x = a *s x + b *s x" "a *s (b *s x) = (a * b) *s x" "1 *s x = x"
lemmas―‹from ‹module››
linear_id = module_hom_id and linear_ident = module_hom_ident and linear_scale_self = module_hom_scale_self and linear_scale_left = module_hom_scale_left and linear_uminus = module_hom_uminus
lemma linear_representation: assumes"independent B""span B = UNIV" shows"linear scale (*) (λv. representation B v b)" proof (unfold_locales, goal_cases) case (5 x y) show ?case using assms by (subst representation_add) auto next case (6 r x) show ?case using assms by (subst representation_scale) auto qed (simp_all add: algebra_simps)
lemma linear_imp_scale: fixes D::"'a → 'b" assumes"linear (*) scale D" obtains d where"D = (λx. scale x d)" proof - interpret linear "(*)" scale D by fact show ?thesis by (metis mult.commute mult.left_neutral scale that) qed
lemma scale_eq_0_iff [simp]: "scale a x = 0 ⟷ a = 0 ∨ x = 0" by (metis scale_left_commute right_inverse scale_one scale_scale scale_zero_left)
lemma scale_left_imp_eq: assumes nonzero: "a ≠ 0" and scale: "scale a x = scale a y" shows"x = y" proof - from scale have"scale a (x - y) = 0" by (simp add: scale_right_diff_distrib) with nonzero have"x - y = 0"by simp thenshow"x = y"by (simp only: right_minus_eq) qed
lemma scale_right_imp_eq: assumes nonzero: "x ≠ 0" and scale: "scale a x = scale b x" shows"a = b" proof - from scale have"scale (a - b) x = 0" by (simp add: scale_left_diff_distrib) with nonzero have"a - b = 0"by simp thenshow"a = b"by (simp only: right_minus_eq) qed
lemma scale_cancel_left [simp]: "scale a x = scale a y ⟷ x = y ∨ a = 0" by (auto intro: scale_left_imp_eq)
lemma scale_cancel_right [simp]: "scale a x = scale b x ⟷ a = b ∨ x = 0" by (auto intro: scale_right_imp_eq)
lemma injective_scale: "c ≠ 0 ==> inj (λx. scale c x)" by (simp add: inj_on_def)
lemma dependent_def: "dependent P ⟷ (∃a ∈ P. a ∈ span (P - {a}))" unfolding dependent_explicit proof safe fix a assume aP: "a ∈ P"and"a ∈ span (P - {a})" thenobtain a S u where aP: "a ∈ P"and fS: "finite S"and SP: "S ⊆ P""a ∉ S"and ua: "(∑v∈S. u v *s v) = a" unfolding span_explicit by blast let ?S = "insert a S" let ?u = "λy. if y = a then - 1 else u y" from fS SP have"(∑v∈?S. ?u v *s v) = 0" by (simp add: if_distrib[of "λr. r *s a"for a] sum.If_cases field_simps Diff_eq[symmetric] ua) moreoverhave"finite ?S""?S ⊆ P""a ∈ ?S""?u a ≠ 0" using fS SP aP by auto ultimatelyshow"∃t u. finite t ∧ t ⊆ P ∧ (∑v∈t. u v *s v) = 0 ∧ (∃v∈t. u v ≠ 0)"by fast next fix S u v assume fS: "finite S"and SP: "S ⊆ P"and vS: "v ∈ S" and uv: "u v ≠ 0"and u: "(∑v∈S. u v *s v) = 0" let ?a = v let ?S = "S - {v}" let ?u = "λi. (- u i) / u v" have th0: "?a ∈ P""finite ?S""?S ⊆ P" using fS SP vS by auto have"(∑v∈?S. ?u v *s v) = (∑v∈S. (- (inverse (u ?a))) *s (u v *s v)) - ?u v *s v" using fS vS uv by (simp add: sum_diff1 field_simps) alsohave"… = ?a" unfolding scale_sum_right[symmetric] u using uv by simp finallyhave"(∑v∈?S. ?u v *s v) = ?a" . with th0 show"∃a ∈ P. a ∈ span (P - {a})" unfolding span_explicit by (auto intro!: bexI[where x="?a"] exI[where x="?S"] exI[where x="?u"]) qed
lemma dependent_single[simp]: "dependent {x} ⟷ x = 0" unfolding dependent_def by auto
lemma in_span_insert: assumes a: "a ∈ span (insert b S)" and na: "a ∉ span S" shows"b ∈ span (insert a S)" proof - from span_breakdown[of b "insert b S" a, OF insertI1 a] obtain k where k: "a - k *s b ∈ span (S - {b})"by auto have"k ≠ 0" proof assume"k = 0" with k span_mono[of "S - {b}" S] have"a ∈ span S"by auto with na show False by blast qed thenhave eq: "b = (1/k) *s a - (1/k) *s (a - k *s b)" by (simp add: algebra_simps)
from k have"(1/k) *s (a - k *s b) ∈ span (S - {b})" by (rule span_scale) alsohave"... ⊆ span (insert a S)" by (rule span_mono) auto finallyshow ?thesis using k by (subst eq) (blast intro: span_diff span_scale span_base) qed
lemma dependent_insertD: assumes a: "a ∉ span S"and S: "dependent (insert a S)"shows"dependent S" proof - have"a ∉ S"using a by (auto dest: span_base) obtain b where b: "b = a ∨ b ∈ S""b ∈ span (insert a S - {b})" using S unfolding dependent_def by blast have"b ≠ a""b ∈ S" using b ‹a ∉ S› a by auto with b have *: "b ∈ span (insert a (S - {b}))" by (auto simp: insert_Diff_if) show"dependent S" proof cases assume"b ∈ span (S - {b})"with‹b ∈ S›show ?thesis by (auto simp add: dependent_def) next assume"b ∉ span (S - {b})" with * have"a ∈ span (insert b (S - {b}))"by (rule in_span_insert) with a show ?thesis using‹b ∈ S›by (auto simp: insert_absorb) qed qed
lemma independent_insertI: "a ∉ span S ==> independent S ==> independent (insert a S)" by (auto dest: dependent_insertD)
lemma independent_insert: "independent (insert a S) ⟷ (if a ∈ S then independent S else independent S ∧ a ∉ span S)" proof - have"a ∉ S ==> a ∈ span S ==> dependent (insert a S)" by (auto simp: dependent_def) thenshow ?thesis by (auto intro: dependent_mono simp: independent_insertI) qed
lemma maximal_independent_subset_extend: assumes"S ⊆ V""independent S" obtains B where"S ⊆ B""B ⊆ V""independent B""V ⊆ span B" proof - let ?C = "{B. S ⊆ B ∧ independent B ∧ B ⊆ V}" have"∃M∈?C. ∀X∈?C. M ⊆ X ⟶ X = M" proof (rule subset_Zorn) fix C :: "'b set set"assume"subset.chain ?C C" thenhave C: "∧c. c ∈ C ==> c ⊆ V""∧c. c ∈ C ==> S ⊆ c""∧c. c ∈ C ==> independent c" "∧c d. c ∈ C ==> d ∈ C ==> c ⊆ d ∨ d ⊆ c" unfolding subset.chain_def by blast+
show"∃U∈?C. ∀X∈C. X ⊆ U" proof cases assume"C = {}"with assms show ?thesis by (auto intro!: exI[of _ S]) next assume"C ≠ {}" with C(2) have"S ⊆∪C" by auto moreoverhave"independent (∪C)" by (intro independent_Union_directed C) moreoverhave"∪C ⊆ V" using C by auto ultimatelyshow ?thesis by auto qed qed thenobtain B where B: "independent B""B ⊆ V""S ⊆ B" and max: "∧S. independent S ==> S ⊆ V ==> B ⊆ S ==> S = B" by auto moreover
{ assume"¬ V ⊆ span B" thenobtain v where"v ∈ V""v ∉ span B" by auto with B have"independent (insert v B)"by (auto intro: dependent_insertD) from max[OF this] ‹v ∈ V›‹B ⊆ V› have"v ∈ B" by auto with‹v ∉ span B›have False by (auto intro: span_base) } ultimatelyshow ?thesis by (meson that) qed
lemma maximal_independent_subset: obtains B where"B ⊆ V""independent B""V ⊆ span B" by (metis maximal_independent_subset_extend[of "{}"] empty_subsetI independent_empty)
text‹Extends a basis from B to a basis of the entire space.› definition extend_basis :: "'b set → 'b set" where"extend_basis B = (SOME B'. B ⊆ B' ∧ independent B' ∧ span B' = UNIV)"
lemma assumes B: "independent B" shows extend_basis_superset: "B ⊆ extend_basis B" and independent_extend_basis: "independent (extend_basis B)" and span_extend_basis[simp]: "span (extend_basis B) = UNIV" proof - define p where"p B' ≡ B ⊆ B' ∧ independent B' ∧ span B' = UNIV"for B' obtain B' where"p B'" using maximal_independent_subset_extend[OF subset_UNIV B] by (metis top.extremum_uniqueI p_def) thenhave"p (extend_basis B)" unfolding extend_basis_def p_def[symmetric] by (rule someI) thenshow"B ⊆ extend_basis B""independent (extend_basis B)""span (extend_basis B) = UNIV" by (auto simp: p_def) qed
lemma in_span_delete: assumes a: "a ∈ span S"and na: "a ∉ span (S - {b})" shows"b ∈ span (insert a (S - {b}))" by (metis Diff_empty Diff_insert0 a in_span_insert insert_Diff na)
lemma span_redundant: "x ∈ span S ==> span (insert x S) = span S" unfolding span_def by (rule hull_redundant)
lemma span_trans: "x ∈ span S ==> y ∈ span (insert x S) ==> y ∈ span S" by (simp only: span_redundant)
lemma span_delete_0 [simp]: "span(S - {0}) = span S" proof show"span (S - {0}) ⊆ span S" by (blast intro!: span_mono) next have"span S ⊆ span(insert 0 (S - {0}))" by (blast intro!: span_mono) alsohave"... ⊆ span(S - {0})" using span_insert_0 by blast finallyshow"span S ⊆ span (S - {0})" . qed
lemma span_image_scale: assumes"finite S"and nz: "∧x. x ∈ S ==> c x ≠ 0" shows"span ((λx. c x *s x) ` S) = span S" using assms proof (induction S arbitrary: c) case (empty c) show ?caseby simp next case (insert x F c) show ?case proof (intro set_eqI iffI) fix y assume"y ∈ span ((λx. c x *s x) ` insert x F)" thenshow"y ∈ span (insert x F)" using insert by (force simp: span_breakdown_eq) next fix y assume"y ∈ span (insert x F)" thenshow"y ∈ span ((λx. c x *s x) ` insert x F)" using insert apply (clarsimp simp: span_breakdown_eq) apply (rule_tac x="k / c x"in exI) by simp qed qed
lemma exchange_lemma: assumes f: "finite T" and i: "independent S" and sp: "S ⊆ span T" shows"∃t'. card t' = card T ∧ finite t' ∧ S ⊆ t' ∧ t' ⊆ S ∪ T ∧ S ⊆ span t'" using f i sp proof (induct "card (T - S)" arbitrary: S T rule: less_induct) case less note ft = ‹finite T›and S = ‹independent S›and sp = ‹S ⊆ span T› let ?P = "λt'. card t' = card T ∧ finite t' ∧ S ⊆ t' ∧ t' ⊆ S ∪ T ∧ S ⊆ span t'" show ?case proof (cases "S ⊆ T ∨ T ⊆ S") case True thenshow ?thesis proof assume"S ⊆ T"thenshow ?thesis by (metis ft Un_commute sp sup_ge1) next assume"T ⊆ S"thenshow ?thesis by (metis Un_absorb sp spanning_subset_independent[OF _ S sp] ft) qed next case False thenhave st: "¬ S ⊆ T""¬ T ⊆ S" by auto from st(2) obtain b where b: "b ∈ T""b ∉ S" by blast from b have"T - {b} - S ⊂ T - S" by blast thenhave cardlt: "card (T - {b} - S) < card (T - S)" using ft by (auto intro: psubset_card_mono) from b ft have ct0: "card T ≠ 0" by auto show ?thesis proof (cases "S ⊆ span (T - {b})") case True from ft have ftb: "finite (T - {b})" by auto from less(1)[OF cardlt ftb S True] obtain U where U: "card U = card (T - {b})""S ⊆ U""U ⊆ S ∪ (T - {b})""S ⊆ span U" and fu: "finite U"by blast let ?w = "insert b U" have th0: "S ⊆ insert b U" using U by blast have th1: "insert b U ⊆ S ∪ T" using U b by blast have bu: "b ∉ U" using b U by blast from U(1) ft b have"card U = (card T - 1)" by auto thenhave th2: "card (insert b U) = card T" using card_insert_disjoint[OF fu bu] ct0 by auto from U(4) have"S ⊆ span U" . alsohave"…⊆ span (insert b U)" by (rule span_mono) blast finallyhave th3: "S ⊆ span (insert b U)" . from th0 th1 th2 th3 fu have th: "?P ?w" by blast from th show ?thesis by blast next case False thenobtain a where a: "a ∈ S""a ∉ span (T - {b})" by blast have ab: "a ≠ b" using a b by blast have at: "a ∉ T" using a ab span_base[of a "T- {b}"] by auto have mlt: "card ((insert a (T - {b})) - S) < card (T - S)" using cardlt ft a b by auto have ft': "finite (insert a (T - {b}))" using ft by auto have sp': "S ⊆ span (insert a (T - {b}))" proof fix x assume xs: "x ∈ S" have T: "T ⊆ insert b (insert a (T - {b}))" using b by auto have bs: "b ∈ span (insert a (T - {b}))" by (rule in_span_delete) (use a sp in auto) from xs sp have"x ∈ span T" by blast with span_mono[OF T] have x: "x ∈ span (insert b (insert a (T - {b})))" .. from span_trans[OF bs x] show"x ∈ span (insert a (T - {b}))" . qed from less(1)[OF mlt ft' S sp'] obtain U where U: "card U = card (insert a (T - {b}))" "finite U""S ⊆ U""U ⊆ S ∪ insert a (T - {b})" "S ⊆ span U"by blast from U a b ft at ct0 have"?P U" by auto thenshow ?thesis by blast qed qed qed
lemma independent_span_bound: assumes f: "finite T" and i: "independent S" and sp: "S ⊆ span T" shows"finite S ∧ card S ≤ card T" by (metis exchange_lemma[OF f i sp] finite_subset card_mono)
lemma independent_explicit_finite_subsets: "independent A ⟷ (∀S ⊆ A. finite S ⟶ (∀u. (∑v∈S. u v *s v) = 0 ⟶ (∀v∈S. u v = 0)))" unfolding dependent_explicit [of A] by (simp add: disj_not2)
lemma independent_if_scalars_zero: assumes fin_A: "finite A" and sum: "∧f x. (∑x∈A. f x *s x) = 0 ==> x ∈ A ==> f x = 0" shows"independent A" proof (unfold independent_explicit_finite_subsets, clarify) fix S v and u :: "'b → 'a" assume S: "S ⊆ A"and v: "v ∈ S" let ?g = "λx. if x ∈ S then u x else 0" have"(∑v∈A. ?g v *s v) = (∑v∈S. u v *s v)" using S fin_A by (auto intro!: sum.mono_neutral_cong_right) alsoassume"(∑v∈S. u v *s v) = 0" finallyhave"?g v = 0"using v S sum by force thus"u v = 0"unfolding if_P[OF v] . qed
lemma bij_if_span_eq_span_bases: assumes B: "independent B"and C: "independent C" and eq: "span B = span C" shows"∃f. bij_betw f B C" proof cases assume"finite B ∨ finite C" thenhave"finite B ∧ finite C ∧ card C = card B" using independent_span_bound[of B C] independent_span_bound[of C B] assms
span_superset[of B] span_superset[of C] by auto thenshow ?thesis by (auto intro!: finite_same_card_bij) next assume"¬ (finite B ∨ finite C)" thenhave"infinite B""infinite C"by auto
{ fix B C assume B: "independent B"and C: "independent C"and"infinite B""infinite C"and eq: "span B = span C" let ?R = "representation B"and ?R' = "representation C"let ?U = "λc. {v. ?R c v ≠ 0}" have in_span_C [simp, intro]: ‹b ∈ B ==> b ∈ span C›for b unfolding eq[symmetric] by (rule span_base) have in_span_B [simp, intro]: ‹c ∈ C ==> c ∈ span B›for c unfolding eq by (rule span_base) have‹B ⊆ (∪c∈C. ?U c)› proof fix b assume‹b ∈ B› have‹b ∈ span C› using‹b ∈ B›unfolding eq[symmetric] by (rule span_base) have‹(∑v | ?R' b v ≠ 0. ∑w | ?R v w ≠ 0. (?R' b v * ?R v w) *s w) =
(∑v | ?R' b v ≠ 0. ?R' b v *s (∑w | ?R v w ≠ 0. ?R v w *s w))› by (simp add: scale_sum_right) alsohave‹… = (∑v | ?R' b v ≠ 0. ?R' b v *s v)› by (auto simp: sum_nonzero_representation_eq B eq span_base representation_ne_zero) alsohave‹… = b› by (rule sum_nonzero_representation_eq[OF C ‹b ∈ span C›]) finallyhave"?R b b = ?R (∑v | ?R' b v ≠ 0. ∑w | ?R v w ≠ 0. (?R' b v * ?R v w) *s w) b" by simp alsohave"... = (∑i∈{v. ?R' b v ≠ 0}. ?R (∑w | ?R i w ≠ 0. (?R' b i * ?R i w) *s w) b)" by (subst representation_sum[OF B]) (auto intro: span_sum span_scale span_base representation_ne_zero) alsohave"... = (∑i∈{v. ?R' b v ≠ 0}. ∑j ∈ {w. ?R i w ≠ 0}. ?R ((?R' b i * ?R i j ) *s j ) b)" by (subst representation_sum[OF B]) (auto simp add: span_sum span_scale span_base representation_ne_zero) alsohave‹… = (∑v | ?R' b v ≠ 0. ∑w | ?R v w ≠ 0. ?R' b v * ?R v w * ?R w b)› using B ‹b ∈ B›by (simp add: representation_scale[OF B] span_base representation_ne_zero) finallyhave"(∑v | ?R' b v ≠ 0. ∑w | ?R v w ≠ 0. ?R' b v * ?R v w * ?R w b) ≠ 0" using representation_basis[OF B ‹b ∈ B›] by auto thenobtain v w where bv: "?R' b v ≠ 0"and vw: "?R v w ≠ 0"and"?R' b v * ?R v w * ?R w b≠ 0" by (blast elim: sum.not_neutral_contains_not_neutral) with representation_basis[OF B, of w] vw[THEN representation_ne_zero] have‹?R' b v ≠ 0›‹?R v b ≠ 0›by (auto split: if_splits) thenshow‹b ∈ (∪c∈C. ?U c)› by (auto dest: representation_ne_zero) qed thenhave B_eq: ‹B = (∪c∈C. ?U c)› by (auto intro: span_base representation_ne_zero eq) have"ordLeq3 (card_of B) (card_of C)" proof (subst B_eq, rule card_of_UNION_ordLeq_infinite[OF ‹infinite C›]) show"ordLeq3 (card_of C) (card_of C)" by (intro ordLeq_refl card_of_Card_order) show"∀c∈C. ordLeq3 (card_of {v. ?R c v ≠ 0}) (card_of C)" by (intro ballI ordLeq3_finite_infinite ‹infinite C› finite_representation) qed } from this[of B C] this[of C B] B C eq ‹infinite C›‹infinite B› show ?thesis by (auto simp add: ordIso_iff_ordLeq card_of_ordIso) qed
definition dim :: "'b set → nat" where"dim V = (if ∃b. independent b ∧ span b = span V then card (SOME b. independent b ∧ span b = span V) else 0)"
lemma dim_eq_card: assumes BV: "span B = span V"and B: "independent B" shows"dim V = card B" proof - define p where"p b ≡ independent b ∧ span b = span V"for b have"p (SOME B. p B)" using assms by (intro someI[of p B]) (auto simp: p_def) thenhave"∃f. bij_betw f B (SOME B. p B)" by (subst (asm) p_def, intro bij_if_span_eq_span_bases[OF B]) (simp_all add: BV) thenhave"card B = card (SOME B. p B)" by (auto intro: bij_betw_same_card) thenshow ?thesis using BV B by (auto simp add: dim_def p_def) qed
lemma basis_card_eq_dim: "B ⊆ V ==> V ⊆ span B ==> independent B ==> card B = dim V" using dim_eq_card[of B V] span_mono[of B V] span_minimal[OF _ subspace_span, of V B] by auto
lemma basis_exists: obtains B where"B ⊆ V""independent B""V ⊆ span B""card B = dim V" by (meson basis_card_eq_dim empty_subsetI independent_empty maximal_independent_subset_extend)
lemma dim_eq_card_independent: "independent B ==> dim B = card B" by (rule dim_eq_card[OF refl])
lemma dim_span[simp]: "dim (span S) = dim S" by (auto simp add: dim_def span_span)
lemma dim_span_eq_card_independent: "independent B ==> dim (span B) = card B" by (simp add: dim_eq_card)
lemma dim_le_card: assumes"V ⊆ span W""finite W"shows"dim V ≤ card W" proof - obtain A where"independent A""A ⊆ V""V ⊆ span A" using maximal_independent_subset[of V] by force with assms independent_span_bound[of W A] basis_card_eq_dim[of A V] show ?thesis by auto qed
lemma span_eq_dim: "span S = span T ==> dim S = dim T" by (metis dim_span)
corollary dim_le_card': "finite s ==> dim s ≤ card s" by (metis basis_exists card_mono)
lemma span_card_ge_dim: "B ⊆ V ==> V ⊆ span B ==> finite B ==> dim V ≤ card B" by (simp add: dim_le_card)
lemma dim_unique: "B ⊆ V ==> V ⊆ span B ==> independent B ==> card B = n ==> dim V = n" by (metis basis_card_eq_dim)
lemma subspace_sums: "[subspace S; subspace T]==> subspace {x + y|x y. x ∈ S ∧ y ∈ T}" apply (simp add: subspace_def) apply (intro conjI impI allI; clarsimp simp: algebra_simps) using add.left_neutral apply blast apply (metis add.assoc) using scale_right_distrib by blast
end
lemma linear_iff: "linear s1 s2 f ⟷ (vector_space s1 ∧ vector_space s2 ∧ (∀x y. f (x + y) = f x + f y) ∧ (∀c x. f (s1 c x) = s2 c (f x)))" unfolding linear_def module_hom_iff vector_space_def module_def by auto
contextbegin
qualified lemma linear_compose: "linear s1 s2 f ==> linear s2 s3 g ==> linear s1 s3 (g o f)" unfolding module_hom_iff_linear[symmetric] by (rule module_hom_compose) end
locale vector_space_pair = vs1: vector_space s1 + vs2: vector_space s2 for s1 :: "'a::field → 'b::ab_group_add → 'b" (infixr‹*a›75) and s2 :: "'a::field → 'c::ab_group_add → 'c" (infixr‹*b›75) begin
contextfixes f assumes"linear s1 s2 f"begin interpretation linear s1 s2 f by fact lemmas―‹from locale ‹module_hom››
linear_0 = zero and linear_add = add and linear_scale = scale and linear_neg = neg and linear_diff = diff and linear_sum = sum and linear_inj_on_iff_eq_0 = inj_on_iff_eq_0 and linear_inj_iff_eq_0 = inj_iff_eq_0 and linear_subspace_image = subspace_image and linear_subspace_vimage = subspace_vimage and linear_subspace_kernel = subspace_kernel and linear_span_image = span_image and linear_dependent_inj_imageD = dependent_inj_imageD and linear_eq_0_on_span = eq_0_on_span and linear_independent_injective_image = independent_injective_image and linear_inj_on_span_independent_image = inj_on_span_independent_image and linear_inj_on_span_iff_independent_image = inj_on_span_iff_independent_image and linear_subspace_linear_preimage = subspace_linear_preimage and linear_spans_image = spans_image and linear_spanning_surjective_image = spanning_surjective_image end
sublocale module_pair
rewrites "module_hom = linear" by unfold_locales (fact module_hom_eq_linear)
lemmas―‹from locale ‹module_pair››
linear_eq_on_span = module_hom_eq_on_span and linear_compose_scale_right = module_hom_scale and linear_compose_add = module_hom_add and linear_zero = module_hom_zero and linear_compose_sub = module_hom_sub and linear_compose_neg = module_hom_neg and linear_compose_scale = module_hom_compose_scale
lemma linear_indep_image_lemma: assumes lf: "linear s1 s2 f" and fB: "finite B" and ifB: "vs2.independent (f ` B)" and fi: "inj_on f B" and xsB: "x ∈ vs1.span B" and fx: "f x = 0" shows"x = 0" using fB ifB fi xsB fx proof (induction B arbitrary: x rule: finite_induct) case empty thenshow ?caseby auto next case (insert a b x) have th0: "f ` b ⊆ f ` (insert a b)" by (simp add: subset_insertI) have ifb: "vs2.independent (f ` b)" using vs2.independent_mono insert.prems(1) th0 by blast have fib: "inj_on f b" using insert.prems(2) by blast from vs1.span_breakdown[of a "insert a b", simplified, OF insert.prems(3)] obtain k where k: "x - k *a a ∈ vs1.span (b - {a})" by blast have"f (x - k *a a) ∈ vs2.span (f ` b)" unfolding linear_span_image[OF lf] using"insert.hyps"(2) k by auto thenhave"f x - k *b f a ∈ vs2.span (f ` b)" by (simp add: linear_diff linear_scale lf) thenhave th: "-k *b f a ∈ vs2.span (f ` b)" using insert.prems(4) by simp have xsb: "x ∈ vs1.span b" proof (cases "k = 0") case True with k have"x ∈ vs1.span (b - {a})"by simp thenshow ?thesis using vs1.span_mono[of "b - {a}" b] by blast next case False from inj_on_image_set_diff[OF insert.prems(2), of "insert a b ""{a}", symmetric] have"f ` insert a b - f ` {a} = f ` (insert a b - {a})"by blast thenhave"f a ∉ vs2.span (f ` b)" using vs2.dependent_def insert.hyps(2) insert.prems(1) by fastforce moreoverhave"f a ∈ vs2.span (f ` b)" using False vs2.span_scale[OF th, of "- 1/ k"] by auto ultimatelyhave False by blast thenshow ?thesis by blast qed show"x = 0" using ifb fib xsb insert.IH insert.prems(4) by blast qed
lemma linear_eq_on: assumes l: "linear s1 s2 f""linear s1 s2 g" assumes x: "x ∈ vs1.span B"and eq: "∧b. b ∈ B ==> f b = g b" shows"f x = g x" proof - interpret d: linear s1 s2 "λx. f x - g x" using l by (intro linear_compose_sub) (auto simp: module_hom_iff_linear) have"f x - g x = 0" by (rule d.eq_0_on_span[OF _ x]) (auto simp: eq) thenshow ?thesis by auto qed
definition construct :: "'b set → ('b → 'c) → ('b → 'c)" where"construct B g v = (∑b | vs1.representation (vs1.extend_basis B) v b ≠ 0. vs1.representation (vs1.extend_basis B) v b *b (if b ∈ B then g b else 0))"
lemma construct_cong: "(∧b. b ∈ B ==> f b = g b) ==> construct B f = construct B g" unfolding construct_def by (auto intro!: sum.cong)
lemma linear_construct: assumes B[simp]: "vs1.independent B" shows"linear s1 s2 (construct B f)" unfolding module_hom_iff_linear linear_iff proof safe have eB[simp]: "vs1.independent (vs1.extend_basis B)" using vs1.independent_extend_basis[OF B] . let ?R = "vs1.representation (vs1.extend_basis B)" fix c x y have"construct B f (x + y) = (∑b∈{b. ?R x b ≠ 0} ∪ {b. ?R y b ≠ 0}. ?R (x + y) b *b (if b ∈ B then f b else 0))" by (auto intro!: sum.mono_neutral_cong_left simp: vs1.finite_representation vs1.representation_add construct_def) alsohave"… = construct B f x + construct B f y" by (auto simp: construct_def vs1.representation_add vs2.scale_left_distrib sum.distrib
intro!: arg_cong2[where f="(+)"] sum.mono_neutral_cong_right vs1.finite_representation) finallyshow"construct B f (x + y) = construct B f x + construct B f y" .
show"construct B f (c *a x) = c *b construct B f x" by (auto simp del: vs2.scale_scale intro!: sum.mono_neutral_cong_left vs1.finite_representation
simp add: construct_def vs2.scale_scale[symmetric] vs1.representation_scale vs2.scale_sum_right) qed intro_locales
lemma construct_basis: assumes B[simp]: "vs1.independent B"and b: "b ∈ B" shows"construct B f b = f b" proof - have *: "vs1.representation (vs1.extend_basis B) b = (λv. if v = b then 1 else 0)" using vs1.extend_basis_superset[OF B] b by (intro vs1.representation_basis vs1.independent_extend_basis) auto thenhave"{v. vs1.representation (vs1.extend_basis B) b v ≠ 0} = {b}" by auto thenshow ?thesis unfolding construct_def by (simp add: * b) qed
lemma construct_outside: assumes B: "vs1.independent B"and v: "v ∈ vs1.span (vs1.extend_basis B - B)" shows"construct B f v = 0" unfolding construct_def proof (clarsimp intro!: sum.neutral simp del: vs2.scale_eq_0_iff) fix b assume"b ∈ B" thenhave"vs1.representation (vs1.extend_basis B - B) v b = 0" using vs1.representation_ne_zero[of "vs1.extend_basis B - B" v b] by auto moreoverhave"vs1.representation (vs1.extend_basis B) v = vs1.representation (vs1.extend_basis B - B) v" using vs1.representation_extend[OF vs1.independent_extend_basis[OF B] v] by auto ultimatelyshow"vs1.representation (vs1.extend_basis B) v b *b f b = 0" by simp qed
lemma construct_add: assumes B[simp]: "vs1.independent B" shows"construct B (λx. f x + g x) v = construct B f v + construct B g v" proof (rule linear_eq_on) show"v ∈ vs1.span (vs1.extend_basis B)"by simp show"b ∈ vs1.extend_basis B ==> construct B (λx. f x + g x) b = construct B f b + construct B g b"for b using construct_outside[OF B vs1.span_base, of b] by (cases "b ∈ B") (auto simp: construct_basis) qed (intro linear_compose_add linear_construct B)+
lemma construct_scale: assumes B[simp]: "vs1.independent B" shows"construct B (λx. c *b f x) v = c *b construct B f v" proof (rule linear_eq_on) show"v ∈ vs1.span (vs1.extend_basis B)"by simp show"b ∈ vs1.extend_basis B ==> construct B (λx. c *b f x) b = c *b construct B f b"for b using construct_outside[OF B vs1.span_base, of b] by (cases "b ∈ B") (auto simp: construct_basis) qed (intro linear_construct module_hom_scale B)+
lemma construct_in_span: assumes B[simp]: "vs1.independent B" shows"construct B f v ∈ vs2.span (f ` B)" proof - interpret c: linear s1 s2 "construct B f"by (rule linear_construct) fact let ?R = "vs1.representation B" have"v ∈ vs1.span ((vs1.extend_basis B - B) ∪ B)" by (auto simp: Un_absorb2 vs1.extend_basis_superset) thenobtain x y where"v = x + y""x ∈ vs1.span (vs1.extend_basis B - B)""y ∈ vs1.span B" unfolding vs1.span_Un by auto moreoverhave"construct B f (∑b | ?R y b ≠ 0. ?R y b *a b) ∈ vs2.span (f ` B)" by (auto simp add: c.sum c.scale construct_basis vs1.representation_ne_zero
intro!: vs2.span_sum vs2.span_scale intro: vs2.span_base ) ultimatelyshow"construct B f v ∈ vs2.span (f ` B)" by (auto simp add: c.add construct_outside vs1.sum_nonzero_representation_eq) qed
lemma linear_compose_sum: assumes lS: "∀a ∈ S. linear s1 s2 (f a)" shows"linear s1 s2 (λx. sum (λa. f a x) S)" proof (cases "finite S") case True thenshow ?thesis using lS by induct (simp_all add: linear_zero linear_compose_add) next case False thenshow ?thesis by (simp add: linear_zero) qed
lemma in_span_in_range_construct: "x ∈ range (construct B f)"if i: "vs1.independent B"and x: "x ∈ vs2.span (f ` B)" proof - interpret linear "(*a)""(*b)""construct B f" using i by (rule linear_construct) obtain bb :: "('b → 'c) → ('b → 'c) → 'b set → 'b"where "∀x0 x1 x2. (∃v4. v4 ∈ x2 ∧ x1 v4 ≠ x0 v4) = (bb x0 x1 x2 ∈ x2 ∧ x1 (bb x0 x1 x2) ≠ x0 (bb x0 x1 x2))" by moura thenhave f2: "∀B Ba f fa. (B ≠ Ba ∨ bb fa f Ba ∈ Ba ∧ f (bb fa f Ba) ≠ fa (bb fa f Ba)) ∨ f ` B = fa ` Ba" by (meson image_cong) have"vs1.span B ⊆ vs1.span (vs1.extend_basis B)" by (simp add: vs1.extend_basis_superset[OF i] vs1.span_mono) thenshow"x ∈ range (construct B f)" using f2 x by (metis (no_types) construct_basis[OF i, of _ f]
vs1.span_extend_basis[OF i] subsetD span_image spans_image) qed
lemma range_construct_eq_span: "range (construct B f) = vs2.span (f ` B)" if"vs1.independent B" by (auto simp: that construct_in_span in_span_in_range_construct)
lemma linear_independent_extend_subspace: ―‹legacy: use term‹construct› instead› assumes"vs1.independent B" shows"∃g. linear s1 s2 g ∧ (∀x∈B. g x = f x) ∧ range g = vs2.span (f`B)" by (rule exI[where x="construct B f"])
(auto simp: linear_construct assms construct_basis range_construct_eq_span)
lemma linear_independent_extend: "vs1.independent B ==>∃g. linear s1 s2 g ∧ (∀x∈B. g x = f x)" using linear_independent_extend_subspace[of B f] by auto
lemma linear_exists_left_inverse_on: assumes lf: "linear s1 s2 f" assumes V: "vs1.subspace V"and f: "inj_on f V" shows"∃g. g ` UNIV ⊆ V ∧ linear s2 s1 g ∧ (∀v∈V. g (f v) = v)" proof - interpret linear s1 s2 f by fact obtain B where V_eq: "V = vs1.span B"and B: "vs1.independent B" using vs1.maximal_independent_subset[of V] vs1.span_minimal[OF _ ‹vs1.subspace V›] by (metis antisym_conv) have f: "inj_on f (vs1.span B)" using f unfolding V_eq . show ?thesis proof (intro exI ballI conjI) interpret p: vector_space_pair s2 s1 by unfold_locales have fB: "vs2.independent (f ` B)" using independent_injective_image[OF B f] . let ?g = "p.construct (f ` B) (the_inv_into B f)" show"linear (*b) (*a) ?g" by (rule p.linear_construct[OF fB]) have"?g b ∈ vs1.span (the_inv_into B f ` f ` B)"for b by (intro p.construct_in_span fB) moreoverhave"the_inv_into B f ` f ` B = B" by (auto simp: image_comp comp_def the_inv_into_f_f inj_on_subset[OF f vs1.span_superset]
cong: image_cong) ultimatelyshow"?g ` UNIV ⊆ V" by (auto simp: V_eq) have"(?g ∘ f) v = id v"if"v ∈ vs1.span B"for v proof (rule vector_space_pair.linear_eq_on[where x=v]) show"vector_space_pair (*a) (*a)"by unfold_locales show"linear (*a) (*a) (?g ∘ f)" proof (rule Vector_Spaces.linear_compose[of _ "(*b)"]) show"linear (*a) (*b) f" by unfold_locales qed fact show"linear (*a) (*a) id"by (rule vs1.linear_id) show"v ∈ vs1.span B"by fact show"b ∈ B ==> (p.construct (f ` B) (the_inv_into B f) ∘ f) b = id b"for b by (simp add: p.construct_basis fB the_inv_into_f_f inj_on_subset[OF f vs1.span_superset]) qed thenshow"v ∈ V ==> ?g (f v) = v"for v by (auto simp: comp_def id_def V_eq) qed qed
lemma linear_exists_right_inverse_on: assumes lf: "linear s1 s2 f" assumes"vs1.subspace V" shows"∃g. g ` UNIV ⊆ V ∧ linear s2 s1 g ∧ (∀v∈f ` V. f (g v) = v)" proof - obtain B where V_eq: "V = vs1.span B"and B: "vs1.independent B" using vs1.maximal_independent_subset[of V] vs1.span_minimal[OF _ ‹vs1.subspace V›] by (metis antisym_conv) obtain C where C: "vs2.independent C"and fB_C: "f ` B ⊆ vs2.span C""C ⊆ f ` B" using vs2.maximal_independent_subset[of "f ` B"] by metis thenhave"∀v∈C. ∃b∈B. v = f b"by auto thenobtain g where g: "∧v. v ∈ C ==> g v ∈ B""∧v. v ∈ C ==> f (g v) = v"by metis show ?thesis proof (intro exI ballI conjI) interpret p: vector_space_pair s2 s1 by unfold_locales let ?g = "p.construct C g" show"linear (*b) (*a) ?g" by (rule p.linear_construct[OF C]) have"?g v ∈ vs1.span (g ` C)"for v by (rule p.construct_in_span[OF C]) alsohave"…⊆ V"unfolding V_eq using g by (intro vs1.span_mono) auto finallyshow"?g ` UNIV ⊆ V"by auto have"(f ∘ ?g) v = id v"if v: "v ∈ f ` V"for v proof (rule vector_space_pair.linear_eq_on[where x=v]) show"vector_space_pair (*b) (*b)"by unfold_locales show"linear (*b) (*b) (f ∘ ?g)" by (rule Vector_Spaces.linear_compose[of _ "(*a)"]) fact+ show"linear (*b) (*b) id"by (rule vs2.linear_id) have"vs2.span (f ` B) = vs2.span C" using fB_C vs2.span_mono[of C "f ` B"] vs2.span_minimal[of "f`B""vs2.span C"] by auto thenshow"v ∈ vs2.span C" using v linear_span_image[OF lf, of B] by (simp add: V_eq) show"(f ∘ p.construct C g) b = id b"if b: "b ∈ C"for b by (auto simp: p.construct_basis g C b) qed thenshow"v ∈ f ` V ==> f (?g v) = v"for v by (auto simp: comp_def id_def) qed qed
lemma linear_inj_on_left_inverse: assumes lf: "linear s1 s2 f" assumes fi: "inj_on f (vs1.span S)" shows"∃g. range g ⊆ vs1.span S ∧ linear s2 s1 g ∧ (∀x∈vs1.span S. g (f x) = x)" using linear_exists_left_inverse_on[OF lf vs1.subspace_span fi] by (auto simp: linear_iff_module_hom)
lemma linear_injective_left_inverse: "linear s1 s2 f ==> inj f ==>∃g. linear s2 s1 g ∧ g ∘ f = id" using linear_inj_on_left_inverse[of f UNIV] by force
lemma linear_surj_right_inverse: assumes lf: "linear s1 s2 f" assumes sf: "vs2.span T ⊆ f`vs1.span S" shows"∃g. range g ⊆ vs1.span S ∧ linear s2 s1 g ∧ (∀x∈vs2.span T. f (g x) = x)" using linear_exists_right_inverse_on[OF lf vs1.subspace_span, of S] sf by (force simp: linear_iff_module_hom)
lemma linear_surjective_right_inverse: "linear s1 s2 f ==> surj f ==>∃g. linear s2 s1 g ∧ f ∘ g = id" using linear_surj_right_inverse[of f UNIV UNIV] by (auto simp: fun_eq_iff)
lemma finite_basis_to_basis_subspace_isomorphism: assumes s: "vs1.subspace S" and t: "vs2.subspace T" and d: "vs1.dim S = vs2.dim T" and fB: "finite B" and B: "B ⊆ S""vs1.independent B""S ⊆ vs1.span B""card B = vs1.dim S" and fC: "finite C" and C: "C ⊆ T""vs2.independent C""T ⊆ vs2.span C""card C = vs2.dim T" shows"∃f. linear s1 s2 f ∧ f ` B = C ∧ f ` S = T ∧ inj_on f S" proof - from B(4) C(4) card_le_inj[of B C] d obtain f where
f: "f ` B ⊆ C""inj_on f B"using‹finite B›‹finite C›by auto from linear_independent_extend[OF B(2)] obtain g where
g: "linear s1 s2 g""∀x ∈ B. g x = f x"by blast interpret g: linear s1 s2 g by fact from inj_on_iff_eq_card[OF fB, of f] f(2) have"card (f ` B) = card B"by simp with B(4) C(4) have ceq: "card (f ` B) = card C"using d by simp have"g ` B = f ` B"using g(2) by (auto simp add: image_iff) alsohave"… = C"using card_subset_eq[OF fC f(1) ceq] . finallyhave gBC: "g ` B = C" . have gi: "inj_on g B"using f(2) g(2) by (auto simp add: inj_on_def) note g0 = linear_indep_image_lemma[OF g(1) fB, unfolded gBC, OF C(2) gi]
{ fix x y assume x: "x ∈ S"and y: "y ∈ S"and gxy: "g x = g y" from B(3) x y have x': "x ∈ vs1.span B"and y': "y ∈ vs1.span B" by blast+ from gxy have th0: "g (x - y) = 0" by (simp add: g.diff) have th1: "x - y ∈ vs1.span B"using x' y' by (metis vs1.span_diff) have"x = y"using g0[OF th1 th0] by simp
} thenhave giS: "inj_on g S"unfolding inj_on_def by blast from vs1.span_subspace[OF B(1,3) s] have"g ` S = vs2.span (g ` B)" by (simp add: g.span_image) alsohave"… = vs2.span C" unfolding gBC .. alsohave"… = T" using vs2.span_subspace[OF C(1,3) t] . finallyhave gS: "g ` S = T" . from g(1) gS giS gBC show ?thesis by blast qed
end
locale finite_dimensional_vector_space = vector_space + fixes Basis :: "'b set" assumes finite_Basis: "finite Basis" and independent_Basis: "independent Basis" and span_Basis: "span Basis = UNIV" begin
definition"dimension = card Basis"
lemma finiteI_independent: "independent B ==> finite B" using independent_span_bound[OF finite_Basis, of B] by (auto simp: span_Basis)
lemma dim_insert: "dim (insert x S) = (if x ∈ span S then dim S else dim S + 1)" proof - show ?thesis proof (cases "x ∈ span S") case True thenshow ?thesis by (metis dim_span span_redundant) next case False obtain B where B: "B ⊆ span S""independent B""span S ⊆ span B""card B = dim (span S)" using basis_exists [of "span S"] by blast have"dim (span (insert x S)) = Suc (dim S)" proof (rule dim_unique) show"insert x B ⊆ span (insert x S)" by (meson B(1) insertI1 insert_subset order_trans span_base span_mono subset_insertI) show"span (insert x S) ⊆ span (insert x B)" by (metis ‹B ⊆ span S›‹span S ⊆ span B› span_breakdown_eq span_subspace subsetI subspace_span) show"independent (insert x B)" by (metis B(1-3) independent_insert span_subspace subspace_span False) show"card (insert x B) = Suc (dim S)" using B False finiteI_independent by force qed thenshow ?thesis by (metis False Suc_eq_plus1 dim_span) qed qed
lemma dim_singleton [simp]: "dim{x} = (if x = 0 then 0 else 1)" by (simp add: dim_insert)
proposition choose_subspace_of_subspace: assumes"n ≤ dim S" obtains T where"subspace T""T ⊆ span S""dim T = n" proof - have"∃T. subspace T ∧ T ⊆ span S ∧ dim T = n" using assms proof (induction n) case0thenshow ?caseby (auto intro!: exI[where x="{0}"] span_zero) next case (Suc n) thenobtain T where"subspace T""T ⊆ span S""dim T = n" by force thenshow ?case proof (cases "span S ⊆ span T") case True have"span T ⊆ span S" by (simp add: ‹T ⊆ span S› span_minimal) thenhave"dim S = dim T" by (rule span_eq_dim [OF subset_antisym [OF True]]) thenshow ?thesis using Suc.prems ‹dim T = n›by linarith next case False thenobtain y where y: "y ∈ S""y ∉ T" by (meson span_mono subsetI) thenhave"span (insert y T) ⊆ span S" by (metis (no_types) ‹T ⊆ span S› subsetD insert_subset span_superset span_mono span_span) with‹dim T = n›‹subspace T› y show ?thesis apply (rule_tac x="span(insert y T)"in exI) using span_eq_iff by (fastforce simp: dim_insert) qed qed with that show ?thesis by blast qed
lemma basis_subspace_exists: assumes"subspace S" obtains B where"finite B""B ⊆ S""independent B""span B = S""card B = dim S" by (metis assms span_subspace basis_exists finiteI_independent)
lemma dim_mono: assumes"V ⊆ span W"shows"dim V ≤ dim W" proof - obtain B where"independent B""B ⊆ W""W ⊆ span B" using maximal_independent_subset[of W] by force with dim_le_card[of V B] assms independent_span_bound[of Basis B] basis_card_eq_dim[of B W]
span_mono[of B W] span_minimal[OF _ subspace_span, of W B] show ?thesis by (auto simp: finite_Basis span_Basis) qed
lemma dim_subset: "S ⊆ T ==> dim S ≤ dim T" using dim_mono[of S T] by (auto intro: span_base)
lemma dim_eq_0 [simp]: "dim S = 0 ⟷ S ⊆ {0}" by (metis basis_exists card_eq_0_iff dim_span finiteI_independent span_empty subset_empty subset_singletonD)
lemma dim_UNIV[simp]: "dim UNIV = card Basis" using dim_eq_card[of Basis UNIV] by (simp add: independent_Basis span_Basis)
lemma independent_card_le_dim: assumes"B ⊆ V"and"independent B"shows"card B ≤ dim V" by (subst dim_eq_card[symmetric, OF refl ‹independent B›]) (rule dim_subset[OF ‹B ⊆ V›])
lemma dim_subset_UNIV: "dim S ≤ dimension" by (metis dim_subset subset_UNIV dim_UNIV dimension_def)
lemma card_ge_dim_independent: assumes BV: "B ⊆ V" and iB: "independent B" and dVB: "dim V ≤ card B" shows"V ⊆ span B" proof fix a assume aV: "a ∈ V"
{ assume aB: "a ∉ span B" thenhave iaB: "independent (insert a B)" using iB aV BV by (simp add: independent_insert) from aV BV have th0: "insert a B ⊆ V" by blast from aB have"a ∉B" by (auto simp add: span_base) with independent_card_le_dim[OF th0 iaB] dVB finiteI_independent[OF iB] have False by auto
} thenshow"a ∈ span B"by blast qed
lemma card_le_dim_spanning: assumes BV: "B ⊆ V" and VB: "V ⊆ span B" and fB: "finite B" and dVB: "dim V ≥ card B" shows"independent B" proof -
{ fix a assume a: "a ∈ B""a ∈ span (B - {a})" from a fB have c0: "card B ≠ 0" by auto from a fB have cb: "card (B - {a}) = card B - 1" by auto
{ fix x assume x: "x ∈ V" from a have eq: "insert a (B - {a}) = B" by blast from x VB have x': "x ∈ span B" by blast from span_trans[OF a(2), unfolded eq, OF x'] have"x ∈ span (B - {a})" .
} thenhave th1: "V ⊆ span (B - {a})" by blast have th2: "finite (B - {a})" using fB by auto from dim_le_card[OF th1 th2] have c: "dim V ≤ card (B - {a})" . from c c0 dVB cb have False by simp
} thenshow ?thesis unfolding dependent_def by blast qed
lemma card_eq_dim: "B ⊆ V ==> card B = dim V ==> finite B ==> independent B ⟷ V ⊆span B" by (metis order_eq_iff card_le_dim_spanning card_ge_dim_independent)
lemma subspace_dim_equal: assumes"subspace S" and"subspace T" and"S ⊆ T" and"dim S ≥ dim T" shows"S = T" proof - obtain B where B: "B ≤ S""independent B ∧ S ⊆ span B""card B = dim S" using basis_exists[of S] by metis thenhave"span B ⊆ S" using span_mono[of B S] span_eq_iff[of S] assms by metis thenhave"span B = S" using B by auto have"dim S = dim T" using assms dim_subset[of S T] by auto thenhave"T ⊆ span B" using card_eq_dim[of B T] B finiteI_independent assms by auto thenshow ?thesis using assms ‹span B = S›by auto qed
corollary dim_eq_span: shows"[S ⊆ T; dim T ≤ dim S]==> span S = span T" by (simp add: span_mono subspace_dim_equal)
lemma dim_psubset: "span S ⊂ span T ==> dim S < dim T" by (metis (no_types, opaque_lifting) dim_span less_le not_le subspace_dim_equal subspace_span)
lemma dim_eq_full: shows"dim S = dimension ⟷ span S = UNIV" by (metis dim_eq_span dim_subset_UNIV span_Basis span_span subset_UNIV
dim_UNIV dim_span dimension_def)
lemma indep_card_eq_dim_span: assumes"independent B" shows"finite B ∧ card B = dim (span B)" using dim_span_eq_card_independent[OF assms] finiteI_independent[OF assms] by auto
text‹More general size bound lemmas.›
lemma independent_bound_general: "independent S ==> finite S ∧ card S ≤ dim S" by (simp add: dim_eq_card_independent finiteI_independent)
lemma independent_explicit: shows"independent B ⟷ finite B ∧ (∀c. (∑v∈B. c v *s v) = 0 ⟶ (∀v ∈ B. c v = 0))" using independent_bound_general by (fastforce simp: dependent_finite)
proposition dim_sums_Int: assumes"subspace S""subspace T" shows"dim {x + y |x y. x ∈ S ∧ y ∈ T} + dim(S ∩ T) = dim S + dim T" (is"dim ?ST + _ = _") proof - obtain B where B: "B ⊆ S ∩ T""S ∩ T ⊆ span B" and indB: "independent B" and cardB: "card B = dim (S ∩ T)" using basis_exists by metis thenobtain C D where"B ⊆ C""C ⊆ S""independent C""S ⊆ span C" and"B ⊆ D""D ⊆ T""independent D""T ⊆ span D" using maximal_independent_subset_extend by (metis Int_subset_iff ‹B ⊆ S ∩ T› indB) thenhave"finite B""finite C""finite D" by (simp_all add: finiteI_independent indB independent_bound_general) have Beq: "B = C ∩ D" proof (rule spanning_subset_independent [symmetric]) show"independent (C ∩ D)" by (meson ‹independent C› independent_mono inf.cobounded1) qed (use B ‹C ⊆ S›‹D ⊆ T›‹B ⊆ C›‹B ⊆ D›in auto) thenhave Deq: "D = B ∪ (D - C)" by blast have CUD: "C ∪ D ⊆ ?ST" proof (simp, intro conjI) show"C ⊆ ?ST" using span_zero span_minimal [OF _ ‹subspace T›] ‹C ⊆ S›by force show"D ⊆ ?ST" using span_zero span_minimal [OF _ ‹subspace S›] ‹D ⊆ T›by force qed have"a v = 0"if0: "(∑v∈C. a v *s v) + (∑v∈D - C. a v *s v) = 0" and v: "v ∈ C ∪ (D-C)"for a v proof - have CsS: "∧x. x ∈ C ==> a x *s x ∈ S" using‹C ⊆ S›‹subspace S› subspace_scale by auto have eq: "(∑v∈D - C. a v *s v) = - (∑v∈C. a v *s v)" using that add_eq_0_iff by blast have"(∑v∈D - C. a v *s v) ∈ S" by (simp add: eq CsS ‹subspace S› subspace_neg subspace_sum) moreoverhave"(∑v∈D - C. a v *s v) ∈ T" apply (rule subspace_sum [OF ‹subspace T›]) by (meson DiffD1 ‹D ⊆ T›‹subspace T› subset_eq subspace_def) ultimatelyhave"(∑v ∈ D-C. a v *s v) ∈ span B" using B by blast thenobtain e where e: "(∑v∈B. e v *s v) = (∑v ∈ D-C. a v *s v)" using span_finite [OF ‹finite B›] by force have"∧c v. [(∑v∈C. c v *s v) = 0; v ∈ C]==> c v = 0" using‹finite C›‹independent C› independentD by blast define cc where"cc x = (if x ∈ B then a x + e x else a x)"for x have [simp]: "C ∩ B = B""D ∩ B = B""C ∩ - B = C-D""B ∩ (D - C) = {}" using‹B ⊆ C›‹B ⊆ D› Beq by blast+ have f2: "(∑v∈C ∩ D. e v *s v) = (∑v∈D - C. a v *s v)" using Beq e by presburger have f3: "(∑v∈C ∪ D. a v *s v) = (∑v∈C - D. a v *s v) + (∑v∈D - C. a v *s v) + (∑v∈C ∩ D. a v *s v)" using‹finite C›‹finite D› sum.union_diff2 by blast have f4: "(∑v∈C ∪ (D - C). a v *s v) = (∑v∈C. a v *s v) + (∑v∈D - C. a v *s v)" by (meson Diff_disjoint ‹finite C›‹finite D› finite_Diff sum.union_disjoint) have"(∑v∈C. cc v *s v) = 0" using0 f2 f3 f4 apply (simp add: cc_def Beq ‹finite C› sum.If_cases algebra_simps sum.distrib
if_distrib if_distribR) apply (simp add: add.commute add.left_commute diff_eq) done thenhave"∧v. v ∈ C ==> cc v = 0" using independent_explicit ‹independent C›‹finite C›by blast thenhave C0: "∧v. v ∈ C - B ==> a v = 0" by (simp add: cc_def Beq) meson thenhave [simp]: "(∑x∈C - B. a x *s x) = 0" by simp have"(∑x∈C. a x *s x) = (∑x∈B. a x *s x)" proof - have"C - D = C - B" using Beq by blast thenshow ?thesis using Beq ‹(∑x∈C - B. a x *s x) = 0› f3 f4 by auto qed with0have Dcc0: "(∑v∈D. a v *s v) = 0" by (subst Deq) (simp add: ‹finite B›‹finite D› sum_Un) thenhave D0: "∧v. v ∈ D ==> a v = 0" using independent_explicit ‹independent D›‹finite D›by blast show ?thesis using v C0 D0 Beq by blast qed thenhave"independent (C ∪ (D - C))" unfolding independent_explicit using independent_explicit by (simp add: independent_explicit ‹finite C›‹finite D› sum_Un del: Un_Diff_cancel) thenhave indCUD: "independent (C ∪ D)"by simp have"dim (S ∩ T) = card B" by (rule dim_unique [OF B indB refl]) moreoverhave"dim S = card C" by (metis ‹C ⊆ S›‹independent C›‹S ⊆ span C› basis_card_eq_dim) moreoverhave"dim T = card D" by (metis ‹D ⊆ T›‹independent D›‹T ⊆ span D› basis_card_eq_dim) moreoverhave"dim ?ST = card(C ∪ D)" proof - have *: "∧x y. [x ∈ S; y ∈ T]==> x + y ∈ span (C ∪ D)" by (meson ‹S ⊆ span C›‹T ⊆ span D› span_add span_mono subsetCE sup.cobounded1 sup.cobounded2) show ?thesis by (auto intro: * dim_unique [OF CUD _ indCUD refl]) qed ultimatelyshow ?thesis using‹B = C ∩ D› [symmetric] by (simp add: ‹independent C›‹independent D› card_Un_Int finiteI_independent) qed
lemma dependent_biggerset_general: "(finite S ==> card S > dim S) ==> dependent S" using independent_bound_general[of S] by (metis linorder_not_le)
lemma subset_le_dim: "S ⊆ span T ==> dim S ≤ dim T" by (metis dim_span dim_subset)
lemma linear_inj_imp_surj: assumes lf: "linear scale scale f" and fi: "inj f" shows"surj f" proof - interpret lf: linear scale scale f by fact from basis_exists[of UNIV] obtain B where B: "B ⊆ UNIV""independent B""UNIV ⊆ span B""card B = dim UNIV" by blast from B(4) have d: "dim UNIV = card B" by simp have"UNIV ⊆ span (f ` B)" proof (rule card_ge_dim_independent) show"independent (f ` B)" by (simp add: B(2) fi lf.independent_inj_image) have"card (f ` B) = dim UNIV" by (metis B(1) card_image d fi inj_on_subset) thenshow"dim UNIV ≤ card (f ` B)" by simp qed blast thenshow ?thesis unfolding lf.span_image surj_def using B(3) by blast qed
end
locale finite_dimensional_vector_space_pair_1 =
vs1: finite_dimensional_vector_space s1 B1 + vs2: vector_space s2 for s1 :: "'a::field → 'b::ab_group_add → 'b" (infixr‹*a›75) and B1 :: "'b set" and s2 :: "'a::field → 'c::ab_group_add → 'c" (infixr‹*b›75) begin
sublocale vector_space_pair s1 s2 by unfold_locales
lemma dim_image_eq: assumes lf: "linear s1 s2 f" and fi: "inj_on f (vs1.span S)" shows"vs2.dim (f ` S) = vs1.dim S" proof - interpret lf: linear by fact obtain B where B: "B ⊆ S""vs1.independent B""S ⊆ vs1.span B""card B = vs1.dim S" using vs1.basis_exists[of S] by auto thenhave"vs1.span S = vs1.span B" using vs1.span_mono[of B S] vs1.span_mono[of S "vs1.span B"] vs1.span_span[of B] by auto moreoverhave"card (f ` B) = card B" using assms card_image[of f B] inj_on_subset[of f "vs1.span S" B] B vs1.span_superset by auto moreoverhave"(f ` B) ⊆ (f ` S)" using B by auto ultimatelyshow ?thesis by (metis B(2) B(4) fi lf.dependent_inj_imageD lf.span_image vs2.dim_eq_card_independent vs2.dim_span) qed
lemma dim_image_le: assumes lf: "linear s1 s2 f" shows"vs2.dim (f ` S) ≤ vs1.dim (S)" proof - from vs1.basis_exists[of S] obtain B where
B: "B ⊆ S""vs1.independent B""S ⊆ vs1.span B""card B = vs1.dim S"by blast from B have fB: "finite B""card B = vs1.dim S" using vs1.independent_bound_general by blast+ have"vs2.dim (f ` S) ≤ card (f ` B)" apply (rule vs2.span_card_ge_dim) using lf B fB apply (auto simp add: module_hom.span_image module_hom.spans_image subset_image_iff
linear_iff_module_hom) done alsohave"…≤ vs1.dim S" using card_image_le[OF fB(1)] fB by simp finallyshow ?thesis . qed
end
locale finite_dimensional_vector_space_pair =
vs1: finite_dimensional_vector_space s1 B1 + vs2: finite_dimensional_vector_space s2 B2 for s1 :: "'a::field → 'b::ab_group_add → 'b" (infixr‹*a›75) and B1 :: "'b set" and s2 :: "'a::field → 'c::ab_group_add → 'c" (infixr‹*b›75) and B2 :: "'c set" begin
lemma linear_surjective_imp_injective: assumes lf: "linear s1 s2 f"and sf: "surj f"and eq: "vs2.dim UNIV = vs1.dim UNIV" shows"inj f" proof - interpret linear s1 s2 f by fact have *: "card (f ` B1) ≤ vs2.dim UNIV" using vs1.finite_Basis vs1.dim_eq_card[of B1 UNIV] sf by (auto simp: vs1.span_Basis vs1.independent_Basis eq
simp del: vs2.dim_UNIV
intro!: card_image_le) have indep_fB: "vs2.independent (f ` B1)" using vs1.finite_Basis vs1.dim_eq_card[of B1 UNIV] sf * by (intro vs2.card_le_dim_spanning[of "f ` B1" UNIV]) (auto simp: span_image vs1.span_Basis ) have"vs2.dim UNIV ≤ card (f ` B1)" unfolding eq sf[symmetric] vs2.dim_span_eq_card_independent[symmetric, OF indep_fB]
vs2.dim_span by (intro vs2.dim_mono) (auto simp: span_image vs1.span_Basis) with * have"card (f ` B1) = vs2.dim UNIV"by auto alsohave"... = card B1" unfolding eq vs1.dim_UNIV .. finallyhave"inj_on f B1" by (subst inj_on_iff_eq_card[OF vs1.finite_Basis]) thenshow"inj f" using inj_on_span_iff_independent_image[OF indep_fB] vs1.span_Basis by auto qed
lemma linear_injective_imp_surjective: assumes lf: "linear s1 s2 f"and sf: "inj f"and eq: "vs2.dim UNIV = vs1.dim UNIV" shows"surj f" proof - interpret linear s1 s2 f by fact have *: False if b: "b ∉ vs2.span (f ` B1)"for b proof - have *: "vs2.independent (f ` B1)" using vs1.independent_Basis by (intro independent_injective_image inj_on_subset[OF sf]) auto have **: "vs2.independent (insert b (f ` B1))" using b * by (rule vs2.independent_insertI)
have"b ∉ f ` B1"using vs2.span_base[of b "f ` B1"] b by auto thenhave"Suc (card B1) = card (insert b (f ` B1))" using sf[THEN inj_on_subset, of B1] by (subst card.insert_remove) (auto intro: vs1.finite_Basis simp: card_image) alsohave"… = vs2.dim (insert b (f ` B1))" using vs2.dim_eq_card_independent[OF **] by simp alsohave"vs2.dim (insert b (f ` B1)) ≤ vs2.dim B2" by (rule vs2.dim_mono) (auto simp: vs2.span_Basis) alsohave"… = card B1" using vs1.dim_span[of B1] vs2.dim_span[of B2] unfolding vs1.span_Basis vs2.span_Basis eq
vs1.dim_eq_card_independent[OF vs1.independent_Basis] by simp finallyshow False by simp qed have"f ` UNIV = f ` vs1.span B1"unfolding vs1.span_Basis .. alsohave"… = vs2.span (f ` B1)"unfolding span_image .. alsohave"… = UNIV"using * by blast finallyshow ?thesis . qed
lemma linear_injective_isomorphism: assumes lf: "linear s1 s2 f" and fi: "inj f" and dims: "vs2.dim UNIV = vs1.dim UNIV" shows"∃f'. linear s2 s1 f' ∧ (∀x. f' (f x) = x) ∧ (∀x. f (f' x) = x)" unfolding isomorphism_expand[symmetric] using linear_injective_imp_surjective[OF lf fi dims] using fi left_right_inverse_eq lf linear_injective_left_inverse linear_surjective_right_inverse by blast
lemma linear_surjective_isomorphism: assumes lf: "linear s1 s2 f" and sf: "surj f" and dims: "vs2.dim UNIV = vs1.dim UNIV" shows"∃f'. linear s2 s1 f' ∧ (∀x. f' (f x) = x) ∧ (∀x. f (f' x) = x)" using linear_surjective_imp_injective[OF lf sf dims] sf
linear_exists_right_inverse_on[OF lf vs1.subspace_UNIV]
linear_exists_left_inverse_on[OF lf vs1.subspace_UNIV]
dims lf linear_injective_isomorphism by auto
lemma basis_to_basis_subspace_isomorphism: assumes s: "vs1.subspace S" and t: "vs2.subspace T" and d: "vs1.dim S = vs2.dim T" and B: "B ⊆ S""vs1.independent B""S ⊆ vs1.span B""card B = vs1.dim S" and C: "C ⊆ T""vs2.independent C""T ⊆ vs2.span C""card C = vs2.dim T" shows"∃f. linear s1 s2 f ∧ f ` B = C ∧ f ` S = T ∧ inj_on f S" proof - from B have fB: "finite B" by (simp add: vs1.finiteI_independent) from C have fC: "finite C" by (simp add: vs2.finiteI_independent) from finite_basis_to_basis_subspace_isomorphism[OF s t d fB B fC C] show ?thesis . qed
lemma basis_change_exists': assumes"vs1.independent B""vs2.independent B'" assumes"vs1.span B = UNIV""vs2.span B' = UNIV""vs1.dimension = vs2.dimension" shows"∃g. linear s1 s2 g ∧ bij g ∧ bij_betw g B B'" proof - have"finite B""finite B'" using assms by (auto intro: vs1.finiteI_independent vs2.finiteI_independent) moreoverfrom assms have"card B = card B'" by (metis vs1.dim_span vs2.dim_span vs1.dim_UNIV vs2.dim_UNIV vs1.dimension_def vs2.dimension_def
vs1.dim_eq_card_independent vs2.dim_eq_card_independent) ultimatelyobtain h where h: "bij_betw h B B'" using‹card B = card B'›by (meson bij_betw_iff_card)
define g where"g = construct B h" interpret g: Vector_Spaces.linear s1 s2 g unfolding g_def by (rule linear_construct) fact
have"bij_betw g B B' ⟷ bij_betw h B B'" using assms(1) by (intro bij_betw_cong) (auto simp: g_def construct_basis) hence"bij_betw g B B'" using h by simp moreoverfrom this have"bij g" using assms(3-5) by (metis bij_betw_imp_surj_on bij_def g.linear_axioms local.linear_span_image local.linear_surjective_imp_injective vs1.dim_UNIV vs1.dimension_def
vs2.dim_UNIV vs2.dimension_def) ultimatelyshow ?thesis using g.linear_axioms by blast qed
lemma basis_change_exists: assumes"vs1.dimension = vs2.dimension" shows"∃g. linear s1 s2 g ∧ bij g ∧ bij_betw g B1 B2" using basis_change_exists'[OF vs1.independent_Basis vs2.independent_Basis
vs1.span_Basis vs2.span_Basis assms] .
end
context finite_dimensional_vector_space begin
lemma linear_surj_imp_inj: assumes lf: "linear scale scale f"and sf: "surj f" shows"inj f" proof - interpret finite_dimensional_vector_space_pair scale Basis scale Basis by unfold_locales let ?U = "UNIV :: 'b set" from basis_exists[of ?U] obtain B where B: "B ⊆ ?U""independent B""?U ⊆ span B"and d: "card B = dim ?U" by blast
{ fix x assume x: "x ∈ span B"and fx: "f x = 0" from B(2) have fB: "finite B" using finiteI_independent by auto have Uspan: "UNIV ⊆ span (f ` B)" by (simp add: B(3) lf linear_spanning_surjective_image sf) have fBi: "independent (f ` B)" proof (rule card_le_dim_spanning) show"card (f ` B) ≤ dim ?U" using card_image_le d fB by fastforce qed (use fB Uspan in auto) have th0: "dim ?U ≤ card (f ` B)" by (rule span_card_ge_dim) (use Uspan fB in auto) moreoverhave"card (f ` B) ≤ card B" by (rule card_image_le, rule fB) ultimatelyhave th1: "card B = card (f ` B)" unfolding d by arith have fiB: "inj_on f B" by (simp add: eq_card_imp_inj_on fB th1) from linear_indep_image_lemma[OF lf fB fBi fiB x] fx have"x = 0"by blast
} thenshow ?thesis unfolding linear_inj_iff_eq_0[OF lf] using B(3) by blast qed
lemma linear_inverse_left: assumes lf: "linear scale scale f" and lf': "linear scale scale f'" shows"f ∘ f' = id ⟷ f' ∘ f = id" proof -
{ fix f f':: "'b → 'b" assume lf: "linear scale scale f""linear scale scale f'" assume f: "f ∘ f' = id" from f have sf: "surj f" by (auto simp add: o_def id_def surj_def) metis interpret finite_dimensional_vector_space_pair scale Basis scale Basis by unfold_locales from linear_surjective_isomorphism[OF lf(1) sf] lf f have"f' ∘ f = id" unfolding fun_eq_iff o_def id_def by metis
} thenshow ?thesis using lf lf' by metis qed
lemma left_inverse_linear: assumes lf: "linear scale scale f" and gf: "g ∘ f = id" shows"linear scale scale g" proof - from gf have fi: "inj f" by (auto simp add: inj_on_def o_def id_def fun_eq_iff) metis interpret finite_dimensional_vector_space_pair scale Basis scale Basis by unfold_locales from linear_injective_isomorphism[OF lf fi] obtain h :: "'b → 'b"where"linear scale scale h"and h: "∀x. h (f x) = x""∀x. f (h x) = x" by blast have"h = g" by (metis gf h isomorphism_expand left_right_inverse_eq) with‹linear scale scale h›show ?thesis by blast qed
lemma inj_linear_imp_inv_linear: assumes"linear scale scale f""inj f"shows"linear scale scale (inv f)" using assms inj_iff left_inverse_linear by blast
lemma right_inverse_linear: assumes lf: "linear scale scale f" and gf: "f ∘ g = id" shows"linear scale scale g" proof - from gf have fi: "surj f" by (auto simp add: surj_def o_def id_def) metis interpret finite_dimensional_vector_space_pair scale Basis scale Basis by unfold_locales from linear_surjective_isomorphism[OF lf fi] obtain h:: "'b → 'b"where h: "linear scale scale h""∀x. h (f x) = x""∀x. f (h x) = x" by blast thenhave"h = g" by (metis gf isomorphism_expand left_right_inverse_eq) with h(1) show ?thesis by blast qed
lemma linear_independent_extend_inj: assumes"independent B""independent (f ` B)""inj_on f B" shows"∃g. linear scale scale g ∧ inj g ∧ (∀x∈B. g x = f x)" proof - obtain B' where B': "span B' = UNIV""B ⊆ B'""independent B'" using assms(1) by (meson extend_basis_superset independent_extend_basis span_extend_basis) obtain B'' where B'': "span B'' = UNIV""f ` B ⊆ B''""independent B''" using assms(2) by (meson extend_basis_superset independent_extend_basis span_extend_basis) have"card B' = card B''" using B' B'' by (metis local.dim_eq_card) hence"card (B' - B) = card (B'' - f ` B)" using finiteI_independent[OF assms(1)] B' B'' by (subst (12) card_Diff_subset) (auto simp: card_image[OF ‹inj_on f B›]) hence"∃h. bij_betw h (B' - B) (B'' - f ` B)" using finiteI_independent[of B'] finiteI_independent[of B''] B' B'' by (intro finite_same_card_bij) auto thenobtain h where h: "bij_betw h (B' - B) (B'' - f ` B)" by blast
have [simp, intro]: "finite B'" using finiteI_independent[of B'] B' by auto define r where"r = representation B'" define g where"g = (λv. ∑b∈B'. scale (r v b) (if b ∈ B then f b else h b))" interpret pair: vector_space_pair scale scale .. interpret g: Vector_Spaces.linear scale scale g unfolding g_def r_def by (intro pair.module_hom_sum pair.linear_compose_scale linear_representation B' conjI module_axioms)
have g_B: "g b = f b"if"b ∈ B"for b proof - from that have"g b = (∑b'∈{b}. f b)" unfolding g_def using B' by (intro sum.mono_neutral_cong_right) (auto simp: r_def representation_basis) thus"g b = f b" by simp qed
have g_not_B: "g b = h b"if"b ∈ B' - B"for b proof - from that have"g b = (∑b'∈{b}. h b)" unfolding g_def using B' by (intro sum.mono_neutral_cong_right) (auto simp: r_def representation_basis) thus"g b = h b" by simp qed
show ?thesis proof (rule exI[of _ g]; safe) have"B'' ⊆ range g" proof fix b assume b: "b ∈ B''" thus"b ∈ range g" proof (cases "b ∈ f ` B") case True thenobtain b' where b': "b' ∈ B""f b' = b" by blast thus ?thesis by (auto simp: image_def g_B intro!: exI[of _ b']) next case False with b have"b ∈ B'' - f ` B" by blast thenobtain b' where"h b' = b""b' ∈ B' - B" using h by (metis bij_betw_iff_bijections) thus ?thesis by (intro rev_image_eqI[of b']) (simp_all add: g_not_B) qed qed hence"span B'' ≤ span (range g)" by (intro span_mono) alsohave"span B'' = UNIV" using B'' by simp finallyshow"inj g" by (simp add: g.linear_axioms g.span_image local.linear_surj_imp_inj set_eq_subset) qed (use g_B g.linear_axioms in auto) qed
end
context finite_dimensional_vector_space_pair begin
lemma subspace_isomorphism: assumes s: "vs1.subspace S" and t: "vs2.subspace T" and d: "vs1.dim S = vs2.dim T" shows"∃f. linear s1 s2 f ∧ f ` S = T ∧ inj_on f S" proof - from vs1.basis_exists[of S] vs1.finiteI_independent obtain B where B: "B ⊆ S""vs1.independent B""S ⊆ vs1.span B""card B = vs1.dim S"and fB: "finite B" by metis from vs2.basis_exists[of T] vs2.finiteI_independent obtain C where C: "C ⊆ T""vs2.independent C""T ⊆ vs2.span C""card C = vs2.dim T"and fC: "finite C" by metis from B(4) C(4) card_le_inj[of B C] d obtain f where f: "f ` B ⊆ C""inj_on f B"using‹finite B›‹finite C› by auto from linear_independent_extend[OF B(2)] obtain g where g: "linear s1 s2 g""∀x∈ B. g x = f x" by blast interpret g: linear s1 s2 g by fact from inj_on_iff_eq_card[OF fB, of f] f(2) have"card (f ` B) = card B" by simp with B(4) C(4) have ceq: "card (f ` B) = card C" using d by simp have"g ` B = f ` B" using g(2) by (auto simp add: image_iff) alsohave"… = C"using card_subset_eq[OF fC f(1) ceq] . finallyhave gBC: "g ` B = C" . have gi: "inj_on g B" using f(2) g(2) by (auto simp add: inj_on_def) note g0 = linear_indep_image_lemma[OF g(1) fB, unfolded gBC, OF C(2) gi]
{ fix x y assume x: "x ∈ S"and y: "y ∈ S"and gxy: "g x = g y" from B(3) x y have x': "x ∈ vs1.span B"and y': "y ∈ vs1.span B" by blast+ from gxy have th0: "g (x - y) = 0" by (simp add: linear_diff g) have th1: "x - y ∈ vs1.span B" using x' y' by (metis vs1.span_diff) have"x = y" using g0[OF th1 th0] by simp
} thenhave giS: "inj_on g S" unfolding inj_on_def by blast from vs1.span_subspace[OF B(1,3) s] have"g ` S = vs2.span (g ` B)" by (simp add: module_hom.span_image[OF g(1)[unfolded linear_iff_module_hom]]) alsohave"… = vs2.span C"unfolding gBC .. alsohave"… = T"using vs2.span_subspace[OF C(1,3) t] . finallyhave gS: "g ` S = T" . from g(1) gS giS show ?thesis by blast qed
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.