relaxed assumptions for dim_image_eq and dim_image_le
authorimmler
Fri, 13 Jul 2018 12:14:26 +0200
changeset 68620 707437105595
parent 68619 79abf4201e8d
child 68622 0987ae51a3be
relaxed assumptions for dim_image_eq and dim_image_le
src/HOL/Analysis/Euclidean_Space.thy
src/HOL/Types_To_Sets/Examples/Linear_Algebra_On.thy
src/HOL/Types_To_Sets/Examples/Linear_Algebra_On_With.thy
src/HOL/Vector_Spaces.thy
--- a/src/HOL/Analysis/Euclidean_Space.thy	Thu Jul 12 17:23:38 2018 +0100
+++ b/src/HOL/Analysis/Euclidean_Space.thy	Fri Jul 13 12:14:26 2018 +0200
@@ -341,6 +341,11 @@
       intro!: finite_dimensional_vector_space.dimension_def
       finite_dimensional_vector_space_euclidean)
 
+interpretation eucl?: finite_dimensional_vector_space_pair_1
+  "scaleR::real\<Rightarrow>'a::euclidean_space\<Rightarrow>'a" Basis
+  "scaleR::real\<Rightarrow>'b::real_vector \<Rightarrow> 'b"
+  by unfold_locales
+
 interpretation eucl?: finite_dimensional_vector_space_prod scaleR scaleR Basis Basis
   rewrites "Basis_pair = Basis"
     and "module_prod.scale ( *\<^sub>R) ( *\<^sub>R) = (scaleR::_\<Rightarrow>_\<Rightarrow>('a \<times> 'b))"
--- a/src/HOL/Types_To_Sets/Examples/Linear_Algebra_On.thy	Thu Jul 12 17:23:38 2018 +0100
+++ b/src/HOL/Types_To_Sets/Examples/Linear_Algebra_On.thy	Fri Jul 13 12:14:26 2018 +0200
@@ -142,6 +142,14 @@
   for S1:: "'b::ab_group_add set" and S2::"'c::ab_group_add set"
     and scale1::"'a::field \<Rightarrow> _" and scale2::"'a \<Rightarrow> _"
 
+locale finite_dimensional_vector_space_pair_1_on =
+  vs1: finite_dimensional_vector_space_on S1 scale1 Basis1 +
+  vs2: vector_space_on S2 scale2
+  for S1 S2
+    and scale1::"'a::field \<Rightarrow> 'b::ab_group_add \<Rightarrow> 'b"
+    and scale2::"'a::field \<Rightarrow> 'c::ab_group_add \<Rightarrow> 'c"
+    and Basis1
+
 locale finite_dimensional_vector_space_pair_on =
   vs1: finite_dimensional_vector_space_on S1 scale1 Basis1 +
   vs2: finite_dimensional_vector_space_on S2 scale2 Basis2
