@@ -753,7 +753,7 @@ definition scene_decomp :: "'a::scene_space scene \<Rightarrow> 'a scene set" ("
753753lemma scene_decomp :
754754 assumes "a \<in> scene_space"
755755 shows decomp_Vars : "scene_decomp a \<subseteq> set Vars" ( is "?A" )
756- and decomp_nbot : "\<bottom>\<^sub>S \<notin> scene_decomp a" ( is "?B" )
756+ and decomp_nbot [ simp ] : "\<bottom>\<^sub>S \<notin> scene_decomp a" ( is "?B" )
757757 and decomp_foldr_scene : "\<exists> xs. scene_decomp a = set xs \<and> a = \<Squnion>\<^sub>S xs" ( is "?C" )
758758proof -
759759 obtain B where B : "B \<subseteq> set Vars" "\<exists> xs. B = set xs \<and> a = \<Squnion>\<^sub>S xs"
@@ -783,12 +783,130 @@ proof -
783783 set_removeAll )
784784qed
785785
786- lemma scene_decomp_transfer :
787- assumes "a \<in> scene_space" "b \<in> scene_space" "scene_decomp a = scene_decomp b"
786+ lemma scene_decomp_mem_Vars [ simp ]:
787+ "\<lbrakk> a \<in> scene_space; x \<in> scene_decomp a \<rbrakk> \<Longrightarrow> x \<in> set Vars"
788+ by ( metis decomp_Vars subset_iff )
789+
790+ lemma scene_decomp_eq_transfer :
791+ assumes "a \<in> scene_space" "b \<in> scene_space" "\<lbrakk>a\<rbrakk>\<^sub>S = \<lbrakk>b\<rbrakk>\<^sub>S"
788792 shows "a = b"
789793 by ( metis assms ( 1 , 2 , 3 ) decomp_Vars decomp_foldr_scene foldr_scene_union_eq_scene_space
790794 mem_Vars_scene_space )
791795
796+ lemma scene_decomp_le_transfer :
797+ assumes "a \<in> scene_space" "b \<in> scene_space" "\<lbrakk>a\<rbrakk>\<^sub>S \<subseteq> \<lbrakk>b\<rbrakk>\<^sub>S"
798+ shows "a \<le> b"
799+ by ( metis assms ( 1 , 2 , 3 ) decomp_Vars decomp_foldr_scene scene_union_foldr_subset )
800+
801+ lemma scene_foldr_decomp_le_Vars :
802+ assumes "set xs \<subseteq> scene_space" "set ys \<subseteq> set Vars" "\<Squnion>\<^sub>S xs \<le> \<Squnion>\<^sub>S ys" "a \<in> set xs" "b \<in> \<lbrakk>a\<rbrakk>\<^sub>S"
803+ shows "b \<in> set ys"
804+ proof -
805+ have bV : "b \<in> set Vars"
806+ using assms ( 1 , 4 , 5 ) scene_decomp_mem_Vars by blast
807+ obtain zs where zs : "\<lbrakk>a\<rbrakk>\<^sub>S = set zs" "a = \<Squnion>\<^sub>S zs"
808+ using assms ( 1 , 4 ) decomp_foldr_scene by blast
809+ have zs_Vars : "set zs \<subseteq> set Vars"
810+ by ( metis assms ( 1 , 4 ) decomp_Vars subset_iff zs ( 1 ))
811+ have zs_le_xs : "\<Squnion>\<^sub>S zs \<le> \<Squnion>\<^sub>S ys"
812+ by ( metis assms ( 1 , 3 , 4 ) idem_scene_space scene_space_foldr scene_space_in_foldr subscene_trans zs ( 2 ))
813+ show ?thesis
814+ by ( metis ( no_types ) assms ( 1 , 2 , 4 , 5 ) decomp_nbot foldr_scene_le_then_subset subset_iff zs ( 1 ) zs_Vars zs_le_xs )
815+ qed
816+
817+
818+ lemma scene_foldr_decomp_le_iff :
819+ assumes "set xs \<subseteq> scene_space" "set ys \<subseteq> set Vars"
820+ shows "\<Squnion>\<^sub>S xs \<le> \<Squnion>\<^sub>S ys \<longleftrightarrow> (\<forall> a\<in>set xs. \<forall> b\<in>\<lbrakk>a\<rbrakk>\<^sub>S. b \<in> set ys)"
821+ apply ( rule iffI )
822+ using assms ( 1 , 2 ) scene_foldr_decomp_le_Vars apply blast
823+ apply ( rule scene_space_foldr_lb )
824+ using assms ( 2 ) scene_space_vars_decomp_iff apply blast
825+ using assms ( 1 ) apply blast
826+ apply ( metis assms ( 1 , 2 ) decomp_foldr_scene scene_union_foldr_subset subset_iff )
827+ done
828+
829+ lemma scene_decomp_foldr :
830+ assumes "set xs \<subseteq> set Vars" "\<bottom>\<^sub>S \<notin> set xs"
831+ shows "\<lbrakk>\<Squnion>\<^sub>S xs\<rbrakk>\<^sub>S = set xs"
832+ by ( metis assms ( 1 , 2 ) decomp_Vars decomp_foldr_scene decomp_nbot foldr_scene_eq_then_eq mem_Vars_scene_space scene_space_foldr )
833+
834+ lemma scene_decomp_foldr_nbot :
835+ assumes "set xs \<subseteq> set Vars"
836+ shows "\<lbrakk>\<Squnion>\<^sub>S xs\<rbrakk>\<^sub>S = set xs - {\<bottom>\<^sub>S}"
837+ by ( metis Diff_iff assms insert_Diff insert_subset removeAll_id scene_decomp_foldr scene_union_foldr_remove_element scene_union_unit ( 2 ) set_removeAll singletonI )
838+
839+ lemma scene_decomp_top :
840+ "\<lbrakk>\<top>\<^sub>S\<rbrakk>\<^sub>S = set Vars - {\<bottom>\<^sub>S}"
841+ by ( metis Diff_empty Diff_iff Diff_insert0 Diff_subset insertCI scene_decomp_foldr set_removeAll top_scene_eq uminus_bot_scene uminus_var_other_vars )
842+
843+ lemma scene_decomp_bot :
844+ "\<lbrakk>\<bottom>\<^sub>S\<rbrakk>\<^sub>S = {}"
845+ by ( metis bot.extremum empty_iff foldr.simps ( 1 ) id_apply list.set ( 1 ) scene_decomp_foldr )
846+
847+ lemma scene_decomp_union :
848+ assumes "a \<in> scene_space" "b \<in> scene_space"
849+ shows "\<lbrakk>a \<squnion>\<^sub>S b\<rbrakk>\<^sub>S = \<lbrakk>a\<rbrakk>\<^sub>S \<union> \<lbrakk>b\<rbrakk>\<^sub>S"
850+ proof -
851+ obtain xs where xs : "set xs \<subseteq> set Vars" "\<bottom>\<^sub>S \<notin> set xs" "a = \<Squnion>\<^sub>S xs"
852+ by ( metis assms ( 1 ) decomp_Vars decomp_foldr_scene decomp_nbot foldr_scene_union_remdups set_remdups )
853+ obtain ys where ys : "set ys \<subseteq> set Vars" "\<bottom>\<^sub>S \<notin> set ys" "b = \<Squnion>\<^sub>S ys"
854+ by ( metis assms ( 2 ) decomp_Vars decomp_foldr_scene decomp_nbot foldr_scene_union_remdups set_remdups )
855+ from xs ys have "\<Squnion>\<^sub>S xs \<squnion>\<^sub>S \<Squnion>\<^sub>S ys = \<Squnion>\<^sub>S (xs @ ys)"
856+ using union_scene_space_foldrs by blast
857+ with xs ys have "\<lbrakk>a \<squnion>\<^sub>S b\<rbrakk>\<^sub>S = set xs \<union> set ys"
858+ by ( metis Un_iff le_sup_iff scene_decomp_foldr set_append )
859+ also have "... = \<lbrakk>a\<rbrakk>\<^sub>S \<union> \<lbrakk>b\<rbrakk>\<^sub>S"
860+ by ( simp add : scene_decomp_foldr xs ys )
861+ finally show ?thesis .
862+ qed
863+
864+ lemma scene_decomp_uminus :
865+ assumes "a \<in> scene_space"
866+ shows "\<lbrakk>- a\<rbrakk>\<^sub>S = set Vars - \<lbrakk>a\<rbrakk>\<^sub>S - {\<bottom>\<^sub>S}"
867+ proof -
868+ obtain xs where xs : "set xs \<subseteq> set Vars" "\<bottom>\<^sub>S \<notin> set xs" "a = \<Squnion>\<^sub>S xs"
869+ by ( metis assms ( 1 ) decomp_Vars decomp_foldr_scene decomp_nbot foldr_scene_union_remdups set_remdups )
870+ thm uminus_vars_other_vars
871+ hence "\<lbrakk>- a\<rbrakk>\<^sub>S = \<lbrakk>\<Squnion>\<^sub>S (filter (\<lambda>x. x \<notin> set xs) Vars)\<rbrakk>\<^sub>S"
872+ by ( simp add : uminus_vars_other_vars )
873+ also have "... = set(filter (\<lambda>x. x \<notin> set xs) Vars) - {\<bottom>\<^sub>S}"
874+ by ( metis ( no_types , lifting ) Diff_iff filter_filter filter_is_subset insertCI scene_decomp_foldr scene_union_foldr_remove_element scene_union_unit ( 2 ) set_minus_filter_out
875+ set_removeAll )
876+ also have "... = set Vars - \<lbrakk>a\<rbrakk>\<^sub>S - {\<bottom>\<^sub>S}"
877+ by ( metis ( full_types ) scene_decomp_foldr set_diff_eq set_filter xs )
878+ finally show ?thesis .
879+ qed
880+
881+ lemma scene_decomp_inter :
882+ assumes "a \<in> scene_space" "b \<in> scene_space"
883+ shows "\<lbrakk>a \<sqinter>\<^sub>S b\<rbrakk>\<^sub>S = \<lbrakk>a\<rbrakk>\<^sub>S \<inter> \<lbrakk>b\<rbrakk>\<^sub>S"
884+ proof -
885+ have "\<lbrakk>a \<sqinter>\<^sub>S b\<rbrakk>\<^sub>S = \<lbrakk>- (- a \<squnion>\<^sub>S - b)\<rbrakk>\<^sub>S"
886+ by ( simp add : inf_scene_def )
887+ also have "... = set Vars - (set Vars - \<lbrakk>a\<rbrakk>\<^sub>S - {\<bottom>\<^sub>S} \<union> (set Vars - \<lbrakk>b\<rbrakk>\<^sub>S - {\<bottom>\<^sub>S})) - {\<bottom>\<^sub>S}"
888+ by ( simp add : scene_decomp_uminus scene_decomp_union assms union_scene_space scene_space_uminus )
889+ also have "... = \<lbrakk>a\<rbrakk>\<^sub>S \<inter> \<lbrakk>b\<rbrakk>\<^sub>S"
890+ using assms decomp_Vars by force
891+ finally show ?thesis .
892+ qed
893+
894+ lemma scene_decomp_foldr_scene :
895+ assumes "set xs \<subseteq> scene_space"
896+ shows "\<lbrakk>\<Squnion>\<^sub>S xs\<rbrakk>\<^sub>S = \<Union> (scene_decomp ` set xs)"
897+ using assms
898+ proof ( induct xs )
899+ case Nil
900+ then show ?case
901+ by ( simp add : scene_decomp_bot )
902+ next
903+ case ( Cons a xs )
904+ then show ?case
905+ by ( simp add : scene_decomp_union scene_space_foldr )
906+ qed
907+
908+ lemmas scene_decomp_transfer = scene_decomp_top scene_decomp_bot scene_decomp_union scene_decomp_uminus scene_decomp_inter
909+
792910subsection \<open> Mapping a lens over a scene list \<close>
793911
794912definition map_lcomp :: "'b scene list \<Rightarrow> ('b \<Longrightarrow> 'a) \<Rightarrow> 'a scene list" where
@@ -850,6 +968,21 @@ proof -
850968 by ( metis Sup_scene_def assms foldr_scene_union_eq_scene_space inf.absorb_iff1 )
851969qed
852970
971+ lemma Sup_scene_decomp_transfer :
972+ assumes "A \<subseteq> scene_space"
973+ shows "\<lbrakk>\<Union>\<^sub>S A\<rbrakk>\<^sub>S = (\<Union>x\<in>A. \<lbrakk>x\<rbrakk>\<^sub>S)"
974+ proof -
975+ obtain xs where xs : "set xs = A"
976+ by ( metis assms finite_list finite_scene_space rev_finite_subset )
977+ have "\<lbrakk>\<Union>\<^sub>S A\<rbrakk>\<^sub>S = \<lbrakk>\<Squnion>\<^sub>S xs\<rbrakk>\<^sub>S"
978+ by ( metis Sup_scene_is_foldr_scene assms xs )
979+ also have "... = \<Union> (scene_decomp ` set xs)"
980+ using assms scene_decomp_foldr_scene xs by blast
981+ also have "... = (\<Union>x\<in>A. \<lbrakk>x\<rbrakk>\<^sub>S)"
982+ by ( simp add : Setcompr_eq_image xs )
983+ finally show ?thesis .
984+ qed
985+
853986lemma Sup_scene_closed : "\<Union>\<^sub>S A \<in> scene_space"
854987 unfolding Sup_scene_def proof -
855988 fix A :: "'a scene set"
@@ -871,6 +1004,39 @@ definition Inf_scene :: "'a::scene_space scene set \<Rightarrow> 'a scene" where
8711004
8721005notation Inf_scene ( "\<Inter>\<^sub>S" )
8731006
1007+ find_theorems uminus "(\<Union>)"
1008+
1009+ lemma Inf_scene_decomp_transfer :
1010+ assumes "A \<subseteq> scene_space" "A \<noteq> {}"
1011+ shows "\<lbrakk>\<Inter>\<^sub>S A\<rbrakk>\<^sub>S = (\<Inter>x\<in>A. \<lbrakk>x\<rbrakk>\<^sub>S)"
1012+ proof -
1013+ have "\<lbrakk>\<Inter>\<^sub>S A\<rbrakk>\<^sub>S = \<lbrakk>- (\<Union>\<^sub>S (uminus ` A))\<rbrakk>\<^sub>S"
1014+ by ( simp add : Inf_scene_def )
1015+ also have "... = set Vars - \<Union> {\<lbrakk>a\<rbrakk>\<^sub>S |a. a \<in> uminus ` A} - {\<bottom>\<^sub>S}"
1016+ proof -
1017+ have "uminus ` A \<subseteq> scene_space"
1018+ by ( metis assms ( 1 ) image_mono uminus_image_scene_space )
1019+ thus ?thesis
1020+ by ( auto simp add : scene_decomp_uminus Sup_scene_decomp_transfer Sup_scene_closed assms )
1021+ qed
1022+ also have "... = set Vars \<inter> - \<Union> ((scene_decomp \<circ> uminus) ` A) \<inter> - {\<bottom>\<^sub>S}"
1023+ by auto
1024+ also from assms scene_decomp_uminus have "... = (set Vars \<inter> (\<Inter>x\<in>A. \<lbrakk>x\<rbrakk>\<^sub>S)) \<inter> - {\<bottom>\<^sub>S}"
1025+ by auto
1026+ also from assms scene_decomp_uminus have "... = (\<Inter>x\<in>A. \<lbrakk>x\<rbrakk>\<^sub>S) \<inter> - {\<bottom>\<^sub>S}"
1027+ proof -
1028+ have "\<forall> x\<in>A. \<lbrakk>x\<rbrakk>\<^sub>S \<subseteq> set Vars"
1029+ using assms decomp_Vars by blast
1030+ with assms ( 2 ) have "(\<Inter>x\<in>A. \<lbrakk>x\<rbrakk>\<^sub>S) \<subseteq> set Vars"
1031+ by blast
1032+ thus ?thesis
1033+ by auto
1034+ qed
1035+ also from assms have "... = (\<Inter>x\<in>A. \<lbrakk>x\<rbrakk>\<^sub>S)"
1036+ by ( metis INF_eq_const INT_E decomp_nbot in_mono inf.order_iff subset_Compl_singleton )
1037+ finally show ?thesis .
1038+ qed
1039+
8741040lemma Inf_scene_top : "\<Inter>\<^sub>S {} = top_class.top"
8751041 by ( simp add : Inf_scene_def )
8761042
0 commit comments