src/HOL/IOA/meta_theory/Solve.ML
changeset 1266 3ae9fe3c0f68
parent 1052 e044350bfa52
child 1667 6056e9c967d9
equal deleted inserted replaced
1265:6ef9a9893fd6 1266:3ae9fe3c0f68
     6 Weak possibilities mapping (abstraction)
     6 Weak possibilities mapping (abstraction)
     7 *)
     7 *)
     8 
     8 
     9 open Solve; 
     9 open Solve; 
    10 
    10 
    11 val SS = SS addsimps [mk_trace_thm,trans_in_actions];
    11 Addsimps [mk_trace_thm,trans_in_actions];
    12 
    12 
    13 goalw Solve.thy [is_weak_pmap_def,traces_def]
    13 goalw Solve.thy [is_weak_pmap_def,traces_def]
    14   "!!f. [| IOA(C); IOA(A); externals(asig_of(C)) = externals(asig_of(A)); \
    14   "!!f. [| IOA(C); IOA(A); externals(asig_of(C)) = externals(asig_of(A)); \
    15 \          is_weak_pmap f C A |] ==> traces(C) <= traces(A)";
    15 \          is_weak_pmap f C A |] ==> traces(C) <= traces(A)";
    16 
    16 
    17   by (simp_tac(SS addsimps [has_trace_def])1);
    17   by (simp_tac(!simpset addsimps [has_trace_def])1);
    18   by (safe_tac set_cs);
    18   by (safe_tac set_cs);
    19 
    19 
    20   (* choose same trace, therefore same NF *)
    20   (* choose same trace, therefore same NF *)
    21   by (res_inst_tac[("x","mk_trace  C (fst ex)")] exI 1);
    21   by (res_inst_tac[("x","mk_trace  C (fst ex)")] exI 1);
    22   by (asm_full_simp_tac set_ss 1);
    22   by (Asm_full_simp_tac 1);
    23 
    23 
    24   (* give execution of abstract automata *)
    24   (* give execution of abstract automata *)
    25   by (res_inst_tac[("x","(mk_trace A (fst ex),%i.f(snd ex i))")] bexI 1);
    25   by (res_inst_tac[("x","(mk_trace A (fst ex),%i.f(snd ex i))")] bexI 1);
    26 
    26 
    27   (* Traces coincide *)
    27   (* Traces coincide *)
    28   by (asm_simp_tac (SS addsimps [mk_trace_def,filter_oseq_idemp])1);
    28   by (asm_simp_tac (!simpset addsimps [mk_trace_def,filter_oseq_idemp])1);
    29 
    29 
    30   (* Use lemma *)
    30   (* Use lemma *)
    31   by (forward_tac [states_of_exec_reachable] 1);
    31   by (forward_tac [states_of_exec_reachable] 1);
    32 
    32 
    33   (* Now show that it's an execution *)
    33   (* Now show that it's an execution *)
    34   by (asm_full_simp_tac(SS addsimps [executions_def]) 1);
    34   by (asm_full_simp_tac(!simpset addsimps [executions_def]) 1);
    35   by (safe_tac set_cs);
    35   by (safe_tac set_cs);
    36 
    36 
    37   (* Start states map to start states *)
    37   (* Start states map to start states *)
    38   by (dtac bspec 1);
    38   by (dtac bspec 1);
    39   by (atac 1);
    39   by (atac 1);
    40 
    40 
    41   (* Show that it's an execution fragment *)
    41   (* Show that it's an execution fragment *)
    42   by (asm_full_simp_tac (SS addsimps [is_execution_fragment_def])1);
    42   by (asm_full_simp_tac (!simpset addsimps [is_execution_fragment_def])1);
    43   by (safe_tac HOL_cs);
    43   by (safe_tac HOL_cs);
    44 
    44 
    45   by (eres_inst_tac [("x","snd ex n")] allE 1);
    45   by (eres_inst_tac [("x","snd ex n")] allE 1);
    46   by (eres_inst_tac [("x","snd ex (Suc n)")] allE 1);
    46   by (eres_inst_tac [("x","snd ex (Suc n)")] allE 1);
    47   by (eres_inst_tac [("x","a")] allE 1);
    47   by (eres_inst_tac [("x","a")] allE 1);
    48   by (asm_full_simp_tac SS 1);
    48   by (Asm_full_simp_tac 1);
    49 qed "trace_inclusion";
    49 qed "trace_inclusion";
    50 
    50 
    51 (* Lemmata *)
    51 (* Lemmata *)
    52 
    52 
    53 val prems = goal HOL.thy "(P ==> Q-->R) ==> P&Q --> R";
    53 val prems = goal HOL.thy "(P ==> Q-->R) ==> P&Q --> R";
    58 (* fist_order_tautology of externals_of_par *)
    58 (* fist_order_tautology of externals_of_par *)
    59 goal IOA.thy "a:externals(asig_of(A1||A2)) =    \
    59 goal IOA.thy "a:externals(asig_of(A1||A2)) =    \
    60 \  (a:externals(asig_of(A1)) & a:externals(asig_of(A2)) |  \
    60 \  (a:externals(asig_of(A1)) & a:externals(asig_of(A2)) |  \
    61 \  a:externals(asig_of(A1)) & a~:externals(asig_of(A2)) |  \
    61 \  a:externals(asig_of(A1)) & a~:externals(asig_of(A2)) |  \
    62 \  a~:externals(asig_of(A1)) & a:externals(asig_of(A2)))";
    62 \  a~:externals(asig_of(A1)) & a:externals(asig_of(A2)))";
    63 by (asm_full_simp_tac (SS addsimps [externals_def,asig_of_par,asig_comp_def,asig_inputs_def,asig_outputs_def]) 1);
    63 by (asm_full_simp_tac (!simpset addsimps [externals_def,asig_of_par,asig_comp_def,asig_inputs_def,asig_outputs_def]) 1);
    64  by (fast_tac set_cs 1);
    64  by (fast_tac set_cs 1);
    65 val externals_of_par_extra = result(); 
    65 val externals_of_par_extra = result(); 
    66 
    66 
    67 goal Solve.thy "!!s.[| reachable (C1||C2) s |] ==> reachable C1 (fst s)";
    67 goal Solve.thy "!!s.[| reachable (C1||C2) s |] ==> reachable C1 (fst s)";
    68 by (asm_full_simp_tac (SS addsimps [reachable_def]) 1); 
    68 by (asm_full_simp_tac (!simpset addsimps [reachable_def]) 1); 
    69 by (etac bexE 1);
    69 by (etac bexE 1);
    70 by (res_inst_tac [("x",
    70 by (res_inst_tac [("x",
    71    "(filter_oseq (%a.a:actions(asig_of(C1))) \
    71    "(filter_oseq (%a.a:actions(asig_of(C1))) \
    72 \                (fst ex),                                                \
    72 \                (fst ex),                                                \
    73 \    %i.fst (snd ex i))")]  bexI 1);
    73 \    %i.fst (snd ex i))")]  bexI 1);
    74 (* fst(s) is in projected execution *)
    74 (* fst(s) is in projected execution *)
    75  by (simp_tac SS 1);
    75  by (Simp_tac 1);
    76  by (fast_tac HOL_cs 1);
    76  by (fast_tac HOL_cs 1);
    77 (* projected execution is indeed an execution *)
    77 (* projected execution is indeed an execution *)
    78 by (asm_full_simp_tac (SS addsimps [executions_def,is_execution_fragment_def,
    78 by (asm_full_simp_tac (!simpset addsimps [executions_def,is_execution_fragment_def,
    79     par_def, starts_of_def,trans_of_def]) 1);
    79     par_def, starts_of_def,trans_of_def]) 1);
    80 by (simp_tac (SS addsimps [filter_oseq_def]) 1);
    80 by (simp_tac (!simpset addsimps [filter_oseq_def]) 1);
    81  by (REPEAT(rtac allI 1));
    81  by (REPEAT(rtac allI 1));
    82  by (cut_inst_tac [("x","fst ex n")] opt_cases 1);
    82  by (cut_inst_tac [("x","fst ex n")] opt_cases 1);
    83  by (etac disjE 1);
    83  by (etac disjE 1);
    84 (* case 1: action sequence of || had already a None *)
    84 (* case 1: action sequence of || had already a None *)
    85 by (asm_full_simp_tac SS 1);
    85 by (Asm_full_simp_tac 1);
    86  by (REPEAT(etac exE 1));
    86  by (REPEAT(etac exE 1));
    87  by (case_tac "y:actions(asig_of(C1))" 1);
    87  by (case_tac "y:actions(asig_of(C1))" 1);
    88 (* case 2: action sequence of || had Some(a) and 
    88 (* case 2: action sequence of || had Some(a) and 
    89            filtered sequence also       *)
    89            filtered sequence also       *)
    90 by (asm_full_simp_tac SS 1);
    90 by (Asm_full_simp_tac 1);
    91  by (rtac impI 1);
    91  by (rtac impI 1);
    92  by (REPEAT(hyp_subst_tac 1)); 
    92  by (REPEAT(hyp_subst_tac 1)); 
    93  by (asm_full_simp_tac SS 1);
    93  by (Asm_full_simp_tac 1);
    94 (* case 3: action sequence pf || had Some(a) but
    94 (* case 3: action sequence pf || had Some(a) but
    95            filtered sequence has None      *)
    95            filtered sequence has None      *)
    96  by (asm_full_simp_tac SS 1);
    96  by (Asm_full_simp_tac 1);
    97 qed"comp1_reachable";
    97 qed"comp1_reachable";
    98 
    98 
    99 
    99 
   100 (* Exact copy of proof of comp1_reachable for the second 
   100 (* Exact copy of proof of comp1_reachable for the second 
   101    component of a parallel composition.     *)
   101    component of a parallel composition.     *)
   102 goal Solve.thy "!!s.[| reachable (C1||C2) s|] ==> reachable C2 (snd s)";
   102 goal Solve.thy "!!s.[| reachable (C1||C2) s|] ==> reachable C2 (snd s)";
   103 by (asm_full_simp_tac (SS addsimps [reachable_def]) 1); 
   103 by (asm_full_simp_tac (!simpset addsimps [reachable_def]) 1); 
   104 by (etac bexE 1);
   104 by (etac bexE 1);
   105 by (res_inst_tac [("x",
   105 by (res_inst_tac [("x",
   106    "(filter_oseq (%a.a:actions(asig_of(C2)))\
   106    "(filter_oseq (%a.a:actions(asig_of(C2)))\
   107 \                (fst ex),                                                \
   107 \                (fst ex),                                                \
   108 \    %i.snd (snd ex i))")]  bexI 1);
   108 \    %i.snd (snd ex i))")]  bexI 1);
   109 (* fst(s) is in projected execution *)
   109 (* fst(s) is in projected execution *)
   110  by (simp_tac list_ss 1);
   110  by (Simp_tac 1);
   111  by (fast_tac HOL_cs 1);
   111  by (fast_tac HOL_cs 1);
   112 (* projected execution is indeed an execution *)
   112 (* projected execution is indeed an execution *)
   113  by (asm_full_simp_tac (SS addsimps [executions_def,is_execution_fragment_def,
   113  by (asm_full_simp_tac (!simpset addsimps [executions_def,is_execution_fragment_def,
   114     par_def, starts_of_def,trans_of_def]) 1);
   114     par_def, starts_of_def,trans_of_def]) 1);
   115  by (simp_tac (SS addsimps [filter_oseq_def]) 1);
   115  by (simp_tac (!simpset addsimps [filter_oseq_def]) 1);
   116  by (REPEAT(rtac allI 1));
   116  by (REPEAT(rtac allI 1));
   117  by (cut_inst_tac [("x","fst ex n")] opt_cases 1);
   117  by (cut_inst_tac [("x","fst ex n")] opt_cases 1);
   118  by (etac disjE 1);
   118  by (etac disjE 1);
   119  by (asm_full_simp_tac SS 1);
   119  by (Asm_full_simp_tac 1);
   120  by (REPEAT(etac exE 1));
   120  by (REPEAT(etac exE 1));
   121  by (case_tac "y:actions(asig_of(C2))" 1);
   121  by (case_tac "y:actions(asig_of(C2))" 1);
   122  by (asm_full_simp_tac SS 1);
   122  by (Asm_full_simp_tac 1);
   123  by (rtac impI 1);
   123  by (rtac impI 1);
   124  by (REPEAT(hyp_subst_tac 1)); 
   124  by (REPEAT(hyp_subst_tac 1)); 
   125  by (asm_full_simp_tac SS 1);
   125  by (Asm_full_simp_tac 1);
   126  by (asm_full_simp_tac SS 1);
   126  by (Asm_full_simp_tac 1);
   127 qed"comp2_reachable";
   127 qed"comp2_reachable";
   128 
   128 
   129 
   129 
   130 (* Composition of possibility-mappings *)
   130 (* Composition of possibility-mappings *)
   131 
   131 
   135 \               externals(asig_of(A2))=externals(asig_of(C2)) & \
   135 \               externals(asig_of(A2))=externals(asig_of(C2)) & \
   136 \               compat_ioas C1 C2 & compat_ioas A1 A2  |]     \
   136 \               compat_ioas C1 C2 & compat_ioas A1 A2  |]     \
   137 \  ==> is_weak_pmap (%p.(f(fst(p)),g(snd(p)))) (C1||C2) (A1||A2)";
   137 \  ==> is_weak_pmap (%p.(f(fst(p)),g(snd(p)))) (C1||C2) (A1||A2)";
   138  by (rtac conjI 1);
   138  by (rtac conjI 1);
   139 (* start_states *)
   139 (* start_states *)
   140  by (asm_full_simp_tac (SS addsimps [par_def, starts_of_def]) 1);
   140  by (asm_full_simp_tac (!simpset addsimps [par_def, starts_of_def]) 1);
   141  by (fast_tac set_cs 1);
   141  by (fast_tac set_cs 1);
   142 (* transitions *)
   142 (* transitions *)
   143 by (REPEAT (rtac allI 1));
   143 by (REPEAT (rtac allI 1));
   144 by (rtac imp_conj_lemma 1);
   144 by (rtac imp_conj_lemma 1);
   145 by (REPEAT(etac conjE 1));
   145 by (REPEAT(etac conjE 1));
   146 by (simp_tac (SS addsimps [externals_of_par_extra]) 1);
   146 by (simp_tac (!simpset addsimps [externals_of_par_extra]) 1);
   147 by (simp_tac (SS addsimps [par_def]) 1);
   147 by (simp_tac (!simpset addsimps [par_def]) 1);
   148 by (asm_full_simp_tac (SS addsimps [trans_of_def]) 1);
   148 by (asm_full_simp_tac (!simpset addsimps [trans_of_def]) 1);
   149 by (rtac (expand_if RS ssubst) 1);
   149 by (rtac (expand_if RS ssubst) 1);
   150 by (rtac conjI 1);
   150 by (rtac conjI 1);
   151 by (rtac impI 1); 
   151 by (rtac impI 1); 
   152 by (etac disjE 1);
   152 by (etac disjE 1);
   153 (* case 1      a:e(A1) | a:e(A2) *)
   153 (* case 1      a:e(A1) | a:e(A2) *)
   154 by (asm_full_simp_tac (SS addsimps [comp1_reachable,comp2_reachable,
   154 by (asm_full_simp_tac (!simpset addsimps [comp1_reachable,comp2_reachable,
   155                                     ext_is_act]) 1);
   155                                     ext_is_act]) 1);
   156 by (etac disjE 1);
   156 by (etac disjE 1);
   157 (* case 2      a:e(A1) | a~:e(A2) *)
   157 (* case 2      a:e(A1) | a~:e(A2) *)
   158 by (asm_full_simp_tac (SS addsimps [comp1_reachable,comp2_reachable,
   158 by (asm_full_simp_tac (!simpset addsimps [comp1_reachable,comp2_reachable,
   159              ext_is_act,ext1_ext2_is_not_act2]) 1);
   159              ext_is_act,ext1_ext2_is_not_act2]) 1);
   160 (* case 3      a:~e(A1) | a:e(A2) *)
   160 (* case 3      a:~e(A1) | a:e(A2) *)
   161 by (asm_full_simp_tac (SS addsimps [comp1_reachable,comp2_reachable,
   161 by (asm_full_simp_tac (!simpset addsimps [comp1_reachable,comp2_reachable,
   162              ext_is_act,ext1_ext2_is_not_act1]) 1);
   162              ext_is_act,ext1_ext2_is_not_act1]) 1);
   163 (* case 4      a:~e(A1) | a~:e(A2) *)
   163 (* case 4      a:~e(A1) | a~:e(A2) *)
   164 by (rtac impI 1);
   164 by (rtac impI 1);
   165 by (subgoal_tac "a~:externals(asig_of(A1)) & a~:externals(asig_of(A2))" 1);
   165 by (subgoal_tac "a~:externals(asig_of(A1)) & a~:externals(asig_of(A2))" 1);
   166 (* delete auxiliary subgoal *)
   166 (* delete auxiliary subgoal *)
   167 by (asm_full_simp_tac SS 2);
   167 by (Asm_full_simp_tac 2);
   168 by (fast_tac HOL_cs 2);
   168 by (fast_tac HOL_cs 2);
   169 by (simp_tac (SS addsimps [conj_disj_distribR] addcongs [conj_cong]
   169 by (simp_tac (!simpset addsimps [conj_disj_distribR] addcongs [conj_cong]
   170                  setloop (split_tac [expand_if])) 1);
   170                  setloop (split_tac [expand_if])) 1);
   171 by(REPEAT((resolve_tac [conjI,impI] 1 ORELSE etac conjE 1) THEN
   171 by(REPEAT((resolve_tac [conjI,impI] 1 ORELSE etac conjE 1) THEN
   172         asm_full_simp_tac(SS addsimps[comp1_reachable,
   172         asm_full_simp_tac(!simpset addsimps[comp1_reachable,
   173                                       comp2_reachable])1));
   173                                       comp2_reachable])1));
   174 qed"fxg_is_weak_pmap_of_product_IOA";
   174 qed"fxg_is_weak_pmap_of_product_IOA";
   175 
   175 
   176 
   176 
   177 goal Solve.thy "!!s.[| reachable (rename C g) s |] ==> reachable C s";
   177 goal Solve.thy "!!s.[| reachable (rename C g) s |] ==> reachable C s";
   178 by (asm_full_simp_tac (SS addsimps [reachable_def]) 1); 
   178 by (asm_full_simp_tac (!simpset addsimps [reachable_def]) 1); 
   179 by (etac bexE 1);
   179 by (etac bexE 1);
   180 by (res_inst_tac [("x",
   180 by (res_inst_tac [("x",
   181    "((%i. case (fst ex i) \
   181    "((%i. case (fst ex i) \
   182 \         of None => None\
   182 \         of None => None\
   183 \          | Some(x) => g x) ,snd ex)")]  bexI 1);
   183 \          | Some(x) => g x) ,snd ex)")]  bexI 1);
   184 by (simp_tac SS 1);
   184 by (Simp_tac 1);
   185 (* execution is indeed an execution of C *)
   185 (* execution is indeed an execution of C *)
   186 by (asm_full_simp_tac (SS addsimps [executions_def,is_execution_fragment_def,
   186 by (asm_full_simp_tac (!simpset addsimps [executions_def,is_execution_fragment_def,
   187     par_def, starts_of_def,trans_of_def,rename_def]) 1);
   187     par_def, starts_of_def,trans_of_def,rename_def]) 1);
   188 by (REPEAT(rtac allI 1));
   188 by (REPEAT(rtac allI 1));
   189 by (cut_inst_tac [("x","fst ex n")] opt_cases 1);
   189 by (cut_inst_tac [("x","fst ex n")] opt_cases 1);
   190  by (etac disjE 1);
   190  by (etac disjE 1);
   191 (* case 1: action sequence of rename C had already a None *)
   191 (* case 1: action sequence of rename C had already a None *)
   192 by (asm_full_simp_tac SS 1);
   192 by (Asm_full_simp_tac 1);
   193 (* case 2 *)
   193 (* case 2 *)
   194 by (REPEAT(etac exE 1));
   194 by (REPEAT(etac exE 1));
   195 by (etac conjE 1);
   195 by (etac conjE 1);
   196 by (eres_inst_tac [("x","n")] allE 1);
   196 by (eres_inst_tac [("x","n")] allE 1);
   197 by (eres_inst_tac [("x","y")] allE 1);
   197 by (eres_inst_tac [("x","y")] allE 1);
   198 by (asm_full_simp_tac SS 1);
   198 by (Asm_full_simp_tac 1);
   199 by (etac exE 1);
   199 by (etac exE 1);
   200 by (etac conjE 1);
   200 by (etac conjE 1);
   201 by (dtac sym 1);
   201 by (dtac sym 1);
   202 by (dtac sym 1);
   202 by (dtac sym 1);
   203 by (dtac sym 1);
   203 by (dtac sym 1);
   204 by (asm_full_simp_tac SS 1);
   204 by (Asm_full_simp_tac 1);
   205 by (safe_tac HOL_cs);
   205 by (safe_tac HOL_cs);
   206 qed"reachable_rename_ioa";
   206 qed"reachable_rename_ioa";
   207 
   207 
   208 
   208 
   209 (* HOL Lemmata - must already exist ! *)
   209 (* HOL Lemmata - must already exist ! *)
   218 val neg_ex = result();
   218 val neg_ex = result();
   219 
   219 
   220 
   220 
   221 goal Solve.thy "!!f.[| is_weak_pmap f C A |]\
   221 goal Solve.thy "!!f.[| is_weak_pmap f C A |]\
   222 \                      ==> (is_weak_pmap f (rename C g) (rename A g))";
   222 \                      ==> (is_weak_pmap f (rename C g) (rename A g))";
   223 by (asm_full_simp_tac (SS addsimps [is_weak_pmap_def]) 1);
   223 by (asm_full_simp_tac (!simpset addsimps [is_weak_pmap_def]) 1);
   224 by (rtac conjI 1);
   224 by (rtac conjI 1);
   225 by (asm_full_simp_tac (SS addsimps [rename_def,starts_of_def]) 1);
   225 by (asm_full_simp_tac (!simpset addsimps [rename_def,starts_of_def]) 1);
   226 by (fast_tac set_cs 1);
   226 by (fast_tac set_cs 1);
   227 by (REPEAT (rtac allI 1));
   227 by (REPEAT (rtac allI 1));
   228 by (rtac imp_conj_lemma 1);
   228 by (rtac imp_conj_lemma 1);
   229 by (simp_tac (SS addsimps [rename_def]) 1);
   229 by (simp_tac (!simpset addsimps [rename_def]) 1);
   230 by (asm_full_simp_tac (SS addsimps [externals_def,asig_inputs_def,asig_outputs_def,asig_of_def,trans_of_def]) 1);
   230 by (asm_full_simp_tac (!simpset addsimps [externals_def,asig_inputs_def,asig_outputs_def,asig_of_def,trans_of_def]) 1);
   231 by (safe_tac set_cs);
   231 by (safe_tac set_cs);
   232 by (rtac (expand_if RS ssubst) 1);
   232 by (rtac (expand_if RS ssubst) 1);
   233  by (rtac conjI 1);
   233  by (rtac conjI 1);
   234  by (rtac impI 1);
   234  by (rtac impI 1);
   235  by (etac disjE 1);
   235  by (etac disjE 1);
   236  by (etac exE 1);
   236  by (etac exE 1);
   237 by (etac conjE 1);
   237 by (etac conjE 1);
   238 (* x is input *)
   238 (* x is input *)
   239  by (dtac sym 1);
   239  by (dtac sym 1);
   240  by (dtac sym 1);
   240  by (dtac sym 1);
   241 by (asm_full_simp_tac SS 1);
   241 by (Asm_full_simp_tac 1);
   242 by (REPEAT (hyp_subst_tac 1));
   242 by (REPEAT (hyp_subst_tac 1));
   243 by (cut_inst_tac [("C","C"),("g","g"),("s","s")] reachable_rename_ioa 1);
   243 by (cut_inst_tac [("C","C"),("g","g"),("s","s")] reachable_rename_ioa 1);
   244 by (assume_tac 1);
   244 by (assume_tac 1);
   245 by (asm_full_simp_tac SS 1);
   245 by (Asm_full_simp_tac 1);
   246 (* x is output *)
   246 (* x is output *)
   247  by (etac exE 1);
   247  by (etac exE 1);
   248 by (etac conjE 1);
   248 by (etac conjE 1);
   249  by (dtac sym 1);
   249  by (dtac sym 1);
   250  by (dtac sym 1);
   250  by (dtac sym 1);
   251 by (asm_full_simp_tac SS 1);
   251 by (Asm_full_simp_tac 1);
   252 by (REPEAT (hyp_subst_tac 1));
   252 by (REPEAT (hyp_subst_tac 1));
   253 by (cut_inst_tac [("C","C"),("g","g"),("s","s")] reachable_rename_ioa 1);
   253 by (cut_inst_tac [("C","C"),("g","g"),("s","s")] reachable_rename_ioa 1);
   254 by (assume_tac 1);
   254 by (assume_tac 1);
   255 by (asm_full_simp_tac SS 1);
   255 by (Asm_full_simp_tac 1);
   256 (* x is internal *)
   256 (* x is internal *)
   257 by (simp_tac (SS addsimps [disj_demorgan,neg_ex,conj_demorgan] addcongs [conj_cong]) 1);
   257 by (simp_tac (!simpset addsimps [disj_demorgan,neg_ex,conj_demorgan] addcongs [conj_cong]) 1);
   258 by (rtac impI 1);
   258 by (rtac impI 1);
   259 by (etac conjE 1);
   259 by (etac conjE 1);
   260 by (cut_inst_tac [("C","C"),("g","g"),("s","s")] reachable_rename_ioa 1);
   260 by (cut_inst_tac [("C","C"),("g","g"),("s","s")] reachable_rename_ioa 1);
   261 by (assume_tac 1);
   261 by (assume_tac 1);
   262 by (eres_inst_tac [("x","s")] allE 1);
   262 by (eres_inst_tac [("x","s")] allE 1);
   263 by (eres_inst_tac [("x","t")] allE 1);
   263 by (eres_inst_tac [("x","t")] allE 1);
   264 by (eres_inst_tac [("x","x")] allE 1);
   264 by (eres_inst_tac [("x","x")] allE 1);
   265 by (eres_inst_tac [("x","x")] allE 1);
   265 by (eres_inst_tac [("x","x")] allE 1);
   266 by (asm_full_simp_tac SS 1);
   266 by (Asm_full_simp_tac 1);
   267 qed"rename_through_pmap";
   267 qed"rename_through_pmap";
   268 
   268 
   269 
   269 
   270 
   270