src/HOLCF/IOA/Modelcheck/MuIOA.thy
author wenzelm
Thu, 26 Apr 2007 16:39:31 +0200
changeset 22819 a7b425bb668c
parent 17244 0b2ff9541727
child 26939 1035c89b4c02
permissions -rw-r--r--
removed legacy ML files;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7299
743b22579a2f quite a lot of tuning and cleanup;
wenzelm
parents: 6471
diff changeset
     1
17244
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
     2
(* $Id$ *)
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
     3
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
     4
theory MuIOA
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
     5
imports IOA MuckeSyn
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
     6
begin
6471
08d12ef5fc19 added translation from IOA to mucalculus and corresponding modelchecker examples;
mueller
parents:
diff changeset
     7
08d12ef5fc19 added translation from IOA to mucalculus and corresponding modelchecker examples;
mueller
parents:
diff changeset
     8
consts
17244
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
     9
  Internal_of_A :: "'a => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    10
  Internal_of_C :: "'a => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    11
  Start_of_A :: "'a => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    12
  Start_of_C :: "'a => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    13
  Trans_of_A :: "'a => 'b => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    14
  Trans_of_C :: "'a => 'b => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    15
  IntStep_of_A :: "'a => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    16
  IntStepStar_of_A :: "'a => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    17
  Move_of_A :: "'a => 'b => bool"
0b2ff9541727 converted to Isar theory format;
wenzelm
parents: 7299
diff changeset
    18
  isSimCA :: "'a => bool"
6471
08d12ef5fc19 added translation from IOA to mucalculus and corresponding modelchecker examples;
mueller
parents:
diff changeset
    19
