src/HOL/Algebra/FiniteProduct.thy
changeset 67091 1393c2340eec
parent 63167 0909deb8059b
child 67341 df79ef3b3a41
equal deleted inserted replaced
67090:0ec94bb9cec4 67091:1393c2340eec
    46 lemma foldSetD_imp_finite [simp]: "(A, x) \<in> foldSetD D f e ==> finite A"
    46 lemma foldSetD_imp_finite [simp]: "(A, x) \<in> foldSetD D f e ==> finite A"
    47   by (induct set: foldSetD) auto
    47   by (induct set: foldSetD) auto
    48 
    48 
    49 lemma finite_imp_foldSetD:
    49 lemma finite_imp_foldSetD:
    50   "[| finite A; e \<in> D; !!x y. [| x \<in> A; y \<in> D |] ==> f x y \<in> D |] ==>
    50   "[| finite A; e \<in> D; !!x y. [| x \<in> A; y \<in> D |] ==> f x y \<in> D |] ==>
    51    EX x. (A, x) \<in> foldSetD D f e"
    51    \<exists>x. (A, x) \<in> foldSetD D f e"
    52 proof (induct set: finite)
    52 proof (induct set: finite)
    53   case empty then show ?case by auto
    53   case empty then show ?case by auto
    54 next
    54 next
    55   case (insert x F)
    55   case (insert x F)
    56   then obtain y where y: "(F, y) \<in> foldSetD D f e" by auto
    56   then obtain y where y: "(F, y) \<in> foldSetD D f e" by auto
    87 lemma (in LCD) foldSetD_imp_finite [simp]:
    87 lemma (in LCD) foldSetD_imp_finite [simp]:
    88   "(A, x) \<in> foldSetD D f e ==> finite A"
    88   "(A, x) \<in> foldSetD D f e ==> finite A"
    89   by (induct set: foldSetD) auto
    89   by (induct set: foldSetD) auto
    90 
    90 
    91 lemma (in LCD) finite_imp_foldSetD:
    91 lemma (in LCD) finite_imp_foldSetD:
    92   "[| finite A; A \<subseteq> B; e \<in> D |] ==> EX x. (A, x) \<in> foldSetD D f e"
    92   "[| finite A; A \<subseteq> B; e \<in> D |] ==> \<exists>x. (A, x) \<in> foldSetD D f e"
    93 proof (induct set: finite)
    93 proof (induct set: finite)
    94   case empty then show ?case by auto
    94   case empty then show ?case by auto
    95 next
    95 next
    96   case (insert x F)
    96   case (insert x F)
    97   then obtain y where y: "(F, y) \<in> foldSetD D f e" by auto
    97   then obtain y where y: "(F, y) \<in> foldSetD D f e" by auto
   100     by (intro foldSetD.intros) auto
   100     by (intro foldSetD.intros) auto
   101   then show ?case ..
   101   then show ?case ..
   102 qed
   102 qed
   103 
   103 
   104 lemma (in LCD) foldSetD_determ_aux:
   104 lemma (in LCD) foldSetD_determ_aux:
   105   "e \<in> D ==> \<forall>A x. A \<subseteq> B & card A < n --> (A, x) \<in> foldSetD D f e -->
   105   "e \<in> D \<Longrightarrow> \<forall>A x. A \<subseteq> B \<and> card A < n \<longrightarrow> (A, x) \<in> foldSetD D f e \<longrightarrow>
   106     (\<forall>y. (A, y) \<in> foldSetD D f e --> y = x)"
   106     (\<forall>y. (A, y) \<in> foldSetD D f e \<longrightarrow> y = x)"
   107   apply (induct n)
   107   apply (induct n)
   108    apply (auto simp add: less_Suc_eq) (* slow *)
   108    apply (auto simp add: less_Suc_eq) (* slow *)
   109   apply (erule foldSetD.cases)
   109   apply (erule foldSetD.cases)
   110    apply blast
   110    apply blast
   111   apply (erule foldSetD.cases)
   111   apply (erule foldSetD.cases)
   118   apply (rename_tac xa Aa ya xb Ab yb, case_tac "xa = xb")
   118   apply (rename_tac xa Aa ya xb Ab yb, case_tac "xa = xb")
   119    apply (subgoal_tac "Aa = Ab")
   119    apply (subgoal_tac "Aa = Ab")
   120     prefer 2 apply (blast elim!: equalityE)
   120     prefer 2 apply (blast elim!: equalityE)
   121    apply blast
   121    apply blast
   122   txt \<open>case @{prop "xa \<notin> xb"}.\<close>
   122   txt \<open>case @{prop "xa \<notin> xb"}.\<close>
   123   apply (subgoal_tac "Aa - {xb} = Ab - {xa} & xb \<in> Aa & xa \<in> Ab")
   123   apply (subgoal_tac "Aa - {xb} = Ab - {xa} \<and> xb \<in> Aa \<and> xa \<in> Ab")
   124    prefer 2 apply (blast elim!: equalityE)
   124    prefer 2 apply (blast elim!: equalityE)
   125   apply clarify
   125   apply clarify
   126   apply (subgoal_tac "Aa = insert xb Ab - {xa}")
   126   apply (subgoal_tac "Aa = insert xb Ab - {xa}")
   127    prefer 2 apply blast
   127    prefer 2 apply blast
   128   apply (subgoal_tac "card Aa \<le> card Ab")
   128   apply (subgoal_tac "card Aa \<le> card Ab")
   164 lemma foldD_empty [simp]:
   164 lemma foldD_empty [simp]:
   165   "e \<in> D ==> foldD D f e {} = e"
   165   "e \<in> D ==> foldD D f e {} = e"
   166   by (unfold foldD_def) blast
   166   by (unfold foldD_def) blast
   167 
   167 
   168 lemma (in LCD) foldD_insert_aux:
   168 lemma (in LCD) foldD_insert_aux:
   169   "[| x ~: A; x \<in> B; e \<in> D; A \<subseteq> B |] ==>
   169   "[| x \<notin> A; x \<in> B; e \<in> D; A \<subseteq> B |] ==>
   170     ((insert x A, v) \<in> foldSetD D f e) =
   170     ((insert x A, v) \<in> foldSetD D f e) =
   171     (EX y. (A, y) \<in> foldSetD D f e & v = f x y)"
   171     (\<exists>y. (A, y) \<in> foldSetD D f e \<and> v = f x y)"
   172   apply auto
   172   apply auto
   173   apply (rule_tac A1 = A in finite_imp_foldSetD [THEN exE])
   173   apply (rule_tac A1 = A in finite_imp_foldSetD [THEN exE])
   174      apply (fastforce dest: foldSetD_imp_finite)
   174      apply (fastforce dest: foldSetD_imp_finite)
   175     apply assumption
   175     apply assumption
   176    apply assumption
   176    apply assumption
   289 
   289 
   290 definition
   290 definition
   291   finprod :: "[('b, 'm) monoid_scheme, 'a => 'b, 'a set] => 'b"
   291   finprod :: "[('b, 'm) monoid_scheme, 'a => 'b, 'a set] => 'b"
   292   where "finprod G f A =
   292   where "finprod G f A =
   293    (if finite A
   293    (if finite A
   294     then foldD (carrier G) (mult G o f) \<one>\<^bsub>G\<^esub> A
   294     then foldD (carrier G) (mult G \<circ> f) \<one>\<^bsub>G\<^esub> A
   295     else \<one>\<^bsub>G\<^esub>)"
   295     else \<one>\<^bsub>G\<^esub>)"
   296 
   296 
   297 syntax
   297 syntax
   298   "_finprod" :: "index => idt => 'a set => 'b => 'b"
   298   "_finprod" :: "index => idt => 'a set => 'b => 'b"
   299       ("(3\<Otimes>__\<in>_. _)" [1000, 0, 51, 10] 10)
   299       ("(3\<Otimes>__\<in>_. _)" [1000, 0, 51, 10] 10)
   358 lemma funcset_Int_left [simp, intro]:
   358 lemma funcset_Int_left [simp, intro]:
   359   "[| f \<in> A \<rightarrow> C; f \<in> B \<rightarrow> C |] ==> f \<in> A Int B \<rightarrow> C"
   359   "[| f \<in> A \<rightarrow> C; f \<in> B \<rightarrow> C |] ==> f \<in> A Int B \<rightarrow> C"
   360   by fast
   360   by fast
   361 
   361 
   362 lemma funcset_Un_left [iff]:
   362 lemma funcset_Un_left [iff]:
   363   "(f \<in> A Un B \<rightarrow> C) = (f \<in> A \<rightarrow> C & f \<in> B \<rightarrow> C)"
   363   "(f \<in> A Un B \<rightarrow> C) = (f \<in> A \<rightarrow> C \<and> f \<in> B \<rightarrow> C)"
   364   by fast
   364   by fast
   365 
   365 
   366 lemma finprod_Un_Int:
   366 lemma finprod_Un_Int:
   367   "[| finite A; finite B; g \<in> A \<rightarrow> carrier G; g \<in> B \<rightarrow> carrier G |] ==>
   367   "[| finite A; finite B; g \<in> A \<rightarrow> carrier G; g \<in> B \<rightarrow> carrier G |] ==>
   368      finprod G g (A Un B) \<otimes> finprod G g (A Int B) =
   368      finprod G g (A Un B) \<otimes> finprod G g (A Int B) =