equal
deleted
inserted
replaced
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) = |