src/HOL/UNITY/Comp.thy
changeset 13798 4c1a53627500
parent 13792 d1811693899c
child 13805 3786b2fd6808
equal deleted inserted replaced
13797:baefae13ad37 13798:4c1a53627500
    10 Revised by Sidi Ehmety on January  2001 
    10 Revised by Sidi Ehmety on January  2001 
    11 
    11 
    12 Added: a strong form of the <= relation (component_of) and localize 
    12 Added: a strong form of the <= relation (component_of) and localize 
    13 
    13 
    14 *)
    14 *)
       
    15 
       
    16 header{*Composition: Basic Primitives*}
    15 
    17 
    16 theory Comp = Union:
    18 theory Comp = Union:
    17 
    19 
    18 instance program :: (type) ord ..
    20 instance program :: (type) ord ..
    19 
    21 
    40 
    42 
    41   funPair      :: "['a => 'b, 'a => 'c, 'a] => 'b * 'c"
    43   funPair      :: "['a => 'b, 'a => 'c, 'a] => 'b * 'c"
    42   "funPair f g == %x. (f x, g x)"
    44   "funPair f g == %x. (f x, g x)"
    43 
    45 
    44 
    46 
    45 (*** component <= ***)
    47 subsection{*The component relation*}
    46 lemma componentI: 
    48 lemma componentI: 
    47      "H <= F | H <= G ==> H <= (F Join G)"
    49      "H <= F | H <= G ==> H <= (F Join G)"
    48 apply (unfold component_def, auto)
    50 apply (unfold component_def, auto)
    49 apply (rule_tac x = "G Join Ga" in exI)
    51 apply (rule_tac x = "G Join Ga" in exI)
    50 apply (rule_tac [2] x = "G Join F" in exI)
    52 apply (rule_tac [2] x = "G Join F" in exI)
    74 lemma component_Join1: "F <= (F Join G)"
    76 lemma component_Join1: "F <= (F Join G)"
    75 by (unfold component_def, blast)
    77 by (unfold component_def, blast)
    76 
    78 
    77 lemma component_Join2: "G <= (F Join G)"
    79 lemma component_Join2: "G <= (F Join G)"
    78 apply (unfold component_def)
    80 apply (unfold component_def)
    79 apply (simp (no_asm) add: Join_commute)
    81 apply (simp add: Join_commute, blast)
    80 apply blast
       
    81 done
    82 done
    82 
    83 
    83 lemma Join_absorb1: "F<=G ==> F Join G = G"
    84 lemma Join_absorb1: "F<=G ==> F Join G = G"
    84 by (auto simp add: component_def Join_left_absorb)
    85 by (auto simp add: component_def Join_left_absorb)
    85 
    86 
    86 lemma Join_absorb2: "G<=F ==> F Join G = F"
    87 lemma Join_absorb2: "G<=F ==> F Join G = F"
    87 by (auto simp add: Join_ac component_def)
    88 by (auto simp add: Join_ac component_def)
    88 
    89 
    89 lemma JN_component_iff: "((JOIN I F) <= H) = (ALL i: I. F i <= H)"
    90 lemma JN_component_iff: "((JOIN I F) <= H) = (ALL i: I. F i <= H)"
    90 apply (simp (no_asm) add: component_eq_subset)
    91 by (simp add: component_eq_subset, blast)
    91 apply blast
       
    92 done
       
    93 
    92 
    94 lemma component_JN: "i : I ==> (F i) <= (JN i:I. (F i))"
    93 lemma component_JN: "i : I ==> (F i) <= (JN i:I. (F i))"
    95 apply (unfold component_def)
    94 apply (unfold component_def)
    96 apply (blast intro: JN_absorb)
    95 apply (blast intro: JN_absorb)
    97 done
    96 done
   105 apply (simp (no_asm_use) add: component_eq_subset)
   104 apply (simp (no_asm_use) add: component_eq_subset)
   106 apply (blast intro!: program_equalityI)
   105 apply (blast intro!: program_equalityI)
   107 done
   106 done
   108 
   107 
   109 lemma Join_component_iff: "((F Join G) <= H) = (F <= H & G <= H)"
   108 lemma Join_component_iff: "((F Join G) <= H) = (F <= H & G <= H)"
   110 apply (simp (no_asm) add: component_eq_subset)
   109 by (simp add: component_eq_subset, blast)
   111 apply blast
       
   112 done
       
   113 
   110 
   114 lemma component_constrains: "[| F <= G; G : A co B |] ==> F : A co B"
   111 lemma component_constrains: "[| F <= G; G : A co B |] ==> F : A co B"
   115 by (auto simp add: constrains_def component_eq_subset)
   112 by (auto simp add: constrains_def component_eq_subset)
   116 
   113 
   117 (*Used in Guar.thy to show that programs are partially ordered*)
   114 (*Used in Guar.thy to show that programs are partially ordered*)
   118 lemmas program_less_le = strict_component_def [THEN meta_eq_to_obj_eq]
   115 lemmas program_less_le = strict_component_def [THEN meta_eq_to_obj_eq]
   119 
   116 
   120 
   117 
   121 (*** preserves ***)
   118 subsection{*The preserves property*}
   122 
   119 
   123 lemma preservesI: "(!!z. F : stable {s. v s = z}) ==> F : preserves v"
   120 lemma preservesI: "(!!z. F : stable {s. v s = z}) ==> F : preserves v"
   124 by (unfold preserves_def, blast)
   121 by (unfold preserves_def, blast)
   125 
   122 
   126 lemma preserves_imp_eq: 
   123 lemma preserves_imp_eq: 
   133 apply (unfold preserves_def, auto)
   130 apply (unfold preserves_def, auto)
   134 done
   131 done
   135 
   132 
   136 lemma JN_preserves [iff]:
   133 lemma JN_preserves [iff]:
   137      "(JOIN I F : preserves v) = (ALL i:I. F i : preserves v)"
   134      "(JOIN I F : preserves v) = (ALL i:I. F i : preserves v)"
   138 apply (simp (no_asm) add: JN_stable preserves_def)
   135 apply (simp add: JN_stable preserves_def, blast)
   139 apply blast
       
   140 done
   136 done
   141 
   137 
   142 lemma SKIP_preserves [iff]: "SKIP : preserves v"
   138 lemma SKIP_preserves [iff]: "SKIP : preserves v"
   143 by (auto simp add: preserves_def)
   139 by (auto simp add: preserves_def)
   144 
   140 
   151 (* (F : preserves (funPair v w)) = (F : preserves v Int preserves w) *)
   147 (* (F : preserves (funPair v w)) = (F : preserves v Int preserves w) *)
   152 declare preserves_funPair [THEN eqset_imp_iff, iff]
   148 declare preserves_funPair [THEN eqset_imp_iff, iff]
   153 
   149 
   154 
   150 
   155 lemma funPair_o_distrib: "(funPair f g) o h = funPair (f o h) (g o h)"
   151 lemma funPair_o_distrib: "(funPair f g) o h = funPair (f o h) (g o h)"
   156 apply (simp (no_asm) add: funPair_def o_def)
   152 by (simp add: funPair_def o_def)
   157 done
       
   158 
   153 
   159 lemma fst_o_funPair [simp]: "fst o (funPair f g) = f"
   154 lemma fst_o_funPair [simp]: "fst o (funPair f g) = f"
   160 apply (simp (no_asm) add: funPair_def o_def)
   155 by (simp add: funPair_def o_def)
   161 done
       
   162 
   156 
   163 lemma snd_o_funPair [simp]: "snd o (funPair f g) = g"
   157 lemma snd_o_funPair [simp]: "snd o (funPair f g) = g"
   164 apply (simp (no_asm) add: funPair_def o_def)
   158 by (simp add: funPair_def o_def)
   165 done
       
   166 
   159 
   167 lemma subset_preserves_o: "preserves v <= preserves (w o v)"
   160 lemma subset_preserves_o: "preserves v <= preserves (w o v)"
   168 by (force simp add: preserves_def stable_def constrains_def)
   161 by (force simp add: preserves_def stable_def constrains_def)
   169 
   162 
   170 lemma preserves_subset_stable: "preserves v <= stable {s. P (v s)}"
   163 lemma preserves_subset_stable: "preserves v <= stable {s. P (v s)}"
   242 lemmas strict_component_of_eq =
   235 lemmas strict_component_of_eq =
   243     strict_component_of_def [THEN meta_eq_to_obj_eq, standard]
   236     strict_component_of_def [THEN meta_eq_to_obj_eq, standard]
   244 
   237 
   245 (** localize **)
   238 (** localize **)
   246 lemma localize_Init_eq [simp]: "Init (localize v F) = Init F"
   239 lemma localize_Init_eq [simp]: "Init (localize v F) = Init F"
   247 apply (unfold localize_def)
   240 by (simp add: localize_def)
   248 apply (simp (no_asm))
       
   249 done
       
   250 
   241 
   251 lemma localize_Acts_eq [simp]: "Acts (localize v F) = Acts F"
   242 lemma localize_Acts_eq [simp]: "Acts (localize v F) = Acts F"
   252 apply (unfold localize_def)
   243 by (simp add: localize_def)
   253 apply (simp (no_asm))
       
   254 done
       
   255 
   244 
   256 lemma localize_AllowedActs_eq [simp]: 
   245 lemma localize_AllowedActs_eq [simp]: 
   257  "AllowedActs (localize v F) = AllowedActs F Int (UN G:(preserves v). Acts G)"
   246  "AllowedActs (localize v F) = AllowedActs F Int (UN G:(preserves v). Acts G)"
   258 apply (unfold localize_def, auto)
   247 by (unfold localize_def, auto)
   259 done
       
   260 
   248 
   261 end
   249 end