src/HOL/Modelcheck/mucke_oracle.ML
author haftmann
Thu, 10 Jun 2010 12:24:03 +0200
changeset 37391 476270a6c2dc
parent 37146 f652333bbf8e
child 37591 d3daea901123
permissions -rw-r--r--
tuned quotes, antiquotations and whitespace
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16152
7294283b0c45 no_tac;
wenzelm
parents: 15574
diff changeset
     1
32740
9dd0a2f83429 explicit indication of Unsynchronized.ref;
wenzelm
parents: 32178
diff changeset
     2
val trace_mc = Unsynchronized.ref false; 
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
     3
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
     4
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
     5
(* transform_case post-processes output strings of the syntax "Mucke" *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
     6
(* with respect to the syntax of the case construct                   *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
     7
local
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
     8
  fun extract_argument [] = []
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
     9
  | extract_argument ("*"::_) = []
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    10
  | extract_argument (x::xs) = x::(extract_argument xs);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    11
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    12
  fun cut_argument [] = []
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    13
  | cut_argument ("*"::r) = r
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    14
  | cut_argument (_::xs) = cut_argument xs;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    15
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    16
  fun insert_case_argument [] s = []
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    17
  | insert_case_argument ("*"::"="::xl) (x::xs) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    18
         (explode(x)@(" "::"="::(insert_case_argument xl (x::xs))))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    19
  | insert_case_argument ("c"::"a"::"s"::"e"::"*"::xl) s =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    20
        (let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    21
        val arg=implode(extract_argument xl);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    22
        val xr=cut_argument xl
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    23
        in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    24
         "c"::"a"::"s"::"e"::" "::(insert_case_argument xr (arg::s))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    25
        end)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    26
  | insert_case_argument ("e"::"s"::"a"::"c"::"*"::xl) (x::xs) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    27
        "e"::"s"::"a"::"c"::(insert_case_argument xl xs)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    28
  | insert_case_argument (x::xl) s = x::(insert_case_argument xl s);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    29
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    30
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    31
fun transform_case s = implode(insert_case_argument (explode s) []);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    32
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    33
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    34
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    35
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    36
(* if_full_simp_tac is a tactic for rewriting non-boolean ifs *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    37
local
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    38
  (* searching an if-term as below as possible *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    39
  fun contains_if (Abs(a,T,t)) = [] |
16587
b34c8aa657a5 Constant "If" is now local
paulson
parents: 16486
diff changeset
    40
  contains_if (Const("HOL.If",T) $ b $ a1 $ a2) =
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    41
  let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    42
  fun tn (Type(s,_)) = s |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    43
  tn _ = error "cannot master type variables in if term";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    44
  val s = tn(body_type T);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    45
  in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    46
  if (s="bool") then [] else [b,a1,a2]
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    47
  end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    48
  contains_if (a $ b) = if ((contains_if b)=[]) then (contains_if a)
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
    49
                        else (contains_if b) |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    50
  contains_if _ = [];
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    51
20194
c9dbce9a23a1 renamed Term.variant_abs to Syntax.variant_abs;
wenzelm
parents: 20071
diff changeset
    52
  fun find_replace_term (Abs(a,T,t)) = find_replace_term (snd(Syntax.variant_abs(a,T,t))) |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    53
  find_replace_term (a $ b) = if ((contains_if (a $ b))=[]) then
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    54
  (if (snd(find_replace_term b)=[]) then (find_replace_term a) else (find_replace_term b))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    55
  else (a $ b,contains_if(a $ b))|
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    56
  find_replace_term t = (t,[]);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    57
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    58
  fun if_substi (Abs(a,T,t)) trm = Abs(a,T,t) |
16587
b34c8aa657a5 Constant "If" is now local
paulson
parents: 16486
diff changeset
    59
  if_substi (Const("HOL.If",T) $ b $ a1 $ a2) t = t |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    60
  if_substi (a $ b) t = if ((contains_if b)=[]) then ((if_substi a t)$b)
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
    61
                        else (a$(if_substi b t)) |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    62
  if_substi t v = t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    63
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    64
  fun deliver_term (t,[]) = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    65
  deliver_term (t,[b,a1,a2]) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    66
  [
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    67
  Const("Trueprop",Type("fun",[Type("bool",[]),Type("prop",[])])) $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    68
  (
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    69
Const("op =",Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])]))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    70
  $ t $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    71
  (
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    72
Const("op &",Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])]))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    73
  $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    74
  (
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    75
Const("op -->",Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])]))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    76
  $ b $ (if_substi t a1))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    77
  $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    78
  (
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    79
Const("op -->",Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])]))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    80
  $ (Const("Not",Type("fun",[Type("bool",[]),Type("bool",[])])) $ b) $ (if_substi t a2))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    81
  ))] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    82
  deliver_term _ =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    83
  error "tactic failed due to occurence of malformed if-term" (* shouldnt occur *);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    84
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    85
  fun search_if (*((Const("==",_)) $ _ $*) (a) = deliver_term(find_replace_term a);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    86
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    87
  fun search_ifs [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    88
  search_ifs (a::r) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    89
  let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    90
  val i = search_if a
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    91
  in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    92
  if (i=[]) then (search_ifs r) else i
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    93
  end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    94
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    95
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    96
fun if_full_simp_tac sset i state =
22596
d0d2af4db18f rep_thm/cterm/ctyp: removed obsolete sign field;
wenzelm
parents: 20194
diff changeset
    97
let val sign = Thm.theory_of_thm state;
33955
fff6f11b1f09 curried take/drop
haftmann
parents: 33004
diff changeset
    98
        val subgoal = nth (prems_of state) i;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
    99
        val prems = Logic.strip_imp_prems subgoal;
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   100
        val concl = Logic.strip_imp_concl subgoal;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   101
        val prems = prems @ [concl];
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   102
        val itrm = search_ifs prems;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   103
in
16152
7294283b0c45 no_tac;
wenzelm
parents: 15574
diff changeset
   104
if (itrm = []) then no_tac state else
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   105
(
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   106
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   107
val trm = hd(itrm)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   108
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   109
(
17959
8db36a108213 OldGoals;
wenzelm
parents: 17374
diff changeset
   110
OldGoals.push_proof();
8db36a108213 OldGoals;
wenzelm
parents: 17374
diff changeset
   111
OldGoals.goalw_cterm [] (cterm_of sign trm);
32178
0261c3eaae41 do not open OldGoals;
wenzelm
parents: 32174
diff changeset
   112
OldGoals.by (simp_tac (global_simpset_of sign) 1);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   113
        let
32178
0261c3eaae41 do not open OldGoals;
wenzelm
parents: 32174
diff changeset
   114
        val if_tmp_result = OldGoals.result()
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   115
        in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   116
        (
17959
8db36a108213 OldGoals;
wenzelm
parents: 17374
diff changeset
   117
        OldGoals.pop_proof();
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   118
        CHANGED(full_simp_tac (sset addsimps [if_tmp_result]) i) state)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   119
        end
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   120
)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   121
end)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   122
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   123
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   124
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   125
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   126
(********************************************************)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   127
(* All following stuff serves for defining mk_mc_oracle *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   128
(********************************************************)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   129
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   130
(***************************************)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   131
(* SECTION 0: some auxiliary functions *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   132
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   133
fun list_contains_key [] _ = false |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   134
list_contains_key ((a,l)::r) t = if (a=t) then true else (list_contains_key r t);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   135
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   136
fun search_in_keylist [] _ = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   137
search_in_keylist ((a,l)::r) t = if (a=t) then l else (search_in_keylist r t);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   138
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   139
(* delivers the part of a qualified type/const-name after the last dot *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   140
fun post_last_dot str =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   141
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   142
fun fl [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   143
fl (a::r) = if (a=".") then [] else (a::(fl r));
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   144
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   145
implode(rev(fl(rev(explode str))))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   146
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   147
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   148
(* OUTPUT - relevant *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   149
(* converts type to string by a mucke-suitable convention *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   150
fun type_to_string_OUTPUT (Type(a,[])) = post_last_dot a |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   151
type_to_string_OUTPUT (Type("*",[a,b])) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   152
         "P_" ^ (type_to_string_OUTPUT a) ^ "_AI_" ^ (type_to_string_OUTPUT b) ^ "_R" |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   153
type_to_string_OUTPUT (Type(a,l)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   154
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   155
fun ts_to_string [] = "" |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   156
ts_to_string (a::[]) = type_to_string_OUTPUT a |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   157
ts_to_string (a::l) = (type_to_string_OUTPUT a) ^ "_I_" ^ (ts_to_string l);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   158
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   159
(post_last_dot a) ^ "_A_" ^ (ts_to_string l) ^ "_C"
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   160
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   161
type_to_string_OUTPUT _ =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   162
error "unexpected type variable in type_to_string";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   163
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   164
(* delivers type of a term *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   165
fun type_of_term (Const(_,t)) = t |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   166
type_of_term (Free(_,t)) = t |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   167
type_of_term (Var(_,t)) = t |
20194
c9dbce9a23a1 renamed Term.variant_abs to Syntax.variant_abs;
wenzelm
parents: 20071
diff changeset
   168
type_of_term (Abs(x,t,trm)) = Type("fun",[t,type_of_term(snd(Syntax.variant_abs(x,t,trm)))]) |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   169
type_of_term (a $ b) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   170
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   171
 fun accept_fun_type (Type("fun",[x,y])) = (x,y) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   172
 accept_fun_type _ =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   173
 error "no function type returned, where it was expected (in type_of_term)";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   174
 val (x,y) = accept_fun_type(type_of_term a)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   175
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   176
y
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   177
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   178
type_of_term _ = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   179
error "unexpected bound variable when calculating type of a term (in type_of_term)";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   180
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   181
(* makes list [a1..an] and ty to type an -> .. -> a1 -> ty *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   182
fun fun_type_of [] ty = ty |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   183
fun_type_of (a::r) ty = fun_type_of r (Type("fun",[a,ty]));
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   184
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   185
(* creates a constructor term from constructor and its argument terms *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   186
fun con_term_of t [] = t |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   187
con_term_of t (a::r) = con_term_of (t $ a) r;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   188
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   189
(* creates list of constructor terms *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   190
fun con_term_list_of trm [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   191
con_term_list_of trm (a::r) = (con_term_of trm a)::(con_term_list_of trm r);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   192
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   193
(* list multiplication *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   194
fun multiply_element a [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   195
multiply_element a (l::r) = (a::l)::(multiply_element a r);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   196
fun multiply_list [] l = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   197
multiply_list (a::r) l = (multiply_element a l)@(multiply_list r l);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   198
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   199
(* To a list of types, delivers all lists of proper argument terms; tl has to *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   200
(* be a preprocessed type list with element type: (type,[(string,[type])])    *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   201
fun arglist_of sg tl [] = [[]] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   202
arglist_of sg tl (a::r) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   203
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   204
fun ispair (Type("*",x::y::[])) = (true,(x,y)) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   205
ispair x = (false,(x,x));
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   206
val erg =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   207
(if (fst(ispair a))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   208
 then (let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   209
        val (x,y) = snd(ispair a)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   210
       in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   211
        con_term_list_of (Const("pair",Type("fun",[x,Type("fun",[y,a])])))
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   212
                         (arglist_of sg tl [x,y])
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   213
       end)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   214
 else
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   215
 (let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   216
  fun deliver_erg sg tl _ [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   217
  deliver_erg sg tl typ ((c,tyl)::r) = let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   218
                        val ft = fun_type_of (rev tyl) typ;
27251
121991a4884d OldGoals.simple_read_term;
wenzelm
parents: 26939
diff changeset
   219
                        val trm = OldGoals.simple_read_term sg ft c;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   220
                        in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   221
                        (con_term_list_of trm (arglist_of sg tl tyl))
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   222
                        @(deliver_erg sg tl typ r)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   223
                        end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   224
  val cl = search_in_keylist tl a;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   225
  in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   226
  deliver_erg sg tl a cl
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   227
  end))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   228
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   229
multiply_list erg (arglist_of sg tl r)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   230
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   231
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   232
(*******************************************************************)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   233
(* SECTION 1: Robert Sandner's source was improved and extended by *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   234
(* generation of function declarations                             *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   235
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   236
fun dest_Abs (Abs s_T_t) = s_T_t
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   237
  | dest_Abs t = raise TERM("dest_Abs", [t]);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   238
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   239
(*
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   240
fun force_Abs (Abs s_T_t) = Abs s_T_t
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   241
  | force_Abs t = Abs("x", hd(fst(strip_type (type_of t))),
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   242
                      (incr_boundvars 1 t) $ (Bound 0));
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   243
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   244
fun etaexp_dest_Abs t = dest_Abs (force_Abs t);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   245
*)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   246
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   247
(* replace Vars bei Frees, freeze_thaw shares code of tactic/freeze_thaw
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   248
   and thm.instantiate *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   249
fun freeze_thaw t =
29270
0eade173f77e moved old add_type_XXX, add_term_XXX etc. to structure OldTerm;
wenzelm
parents: 29265
diff changeset
   250
  let val used = OldTerm.add_term_names (t, [])
29265
5b4247055bd7 moved old add_term_vars, add_term_frees etc. to structure OldTerm;
wenzelm
parents: 28290
diff changeset
   251
          and vars = OldTerm.term_vars t;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   252
      fun newName (Var(ix,_), (pairs,used)) = 
20071
8f3e1ddb50e6 replaced Term.variant(list) by Name.variant(_list);
wenzelm
parents: 18443
diff changeset
   253
          let val v = Name.variant used (string_of_indexname ix)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   254
          in  ((ix,v)::pairs, v::used)  end;
33004
715566791eb0 always qualify NJ's old List.foldl/foldr in Isabelle/ML;
wenzelm
parents: 32960
diff changeset
   255
      val (alist, _) = List.foldr newName ([], used) vars;
17374
63e0ab9f2ea9 introduces AList.lookup
haftmann
parents: 17272
diff changeset
   256
      fun mk_inst (Var(v,T)) = (Var(v,T),
63e0ab9f2ea9 introduces AList.lookup
haftmann
parents: 17272
diff changeset
   257
           Free ((the o AList.lookup (op =) alist) v, T));
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   258
      val insts = map mk_inst vars;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   259
  in subst_atomic insts t end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   260
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   261
fun make_fun_type (a::b::l) = Type("fun",a::(make_fun_type (b::l))::[]) 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   262
  | make_fun_type (a::l) = a;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   263
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   264
fun make_decl muckeType id isaType =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   265
  let val constMuckeType = Const(muckeType,isaType);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   266
      val constId = Const(id,isaType);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   267
      val constDecl = Const("_decl", make_fun_type [isaType,isaType,isaType]); 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   268
  in (constDecl $ constMuckeType) $ constId end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   269
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   270
fun make_MuTerm muDeclTerm ParamDeclTerm muTerm isaType =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   271
  let val constMu = Const("_mu",
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   272
                          make_fun_type [isaType,isaType,isaType,isaType]);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   273
      val t1 = constMu $ muDeclTerm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   274
      val t2 = t1 $ ParamDeclTerm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   275
      val t3 = t2 $  muTerm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   276
  in t3 end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   277
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   278
fun make_MuDecl muDeclTerm ParamDeclTerm isaType =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   279
  let val constMu = Const("_mudec",
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   280
                          make_fun_type [isaType,isaType,isaType]);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   281
      val t1 = constMu $ muDeclTerm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   282
      val t2 = t1 $ ParamDeclTerm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   283
  in t2 end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   284
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   285
fun make_NuTerm muDeclTerm ParamDeclTerm muTerm isaType =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   286
  let val constMu = Const("_nu",
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   287
                          make_fun_type [isaType,isaType,isaType,isaType]);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   288
      val t1 = constMu $ muDeclTerm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   289
      val t2 = t1 $ ParamDeclTerm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   290
      val t3 = t2 $  muTerm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   291
  in t3 end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   292
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   293
fun make_NuDecl muDeclTerm ParamDeclTerm isaType =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   294
  let val constMu = Const("_nudec",
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   295
                          make_fun_type [isaType,isaType,isaType]);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   296
      val t1 = constMu $ muDeclTerm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   297
      val t2 = t1 $ ParamDeclTerm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   298
  in t2 end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   299
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   300
fun is_mudef (( Const("==",_) $ t1) $ ((Const("MuCalculus.mu",_)) $ t2)) = true
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   301
  | is_mudef _ = false;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   302
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   303
fun is_nudef (( Const("==",_) $ t1) $ ((Const("MuCalculus.nu",_)) $ t2)) = true
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   304
  | is_nudef _ = false;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   305
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   306
fun make_decls sign Dtype (Const(str,tp)::n::Clist) = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   307
    let val const_decls = Const("_decls",make_fun_type [Dtype,Dtype,Dtype]);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   308
        val decl = make_decl (type_to_string_OUTPUT tp) str Dtype;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   309
    in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   310
    ((const_decls $ decl) $ (make_decls sign Dtype (n::Clist)))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   311
    end
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   312
  | make_decls sign Dtype [Const(str,tp)] = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   313
      make_decl (type_to_string_OUTPUT tp) str Dtype;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   314
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   315
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   316
(* make_mu_def transforms an Isabelle Mu-Definition into Mucke format
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   317
   Takes equation of the form f = Mu Q. % x. t *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   318
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   319
fun dest_atom (Const t) = dest_Const (Const t)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   320
  | dest_atom (Free t)  = dest_Free (Free t);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   321
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   322
fun get_decls sign Clist (Abs(s,tp,trm)) = 
20194
c9dbce9a23a1 renamed Term.variant_abs to Syntax.variant_abs;
wenzelm
parents: 20071
diff changeset
   323
    let val VarAbs = Syntax.variant_abs(s,tp,trm);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   324
    in get_decls sign (Const(fst VarAbs,tp)::Clist) (snd VarAbs)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   325
    end
37135
636e6d8645d6 normalized references to constant "split"
haftmann
parents: 36692
diff changeset
   326
  | get_decls sign Clist ((Const (@{const_name split}, _)) $ trm) = get_decls sign Clist trm
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   327
  | get_decls sign Clist trm = (Clist,trm);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   328
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   329
fun make_mu_def sign ((tt $ LHS) $ (ttt $ RHS)) =
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   330
  let   val LHSStr = fst (dest_atom LHS);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   331
        val MuType = Type("bool",[]); (* always ResType of mu, also serves
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   332
                                         as dummy type *)
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   333
        val (_,_,PAbs) = dest_Abs (RHS); (* RHS is %Q. ... *)
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   334
        val (PCon_LHS,MMuTerm) = get_decls sign [] (subst_bound (LHS,PAbs));
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   335
        val PConsts = rev PCon_LHS;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   336
        val muDeclTerm = make_decl "bool" LHSStr MuType;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   337
        val PDeclsTerm = make_decls sign MuType PConsts;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   338
        val MuDefTerm = make_MuTerm muDeclTerm PDeclsTerm MMuTerm MuType;               
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   339
  in MuDefTerm end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   340
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   341
fun make_mu_decl sign ((tt $ LHS) $ (ttt $ RHS)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   342
  let   val LHSStr = fst (dest_atom LHS);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   343
        val MuType = Type("bool",[]); (* always ResType of mu, also serves
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   344
                                         as dummy type *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   345
        val (_,_,PAbs) = dest_Abs (RHS); (* RHS is %Q. ... *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   346
        val (PCon_LHS,MMuTerm) = get_decls sign [] (subst_bound (LHS,PAbs));
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   347
        val PConsts = rev PCon_LHS;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   348
        val muDeclTerm = make_decl "bool" LHSStr MuType;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   349
        val PDeclsTerm = make_decls sign MuType PConsts;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   350
        val MuDeclTerm = make_MuDecl muDeclTerm PDeclsTerm MuType;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   351
  in MuDeclTerm end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   352
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   353
fun make_nu_def sign ((tt $ LHS) $ (ttt $ RHS)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   354
  let   val LHSStr = fst (dest_atom LHS);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   355
        val MuType = Type("bool",[]); (* always ResType of mu, also serves
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   356
                                         as dummy type *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   357
        val (_,_,PAbs) = dest_Abs (RHS); (* RHS is %Q. ... *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   358
        val (PCon_LHS,MMuTerm) = get_decls sign [] (subst_bound (LHS,PAbs));
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   359
        val PConsts = rev PCon_LHS;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   360
        val muDeclTerm = make_decl "bool" LHSStr MuType;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   361
        val PDeclsTerm = make_decls sign MuType PConsts;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   362
        val NuDefTerm = make_NuTerm muDeclTerm PDeclsTerm MMuTerm MuType;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   363
  in NuDefTerm end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   364
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   365
fun make_nu_decl sign ((tt $ LHS) $ (ttt $ RHS)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   366
  let   val LHSStr = fst (dest_atom LHS);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   367
        val MuType = Type("bool",[]); (* always ResType of mu, also serves
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   368
                                         as dummy type *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   369
        val (_,_,PAbs) = dest_Abs (RHS); (* RHS is %Q. ... *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   370
        val (PCon_LHS,MMuTerm) = get_decls sign [] (subst_bound (LHS,PAbs));
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   371
        val PConsts = rev PCon_LHS; 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   372
        val muDeclTerm = make_decl "bool" LHSStr MuType;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   373
        val PDeclsTerm = make_decls sign MuType PConsts; 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   374
        val NuDeclTerm = make_NuDecl muDeclTerm PDeclsTerm MuType;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   375
  in NuDeclTerm end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   376
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   377
fun make_FunMuckeTerm FunDeclTerm ParamDeclTerm Term isaType =
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   378
  let   val constFun = Const("_fun",
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   379
                            make_fun_type [isaType,isaType,isaType,isaType]);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   380
        val t1 = constFun $ FunDeclTerm;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   381
        val t2 = t1 $ ParamDeclTerm;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   382
        val t3 = t2 $  Term
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   383
  in t3 end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   384
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   385
fun make_FunMuckeDecl FunDeclTerm ParamDeclTerm isaType =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   386
  let   val constFun = Const("_dec",
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   387
                            make_fun_type [isaType,isaType,isaType]);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   388
      val t1 = constFun $ FunDeclTerm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   389
      val t2 = t1 $ ParamDeclTerm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   390
  in t2 end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   391
37135
636e6d8645d6 normalized references to constant "split"
haftmann
parents: 36692
diff changeset
   392
fun is_fundef (Const("==", _) $ _ $ (Const (@{const_name split}, _) $ _)) = true
636e6d8645d6 normalized references to constant "split"
haftmann
parents: 36692
diff changeset
   393
  | is_fundef (Const("==", _) $ _ $ Abs _) = true 
636e6d8645d6 normalized references to constant "split"
haftmann
parents: 36692
diff changeset
   394
  | is_fundef _ = false; 
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   395
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   396
fun make_mucke_fun_def sign ((_ $ LHS) $ RHS) =
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   397
  let   (* fun dest_atom (Const t) = dest_Const (Const t)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   398
          | dest_atom (Free t)  = dest_Free (Free t); *)
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   399
        val LHSStr = fst (dest_atom LHS);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   400
        val LHSResType = body_type(snd(dest_atom LHS));
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   401
        val LHSResTypeStr = type_to_string_OUTPUT LHSResType;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   402
(*      val (_,AbsType,RawTerm) = dest_Abs(RHS);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   403
*)      val (Consts_LHS_rev,Free_RHS) = get_decls sign [] RHS;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   404
        val Consts_LHS = rev Consts_LHS_rev;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   405
        val PDeclsTerm = make_decls sign LHSResType Consts_LHS; 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   406
                (* Boolean functions only, list necessary in general *)
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   407
        val DeclTerm = make_decl LHSResTypeStr LHSStr LHSResType;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   408
        val MuckeDefTerm = make_FunMuckeTerm DeclTerm PDeclsTerm Free_RHS
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   409
                                         LHSResType;    
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   410
  in MuckeDefTerm end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   411
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   412
fun make_mucke_fun_decl sign ((_ $ LHS) $ RHS) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   413
  let   (* fun dest_atom (Const t) = dest_Const (Const t)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   414
          | dest_atom (Free t)  = dest_Free (Free t); *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   415
        val LHSStr = fst (dest_atom LHS);
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   416
        val LHSResType = body_type(snd(dest_atom LHS));
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   417
        val LHSResTypeStr = type_to_string_OUTPUT LHSResType;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   418
(*      val (_,AbsType,RawTerm) = dest_Abs(RHS);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   419
*)      val (Consts_LHS_rev,Free_RHS) = get_decls sign [] RHS;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   420
        val Consts_LHS = rev Consts_LHS_rev;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   421
        val PDeclsTerm = make_decls sign LHSResType Consts_LHS;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   422
                (* Boolean functions only, list necessary in general *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   423
        val DeclTerm = make_decl LHSResTypeStr LHSStr LHSResType;
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   424
        val MuckeDeclTerm = make_FunMuckeDecl DeclTerm PDeclsTerm LHSResType;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   425
in MuckeDeclTerm end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   426
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   427
fun elim_quantifications sign ((Const("Ex",_)) $ Abs (str,tp,t)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   428
    (let val ExConst = Const("_Ex",make_fun_type [tp,tp,tp,tp]);
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   429
         val TypeConst = Const (type_to_string_OUTPUT tp,tp);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   430
         val VarAbs = Syntax.variant_abs(str,tp,t);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   431
         val BoundConst = Const(fst VarAbs,tp);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   432
         val t1 = ExConst $ TypeConst;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   433
         val t2 = t1 $ BoundConst;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   434
         val t3 = elim_quantifications sign (snd VarAbs)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   435
     in t2 $ t3 end)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   436
  |  elim_quantifications sign ((Const("All",_)) $ Abs (str,tp,t)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   437
    (let val AllConst = Const("_All",make_fun_type [tp,tp,tp,tp]);
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   438
         val TypeConst = Const (type_to_string_OUTPUT tp,tp);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   439
         val VarAbs = Syntax.variant_abs(str,tp,t);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   440
         val BoundConst = Const(fst VarAbs,tp);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   441
         val t1 = AllConst $ TypeConst;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   442
         val t2 = t1 $ BoundConst;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   443
         val t3 = elim_quantifications sign (snd VarAbs)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   444
     in t2 $ t3 end)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   445
  | elim_quantifications sign (t1 $ t2) = 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   446
        (elim_quantifications sign t1) $ (elim_quantifications sign t2)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   447
  | elim_quantifications sign (Abs(_,_,t)) = elim_quantifications sign t
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   448
  | elim_quantifications sign t = t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   449
fun elim_quant_in_list sign [] = []
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   450
  | elim_quant_in_list sign (trm::list) = 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   451
                        (elim_quantifications sign trm)::(elim_quant_in_list sign list);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   452
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   453
fun dummy true = writeln "True\n" |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   454
    dummy false = writeln "Fals\n";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   455
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   456
fun transform_definitions sign [] = []
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   457
  | transform_definitions sign (trm::list) = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   458
      if is_mudef trm 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   459
      then (make_mu_def sign trm)::(transform_definitions sign list)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   460
      else 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   461
        if is_nudef trm
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   462
         then (make_nu_def sign trm)::(transform_definitions sign list)
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   463
         else 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   464
           if is_fundef trm
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   465
           then (make_mucke_fun_def sign trm)::(transform_definitions sign list)
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   466
                     else trm::(transform_definitions sign list);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   467
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   468
fun terms_to_decls sign [] = []
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   469
 | terms_to_decls sign (trm::list) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   470
      if is_mudef trm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   471
      then (make_mu_decl sign trm)::(terms_to_decls sign list)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   472
      else
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   473
        if is_nudef trm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   474
         then (make_nu_decl sign trm)::(terms_to_decls sign list)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   475
         else
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   476
           if is_fundef trm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   477
           then (make_mucke_fun_decl sign trm)::(terms_to_decls sign list)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   478
                     else (transform_definitions sign list);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   479
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   480
fun transform_terms sign list = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   481
let val DefsOk = transform_definitions sign list;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   482
in elim_quant_in_list sign DefsOk
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   483
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   484
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   485
fun string_of_terms sign terms =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   486
let fun make_string sign [] = "" |
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   487
        make_string sign (trm::list) =
26939
1035c89b4c02 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26343
diff changeset
   488
           Syntax.string_of_term_global sign trm ^ "\n" ^ make_string sign list
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   489
in
37146
f652333bbf8e renamed structure PrintMode to Print_Mode, keeping the old name as legacy alias for some time;
wenzelm
parents: 37135
diff changeset
   490
  Print_Mode.setmp ["Mucke"] (make_string sign) terms
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   491
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   492
6491
7954ffeb93f3 fixed IO;
wenzelm
parents: 6473
diff changeset
   493
fun callmc s =
7954ffeb93f3 fixed IO;
wenzelm
parents: 6473
diff changeset
   494
  let
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   495
    val mucke_home = getenv "MUCKE_HOME";
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   496
    val mucke =
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   497
      if mucke_home = "" then error "Environment variable MUCKE_HOME not set"
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   498
      else mucke_home ^ "/mucke";
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   499
    val mucke_input_file = File.tmp_path (Path.basic "tmp.mu");
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   500
    val _ = File.write mucke_input_file s;
35010
d6e492cea6e4 renamed system/system_out to bash/bash_output -- to emphasized that this is really GNU bash, not some undefined POSIX sh;
wenzelm
parents: 33955
diff changeset
   501
    val (result, _) = bash_output (mucke ^ " -nb -res " ^ File.shell_path mucke_input_file);
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   502
  in
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   503
    if not (!trace_mc) then (File.rm mucke_input_file) else (); 
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   504
    result
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   505
  end;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   506
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   507
(* extract_result looks for true value before *) 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   508
(* finishing line "===..." of mucke output    *)
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   509
(* ------------------------------------------ *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   510
(* Be Careful:                                *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   511
(* If the mucke version changes, some changes *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   512
(* have also to be made here:                 *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   513
(* In extract_result, the value               *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   514
(* answer_with_info_lines checks the output   *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   515
(* of the muche version, where the output     *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   516
(* finishes with information about memory and *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   517
(* time (segregated from the "true" value by  *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   518
(* a line of equality signs).                 *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   519
(* For older versions, where this line does   *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   520
(* exist, value general_answer checks whether *)
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   521
(* "true" stand at the end of the output.     *)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   522
local
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   523
18443
a1d53af4c4c7 removed superfluos is_prefix functions
haftmann
parents: 17959
diff changeset
   524
infix contains at_post string_contains string_at_post;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   525
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   526
  val is_blank : string -> bool =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   527
      fn " " => true | "\t" => true | "\n" => true | "\^L" => true 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   528
       | "\160" => true | _ => false;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   529
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   530
  fun delete_blanks [] = []
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   531
    | delete_blanks (":"::xs) = delete_blanks xs
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   532
    | delete_blanks (x::xs) = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   533
        if (is_blank x) then (delete_blanks xs)
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   534
                        else x::(delete_blanks xs);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   535
  
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   536
  fun delete_blanks_string s = implode(delete_blanks (explode s));
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   537
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   538
  fun [] contains [] = true
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   539
    | [] contains s = false
18443
a1d53af4c4c7 removed superfluos is_prefix functions
haftmann
parents: 17959
diff changeset
   540
    | (x::xs) contains s = (is_prefix (op =) s (x::xs)) orelse (xs contains s);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   541
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   542
  fun [] at_post [] = true
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   543
    | [] at_post s = false
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   544
    | (x::xs) at_post s = (s = (x::xs)) orelse (xs at_post s);
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   545
 
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   546
  fun s string_contains s1 = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   547
      (explode s) contains (explode s1);
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   548
  fun s string_at_post s1 =
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   549
      (explode s) at_post (explode s1);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   550
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   551
in 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   552
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   553
fun extract_result goal answer =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   554
  let 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   555
    val search_text_true = "istrue===";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   556
    val short_answer = delete_blanks_string answer;
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   557
    val answer_with_info_lines = short_answer string_contains search_text_true;
7305
dad3b686941c mucke -res;
wenzelm
parents: 7295
diff changeset
   558
    (* val general_answer = short_answer string_at_post "true" *) 
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   559
  in
7305
dad3b686941c mucke -res;
wenzelm
parents: 7295
diff changeset
   560
    (answer_with_info_lines) (* orelse (general_answer) *)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   561
  end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   562
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   563
end; 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   564
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   565
(**************************************************************)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   566
(* SECTION 2: rewrites case-constructs over complex datatypes *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   567
local
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   568
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   569
(* check_case checks, whether a term is of the form a $ "(case x of ...)", *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   570
(* where x is of complex datatype; the second argument of the result is    *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   571
(* the number of constructors of the type of x                             *) 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   572
fun check_case sg tl (a $ b) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   573
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   574
 (* tl_contains_complex returns true in the 1st argument when argument type is *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   575
 (* complex; the 2nd argument is the number of constructors                    *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   576
 fun tl_contains_complex [] _ = (false,0) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   577
 tl_contains_complex ((a,l)::r) t =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   578
 let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   579
  fun check_complex [] p = p |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   580
  check_complex ((a,[])::r) (t,i) = check_complex r (t,i+1) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   581
  check_complex ((a,_)::r) (t,i) = check_complex r (true,i+1);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   582
 in
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   583
        if (a=t) then (check_complex l (false,0)) else (tl_contains_complex r t)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   584
 end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   585
 fun check_head_for_case sg (Const(s,_)) st 0 = 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   586
        if (post_last_dot(s) = (st ^ "_case")) then true else false |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   587
 check_head_for_case sg (a $ (Const(s,_))) st 0 = 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   588
        if (post_last_dot(s) = (st ^ "_case")) then true else false |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   589
 check_head_for_case _ _ _ 0 = false |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   590
 check_head_for_case sg (a $ b) st n = check_head_for_case sg a st (n-1) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   591
 check_head_for_case _ _ _ _ = false;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   592
 fun qtn (Type(a,_)) = a | 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   593
 qtn _ = error "unexpected type variable in check_case";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   594
 val t = type_of_term b;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   595
 val (bv,n) = tl_contains_complex tl t
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   596
 val st = post_last_dot(qtn t); 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   597
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   598
 if (bv) then ((check_head_for_case sg a st n),n) else (false,n) 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   599
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   600
check_case sg tl trm = (false,0);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   601
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   602
(* enrich_case_with_terms enriches a case term with additional *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   603
(* conditions according to the context of the case replacement *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   604
fun enrich_case_with_terms sg [] t = t |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   605
enrich_case_with_terms sg [trm] (Abs(x,T,t)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   606
let
20194
c9dbce9a23a1 renamed Term.variant_abs to Syntax.variant_abs;
wenzelm
parents: 20071
diff changeset
   607
 val v = Syntax.variant_abs(x,T,t);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   608
 val f = fst v;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   609
 val s = snd v
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   610
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   611
(Const("Ex",Type("fun",[Type("fun",[T,Type("bool",[])]),Type("bool",[])])) $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   612
(Abs(x,T,
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   613
abstract_over(Free(f,T),
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   614
Const("op &",Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])]))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   615
$
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   616
(Const("op =",Type("fun",[T,Type("fun",[T,Type("bool",[])])])) $ (Free(f,T)) $ trm)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   617
$ s))))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   618
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   619
enrich_case_with_terms sg (a::r) (Abs(x,T,t)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   620
        enrich_case_with_terms sg [a] (Abs(x,T,(enrich_case_with_terms sg r t))) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   621
enrich_case_with_terms sg (t::r) trm =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   622
let val ty = type_of_term t
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   623
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   624
(Const("Ex",Type("fun",[Type("fun",[ ty ,Type("bool",[])]),Type("bool",[])])) $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   625
Abs("a", ty,
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   626
Const("op &",Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])]))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   627
$
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   628
(Const("op =",Type("fun",[ ty ,Type("fun",[ ty ,Type("bool",[])])])) $ Bound(0) $ t)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   629
$
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   630
enrich_case_with_terms sg r (trm $ (Bound(length(r))))))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   631
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   632
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   633
fun replace_termlist_with_constrs sg tl (a::l1) (c::l2) t = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   634
let
20194
c9dbce9a23a1 renamed Term.variant_abs to Syntax.variant_abs;
wenzelm
parents: 20071
diff changeset
   635
 fun heart_of_trm (Abs(x,T,t)) = heart_of_trm(snd(Syntax.variant_abs(x,T,t))) |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   636
 heart_of_trm t = t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   637
 fun replace_termlist_with_args _ _ trm _ [] _ ([],[]) = trm (* should never occur *) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   638
 replace_termlist_with_args sg _ trm _ [a] _ ([],[]) =
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   639
        if ((heart_of_trm trm)= Const("False",Type("bool",[]))) then trm else 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   640
        (enrich_case_with_terms sg a trm) |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   641
 replace_termlist_with_args sg tl trm con [] t (l1,l2) =
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   642
        (replace_termlist_with_constrs sg tl l1 l2 t) | 
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   643
 replace_termlist_with_args sg tl trm con (a::r) t (l1,l2) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   644
 let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   645
  val tty = type_of_term t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   646
  val con_term = con_term_of con a;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   647
 in
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   648
        (Const("HOL.If",Type("fun",[Type("bool",[]),
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   649
        Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])])])) $
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   650
        (Const("op =",Type("fun",[tty,Type("fun",[tty,Type("bool",[])])])) $
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   651
        t $ con_term) $
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   652
        (if ((heart_of_trm trm)= Const("False",Type("bool",[]))) then trm else 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   653
        (enrich_case_with_terms sg a trm)) $
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   654
        (replace_termlist_with_args sg tl trm con r t (l1,l2)))
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   655
 end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   656
 val arglist = arglist_of sg tl (snd c);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   657
 val tty = type_of_term t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   658
 val con_typ = fun_type_of (rev (snd c)) tty;
27251
121991a4884d OldGoals.simple_read_term;
wenzelm
parents: 26939
diff changeset
   659
 val con = OldGoals.simple_read_term sg con_typ (fst c);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   660
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   661
 replace_termlist_with_args sg tl a con arglist t (l1,l2)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   662
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   663
replace_termlist_with_constrs _ _ _ _ _ = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   664
error "malformed arguments in replace_termlist_with_constrs" (* shouldnt occur *);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   665
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   666
(* rc_in_termlist constructs a cascading if with the case terms in trm_list, *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   667
(* which were found in rc_in_term (see replace_case)                         *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   668
fun rc_in_termlist sg tl trm_list trm =  
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   669
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   670
 val ty = type_of_term trm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   671
 val constr_list = search_in_keylist tl ty;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   672
in
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   673
        replace_termlist_with_constrs sg tl trm_list constr_list trm
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   674
end;  
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   675
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   676
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   677
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   678
(* replace_case replaces each case statement over a complex datatype by a cascading if; *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   679
(* it is normally called with a 0 in the 4th argument, it is positive, if in the course *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   680
(* of calculation, a "case" is discovered and then indicates the distance to that case  *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   681
fun replace_case sg tl (a $ b) 0 =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   682
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   683
 (* rc_in_term changes the case statement over term x to a cascading if; the last *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   684
 (* indicates the distance to the "case"-constant                                 *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   685
 fun rc_in_term sg tl (a $ b) l x 0 =
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   686
         (replace_case sg tl a 0) $ (rc_in_termlist sg tl l x) |  
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   687
 rc_in_term sg tl  _ l x 0 = rc_in_termlist sg tl l x |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   688
 rc_in_term sg tl (a $ b) l x n = rc_in_term sg tl a (b::l) x (n-1) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   689
 rc_in_term sg _ trm _ _ n =
26939
1035c89b4c02 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26343
diff changeset
   690
 error("malformed term for case-replacement: " ^ (Syntax.string_of_term_global sg trm));
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   691
 val (bv,n) = check_case sg tl (a $ b);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   692
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   693
 if (bv) then 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   694
        (let
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   695
        val t = (replace_case sg tl a n) 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   696
        in 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   697
        rc_in_term sg tl t [] b n       
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   698
        end)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   699
 else ((replace_case sg tl a 0) $ (replace_case sg tl b 0))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   700
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   701
replace_case sg tl (a $ b) 1 = a $ (replace_case sg tl b 0) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   702
replace_case sg tl (a $ b) n = (replace_case sg tl a (n-1)) $ (replace_case sg tl b 0) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   703
replace_case sg tl (Abs(x,T,t)) _ = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   704
let 
20194
c9dbce9a23a1 renamed Term.variant_abs to Syntax.variant_abs;
wenzelm
parents: 20071
diff changeset
   705
 val v = Syntax.variant_abs(x,T,t);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   706
 val f = fst v;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   707
 val s = snd v
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   708
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   709
 Abs(x,T,abstract_over(Free(f,T),replace_case sg tl s 0))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   710
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   711
replace_case _ _ t _ = t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   712
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   713
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   714
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   715
(*******************************************************************)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   716
(* SECTION 3: replacing variables being part of a constructor term *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   717
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   718
(* transforming terms so that nowhere a variable is subterm of *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   719
(* a constructor term; the transformation uses cascading ifs   *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   720
fun remove_vars sg tl (Abs(x,ty,trm)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   721
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   722
(* checks freeness of variable x in term *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   723
fun xFree x (a $ b) = if (xFree x a) then true else (xFree x b) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   724
xFree x (Abs(a,T,trm)) = xFree x trm |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   725
xFree x (Free(y,_)) = if (x=y) then true else false |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   726
xFree _ _ = false;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   727
(* really substitues variable x by term c *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   728
fun real_subst sg tl x c (a$b) = (real_subst sg tl x c a) $ (real_subst sg tl x c b) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   729
real_subst sg tl x c (Abs(y,T,trm)) = Abs(y,T,real_subst sg tl x c trm) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   730
real_subst sg tl x c (Free(y,t)) = if (x=y) then c else Free(y,t) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   731
real_subst sg tl x c t = t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   732
(* substituting variable x by term c *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   733
fun x_subst sg tl x c (a $ b) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   734
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   735
 val t = (type_of_term (a $ b))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   736
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   737
 if ((list_contains_key tl t) andalso (xFree x (a$b)))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   738
 then (real_subst sg tl x c (a$b)) else ((x_subst sg tl x c a) $ (x_subst sg tl x c b))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   739
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   740
x_subst sg tl x c (Abs(y,T,trm)) = Abs(y,T,x_subst sg tl x c trm) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   741
x_subst sg tl x c t = t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   742
(* genearting a cascading if *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   743
fun casc_if sg tl x ty (c::l) trm =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   744
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   745
 val arglist = arglist_of sg tl (snd c);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   746
 val con_typ = fun_type_of (rev (snd c)) ty;
27251
121991a4884d OldGoals.simple_read_term;
wenzelm
parents: 26939
diff changeset
   747
 val con = OldGoals.simple_read_term sg con_typ (fst c);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   748
 fun casc_if2 sg tl x con [] ty trm [] = trm | (* should never occur *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   749
 casc_if2 sg tl x con [arg] ty trm [] = x_subst sg tl x (con_term_of con arg) trm |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   750
 casc_if2 sg tl x con (a::r) ty trm cl =
16587
b34c8aa657a5 Constant "If" is now local
paulson
parents: 16486
diff changeset
   751
        Const("HOL.If",Type("fun",[Type("bool",[]),
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   752
        Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])])
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   753
        ])) $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   754
     (Const("op =",Type("fun",[ty,Type("fun",[ty,Type("bool",[])])])) $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   755
        Free(x,ty) $ (real_subst sg tl x (con_term_of con a) (Free(x,ty)))) $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   756
   (x_subst sg tl x (con_term_of con a) trm) $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   757
   (casc_if2 sg tl x con r ty trm cl) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   758
 casc_if2 sg tl x con [] ty trm cl = casc_if sg tl x ty cl trm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   759
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   760
 casc_if2 sg tl x con arglist ty trm l
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   761
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   762
casc_if _ _ _ _ [] trm = trm (* should never occur *); 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   763
fun if_term sg tl x ty trm =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   764
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   765
 val tyC_list = search_in_keylist tl ty;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   766
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   767
 casc_if sg tl x ty tyC_list trm
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   768
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   769
(* checking whether a variable occurs in a constructor term *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   770
fun constr_term_contains_var sg tl (a $ b) x =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   771
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   772
 val t = type_of_term (a $ b)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   773
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   774
 if ((list_contains_key tl t) andalso (xFree x (a$b))) then true
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   775
 else
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   776
 (if (constr_term_contains_var sg tl a x) then true 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   777
  else (constr_term_contains_var sg tl b x))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   778
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   779
constr_term_contains_var sg tl (Abs(y,ty,trm)) x =
20194
c9dbce9a23a1 renamed Term.variant_abs to Syntax.variant_abs;
wenzelm
parents: 20071
diff changeset
   780
         constr_term_contains_var sg tl (snd(Syntax.variant_abs(y,ty,trm))) x |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   781
constr_term_contains_var _ _ _ _ = false;
20194
c9dbce9a23a1 renamed Term.variant_abs to Syntax.variant_abs;
wenzelm
parents: 20071
diff changeset
   782
val vt = Syntax.variant_abs(x,ty,trm);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   783
val tt = remove_vars sg tl (snd(vt))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   784
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   785
if (constr_term_contains_var sg tl tt (fst vt))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   786
(* fst vt muss frei vorkommen, als ECHTER TeilKonstruktorterm *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   787
then (Abs(x,ty,
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   788
        abstract_over(Free(fst vt,ty),
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   789
        if_term sg ((Type("bool",[]),[("True",[]),("False",[])])::tl) (fst vt) ty tt)))
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   790
else Abs(x,ty,abstract_over(Free(fst vt,ty),tt))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   791
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   792
remove_vars sg tl (a $ b) = (remove_vars sg tl a) $ (remove_vars sg tl b) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   793
remove_vars sg tl t = t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   794
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   795
(* dissolves equalities "=" of boolean terms, where one of them is a complex term *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   796
fun remove_equal sg tl (Abs(x,ty,trm)) = Abs(x,ty,remove_equal sg tl trm) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   797
remove_equal sg tl (Const("op =",Type("fun",[Type("bool",[]),
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   798
        Type("fun",[Type("bool",[]),Type("bool",[])])])) $ lhs $ rhs) =
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   799
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   800
fun complex_trm (Abs(_,_,_)) = true |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   801
complex_trm (_ $ _) = true |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   802
complex_trm _ = false;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   803
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   804
(if ((complex_trm lhs) orelse (complex_trm rhs)) then
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   805
(let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   806
val lhs = remove_equal sg tl lhs;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   807
val rhs = remove_equal sg tl rhs
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   808
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   809
(
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   810
Const("op &",
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   811
Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])])) $
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   812
(Const("op -->",
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   813
 Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])])) $
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   814
        lhs $ rhs) $
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   815
(Const("op -->",
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   816
 Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])])) $
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   817
        rhs $ lhs)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   818
)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   819
end)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   820
else
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   821
(Const("op =",
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   822
 Type("fun",[Type("bool",[]),Type("fun",[Type("bool",[]),Type("bool",[])])])) $
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   823
        lhs $ rhs))
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   824
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   825
remove_equal sg tl (a $ b) = (remove_equal sg tl a) $ (remove_equal sg tl b) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   826
remove_equal sg tl trm = trm;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   827
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   828
(* rewrites constructor terms (without vars) for mucke *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   829
fun rewrite_dt_term sg tl (Abs(x,ty,t)) = Abs(x,ty,(rewrite_dt_term sg tl t)) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   830
rewrite_dt_term sg tl (a $ b) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   831
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   832
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   833
(* OUTPUT - relevant *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   834
(* transforms constructor term to a mucke-suitable output *)
37391
476270a6c2dc tuned quotes, antiquotations and whitespace
haftmann
parents: 37146
diff changeset
   835
fun term_OUTPUT sg (Const(@{const_name Pair},_) $ a $ b) =
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   836
                (term_OUTPUT sg a) ^ "_I_" ^ (term_OUTPUT sg b) |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   837
term_OUTPUT sg (a $ b) = (term_OUTPUT sg a) ^ "_I_" ^ (term_OUTPUT sg b) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   838
term_OUTPUT sg (Const(s,t)) = post_last_dot s |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   839
term_OUTPUT _ _ = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   840
error "term contains an unprintable constructor term (in term_OUTPUT)";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   841
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   842
fun contains_bound i (Bound(j)) = if (j>=i) then true else false |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   843
contains_bound i (a $ b) = if (contains_bound i a) then true else (contains_bound i b) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   844
contains_bound i (Abs(_,_,t)) = contains_bound (i+1) t |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   845
contains_bound _ _ = false;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   846
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   847
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   848
        if (contains_bound 0 (a $ b)) 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   849
        then ((rewrite_dt_term sg tl a) $ (rewrite_dt_term sg tl b))
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   850
        else
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   851
        (
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   852
        let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   853
        val t = type_of_term (a $ b);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   854
        in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   855
        if (list_contains_key tl t) then (Const((term_OUTPUT sg (a $ b)),t)) else
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   856
        ((rewrite_dt_term sg tl a) $ (rewrite_dt_term sg tl b))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   857
        end)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   858
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   859
rewrite_dt_term sg tl t = t;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   860
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   861
fun rewrite_dt_terms sg tl [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   862
rewrite_dt_terms sg tl (a::r) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   863
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   864
 val c = (replace_case sg ((Type("bool",[]),[("True",[]),("False",[])])::tl) a 0);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   865
 val rv = (remove_vars sg tl c);  
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   866
 val rv = (remove_equal sg tl rv);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   867
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   868
 ((rewrite_dt_term sg tl rv) 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   869
 :: (rewrite_dt_terms sg tl r))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   870
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   871
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   872
(**********************************************************************)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   873
(* SECTION 4: generating type declaration and preprocessing type list *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   874
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   875
fun make_type_decls [] tl = "" |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   876
make_type_decls ((a,l)::r) tl = 
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   877
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   878
fun comma_list_of [] = "" |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   879
comma_list_of (a::[]) = a |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   880
comma_list_of (a::r) = a ^ "," ^ (comma_list_of r);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   881
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   882
(* OUTPUT - relevant *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   883
(* produces for each type of the 2nd argument its constant names (see *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   884
(* concat_constr) and appends them to prestring (see concat_types)    *)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   885
fun generate_constnames_OUTPUT prestring [] _ = [prestring] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   886
generate_constnames_OUTPUT prestring ((Type("*",[a,b]))::r) tl =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   887
 generate_constnames_OUTPUT prestring (a::b::r) tl |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   888
generate_constnames_OUTPUT prestring (a::r) tl =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   889
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   890
 fun concat_constrs [] _ = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   891
 concat_constrs ((c,[])::r) tl = c::(concat_constrs r tl)  |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   892
 concat_constrs ((c,l)::r) tl =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   893
         (generate_constnames_OUTPUT (c ^ "_I_") l tl) @ (concat_constrs r tl);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   894
 fun concat_types _ [] _ _ = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   895
 concat_types prestring (a::q) [] tl = [prestring ^ a] 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   896
                                       @ (concat_types prestring q [] tl) |
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   897
 concat_types prestring (a::q) r tl = 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   898
                (generate_constnames_OUTPUT (prestring ^ a ^ "_I_") r tl) 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   899
                @ (concat_types prestring q r tl);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   900
 val g = concat_constrs (search_in_keylist tl a) tl;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   901
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   902
 concat_types prestring g r tl
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   903
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   904
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   905
fun make_type_decl a tl =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   906
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   907
        val astr = type_to_string_OUTPUT a;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   908
        val dl = generate_constnames_OUTPUT "" [a] tl;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   909
        val cl = comma_list_of dl;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   910
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   911
        ("enum " ^ astr ^ " {" ^ cl ^ "};\n")
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   912
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   913
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   914
 (make_type_decl a tl) ^ (make_type_decls r tl)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   915
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   916
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   917
fun check_finity gl [] [] true = true |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   918
check_finity gl bl [] true = (check_finity gl [] bl false) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   919
check_finity _ _ [] false =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   920
error "used datatypes are not finite" |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   921
check_finity gl bl ((t,cl)::r) b =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   922
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   923
fun listmem [] _ = true |
36692
54b64d4ad524 farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
haftmann
parents: 35010
diff changeset
   924
listmem (a::r) l = if member (op =) l a then (listmem r l) else false;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   925
fun snd_listmem [] _ = true |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   926
snd_listmem ((a,b)::r) l = if (listmem b l) then (snd_listmem r l) else false;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   927
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   928
(if (snd_listmem cl gl) then (check_finity (t::gl) bl r true)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   929
else (check_finity gl ((t,cl)::bl) r b))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   930
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   931
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   932
fun preprocess_td sg [] done = [] |
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   933
preprocess_td sg (a::b) done =
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   934
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   935
fun extract_hd sg (_ $ Abs(_,_,r)) = extract_hd sg r |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   936
extract_hd sg (Const("Trueprop",_) $ r) = extract_hd sg r |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   937
extract_hd sg (Var(_,_) $ r) = extract_hd sg r |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   938
extract_hd sg (a $ b) = extract_hd sg a |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   939
extract_hd sg (Const(s,t)) = post_last_dot s |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   940
extract_hd _ _ =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   941
error "malformed constructor term in a induct-theorem";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   942
fun list_of_param_types sg tl pl (_ $ Abs(_,t,r)) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   943
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   944
 fun select_type [] [] t = t |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   945
 select_type (a::r) (b::s) t =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   946
 if (t=b) then a else (select_type r s t) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   947
 select_type _ _ _ =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   948
 error "wrong number of argument of a constructor in a induct-theorem";
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   949
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   950
 (select_type tl pl t) :: (list_of_param_types sg tl pl r)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   951
end |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   952
list_of_param_types sg tl pl (Const("Trueprop",_) $ r) = list_of_param_types sg tl pl r |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   953
list_of_param_types _ _ _ _ = [];
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   954
fun split_constr sg tl pl a = (extract_hd sg a,list_of_param_types sg tl pl a);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   955
fun split_constrs _ _ _ [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   956
split_constrs sg tl pl (a::r) = (split_constr sg tl pl a) :: (split_constrs sg tl pl r);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   957
fun new_types [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   958
new_types ((t,l)::r) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   959
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   960
 fun ex_bool [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   961
 ex_bool ((Type("bool",[]))::r) = ex_bool r |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   962
 ex_bool ((Type("*",[a,b]))::r) = ex_bool (a::b::r) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   963
 ex_bool (s::r) = s:: (ex_bool r);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   964
 val ll = ex_bool l
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   965
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   966
 (ll @ (new_types r))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   967
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   968
in
36692
54b64d4ad524 farewell to old-style mem infixes -- type inference in situations with mem_int and mem_string should provide enough information to resolve the type of (op =)
haftmann
parents: 35010
diff changeset
   969
        if member (op =) done a
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   970
        then (preprocess_td sg b done)
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   971
        else
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   972
        (let
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   973
         fun qtn (Type(a,tl)) = (a,tl) |
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   974
         qtn _ = error "unexpected type variable in preprocess_td";
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   975
         val s =  post_last_dot(fst(qtn a));
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   976
         fun param_types ((Const("Trueprop",_)) $ (_ $ (Var(_,Type(_,t)))))  = t |
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   977
         param_types _ = error "malformed induct-theorem in preprocess_td";     
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   978
         val induct_rule = PureThy.get_thm sg (s ^ ".induct");
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   979
         val pl = param_types (concl_of induct_rule);
26336
a0e2b706ce73 renamed datatype thmref to Facts.ref, tuned interfaces;
wenzelm
parents: 26225
diff changeset
   980
         val l = split_constrs sg (snd(qtn a)) pl (prems_of induct_rule);
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
   981
         val ntl = new_types l;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   982
        in 
7295
fe09a0c5cebe quite a lot of tuning an cleanup;
wenzelm
parents: 6491
diff changeset
   983
        ((a,l) :: (preprocess_td sg (ntl @ b) (a :: done)))
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   984
        end)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   985
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   986
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   987
fun extract_type_names_prems sg [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   988
extract_type_names_prems sg (a::b) =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   989
let
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   990
fun analyze_types sg [] = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   991
analyze_types sg [Type(a,[])] =
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   992
(let
26939
1035c89b4c02 moved global pretty/string_of functions from Sign to Syntax;
wenzelm
parents: 26343
diff changeset
   993
 val s = (Syntax.string_of_typ_global sg (Type(a,[])))
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   994
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   995
 (if (s="bool") then ([]) else ([Type(a,[])]))
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   996
end) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   997
analyze_types sg [Type("*",l)] = analyze_types sg l |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   998
analyze_types sg [Type("fun",l)] = analyze_types sg l |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
   999
analyze_types sg [Type(t,l)] = ((Type(t,l))::(analyze_types sg l)) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1000
analyze_types sg (a::l) = (analyze_types sg [a]) @ (analyze_types sg l);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1001
fun extract_type_names sg (Const("==",_)) = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1002
extract_type_names sg (Const("Trueprop",_)) = [] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1003
extract_type_names sg (Const(_,typ)) = analyze_types sg [typ] |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1004
extract_type_names sg (a $ b) = (extract_type_names sg a) @ (extract_type_names sg b) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1005
extract_type_names sg (Abs(x,T,t)) = (analyze_types sg [T]) @ (extract_type_names sg t) |
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1006
extract_type_names _ _ = [];
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1007
in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1008
 (extract_type_names sg a) @ extract_type_names_prems sg b
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1009
end;
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1010
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1011
(**********************************************************)
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1012
28290
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27251
diff changeset
  1013
fun mk_mc_mucke_oracle csubgoal =
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27251
diff changeset
  1014
  let
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27251
diff changeset
  1015
  val sign = Thm.theory_of_cterm csubgoal;
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27251
diff changeset
  1016
  val subgoal = Thm.term_of csubgoal;
4cc2b6046258 simplified oracle interface;
wenzelm
parents: 27251
diff changeset
  1017
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1018
        val Freesubgoal = freeze_thaw subgoal;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1019
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1020
        val prems = Logic.strip_imp_prems Freesubgoal; 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1021
        val concl = Logic.strip_imp_concl Freesubgoal; 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1022
        
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1023
        val Muckedecls = terms_to_decls sign prems;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1024
        val decls_str = string_of_terms sign Muckedecls;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1025
        
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1026
        val type_list = (extract_type_names_prems sign (prems@[concl]));
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1027
        val ctl =  preprocess_td sign type_list [];
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1028
        val b = if (ctl=[]) then true else (check_finity [Type("bool",[])] [] ctl false);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1029
        val type_str = make_type_decls ctl 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1030
                                ((Type("bool",[]),("True",[])::("False",[])::[])::ctl);
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1031
        
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1032
        val mprems = rewrite_dt_terms sign ctl prems;
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1033
        val mconcl = rewrite_dt_terms sign ctl [concl];
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1034
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1035
        val Muckeprems = transform_terms sign mprems;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1036
        val prems_str = transform_case(string_of_terms sign Muckeprems);
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1037
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1038
        val Muckeconcl = elim_quant_in_list sign mconcl;
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1039
        val concl_str = transform_case(string_of_terms sign Muckeconcl);
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1040
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1041
        val MCstr = (
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1042
                "/**** type declarations: ****/\n" ^ type_str ^
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1043
                "/**** declarations: ****/\n" ^ decls_str ^
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1044
                "/**** definitions: ****/\n" ^ prems_str ^ 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1045
                "/**** formula: ****/\n" ^ concl_str ^";");
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1046
        val result = callmc MCstr;
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1047
  in
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1048
(if !trace_mc then 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1049
        (writeln ("\nmodelchecker input:\n" ^ MCstr ^ "\n/**** end ****/"))
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1050
          else ();
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1051
(case (extract_result concl_str result) of 
32960
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1052
        true  =>  cterm_of sign (Logic.strip_imp_concl subgoal) | 
69916a850301 eliminated hard tabulators, guessing at each author's individual tab-width;
wenzelm
parents: 32740
diff changeset
  1053
        false => (error ("Mucke couldn't solve subgoal: \n" ^result)))) 
6473
7411f5d6bad7 added for mucke translation;
mueller
parents:
diff changeset
  1054
  end;