22819
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    20
ML {*
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    21
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    22
(* MuIOA.ML declares function mk_sim_oracle used by oracle "Sim" (see MuIOAOracle.thy).
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    23
	There, implementation relations for I/O automatons are proved using
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    24
	the model checker mucke (invoking cal_mucke_tac defined in MCSyn.ML). *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    25
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    26
exception SimFailureExn of string;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    27
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    28
val ioa_simps = [thm "asig_of_def", thm "starts_of_def", thm "trans_of_def"];
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    29
val asig_simps = [thm "asig_inputs_def", thm "asig_outputs_def",
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    30
  thm "asig_internals_def", thm "actions_def"];
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    31
val comp_simps = [thm "par_def", thm "asig_comp_def"];
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    32
val restrict_simps = [thm "restrict_def", thm "restrict_asig_def"];
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    33
val hide_simps = [thm "hide_def", thm "hide_asig_def"];
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    34
val rename_simps = [thm "rename_def", thm "rename_set_def"];
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    35
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    36
local
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    37
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    38
exception malformed;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    39
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    40
fun fst_type (Type("*",[a,_])) = a |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    41
fst_type _ = raise malformed; 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    42
fun snd_type (Type("*",[_,a])) = a |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    43
snd_type _ = raise malformed;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    44
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    45
fun element_type (Type("set",[a])) = a |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    46
element_type t = raise malformed;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    47
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    48
fun IntC sg (Const("Trueprop",_) $ ((Const("op <=",_) $ (_ $ concreteIOA)) $ _)) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    49
let
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    50
val aut_typ = #T(rep_cterm(cterm_of sg concreteIOA));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    51
val sig_typ = fst_type aut_typ;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    52
val int_typ = fst_type sig_typ
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    53
in 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    54
Const("Asig.internals",Type("fun",[sig_typ,int_typ])) $
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    55
 (Const("Automata.asig_of",Type("fun",[aut_typ,sig_typ])) $ concreteIOA)
6471
08d12ef5fc19 added translation from IOA to mucalculus and corresponding modelchecker examples;
mueller
parents:
diff changeset
    56
end
22819
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    57
|
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    58
IntC sg t =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    59
error("malformed automaton def for IntC:\n" ^ (Sign.string_of_term sg t));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    60
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    61
fun StartC sg (Const("Trueprop",_) $ ((Const("op <=",_) $ (_ $ concreteIOA)) $ _)) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    62
let
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    63
val aut_typ = #T(rep_cterm(cterm_of sg concreteIOA));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    64
val st_typ = fst_type(snd_type aut_typ)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    65
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    66
Const("Automata.starts_of",Type("fun",[aut_typ,st_typ])) $ concreteIOA
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    67
end
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    68
|
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    69
StartC sg t =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    70
error("malformed automaton def for StartC:\n" ^ (Sign.string_of_term sg t));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    71
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    72
fun TransC sg (Const("Trueprop",_) $ ((Const("op <=",_) $ (_ $ concreteIOA)) $ _)) = 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    73
let
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    74
val aut_typ = #T(rep_cterm(cterm_of sg concreteIOA));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    75
val tr_typ = fst_type(snd_type(snd_type aut_typ))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    76
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    77
Const("Automata.trans_of",Type("fun",[aut_typ,tr_typ])) $ concreteIOA
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    78
end
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    79
|
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    80
TransC sg t =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    81
error("malformed automaton def for TransC:\n" ^ (Sign.string_of_term sg t));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    82
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    83
fun IntA sg (Const("Trueprop",_) $ ((Const("op <=",_) $ _) $ (_ $ abstractIOA))) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    84
let
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    85
val aut_typ = #T(rep_cterm(cterm_of sg abstractIOA));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    86
val sig_typ = fst_type aut_typ;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    87
val int_typ = fst_type sig_typ
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    88
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    89
Const("Asig.internals",Type("fun",[sig_typ,int_typ])) $
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    90
 (Const("Automata.asig_of",Type("fun",[aut_typ,sig_typ])) $ abstractIOA)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    91
end
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    92
|
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    93
IntA sg t =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    94
error("malformed automaton def for IntA:\n" ^ (Sign.string_of_term sg t));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    95
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    96
fun StartA sg (Const("Trueprop",_) $ ((Const("op <=",_) $ _) $ (_ $ abstractIOA))) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    97
let
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    98
val aut_typ = #T(rep_cterm(cterm_of sg abstractIOA));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
    99
val st_typ = fst_type(snd_type aut_typ)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   100
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   101
Const("Automata.starts_of",Type("fun",[aut_typ,st_typ])) $ abstractIOA
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   102
end
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   103
|
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   104
StartA sg t =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   105
error("malformed automaton def for StartA:\n" ^ (Sign.string_of_term sg t));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   106
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   107
fun TransA sg (Const("Trueprop",_) $ ((Const("op <=",_) $ _) $ (_ $ abstractIOA))) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   108
let
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   109
val aut_typ = #T(rep_cterm(cterm_of sg abstractIOA));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   110
val tr_typ = fst_type(snd_type(snd_type aut_typ))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   111
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   112
Const("Automata.trans_of",Type("fun",[aut_typ,tr_typ])) $ abstractIOA 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   113
end
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   114
|
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   115
TransA sg t =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   116
error("malformed automaton def for TransA:\n" ^ (Sign.string_of_term sg t));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   117
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   118
fun delete_ul [] = []
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   119
| delete_ul (x::xs) = if (is_prefix (op =) ("\^["::"["::"4"::"m"::[]) (x::xs))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   120
        then (let val (_::_::_::s) = xs in delete_ul s end)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   121
        else (if (is_prefix (op =) ("\^["::"["::"0"::"m"::[]) (x::xs))
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   122
                then  (let val (_::_::_::s) = xs in delete_ul s end)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   123
                else (x::delete_ul xs));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   124
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   125
fun delete_ul_string s = implode(delete_ul (explode s));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   126
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   127
fun type_list_of sign (Type("*",a::b::_)) = (type_list_of sign a) @ (type_list_of sign b) |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   128
type_list_of sign a = [(Sign.string_of_typ sign a)];
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   129
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   130
fun structured_tuple l (Type("*",s::t::_)) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   131
let
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   132
val (r,str) = structured_tuple l s;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   133
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   134
(fst(structured_tuple r t),"(" ^ str ^ "),(" ^ (snd(structured_tuple r t)) ^ ")")
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   135
end |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   136
structured_tuple (a::r) t = (r,a) |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   137
structured_tuple [] _ = raise malformed;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   138
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   139
fun varlist_of _ _ [] = [] |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   140
varlist_of n s (a::r) = (s ^ (Int.toString(n))) :: (varlist_of (n+1) s r);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   141
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   142
fun string_of [] = "" |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   143
string_of (a::r) = a ^ " " ^ (string_of r);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   144
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   145
fun tupel_typed_of _ _ _ [] = "" |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   146
tupel_typed_of sign s n [a] = s ^ (Int.toString(n)) ^ "::" ^ a |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   147
tupel_typed_of sign s n (a::r) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   148
 s ^ (Int.toString(n)) ^ "::" ^ a ^ "," ^ (tupel_typed_of sign s (n+1) r);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   149
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   150
fun double_tupel_typed_of _ _ _ _ [] = "" |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   151
double_tupel_typed_of sign s t n [a] =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   152
 s ^ (Int.toString(n)) ^ "::" ^ a ^ "," ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   153
 t ^ (Int.toString(n)) ^ "::" ^ a |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   154
double_tupel_typed_of sign s t n (a::r) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   155
 s ^ (Int.toString(n)) ^ "::" ^ a ^ "," ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   156
 t ^ (Int.toString(n)) ^ "::" ^ a ^ "," ^ (double_tupel_typed_of sign s t (n+1) r);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   157
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   158
fun tupel_of _ _ _ [] = "" |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   159
tupel_of sign s n [a] = s ^ (Int.toString(n)) |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   160
tupel_of sign s n (a::r) = s ^ (Int.toString(n)) ^ "," ^ (tupel_of sign s (n+1) r);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   161
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   162
fun double_tupel_of _ _ _ _ [] = "" |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   163
double_tupel_of sign s t n [a] = s ^ (Int.toString(n)) ^ "," ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   164
				 t ^ (Int.toString(n)) |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   165
double_tupel_of sign s t n (a::r) = s ^ (Int.toString(n)) ^ "," ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   166
		t ^ (Int.toString(n)) ^ "," ^ (double_tupel_of sign s t (n+1) r);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   167
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   168
fun eq_string _ _ _ [] = "" |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   169
eq_string s t n [a] = s ^ (Int.toString(n)) ^ " = " ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   170
			 t ^ (Int.toString(n)) |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   171
eq_string s t n (a::r) =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   172
 s ^ (Int.toString(n)) ^ " = " ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   173
 t ^ (Int.toString(n)) ^ " & " ^ (eq_string s t (n+1) r);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   174
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   175
fun merge_var_and_type [] [] = "" |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   176
merge_var_and_type (a::r) (b::s) = "(" ^ a ^ " ::" ^ b ^ ") " ^ (merge_var_and_type r s) |
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   177
merge_var_and_type _ _ = raise malformed;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   178
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   179
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   180
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   181
fun mk_sim_oracle sign (subgoal, thl) = (
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   182
  let
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   183
    val weak_case_congs = (map (#weak_case_cong o snd) o Symtab.dest o DatatypePackage.get_datatypes) sign;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   184
    val concl = Logic.strip_imp_concl subgoal;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   185
    val ic_str = delete_ul_string(Sign.string_of_term sign (IntC sign concl));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   186
    val ia_str = delete_ul_string(Sign.string_of_term sign (IntA sign concl));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   187
	val sc_str = delete_ul_string(Sign.string_of_term sign (StartC sign concl));	
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   188
	val sa_str = delete_ul_string(Sign.string_of_term sign (StartA sign concl));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   189
	val tc_str = delete_ul_string(Sign.string_of_term sign (TransC sign concl));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   190
	val ta_str = delete_ul_string(Sign.string_of_term sign (TransA sign concl));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   191
	
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   192
	val action_type_str =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   193
	Sign.string_of_typ sign (element_type(#T (rep_cterm(cterm_of sign (IntA sign concl)))));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   194
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   195
	val abs_state_type_list =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   196
	type_list_of sign (element_type(#T (rep_cterm(cterm_of sign (StartA sign concl)))));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   197
	val con_state_type_list =
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   198
	type_list_of sign (element_type(#T (rep_cterm(cterm_of sign (StartC sign concl)))));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   199
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   200
	val tupel_eq = eq_string "s" "t" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   201
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   202
	val abs_pre_tupel_typed = tupel_typed_of sign "s" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   203
	val abs_s_t_tupel_typed = double_tupel_typed_of sign "s" "t" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   204
	val con_pre_tupel_typed = tupel_typed_of sign "cs" 0 con_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   205
	val con_s_t_tupel_typed = double_tupel_typed_of sign "cs" "ct" 0 con_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   206
	
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   207
	val abs_pre_tupel = tupel_of sign "s" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   208
	val abs_post_tupel = tupel_of sign "t" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   209
	val abs_s_t_tupel = double_tupel_of sign "s" "t" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   210
	val abs_s_u_tupel = double_tupel_of sign "s" "u" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   211
	val abs_u_t_tupel = double_tupel_of sign "u" "t" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   212
	val abs_u_v_tupel = double_tupel_of sign "u" "v" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   213
	val abs_v_t_tupel = double_tupel_of sign "v" "t" 0 abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   214
	val con_pre_tupel = tupel_of sign "cs" 0 con_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   215
        val con_post_tupel = tupel_of sign "ct" 0 con_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   216
	val con_s_t_tupel = double_tupel_of sign "cs" "ct" 0 con_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   217
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   218
        val abs_pre_varlist = varlist_of 0 "s" abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   219
        val abs_post_varlist = varlist_of 0 "t" abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   220
        val abs_u_varlist = varlist_of 0 "u" abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   221
        val abs_v_varlist = varlist_of 0 "v" abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   222
	val con_pre_varlist = varlist_of 0 "cs" con_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   223
        val con_post_varlist = varlist_of 0 "ct" con_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   224
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   225
        val abs_post_str = string_of abs_post_varlist;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   226
	val abs_u_str = string_of abs_u_varlist;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   227
	val con_post_str = string_of con_post_varlist;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   228
	
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   229
	val abs_pre_str_typed = merge_var_and_type abs_pre_varlist abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   230
	val abs_u_str_typed = merge_var_and_type abs_u_varlist abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   231
        val abs_v_str_typed = merge_var_and_type abs_v_varlist abs_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   232
	val con_pre_str_typed = merge_var_and_type con_pre_varlist con_state_type_list;
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   233
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   234
	val abs_pre_tupel_struct = snd(
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   235
structured_tuple abs_pre_varlist (element_type(#T(rep_cterm(cterm_of sign (StartA sign concl))))));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   236
	val abs_post_tupel_struct = snd(
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   237
structured_tuple abs_post_varlist (element_type(#T(rep_cterm(cterm_of sign (StartA sign concl))))));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   238
	val con_pre_tupel_struct = snd(
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   239
structured_tuple con_pre_varlist (element_type(#T(rep_cterm(cterm_of sign (StartC sign concl))))));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   240
	val con_post_tupel_struct = snd(
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   241
structured_tuple con_post_varlist (element_type(#T(rep_cterm(cterm_of sign (StartC sign concl))))));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   242
in
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   243
(
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   244
OldGoals.push_proof();
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   245
Goal 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   246
( "(Internal_of_A = (% a::(" ^ action_type_str ^ "). a:(" ^ ia_str^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   247
  "))) --> (Internal_of_C = (% a::(" ^ action_type_str ^ "). a:(" ^ ic_str ^ 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   248
  "))) --> (Start_of_A = (% (" ^ abs_pre_tupel_typed ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   249
	"). (" ^ abs_pre_tupel_struct ^ "):(" ^ sa_str ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   250
  "))) --> (Start_of_C = (% (" ^ con_pre_tupel_typed ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   251
	"). (" ^ con_pre_tupel_struct ^ "):(" ^ sc_str ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   252
  "))) --> (Trans_of_A = (% (" ^ abs_s_t_tupel_typed ^ ") (a::(" ^ action_type_str ^ 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   253
	")). ((" ^ abs_pre_tupel_struct ^ "),a,(" ^ abs_post_tupel_struct ^ ")):(" ^ ta_str ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   254
  "))) --> (Trans_of_C = (% (" ^ con_s_t_tupel_typed ^ ") (a::(" ^ action_type_str ^ 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   255
	")). ((" ^ con_pre_tupel_struct ^ "),a,(" ^ con_post_tupel_struct ^ ")):(" ^ tc_str ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   256
  "))) --> (IntStep_of_A = (% (" ^ abs_s_t_tupel_typed ^ 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   257
	"). ? (a::(" ^ action_type_str ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   258
	")). Internal_of_A a & Trans_of_A (" ^ abs_s_t_tupel ^ ") a" ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   259
  ")) --> (IntStepStar_of_A =  mu (% P (" ^ abs_s_t_tupel_typed ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   260
	 "). (" ^ tupel_eq ^ ") | (? " ^ abs_u_str ^ ". IntStep_of_A (" ^ abs_s_u_tupel ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   261
	 ") & P(" ^ abs_u_t_tupel ^ ")))" ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   262
  ") --> (Move_of_A = (% (" ^ abs_s_t_tupel_typed ^ ") (a::(" ^ action_type_str ^ 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   263
	")). (Internal_of_C a & IntStepStar_of_A(" ^ abs_s_t_tupel ^ 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   264
	")) | (? " ^ abs_u_str_typed ^ ". ? " ^ abs_v_str_typed ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   265
	". IntStepStar_of_A(" ^ abs_s_u_tupel ^ ") & " ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   266
	"Trans_of_A (" ^ abs_u_v_tupel ^ ") a  & IntStepStar_of_A(" ^ abs_v_t_tupel ^ "))" ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   267
  ")) --> (isSimCA = nu (% P (" ^ con_pre_tupel_typed ^ "," ^ abs_pre_tupel_typed ^ 
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   268
	"). (! (a::(" ^ action_type_str ^ ")) " ^ con_post_str ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   269
	". Trans_of_C (" ^ con_s_t_tupel ^ ") a  -->" ^ " (? " ^ abs_post_str ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   270
  ". Move_of_A (" ^ abs_s_t_tupel ^ ") a  & P(" ^ con_post_tupel ^ "," ^ abs_post_tupel ^ "))))" ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   271
 ") --> (! " ^ con_pre_str_typed ^ ". ! " ^ abs_pre_str_typed ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   272
	". (Start_of_C (" ^ con_pre_tupel ^ ") & Start_of_A (" ^ abs_pre_tupel ^
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   273
	")) --> isSimCA(" ^ con_pre_tupel ^ "," ^ abs_pre_tupel ^ "))");
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   274
by (REPEAT (rtac impI 1));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   275
by (REPEAT (dtac eq_reflection 1));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   276
(* Bis hierher wird im Kapitel 4 erl"autert, ab hier im Kapitel 5 *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   277
by (full_simp_tac ((simpset() delcongs (if_weak_cong :: weak_case_congs)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   278
                              delsimps [not_iff,split_part])
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   279
			      addsimps (thl @ comp_simps @ restrict_simps @ hide_simps @
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   280
                                        rename_simps @ ioa_simps @ asig_simps)) 1);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   281
by (full_simp_tac
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   282
  (Mucke_ss delcongs (if_weak_cong :: weak_case_congs) delsimps [not_iff,split_part]) 1);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   283
by (REPEAT (if_full_simp_tac
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   284
  (simpset() delcongs (if_weak_cong :: weak_case_congs) delsimps [not_iff,split_part]) 1));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   285
by (call_mucke_tac 1);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   286
(* Bis hierher wird im Kapitel 5 erl"autert, ab hier wieder im Kapitel 4 *)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   287
by (atac 1);
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   288
result();
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   289
OldGoals.pop_proof();
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   290
Logic.strip_imp_concl subgoal
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   291
)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   292
end)
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   293
handle malformed =>
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   294
error("No suitable match to IOA types in " ^ (Sign.string_of_term sign subgoal));
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   295
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   296
end
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   297
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   298
*}
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   299
a7b425bb668c removed legacy ML files;
wenzelm
parents: 17244
diff changeset
   300
end