@@ -489,6 +497,24 @@
   lt2.plus_S lt2.minus_S lt2.uminus_S (lt2.zero_S::'t) lt2.scale_S"
   by (simp add: type_module_pair_on_with vector_space_pair_on_with_def)
 
+sublocale lt1: local_typedef_vector_space_on S1 scale1 s by unfold_locales
+sublocale lt2: local_typedef_vector_space_on S2 scale2 t by unfold_locales
+
+end
+
+locale local_typedef_finite_dimensional_vector_space_pair_1 =
+  lt1: local_typedef_finite_dimensional_vector_space_on S1 scale1 Basis1 s +
+  lt2: local_typedef_vector_space_on S2 scale2 t
+  for S1::"'b::ab_group_add set" and scale1::"'a::field \<Rightarrow> 'b \<Rightarrow> 'b" and Basis1 and s::"'s itself"
+    and S2::"'c::ab_group_add set" and scale2::"'a \<Rightarrow> 'c \<Rightarrow> 'c" and t::"'t itself"
+begin
+
+lemma type_finite_dimensional_vector_space_pair_1_on_with:
+  "finite_dimensional_vector_space_pair_1_on_with UNIV UNIV lt1.plus_S lt1.minus_S lt1.uminus_S (lt1.zero_S::'s) lt1.scale_S lt1.Basis_S
+  lt2.plus_S lt2.minus_S lt2.uminus_S (lt2.zero_S::'t) lt2.scale_S"
+  by (simp add: finite_dimensional_vector_space_pair_1_on_with_def
+      lt1.type_finite_dimensional_vector_space_on_with lt2.type_vector_space_on_with)
+
 end
 
 locale local_typedef_finite_dimensional_vector_space_pair =
@@ -507,6 +533,7 @@
 
 end
 
+
 subsection \<open>Transfer from type-based @{theory HOL.Modules} and @{theory HOL.Vector_Spaces}\<close>
 
 context module_on begin
@@ -964,9 +991,12 @@
 
 interpretation local_typedef_vector_space_pair S1 scale1 "TYPE('s)" S2 scale2 "TYPE('t)" by unfold_locales fact+
 
+
+
 lemmas_with [var_simplified explicit_ab_group_add,
     unoverload_type 'e 'b,
   OF lt2.type.ab_group_add_axioms lt1.type.ab_group_add_axioms type_vector_space_pair_on_with,
+  folded lt1.dim_S_def lt2.dim_S_def,
   untransferred,
   var_simplified implicit_ab_group_add]:
   lt_linear_0 = vector_space_pair.linear_0
@@ -1007,6 +1037,7 @@
 and lt_linear_injective_left_inverse = vector_space_pair.linear_injective_left_inverse
 and lt_linear_surj_right_inverse = vector_space_pair.linear_surj_right_inverse
 and lt_linear_surjective_right_inverse = vector_space_pair.linear_surjective_right_inverse
+and lt_finite_basis_to_basis_subspace_isomorphism = vector_space_pair.finite_basis_to_basis_subspace_isomorphism
 (* should work, but doesnt
 *)
 (* not expected to work:
@@ -1067,9 +1098,42 @@
   and linear_injective_left_inverse = lt_linear_injective_left_inverse
   and linear_surj_right_inverse = lt_linear_surj_right_inverse
   and linear_surjective_right_inverse = lt_linear_surjective_right_inverse
+  and finite_basis_to_basis_subspace_isomorphism = lt_finite_basis_to_basis_subspace_isomorphism
 
 end
 
+context finite_dimensional_vector_space_pair_1_on begin
+
+context includes lifting_syntax
+  notes [transfer_rule del] = Collect_transfer
+  assumes
+    "\<exists>(Rep::'s \<Rightarrow> 'b) (Abs::'b \<Rightarrow> 's). type_definition Rep Abs S1"
+    "\<exists>(Rep::'t \<Rightarrow> 'c) (Abs::'c \<Rightarrow> 't). type_definition Rep Abs S2" begin
+
+interpretation local_typedef_finite_dimensional_vector_space_pair_1 S1 scale1 Basis1 "TYPE('s)" S2 scale2 "TYPE('t)" by unfold_locales fact+
+
+lemmas_with [var_simplified explicit_ab_group_add,
+    unoverload_type 'e 'b,
+  OF lt2.type.ab_group_add_axioms lt1.type.ab_group_add_axioms type_finite_dimensional_vector_space_pair_1_on_with,
+  folded lt1.dim_S_def lt2.dim_S_def,
+  untransferred,
+  var_simplified implicit_ab_group_add]:
+   lt_dim_image_eq = finite_dimensional_vector_space_pair_1.dim_image_eq
+and lt_dim_image_le = finite_dimensional_vector_space_pair_1.dim_image_le
+
+end
+
+lemmas_with [cancel_type_definition, OF vs1.S_ne,
+    cancel_type_definition, OF vs2.S_ne,
+    folded subset_iff' top_set_def,
+    simplified pred_fun_def,
+    simplified\<comment>\<open>too much?\<close>]:
+  dim_image_eq = lt_dim_image_eq
+and dim_image_le = lt_dim_image_le
+
+end
+
+
 context finite_dimensional_vector_space_pair_on begin
 
 context includes lifting_syntax
@@ -1090,9 +1154,7 @@
 and lt_linear_injective_imp_surjective = finite_dimensional_vector_space_pair.linear_injective_imp_surjective
 and lt_linear_injective_isomorphism = finite_dimensional_vector_space_pair.linear_injective_isomorphism
 and lt_linear_surjective_isomorphism = finite_dimensional_vector_space_pair.linear_surjective_isomorphism
-and lt_dim_image_eq = finite_dimensional_vector_space_pair.dim_image_eq
 and lt_basis_to_basis_subspace_isomorphism = finite_dimensional_vector_space_pair.basis_to_basis_subspace_isomorphism
-and lt_dim_image_le = finite_dimensional_vector_space_pair.dim_image_le
 and lt_subspace_isomorphism = finite_dimensional_vector_space_pair.subspace_isomorphism
 
 end
@@ -1106,9 +1168,7 @@
 and linear_injective_imp_surjective = lt_linear_injective_imp_surjective
 and linear_injective_isomorphism = lt_linear_injective_isomorphism
 and linear_surjective_isomorphism = lt_linear_surjective_isomorphism
-and dim_image_eq = lt_dim_image_eq
 and basis_to_basis_subspace_isomorphism = lt_basis_to_basis_subspace_isomorphism
-and dim_image_le = lt_dim_image_le
 and subspace_isomorphism = lt_subspace_isomorphism
 
 end
--- a/src/HOL/Types_To_Sets/Examples/Linear_Algebra_On_With.thy	Thu Jul 12 17:23:38 2018 +0100
+++ b/src/HOL/Types_To_Sets/Examples/Linear_Algebra_On_With.thy	Fri Jul 13 12:14:26 2018 +0200
@@ -119,6 +119,11 @@
     \<not> dependent_with pls zero scl basis \<and>
     span_with pls zero scl basis = S"
 
+definition "finite_dimensional_vector_space_pair_1_on_with S S' pls mns um zero (scl::'a::field\<Rightarrow>_) b
+  pls' mns' um' zero' (scl'::'a::field\<Rightarrow>_) \<longleftrightarrow>
+  finite_dimensional_vector_space_on_with S pls mns um zero (scl::'a::field\<Rightarrow>_) b \<and>
+  vector_space_on_with S' pls' mns' um' zero' (scl'::'a::field\<Rightarrow>_)"
+
 definition "finite_dimensional_vector_space_pair_on_with S S' pls mns um zero (scl::'a::field\<Rightarrow>_) b
   pls' mns' um' zero' (scl'::'a::field\<Rightarrow>_) b' \<longleftrightarrow>
   finite_dimensional_vector_space_on_with S pls mns um zero (scl::'a::field\<Rightarrow>_) b \<and>
@@ -239,6 +244,13 @@
   by (auto simp: module_pair_on_with_def explicit_ab_group_add
       vector_space_pair_on_with_def vector_space_pair_def module_on_with_def vector_space_on_with_def)
 
+lemma finite_dimensional_vector_space_pair_1_with[explicit_ab_group_add]:
+  "finite_dimensional_vector_space_pair_1 s1 b1 s2 \<longleftrightarrow>
+    finite_dimensional_vector_space_pair_1_on_with UNIV UNIV (+) (-) uminus 0 s1 b1 (+) (-) uminus 0 s2"
+  by (auto simp: finite_dimensional_vector_space_pair_1_def
+      finite_dimensional_vector_space_pair_1_on_with_def finite_dimensional_vector_space_on_with
+      vector_space_on_with)
+
 lemma finite_dimensional_vector_space_pair_with[explicit_ab_group_add]:
   "finite_dimensional_vector_space_pair s1 b1 s2 b2 \<longleftrightarrow>
     finite_dimensional_vector_space_pair_on_with UNIV UNIV (+) (-) uminus 0 s1 b1 (+) (-) uminus 0 s2 b2"
@@ -261,21 +273,24 @@
   using that
   by (auto simp: vector_space_pair_on_with_def module_pair_on_with_def vector_space_on_with_def)
 
+lemma finite_dimensional_vector_space_pair_1_with_imp_with[explicit_ab_group_add]:
+  "vector_space_on_with S (+) (-) uminus 0 s"
+  "finite_dimensional_vector_space_on_with S (+) (-) uminus 0 s b"
+  "vector_space_on_with T (+) (-) uminus 0 t"
+  if "finite_dimensional_vector_space_pair_1_on_with S T (+) (-) uminus 0 s b (+) (-) uminus 0 t"
+  using that
+  unfolding finite_dimensional_vector_space_pair_1_on_with_def
+  by (simp_all add: finite_dimensional_vector_space_on_with_def)
+
 lemma finite_dimensional_vector_space_pair_with_imp_finite_dimensional_vector_space_with[explicit_ab_group_add]:
-  "finite_dimensional_vector_space_on_with S (+) (-) uminus 0 s b"
+  "vector_space_on_with S (+) (-) uminus 0 s"
+  "finite_dimensional_vector_space_on_with T (+) (-) uminus 0 t c"
+  "vector_space_on_with T (+) (-) uminus 0 t"
   "finite_dimensional_vector_space_on_with T (+) (-) uminus 0 t c"
   if "finite_dimensional_vector_space_pair_on_with S T (+) (-) uminus 0 s b (+) (-) uminus 0 t c"
   using that
   unfolding finite_dimensional_vector_space_pair_on_with_def
-  by simp_all
-
-lemma finite_dimensional_vector_space_pair_with_imp_vector_space_with[explicit_ab_group_add]:
-  \<comment>\<open>this rule is strange: why is it needed, but not the one with \<open>module_with\<close> as conclusions?\<close>
-  "vector_space_on_with S (+) (-) uminus 0 s"
-  "vector_space_on_with T (+) (-) uminus 0 t"
-  if "finite_dimensional_vector_space_pair_on_with S T (+) (-) uminus 0 s b (+) (-) uminus 0 t c"
-  using that
-  by (auto simp: finite_dimensional_vector_space_pair_on_with_def finite_dimensional_vector_space_on_with_def)
+  by (simp_all add: finite_dimensional_vector_space_on_with_def)
 
 lemma finite_dimensional_vector_space_on_with_transfer[transfer_rule]:
   includes lifting_syntax
--- a/src/HOL/Vector_Spaces.thy	Thu Jul 12 17:23:38 2018 +0100
+++ b/src/HOL/Vector_Spaces.thy	Fri Jul 13 12:14:26 2018 +0200
@@ -954,6 +954,56 @@
   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 \<subseteq> S" "vs1.independent B" "S \<subseteq> vs1.span B" "card B = vs1.dim S"
+    and fC: "finite C"
+    and C: "C \<subseteq> T" "vs2.independent C" "T \<subseteq> vs2.span C" "card C = vs2.dim T"
+  shows "\<exists>f. linear s1 s2 f \<and> f ` B = C \<and> f ` S = T \<and> inj_on f S"
+proof -
+  from B(4) C(4) card_le_inj[of B C] d obtain f where
+    f: "f ` B \<subseteq> C" "inj_on f B" using \<open>finite B\<close> \<open>finite C\<close> by auto
+  from linear_independent_extend[OF B(2)] obtain g where
+    g: "linear s1 s2 g" "\<forall>x \<in> 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)
+  also have "\<dots> = C" using card_subset_eq[OF fC f(1) ceq] .
+  finally have 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 \<in> S" and y: "y \<in> S" and gxy: "g x = g y"
+    from B(3) x y have x': "x \<in> vs1.span B" and y': "y \<in> vs1.span B"
+      by blast+
+    from gxy have th0: "g (x - y) = 0"
+      by (simp add: g.diff)
+    have th1: "x - y \<in> vs1.span B" using x' y'
+      by (metis vs1.span_diff)
+    have "x = y" using g0[OF th1 th0] by simp
+  }
+  then have 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)
+  also have "\<dots> = vs2.span C"
+    unfolding gBC ..
+  also have "\<dots> = T"
+    using vs2.span_subspace[OF C(1,3) t] .
+  finally have gS: "g ` S = T" .
+  from g(1) gS giS gBC show ?thesis
+    by blast
+qed
+
 end
 
 lemma surjective_iff_injective_gen:
@@ -1366,6 +1416,54 @@
 
 end
 
+locale finite_dimensional_vector_space_pair_1 =
+  vs1: finite_dimensional_vector_space s1 B1 + vs2: vector_space s2
+  for s1 :: "'a::field \<Rightarrow> 'b::ab_group_add \<Rightarrow> 'b" (infixr "*a" 75)
+  and B1 :: "'b set"
+  and s2 :: "'a::field \<Rightarrow> 'c::ab_group_add \<Rightarrow> '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 \<subseteq> S" "vs1.independent B" "S \<subseteq> vs1.span B" "card B = vs1.dim S"
+    using vs1.basis_exists[of S] by auto
+  then have "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
+  moreover have "card (f ` B) = card B"
+    using assms card_image[of f B] subset_inj_on[of f "vs1.span S" B] B vs1.span_superset by auto
+  moreover have "(f ` B) \<subseteq> (f ` S)"
+    using B by auto
+  ultimately show ?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) \<le> vs1.dim (S)"
+proof -
+  from vs1.basis_exists[of S] obtain B where
+    B: "B \<subseteq> S" "vs1.independent B" "S \<subseteq> 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) \<le> 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
+  also have "\<dots> \<le> vs1.dim S"
+    using card_image_le[OF fB(1)] fB by simp
+  finally show ?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 \<Rightarrow> 'b::ab_group_add \<Rightarrow> 'b" (infixr "*a" 75)
@@ -1374,7 +1472,7 @@
   and B2 :: "'c set"
 begin
 
-sublocale vector_space_pair s1 s2 by unfold_locales
+sublocale finite_dimensional_vector_space_pair_1 ..
 
 lemma linear_surjective_imp_injective:
   assumes lf: "linear s1 s2 f" and sf: "surj f" and eq: "vs2.dim UNIV = vs1.dim UNIV"
@@ -1470,24 +1568,6 @@
     done
 qed
 
-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 \<subseteq> S" "vs1.independent B" "S \<subseteq> vs1.span B" "card B = vs1.dim S"
-    using vs1.basis_exists[of S] by auto
-  then have "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
-  moreover have "card (f ` B) = card B"
-    using assms card_image[of f B] subset_inj_on[of f "vs1.span S" B] B vs1.span_superset by auto
-  moreover have "(f ` B) \<subseteq> (f ` S)"
-    using B by auto
-  ultimately show ?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 basis_to_basis_subspace_isomorphism:
   assumes s: "vs1.subspace S"
     and t: "vs2.subspace T"
@@ -1500,63 +1580,7 @@
     by (simp add: vs1.finiteI_independent)
   from C have fC: "finite C"
     by (simp add: vs2.finiteI_independent)
-  from B(4) C(4) card_le_inj[of B C] d obtain f where
-    f: "f ` B \<subseteq> C" "inj_on f B" using \<open>finite B\<close> \<open>finite C\<close> by auto
-  from linear_independent_extend[OF B(2)] obtain g where
-    g: "linear s1 s2 g" "\<forall>x \<in> 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)
-  also have "\<dots> = C" using card_subset_eq[OF fC f(1) ceq] .
-  finally have 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 \<in> S" and y: "y \<in> S" and gxy: "g x = g y"
-    from B(3) x y have x': "x \<in> vs1.span B" and y': "y \<in> vs1.span B"
-      by blast+
-    from gxy have th0: "g (x - y) = 0"
-      by (simp add: g.diff)
-    have th1: "x - y \<in> vs1.span B" using x' y'
-      by (metis vs1.span_diff)
-    have "x = y" using g0[OF th1 th0] by simp
-  }
-  then have 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)
-  also have "\<dots> = vs2.span C"
-    unfolding gBC ..
-  also have "\<dots> = T"
-    using vs2.span_subspace[OF C(1,3) t] .
-  finally have gS: "g ` S = T" .
-  from g(1) gS giS gBC show ?thesis
-    by blast
-qed
-
-lemma dim_image_le:
-  assumes lf: "linear s1 s2 f"
-  shows "vs2.dim (f ` S) \<le> vs1.dim (S)"
-proof -
-  from vs1.basis_exists[of S] obtain B where
-    B: "B \<subseteq> S" "vs1.independent B" "S \<subseteq> 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) \<le> 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
-  also have "\<dots> \<le> vs1.dim S"
-    using card_image_le[OF fB(1)] fB by simp
-  finally show ?thesis .
+  from finite_basis_to_basis_subspace_isomorphism[OF s t d fB B fC C] show ?thesis .
 qed
 
 end