lemma pairwise_Diff: "pairwise R A ==> pairwise R (A - B)" using pairwise_mono by fastforce
lemma scene_compats_members: "[ pairwise (##S) A; x ∈ A; y ∈ A ]==> x ##S y" by (metis pairwise_def scene_compat_refl)
corollary foldr_scene_union_removeAll: assumes"pairwise (##S) (set xs)""x ∈ set xs" shows"⊔S (removeAll x xs) ⊔S x = ⊔S xs" using assms proof (induct xs) case Nil thenshow ?caseby simp next case (Cons a xs) have x_compat: "∧ z. z ∈ set xs ==> x ##S z" using Cons.prems(1) Cons.prems(2) scene_compats_members by auto
from Cons have x_compats: "x ##S⊔S (removeAll x xs)" by (metis (no_types, lifting) insert_Diff list.simps(15) pairwise_compat_foldr pairwise_insert removeAll_id set_removeAll x_compat)
from Cons have a_compats: "a ##S⊔S (removeAll x xs)" by (metis (no_types, lifting) insert_Diff insert_iff list.simps(15) pairwise_compat_foldr pairwise_insert scene_compat_refl set_removeAll x_compats)
from Cons show ?case proof (cases "x ∈ set xs") case True with Cons show ?thesis by (auto simp add: pairwise_insert scene_union_commute)
(metis a_compats scene_compats_members scene_union_assoc scene_union_idem,
metis (full_types) a_compats scene_union_assoc scene_union_commute x_compats) next case False with Cons show ?thesis by (simp add: scene_union_commute) qed qed
lemma foldr_scene_union_eq_sets: assumes"pairwise (##S) (set xs)""set xs = set ys" shows"⊔S xs = ⊔S ys" using assms proof (induct xs arbitrary: ys) case Nil thenshow ?case by simp next case (Cons a xs) hence ys: "set ys = insert a (set (removeAll a ys))" by (auto) thenshow ?case by (metis (no_types, lifting) Cons.hyps Cons.prems(1) Cons.prems(2) Diff_insert_absorb foldr_scene_union_removeAll insertCI insert_absorb list.simps(15) pairwise_insert set_removeAll) qed
lemma foldr_scene_removeAll: assumes"pairwise (##S) (set xs)" shows"x ⊔S⊔S (removeAll x xs) = x ⊔S⊔S xs" by (metis (mono_tags, opaque_lifting) assms foldr_Cons foldr_scene_union_eq_sets insertCI insert_Diff list.simps(15) o_apply removeAll.simps(2) removeAll_id set_removeAll)
lemma pairwise_Collect: "pairwise R A ==> pairwise R {x ∈ A. P x}" by (simp add: pairwise_def)
lemma removeAll_overshadow_filter: "removeAll x (filter (λxa. xa ∉ A - {x}) xs) = removeAll x (filter (λ xa. xa ∉ A) xs)" apply (simp add: removeAll_filter_not_eq) apply (rule filter_cong) apply (simp) apply auto done
corollary foldr_scene_union_filter: assumes"pairwise (##S) (set xs)""set ys ⊆ set xs" shows"⊔S xs = ⊔S (filter (λx. x ∉ set ys) xs) ⊔S⊔S ys" using assms proof (induct xs arbitrary: ys) case Nil thenshow ?caseby (simp) next case (Cons x xs) show ?case proof (cases "x ∈ set ys") case True with Cons have1: "set ys - {x} ⊆ set xs" by (auto) have2: "x ##S⊔S (removeAll x ys)" by (metis Cons.prems(1) Cons.prems(2) True foldr_scene_removeAll foldr_scene_union_removeAll pairwise_subset scene_compat_bot(2) scene_compat_sym scene_union_incompat scene_union_unit(1)) have3: "∧ P. x ##S⊔S (filter P xs)" by (meson Cons.prems(1) Cons.prems(2) True filter_is_subset in_mono pairwise_compat_foldr pairwise_subset scene_compats_members set_subset_Cons) have4: "∧ P. ⊔S (filter P xs) ##S⊔S (removeAll x ys)" by (rule pairwise_compat_foldr)
(metis Cons.prems(1) Cons.prems(2) pairwise_Diff pairwise_subset set_removeAll,
metis (no_types, lifting) "1" Cons.prems(1) filter_is_subset pairwise_compat_foldr pairwise_subset scene_compat_sym scene_compats_members set_removeAll set_subset_Cons subsetD) have"⊔S (x # xs) = x ⊔S⊔S xs" by simp alsohave"... = x ⊔S (⊔S (filter (λxa. xa ∉ set ys - {x}) xs) ⊔S⊔S (removeAll x ys))" using1 Cons(1)[where ys="removeAll x ys"] Cons(2) by (simp add: pairwise_insert) alsohave"... = (x ⊔S⊔S (filter (λxa. xa ∉ set ys - {x}) xs)) ⊔S⊔S (removeAll x ys)" by (simp add: scene_union_assoc 1234) alsohave"... = (x ⊔S⊔S (removeAll x (filter (λxa. xa ∉ set ys - {x}) xs))) ⊔S⊔S (removeAll x ys)" by (metis (no_types, lifting) Cons.prems(1) filter_is_subset foldr_scene_removeAll pairwise_subset set_subset_Cons) alsohave"... = (x ⊔S⊔S (removeAll x (filter (λxa. xa ∉ set ys) xs))) ⊔S⊔S (removeAll x ys)" by (simp only: removeAll_overshadow_filter) alsohave"... = (x ⊔S⊔S (removeAll x (filter (λxa. xa ∉ set ys) (x # xs)))) ⊔S⊔S (removeAll x ys)" by simp alsohave"... = (x ⊔S⊔S (filter (λxa. xa ∉ set ys) (x # xs))) ⊔S⊔S (removeAll x ys)" by (simp add: True) alsohave"... = (⊔S (filter (λxa. xa ∉ set ys) (x # xs)) ⊔S x) ⊔S⊔S (removeAll x ys)" by (simp add: scene_union_commute) alsohave"... = ⊔S (filter (λxa. xa ∉ set ys) (x # xs)) ⊔S (x ⊔S⊔S (removeAll x ys))" by (simp add: scene_union_assoc True 234 scene_compat_sym) alsohave"... = ⊔S (filter (λxa. xa ∉ set ys) (x # xs)) ⊔S⊔S ys" by (metis (no_types, lifting) Cons.prems(1) Cons.prems(2) True foldr_scene_union_removeAll pairwise_subset scene_union_commute) finallyshow ?thesis . next case False with Cons(2-3) have1: "set ys ⊆ set xs" by auto have2: "x ##S⊔S (filter (λx. x ∉ set ys) xs)" by (smt (verit, ccfv_threshold) Cons.prems(1) filter_is_subset list.set_intros(1)
pairwise_compat_foldr pairwise_def scene_compat_refl set_subset_Cons
subset_code(1)) have3: "x ##S⊔S ys" by (meson Cons.prems(1) Cons.prems(2) list.set_intros(1) pairwise_compat_foldr pairwise_subset scene_compats_members subset_code(1)) from Cons(1)[of ys] Cons(2-3) have4: "⊔S (filter (λx. x ∉ set ys) xs) ##S⊔S ys" by (auto simp add: pairwise_insert)
(metis (no_types, lifting) "1" foldr_append foldr_scene_union_eq_sets scene_compat_bot(1) scene_union_incompat set_append subset_Un_eq)
with1 False Cons(1)[of ys] Cons(2-3) show ?thesis by (auto simp add: pairwise_insert scene_union_assoc 234) qed qed
definition scene_indeps :: "'s scene set ==> bool"where "scene_indeps = pairwise (⋈S)"
text‹ All scenes in the set cover the entire state space ›
definition scene_span :: "'s scene list ==> bool"where "scene_span S = (foldr (⊔S) S ⊥S = ⊤S)"
text‹ cf. @{term finite_dimensional_vector_space}, which scene spaces are based on. ›
subsection‹ Scene space class ›
class scene_space = fixes Vars :: "'a scene list" assumes idem_scene_Vars [simp]: "∧ x. x ∈ set Vars ==> idem_scene x" and indep_Vars: "scene_indeps (set Vars)" and span_Vars: "scene_span Vars" begin
lemma Vars_ext_lens_indep: "[ a ;S x ≠ b ;S x; a ∈ set Vars; b ∈ set Vars ]==> a ;S x ⋈S b ;S x" by (metis indep_Vars pairwiseD scene_comp_indep scene_indeps_def)
inductive_set scene_space :: "'a scene set"where
bot_scene_space [intro]: "⊥S∈ scene_space" |
Vars_scene_space [intro]: "x ∈ set Vars ==> x ∈ scene_space" |
union_scene_space [intro]: "[ x ∈ scene_space; y ∈ scene_space ]==> x ⊔S y ∈ scene_space"
lemma idem_scene_space: "a ∈ scene_space ==> idem_scene a" by (induct rule: scene_space.induct) auto
lemma set_Vars_scene_space [simp]: "set Vars ⊆ scene_space" by blast
lemma pairwise_compat_Vars_subset: "set xs ⊆ set Vars ==> pairwise (##S) (set xs)" using pairwise_subset scene_space_compats by blast
lemma top_scene_eq: "⊤S = ⊔S Vars" usinglocal.span_Vars scene_span_def by force
lemma top_scene_space: "⊤S∈ scene_space" proof - have"⊤S = foldr (⊔S) Vars ⊥S" using span_Vars by (simp add: scene_span_def) alsohave"... ∈ scene_space" by (simp add: scene_space_foldr) finallyshow ?thesis . qed
lemma Vars_compat_scene_space: "[ b ∈ scene_space; x ∈ set Vars ]==> x ##S b" proof (induct b rule: scene_space.induct) case bot_scene_space thenshow ?case by (metis scene_compat_refl scene_union_incompat scene_union_unit(1)) next case (Vars_scene_space a) thenshow ?case by (metis local.indep_Vars pairwiseD scene_compat_refl scene_indep_compat scene_indeps_def) next case (union_scene_space a b) thenshow ?case using scene_union_pres_compat by blast qed
lemma scene_space_compat: "[ a ∈ scene_space; b ∈ scene_space ]==> a ##S b" proof (induct rule: scene_space.induct) case bot_scene_space thenshow ?case by simp next case (Vars_scene_space x) thenshow ?case by (simp add: Vars_compat_scene_space) next case (union_scene_space x y) thenshow ?case using scene_compat_sym scene_union_pres_compat by blast qed
lemma scene_space_vars_decomp: "a ∈ scene_space ==>∃xs. set xs ⊆ set Vars ∧ foldr (⊔S) xs ⊥S = a" proof (induct rule: scene_space.induct) case bot_scene_space thenshow ?case by (simp add: exI[where x="[]"]) next case (Vars_scene_space x) show ?case apply (rule exI[where x="[x]"]) using Vars_scene_space by simp next case (union_scene_space x y) thenobtain xs ys where xsys: "set xs ⊆ set Vars ∧ foldr (⊔S) xs ⊥S = x" "set ys ⊆ set Vars ∧ foldr (⊔S) ys ⊥S = y" by blast+ show ?case proof (rule exI[where x="xs @ ys"]) show"set (xs @ ys) ⊆ set Vars ∧⊔S (xs @ ys) = x ⊔S y" by (auto simp: xsys)
(metis (full_types) Vars_compat_scene_space foldr_scene_union_add_tail pairwise_subset
scene_space_compats subsetD union_scene_space.hyps(3) xsys(1)) qed qed
lemma scene_space_vars_decomp_iff: "a ∈ scene_space ⟷ (∃xs. set xs ⊆ set Vars ∧ a = foldr (⊔S) xs ⊥S)" apply (auto simp add: scene_space_vars_decomp scene_space.Vars_scene_space scene_space_foldr) apply (simp add: scene_space.Vars_scene_space scene_space_foldr subset_eq) using scene_space_vars_decomp apply auto[1] by (meson dual_order.trans scene_space_foldr set_Vars_scene_space)
lemma"fold (⊔S) (map (λx. x ;S a) Vars) b = [a]\<sim> ⊔S b" oops
lemma Vars_indep_foldr: assumes"x ∈ set Vars""set xs ⊆ set Vars" shows"x ⋈S⊔S (removeAll x xs)" proof (rule foldr_scene_indep) show"pairwise (##S) (set (removeAll x xs))" by (simp, metis Diff_subset assms(2) pairwise_mono scene_space_compats) from assms show"∀b∈set (removeAll x xs). x ⋈S b" by (simp)
(metis DiffE insertI1 local.indep_Vars pairwiseD scene_indeps_def subset_iff) qed
lemma uminus_var_other_vars: assumes"x ∈ set Vars" shows"- x = foldr (⊔S) (removeAll x Vars) ⊥S" proof (rule scene_union_indep_uniq[where Z="x"]) show"idem_scene (foldr (⊔S) (removeAll x Vars) ⊥S)" by (metis Diff_subset idem_scene_space order_trans scene_space_foldr set_Vars_scene_space set_removeAll) show"idem_scene x""idem_scene (-x)" by (simp_all add: assms local.idem_scene_Vars) show"foldr (⊔S) (removeAll x Vars) ⊥S⋈S x" using Vars_indep_foldr assms scene_indep_sym by blast show"- x ⋈S x" using scene_indep_self_compl scene_indep_sym by blast show"- x ⊔S x = foldr (⊔S) (removeAll x Vars) ⊥S⊔S x" by (metis ‹idem_scene (- x)› assms foldr_scene_union_removeAll local.span_Vars scene_space_compats scene_span_def scene_union_compl uminus_scene_twice) qed
lemma uminus_vars_other_vars: assumes"set xs ⊆ set Vars" shows"- ⊔S xs = ⊔S (filter (λx. x ∉ set xs) Vars)" proof (rule scene_union_indep_uniq[where Z="foldr (⊔S) xs ⊥S"]) show"idem_scene (- foldr (⊔S) xs ⊥S)""idem_scene (foldr (⊔S) xs ⊥S)" using assms idem_scene_space idem_scene_uminus scene_space_vars_decomp_iff by blast+ show"idem_scene (foldr (⊔S) (filter (λx. x ∉ set xs) Vars) ⊥S)" by (meson filter_is_subset idem_scene_space scene_space_vars_decomp_iff) show"- foldr (⊔S) xs ⊥S⋈S foldr (⊔S) xs ⊥S" by (metis scene_indep_self_compl uminus_scene_twice) show"foldr (⊔S) (filter (λx. x ∉ set xs) Vars) ⊥S⋈S foldr (⊔S) xs ⊥S" using Vars_indeps_foldr assms scene_indep_sym by blast show"- ⊔S xs ⊔S⊔S xs = ⊔S (filter (λx. x ∉ set xs) Vars) ⊔S⊔S xs" using foldr_scene_union_filter[of Vars xs, THEN sym] by (simp add: assms)
(metis ‹idem_scene (- ⊔S xs)›local.span_Vars scene_span_def scene_union_compl uminus_scene_twice) qed
lemma scene_space_uminus: "[ a ∈ scene_space ]==> - a ∈ scene_space" by (auto simp add: scene_space_vars_decomp_iff uminus_vars_other_vars)
(metis filter_is_subset)
lemma scene_space_inter: "[ a ∈ scene_space; b ∈ scene_space ]==> a ⊓S b ∈ scene_space" by (simp add: inf_scene_def scene_space.union_scene_space scene_space_uminus)
lemma scene_union_foldr_remove_element: assumes"set xs ⊆ set Vars" shows"a ⊔S⊔S xs = a ⊔S⊔S (removeAll a xs)" using assms proof (induct xs) case Nil thenshow ?caseby simp next case (Cons a xs) thenshow ?caseapply auto apply (metis order_trans scene_space.Vars_scene_space scene_space_foldr scene_space_union_assoc scene_union_idem set_Vars_scene_space) apply (smt (verit, best) Diff_subset dual_order.trans removeAll_id scene_space_foldr scene_space_union_assoc scene_union_commute set_Vars_scene_space set_removeAll subset_iff) done qed
lemma scene_union_foldr_Cons_removeAll: assumes"set xs ⊆ set Vars""a ∈ set xs" shows"foldr (⊔S) xs ⊥S = foldr (⊔S) (a # removeAll a xs) ⊥S" by (metis assms(1) assms(2) foldr_scene_union_eq_sets insert_Diff list.simps(15) pairwise_subset scene_space_compats set_removeAll)
lemma scene_union_foldr_Cons_removeAll': assumes"set xs ⊆ set Vars""a ∈ set Vars" shows"foldr (⊔S) (a # xs) ⊥S = foldr (⊔S) (a # removeAll a xs) ⊥S" by (simp add: assms(1) scene_union_foldr_remove_element)
lemma scene_in_foldr: "[ a ∈ set xs; set xs ⊆ set Vars ]==> a ⊆S⊔S xs" apply (induct xs) apply (simp) apply (subst scene_union_foldr_Cons_removeAll') apply simp apply simp apply (auto) apply (rule scene_union_ub) apply (metis Diff_subset dual_order.trans idem_scene_space scene_space_vars_decomp_iff set_removeAll) using Vars_indep_foldr apply blast apply (metis Vars_indep_foldr foldr_scene_union_removeAll idem_scene_space local.idem_scene_Vars order.trans pairwise_mono removeAll_id scene_indep_sym scene_space_compats scene_space_foldr scene_union_commute scene_union_ub set_Vars_scene_space subscene_trans) done
lemma scene_union_foldr_subset: assumes"set xs ⊆ set ys""set ys ⊆ set Vars" shows"⊔S xs ⊆S⊔S ys" using assms proof (induct xs arbitrary: ys) case Nil thenshow ?case by (simp add: scene_bot_least) next case (Cons a xs)
{ assume"a ∈ set xs" with Cons have"foldr (⊔S) xs ⊥S = foldr (⊔S) (a # removeAll a xs) ⊥S" apply (subst scene_union_foldr_Cons_removeAll) apply (auto) done
} note a_in = this
{ assume"a ∉ set xs" thenhave"a ⊔S foldr (⊔S) xs ⊥S = foldr (⊔S) (a # xs) ⊥S" by simp
} note a_out = this show ?caseapply (simp) apply (cases "a ∈ set xs") using a_in Cons apply auto apply (metis dual_order.trans scene_union_foldr_remove_element) using a_out Cons apply auto apply (rule scene_union_mono) using scene_in_foldr apply blast apply blast apply (meson Vars_compat_scene_space dual_order.trans scene_space_foldr set_Vars_scene_space subsetD) usinglocal.idem_scene_Vars apply blast apply (meson idem_scene_space scene_space_foldr set_Vars_scene_space subset_trans) done qed
lemma scene_space_ub: assumes"a ∈ scene_space""b ∈ scene_space" shows"a ⊆S a ⊔S b" using assms apply (auto simp add: scene_space_vars_decomp_iff union_scene_space_foldrs) by (smt (verit, ccfv_SIG) foldr_append scene_union_foldr_subset set_append sup.bounded_iff sup_commute sup_ge2)
lemma scene_compl_subset_iff: assumes"a ∈ scene_space""b ∈ scene_space" shows"- a ⊆S -b ⟷ b ⊆S a" by (metis scene_indep_sym scene_le_iff_indep_inv uminus_scene_twice)
lemma inter_scene_space_foldrs: assumes"set xs ⊆ set Vars""set ys ⊆ set Vars" shows"⊔S xs ⊓S⊔S ys = ⊔S (filter (λ x. x ∈ set xs ∩ set ys) Vars)" proof - have"⊔S xs ⊓S⊔S ys = - (- ⊔S xs ⊔S - ⊔S ys)" by (simp add: inf_scene_def) alsohave"... = - (⊔S (filter (λx. x ∉ set xs) Vars) ⊔S⊔S (filter (λx. x ∉ set ys) Vars))" by (simp add: uminus_vars_other_vars assms) alsohave"... = - ⊔S (filter (λx. x ∉ set xs) Vars @ filter (λx. x ∉ set ys) Vars)" by (simp add: union_scene_space_foldrs assms) alsohave"... = ⊔S (filter (λx. x ∉ set (filter (λx. x ∉ set xs) Vars @ filter (λx. x ∉ set ys) Vars)) Vars)" by (subst uminus_vars_other_vars, simp_all) alsohave"... = ⊔S (filter (λ x. x ∈ set xs ∩ set ys) Vars)" proof - have"∧x. x ∈ set Vars ==> ((x ∈ set Vars ⟶ x ∈ set xs) ∧ (x ∈ set Vars ⟶ x ∈ set ys)) = (x ∈ set xs ∧ x ∈ set ys)" by auto thus ?thesis by (simp cong: arg_cong[where f="⊔S"] filter_cong add: assms) qed finallyshow ?thesis . qed
lemma scene_union_inter_distrib: assumes"a ∈ scene_space""b ∈ scene_space""c ∈ scene_space" shows"a ⊔S b ⊓S c = (a ⊔S b) ⊓S (a ⊔S c)" using assms by (auto simp add: scene_space_vars_decomp_iff scene_inter_distrib_lemma)
lemma finite_distinct_lists_subset: assumes"finite A" shows"finite {xs. distinct xs ∧ set xs ⊆ A}" by (metis (no_types, lifting) Collect_cong finite_subset_distinct[OF assms])
lemma foldr_scene_union_remdups: "set xs ⊆ set Vars ==>⊔S (remdups xs) = ⊔S xs" by (auto intro: foldr_scene_union_eq_sets simp add: pairwise_compat_Vars_subset)
lemma scene_space_as_lists: "scene_space = {⊔S xs | xs. distinct xs ∧ set xs ⊆ set Vars}" proof (rule Set.set_eqI, rule iffI) fix a assume"a ∈ scene_space" thenobtain xs where xs: "set xs ⊆ set Vars""⊔S xs = a" using scene_space_vars_decomp_iff by auto thus"a ∈ {⊔S xs |xs. distinct xs ∧ set xs ⊆ set Vars}" by auto (metis distinct_remdups foldr_scene_union_remdups set_remdups) next fix a assume"a ∈ {⊔S xs |xs. distinct xs ∧ set xs ⊆ set Vars}" thus"a ∈ scene_space" using scene_space_vars_decomp_iff by auto qed
lemma finite_scene_space: "finite scene_space" proof - have"scene_space = {⊔S xs | xs. distinct xs ∧ set xs ⊆ set Vars}" by (simp add: scene_space_as_lists) alsohave"... = ⊔S ` {xs. distinct xs ∧ set xs ⊆ set Vars}" by auto alsohave"finite ..." by (rule finite_imageI, simp add: finite_distinct_lists_subset) finallyshow ?thesis . qed
lemma scene_space_inter_assoc: assumes"x ∈ scene_space""y ∈ scene_space""z ∈ scene_space" shows"(x ⊓S y) ⊓S z = x ⊓S (y ⊓S z)" proof - have"(x ⊓S y) ⊓S z = - (- x ⊔S - y ⊔S - z)" by (simp add: scene_demorgan1 uminus_scene_twice) alsohave"... = - (- x ⊔S (- y ⊔S - z))" by (simp add: assms scene_space_uminus scene_space_union_assoc) alsohave"... = x ⊓S (y ⊓S z)" by (simp add: scene_demorgan1 uminus_scene_twice) finallyshow ?thesis . qed
lemma scene_union_inter_minus: assumes"a ∈ scene_space""b ∈ scene_space" shows"a ⊔S (b ⊓S - a) = a ⊔S b" by (metis assms(1) assms(2) bot_idem_scene idem_scene_space idem_scene_uminus local.scene_union_inter_distrib scene_demorgan1 scene_space_uminus scene_union_compl scene_union_unit(1) uminus_scene_twice)
lemma scene_union_foldr_minus_element: assumes"a ∈ scene_space""set xs ⊆ scene_space" shows"a ⊔S⊔S xs = a ⊔S⊔S (map (λ x. x ⊓S - a) xs)" using assms proof (induct xs) case Nil thenshow ?caseby (simp) next case (Cons y ys) have"a ⊔S (y ⊔S⊔S ys) = y ⊔S (a ⊔S⊔S ys)" by (metis Cons.prems(2) assms(1) insert_subset list.simps(15) scene_space_foldr scene_space_union_assoc scene_union_commute) alsohave"... = y ⊔S (a ⊔S⊔S (map (λx. x ⊓S - a) ys))" using Cons.hyps Cons.prems(2) assms(1) by auto alsohave"... = y ⊔S a ⊔S⊔S (map (λx. x ⊓S - a) ys)" apply (subst scene_union_assoc) using Cons.prems(2) assms(1) scene_space_compat apply auto[1] apply (rule pairwise_compat_foldr) apply (simp) apply (rule pairwise_imageI) apply (meson Cons.prems(2) assms(1) scene_space_compat scene_space_inter scene_space_uminus set_subset_Cons subsetD) apply simp apply (meson Cons.prems(2) assms(1) in_mono list.set_intros(1) scene_space_compat scene_space_inter scene_space_uminus set_subset_Cons) apply (rule pairwise_compat_foldr) apply (simp) apply (rule pairwise_imageI) apply (meson Cons.prems(2) assms(1) in_mono scene_space_compat scene_space_inter scene_space_uminus set_subset_Cons) apply (simp) apply (meson Cons.prems(2) assms(1) in_mono scene_space_compat scene_space_inter scene_space_uminus set_subset_Cons) apply simp done alsohave"... = a ⊔S (y ⊓S - a ⊔S⊔S (map (λx. x ⊓S - a) ys))" apply (subst scene_union_assoc) using Cons.prems(2) assms(1) scene_space_compat scene_space_inter scene_space_uminus apply force apply (metis (no_types, lifting) Cons.hyps Cons.prems(2) assms(1) insert_subset list.simps(15) scene_compat_sym scene_space_compat scene_space_foldr scene_union_assoc scene_union_idem scene_union_incompat scene_union_unit(1)) apply (rule scene_space_compat) using Cons.prems(2) assms(1) scene_space_inter scene_space_uminus apply auto[1] apply (rule scene_space_foldr) apply auto apply (meson Cons.prems(2) assms(1) in_mono scene_space_inter scene_space_uminus set_subset_Cons) apply (metis Cons.prems(2) assms(1) insert_subset list.simps(15) scene_union_inter_minus scene_union_commute) done finallyshow ?caseusing Cons by auto qed
lemma scene_space_in_foldr: "[ a ∈ set xs; set xs ⊆ scene_space ]==> a ⊆S⊔S xs" proof (induct xs) case Nil thenshow ?case by simp next case (Cons y ys) have ysp: "y ⊔S⊔S ys = y ⊔S⊔S (map (λ x. x ⊓S - y) ys)" using Cons.prems(2) scene_union_foldr_minus_element by force show ?case proof (cases "a ⊆S y") case False with Cons show ?thesis by (simp)
(metis (no_types, lifting) idem_scene_space scene_space_foldr scene_space_ub scene_union_commute subscene_trans) next case True with Cons show ?thesis by (simp)
(meson idem_scene_space scene_space_foldr scene_space_ub subscene_trans) qed qed
lemma scene_space_foldr_lb: "[ a ∈ scene_space; set xs ⊆ scene_space; ∀ b∈set xs. b ≤ a ]==>⊔S xs ⊆S a" proof (induct xs arbitrary: a) case Nil thenshow ?case by (simp add: scene_bot_least) next case (Cons x xs) thenshow ?case by (simp add: scene_space_compat scene_space_foldr scene_union_lb) qed
lemma var_le_union_choice: "[ x ∈ set Vars; a ∈ scene_space; b ∈ scene_space; x ≤ a ⊔S b ]==> (x ≤ a ∨ x ≤ b)" by (auto simp add: scene_space_vars_decomp_iff)
(metis Vars_indep_foldr bot_idem_scene idem_scene_space removeAll_id scene_bot_least scene_indep_pres_compat scene_le_iff_indep_inv scene_space.union_scene_space scene_space_foldr scene_space_in_foldr scene_union_compl set_Vars_scene_space subscene_trans subset_trans uminus_scene_twice uminus_top_scene)
lemma var_le_union_iff: "[ x ∈ set Vars; a ∈ scene_space; b ∈ scene_space ]==> x ≤ a ⊔S b ⟷ (x ≤ a ∨ x ≤ b)" apply (rule iffI, simp add: var_le_union_choice) apply (auto) apply (meson idem_scene_space scene_space_ub subscene_trans) apply (metis idem_scene_space scene_space_ub scene_union_commute subscene_trans) done
text‹ @{term Vars} may contain the empty scene, as we want to allow vacuous lenses in alphabets ›
lemma le_vars_then_equal: "[ x ∈ set Vars; y ∈ set Vars; x ≤ y; x ≠⊥S]==> x = y" by (metis bot_idem_scene foldr_scene_removeAll local.idem_scene_Vars local.indep_Vars local.span_Vars pairwiseD scene_bot_least scene_indep_pres_compat scene_indeps_def scene_le_iff_indep_inv scene_space_compats scene_span_def scene_union_annhil subscene_antisym uminus_scene_twice uminus_top_scene uminus_var_other_vars)
end
lemma foldr_scene_union_eq_scene_space: "[ set xs ⊆ scene_space; set xs = set ys ]==>⊔S xs = ⊔S ys" by (metis foldr_scene_union_eq_sets pairwise_def pairwise_subset scene_space_compat)
subsection‹ Mapping a lens over a scene list ›
definition map_lcomp :: "'b scene list ==> ('b ==> 'a) ==> 'a scene list"where "map_lcomp ss a = map (λ x. x ;S a) ss"
lemma map_lcomp_dist: "[ pairwise (##S) (set xs); vwb_lens a ]==>⊔S (map_lcomp xs a) = ⊔S xs ;S a" by (simp add: foldr_compat_dist map_lcomp_def)
lemma map_lcomp_Vars_is_lens [simp]: "vwb_lens a ==>⊔S (map_lcomp Vars a) = [a]\<sim>" by (metis map_lcomp_dist scene_comp_top_scene scene_space_compats top_scene_eq)
lemma set_map_lcomp [simp]: "set (map_lcomp xs a) = (λx. x ;S a) ` set xs" by (simp add: map_lcomp_def)
subsection‹ Instances ›
instantiation unit :: scene_space begin
definition Vars_unit :: "unit scene list"where [simp]: "Vars_unit = []"
instance by (intro_classes, simp_all add: scene_indeps_def scene_span_def unit_scene_top_eq_bot)
end
instantiation prod :: (scene_space, scene_space) scene_space begin
definition Vars_prod :: "('a × 'b) scene list"where"Vars_prod = map_lcomp Vars fstL @ map_lcomp Vars sndL"
instanceproof have pw: "pairwise (⋈S) (set (map_lcomp Vars fstL @ map_lcomp Vars sndL))" by (auto simp add: pairwise_def Vars_ext_lens_indep scene_comp_pres_indep scene_indep_sym) show"∧x:: ('a × 'b) scene. x ∈ set Vars ==> idem_scene x" by (auto simp add: Vars_prod_def) from pw show"scene_indeps (set (Vars :: ('a × 'b) scene list))" by (simp add: Vars_prod_def scene_indeps_def) show"scene_span (Vars :: ('a × 'b) scene list)" by (simp only: scene_span_def Vars_prod_def foldr_scene_append pw pairwise_indep_then_compat map_lcomp_Vars_is_lens fst_vwb_lens snd_vwb_lens)
(metis fst_vwb_lens lens_plus_scene lens_scene_top_iff_bij_lens plus_mwb_lens scene_union_commute snd_fst_lens_indep snd_vwb_lens swap_bij_lens vwb_lens_mwb) 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.