@@ -230,6 +230,9 @@ lemma idem_scene_space: "a \<in> scene_space \<Longrightarrow> idem_scene a"
230230lemma set_Vars_scene_space [ simp ]: "set Vars \<subseteq> scene_space"
231231 by blast
232232
233+ lemma mem_Vars_scene_space [ simp ]: "A \<subseteq> set Vars \<Longrightarrow> A \<subseteq> scene_space"
234+ by blast
235+
233236lemma pairwise_compat_Vars_subset : "set xs \<subseteq> set Vars \<Longrightarrow> pairwise (##\<^sub>S) (set xs)"
234237 using pairwise_subset scene_space_compats by blast
235238
308311qed
309312
310313lemma scene_space_vars_decomp_iff : "a \<in> scene_space \<longleftrightarrow> (\<exists>xs. set xs \<subseteq> set Vars \<and> a = foldr (\<squnion>\<^sub>S) xs \<bottom>\<^sub>S)"
311- apply ( auto simp add : scene_space_vars_decomp scene_space.Vars_scene_space scene_space_foldr )
312- apply ( simp add : scene_space.Vars_scene_space scene_space_foldr subset_eq )
314+ apply ( rule iffI )
315+ apply ( simp add : scene_space_foldr subset_eq )
313316 using scene_space_vars_decomp apply auto [ 1 ]
314317 by ( meson dual_order.trans scene_space_foldr set_Vars_scene_space )
315318
@@ -712,10 +715,55 @@ lemma le_vars_then_equal: "\<lbrakk> x \<in> set Vars; y \<in> set Vars; x \<le>
712715
713716end
714717
718+ lemma scene_union_le_iff :
719+ assumes "a \<in> scene_space" "b \<in> scene_space"
720+ shows "a \<squnion>\<^sub>S b \<le> c \<longleftrightarrow> a \<le> c \<and> b \<le> c"
721+ by ( metis assms idem_scene_space idem_scene_union scene_space_compat
722+ scene_space_ub scene_union_commute scene_union_mono subscene_trans )
723+
715724lemma foldr_scene_union_eq_scene_space :
716725 "\<lbrakk> set xs \<subseteq> scene_space; set xs = set ys \<rbrakk> \<Longrightarrow> \<Squnion>\<^sub>S xs = \<Squnion>\<^sub>S ys"
717726 by ( metis foldr_scene_union_eq_sets pairwise_def pairwise_subset scene_space_compat )
718727
728+ lemma foldr_scene_le_then_subset :
729+ assumes "set xs \<subseteq> set Vars" "set ys \<subseteq> set Vars" "\<Squnion>\<^sub>S xs \<le> \<Squnion>\<^sub>S ys" "\<bottom>\<^sub>S \<notin> set xs"
730+ shows "set xs \<subseteq> set ys"
731+ using assms proof ( induct xs arbitrary : ys )
732+ case Nil
733+ then show ?case by simp
734+ next
735+ case ( Cons a xs )
736+ then show ?case
737+ apply ( simp add : scene_union_le_iff scene_space_foldr )
738+ apply ( metis ( mono_tags , lifting ) Vars_indep_foldr bot_idem_scene foldr_scene_union_filter
739+ removeAll_id scene_bot_least scene_indep_pres_compat scene_le_iff_indep_inv
740+ scene_space_compats subscene_antisym top_scene_eq uminus_bot_scene
741+ uminus_vars_other_vars )
742+ done
743+ qed
744+
745+ lemma foldr_scene_eq_then_eq :
746+ assumes "set xs \<subseteq> set Vars" "set ys \<subseteq> set Vars" "\<Squnion>\<^sub>S xs = \<Squnion>\<^sub>S ys" "\<bottom>\<^sub>S \<notin> set xs" "\<bottom>\<^sub>S \<notin> set ys"
747+ shows "set xs = set ys"
748+ by ( simp add : assms dual_order.eq_iff foldr_scene_le_then_subset scene_union_foldr_subset )
749+
750+ definition "scene_decomp a = (THE B. B \<subseteq> set Vars \<and> \<bottom>\<^sub>S \<notin> B \<and> (\<exists> xs. B = set xs \<and> a = \<Squnion>\<^sub>S xs))"
751+
752+ lemma
753+ assumes "a \<in> scene_space"
754+ shows "scene_decomp a \<subseteq> set Vars"
755+ proof -
756+ obtain B where B : "B \<subseteq> set Vars" "\<exists> xs. B = set xs \<and> a = \<Squnion>\<^sub>S xs"
757+ by ( metis assms scene_space_vars_decomp_iff )
758+ from B show ?thesis
759+ apply ( simp add : scene_decomp_def )
760+ apply ( rule theI2 [ where a = "B - {\<bottom>\<^sub>S}" ])
761+ apply auto
762+ apply ( metis scene_union_foldr_remove_element scene_union_unit ( 2 )
763+ set_removeAll )
764+ apply ( metis foldr_scene_le_then_subset scene_union_foldr_subset subset_iff )
765+ oops
766+
719767subsection \<open> Mapping a lens over a scene list \<close>
720768
721769definition map_lcomp :: "'b scene list \<Rightarrow> ('b \<Longrightarrow> 'a) \<Rightarrow> 'a scene list" where
@@ -942,7 +990,27 @@ next
942990 by blast
943991qed
944992
945-
993+ lemma basis_scene_decomposition :
994+ assumes "a \<in> scene_space"
995+ shows "\<exists> B\<subseteq>set Vars. a = \<Union>\<^sub>S B"
996+ by ( metis Sup_scene_is_foldr_scene assms scene_space_vars_decomp_iff set_Vars_scene_space subset_trans )
997+
998+ lemma
999+ assumes "x \<in> set Vars" "A \<subseteq> set Vars"
1000+ shows "x \<le> \<Union>\<^sub>S A \<longleftrightarrow> (x = \<bottom>\<^sub>S \<or> x \<in> A)"
1001+ oops
1002+
1003+ lemma
1004+ assumes "A \<subseteq> set Vars" "B \<subseteq> set Vars" "\<Union>\<^sub>S A = \<Union>\<^sub>S B" "x \<in> A"
1005+ shows "x \<in> B"
1006+ oops
1007+
1008+ lemma
1009+ assumes "a \<in> scene_space"
1010+ shows "scene_decomp a \<subseteq> set Vars"
1011+ oops
1012+
1013+
9461014lemma ( in complete_lattice ) is_lub_modulo_carrier :
9471015 "is_lub L x A \<longleftrightarrow> is_lub L x (A \<inter> carrier L)"
9481016 by ( simp add : Upper_def )
@@ -1042,7 +1110,7 @@ lemma scene_union_dist:
10421110 shows "A \<union>\<^sub>S (B \<inter>\<^sub>S C) = (A \<union>\<^sub>S B) \<inter>\<^sub>S (A \<union>\<^sub>S C)"
10431111 by ( metis assms ( 1 , 2 , 3 ) inf_scene_inter scene_space_class.scene_union_inter_distrib ss_clat.join_closed ss_clat.meet_closed sup_scene_union )
10441112
1045- lemma Sup_scene_dist :
1113+ lemma Sup_scene_dist :
10461114 assumes "a \<in> scene_space" "B \<subseteq> scene_space"
10471115 shows "a \<union>\<^sub>S (\<Inter>\<^sub>S B) = \<Inter>\<^sub>S {a \<union>\<^sub>S b | b. b \<in> B}"
10481116proof -
@@ -1084,6 +1152,11 @@ lemma scene_inter_dist:
10841152 shows "A \<inter>\<^sub>S (B \<union>\<^sub>S C) = (A \<inter>\<^sub>S B) \<union>\<^sub>S (A \<inter>\<^sub>S C)"
10851153 by ( metis ( no_types , opaque_lifting ) Sup_scene_closed assms ( 1 , 2 , 3 ) inf_scene_inter scene_inter_union_distrib ss_clat.meet_closed ss_union_def sup_scene_union )
10861154
1155+ lemma Inf_scene_dist :
1156+ assumes "a \<in> scene_space" "B \<subseteq> scene_space"
1157+ shows "a \<inter>\<^sub>S (\<Union>\<^sub>S B) = \<Union>\<^sub>S {a \<inter>\<^sub>S b | b. b \<in> B}"
1158+ oops
1159+
10871160lemma scene_union_diff :
10881161 assumes "A \<in> scene_space" "B \<in> scene_space" "C \<in> scene_space"
10891162 shows "(A \<union>\<^sub>S B) - C = (A - C) \<union>\<^sub>S (B - C)"
0 commit comments