| author | wenzelm | 
| Sat, 09 Mar 2024 19:57:08 +0100 | |
| changeset 79836 | c69ae2b8987e | 
| parent 62902 | 3c0f53eae166 | 
| permissions | -rw-r--r-- | 
| 47455 | 1 | (* Title: HOL/Matrix_LP/Compute_Oracle/am_compiler.ML | 
| 23174 | 2 | Author: Steven Obua | 
| 3 | *) | |
| 4 | ||
| 5 | signature COMPILING_AM = | |
| 6 | sig | |
| 7 | include ABSTRACT_MACHINE | |
| 8 | ||
| 23663 | 9 | val set_compiled_rewriter : (term -> term) -> unit | 
| 23174 | 10 | val list_nth : 'a list * int -> 'a | 
| 11 |   val list_map : ('a -> 'b) -> 'a list -> 'b list
 | |
| 12 | end | |
| 13 | ||
| 14 | structure AM_Compiler : COMPILING_AM = struct | |
| 15 | ||
| 16 | val list_nth = List.nth; | |
| 17 | val list_map = map; | |
| 18 | ||
| 23663 | 19 | open AbstractMachine; | 
| 23174 | 20 | |
| 32740 | 21 | val compiled_rewriter = Unsynchronized.ref (NONE:(term -> term)Option.option) | 
| 23174 | 22 | |
| 23 | fun set_compiled_rewriter r = (compiled_rewriter := SOME r) | |
| 24 | ||
| 25 | type program = (term -> term) | |
| 26 | ||
| 27 | fun count_patternvars PVar = 1 | |
| 28 | | count_patternvars (PConst (_, ps)) = | |
| 29 | List.foldl (fn (p, count) => (count_patternvars p)+count) 0 ps | |
| 30 | ||
| 31 | fun print_rule (p, t) = | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 32 | let | 
| 41491 | 33 | fun str x = string_of_int x | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 34 | fun print_pattern n PVar = (n+1, "x"^(str n)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 35 | | print_pattern n (PConst (c, [])) = (n, "c"^(str c)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 36 | | print_pattern n (PConst (c, args)) = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 37 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 38 | val h = print_pattern n (PConst (c,[])) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 39 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 40 | print_pattern_list h args | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 41 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 42 | and print_pattern_list r [] = r | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 43 | | print_pattern_list (n, p) (t::ts) = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 44 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 45 | val (n, t) = print_pattern n t | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 46 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 47 |                 print_pattern_list (n, "App ("^p^", "^t^")") ts
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 48 | end | 
| 23174 | 49 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 50 | val (n, pattern) = print_pattern 0 p | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 51 | val pattern = | 
| 23174 | 52 |             if exists_string Symbol.is_ascii_blank pattern then "(" ^ pattern ^")"
 | 
| 53 | else pattern | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 54 | |
| 46531 | 55 | fun print_term d (Var x) = "Var " ^ str x | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 56 | | print_term d (Const c) = "c" ^ str c | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 57 |           | print_term d (App (a,b)) = "App (" ^ print_term d a ^ ", " ^ print_term d b ^ ")"
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 58 |           | print_term d (Abs c) = "Abs (" ^ print_term (d + 1) c ^ ")"
 | 
| 25217 | 59 | | print_term d (Computed c) = print_term d c | 
| 23174 | 60 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 61 | fun listvars n = if n = 0 then "x0" else "x"^(str n)^", "^(listvars (n-1)) | 
| 23174 | 62 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 63 | val term = print_term 0 t | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 64 | val term = | 
| 23174 | 65 | if n > 0 then "Closure (["^(listvars (n-1))^"], "^term^")" | 
| 66 | else "Closure ([], "^term^")" | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 67 | |
| 23174 | 68 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 69 | " | weak_reduce (false, stack, "^pattern^") = Continue (false, stack, "^term^")" | 
| 23174 | 70 | end | 
| 71 | ||
| 72 | fun constants_of PVar = [] | |
| 73 | | constants_of (PConst (c, ps)) = c :: maps constants_of ps | |
| 74 | ||
| 75 | fun constants_of_term (Var _) = [] | |
| 76 | | constants_of_term (Abs m) = constants_of_term m | |
| 77 | | constants_of_term (App (a,b)) = (constants_of_term a)@(constants_of_term b) | |
| 78 | | constants_of_term (Const c) = [c] | |
| 25217 | 79 | | constants_of_term (Computed c) = constants_of_term c | 
| 23174 | 80 | |
| 81 | fun load_rules sname name prog = | |
| 82 | let | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 83 | val buffer = Unsynchronized.ref "" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 84 | fun write s = (buffer := (!buffer)^s) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 85 | fun writeln s = (write s; write "\n") | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 86 | fun writelist [] = () | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 87 | | writelist (s::ss) = (writeln s; writelist ss) | 
| 41491 | 88 | fun str i = string_of_int i | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 89 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 90 | "structure "^name^" = struct", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 91 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 92 | "datatype term = Dummy | App of term * term | Abs of term | Var of int | Const of int | Closure of term list * term"] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 93 | val constants = distinct (op =) (maps (fn (p, r) => ((constants_of p)@(constants_of_term r))) prog) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 94 |         val _ = map (fn x => write (" | c"^(str x))) constants
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 95 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 96 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 97 | "datatype stack = SEmpty | SAppL of term * stack | SAppR of term * stack | SAbs of stack", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 98 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 99 | "type state = bool * stack * term", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 100 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 101 | "datatype loopstate = Continue of state | Stop of stack * term", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 102 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 103 | "fun proj_C (Continue s) = s", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 104 | " | proj_C _ = raise Match", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 105 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 106 | "fun proj_S (Stop s) = s", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 107 | " | proj_S _ = raise Match", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 108 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 109 | "fun cont (Continue _) = true", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 110 | " | cont _ = false", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 111 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 112 | "fun do_reduction reduce p =", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 113 | " let", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 114 | " val s = Unsynchronized.ref (Continue p)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 115 | " val _ = while cont (!s) do (s := reduce (proj_C (!s)))", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 116 | " in", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 117 | " proj_S (!s)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 118 | " end", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 119 | ""] | 
| 23663 | 120 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 121 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 122 | "fun weak_reduce (false, stack, Closure (e, App (a, b))) = Continue (false, SAppL (Closure (e, b), stack), Closure (e, a))", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 123 | " | weak_reduce (false, SAppL (b, stack), Closure (e, Abs m)) = Continue (false, stack, Closure (b::e, m))", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 124 | " | weak_reduce (false, stack, c as Closure (e, Abs m)) = Continue (true, stack, c)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 125 | " | weak_reduce (false, stack, Closure (e, Var n)) = Continue (false, stack, case "^sname^".list_nth (e, n) of Dummy => Var n | r => r)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 126 | " | weak_reduce (false, stack, Closure (e, c)) = Continue (false, stack, c)"] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 127 | val _ = writelist (map print_rule prog) | 
| 23663 | 128 | val _ = writelist [ | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 129 | " | weak_reduce (false, stack, clos) = Continue (true, stack, clos)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 130 | " | weak_reduce (true, SAppR (a, stack), b) = Continue (false, stack, App (a,b))", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 131 | " | weak_reduce (true, s as (SAppL (b, stack)), a) = Continue (false, SAppR (a, stack), b)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 132 | " | weak_reduce (true, stack, c) = Stop (stack, c)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 133 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 134 | "fun strong_reduce (false, stack, Closure (e, Abs m)) =", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 135 | " let", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 136 | " val (stack', wnf) = do_reduction weak_reduce (false, SEmpty, Closure (Dummy::e, m))", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 137 | " in", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 138 | " case stack' of", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 139 | " SEmpty => Continue (false, SAbs stack, wnf)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 140 |                 "          | _ => raise ("^sname^".Run \"internal error in strong: weak failed\")",
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 141 | " end", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 142 | " | strong_reduce (false, stack, clos as (App (u, v))) = Continue (false, SAppL (v, stack), u)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 143 | " | strong_reduce (false, stack, clos) = Continue (true, stack, clos)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 144 | " | strong_reduce (true, SAbs stack, m) = Continue (false, stack, Abs m)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 145 | " | strong_reduce (true, SAppL (b, stack), a) = Continue (false, SAppR (a, stack), b)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 146 | " | strong_reduce (true, SAppR (a, stack), b) = Continue (true, stack, App (a, b))", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 147 | " | strong_reduce (true, stack, clos) = Stop (stack, clos)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 148 | ""] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 149 | |
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 150 | val ic = "(case c of "^(implode (map (fn c => (str c)^" => c"^(str c)^" | ") constants))^" _ => Const c)" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 151 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 152 |                 "fun importTerm ("^sname^".Var x) = Var x",
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 153 |                 "  | importTerm ("^sname^".Const c) =  "^ic,
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 154 |                 "  | importTerm ("^sname^".App (a, b)) = App (importTerm a, importTerm b)",
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 155 |                 "  | importTerm ("^sname^".Abs m) = Abs (importTerm m)",
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 156 | ""] | 
| 23174 | 157 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 158 | fun ec c = " | exportTerm c"^(str c)^" = "^sname^".Const "^(str c) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 159 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 160 | "fun exportTerm (Var x) = "^sname^".Var x", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 161 | " | exportTerm (Const c) = "^sname^".Const c", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 162 | " | exportTerm (App (a,b)) = "^sname^".App (exportTerm a, exportTerm b)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 163 | " | exportTerm (Abs m) = "^sname^".Abs (exportTerm m)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 164 |                 "  | exportTerm (Closure (closlist, clos)) = raise ("^sname^".Run \"internal error, cannot export Closure\")",
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 165 |                 "  | exportTerm Dummy = raise ("^sname^".Run \"internal error, cannot export Dummy\")"]
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 166 | val _ = writelist (map ec constants) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 167 | |
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 168 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 169 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 170 | "fun rewrite t = ", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 171 | " let", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 172 | " val (stack, wnf) = do_reduction weak_reduce (false, SEmpty, Closure ([], importTerm t))", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 173 | " in", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 174 | " case stack of ", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 175 | " SEmpty => (case do_reduction strong_reduce (false, SEmpty, wnf) of", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 176 | " (SEmpty, snf) => exportTerm snf", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 177 |                 "                        | _ => raise ("^sname^".Run \"internal error in rewrite: strong failed\"))",
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 178 |                 "         | _ => (raise ("^sname^".Run \"internal error in rewrite: weak failed\"))",
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 179 | " end", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 180 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 181 | "val _ = "^sname^".set_compiled_rewriter rewrite", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 182 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 183 | "end;"] | 
| 23174 | 184 | |
| 185 | in | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 186 | compiled_rewriter := NONE; | 
| 62902 
3c0f53eae166
more conventional theory syntax for ML bootstrap, with 'ML_file' instead of 'use';
 wenzelm parents: 
62495diff
changeset | 187 | ML_Compiler0.ML ML_Env.context | 
| 60956 | 188 |           {line = 1, file = "", verbose = false, debug = false} (!buffer);
 | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 189 | case !compiled_rewriter of | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 190 | NONE => raise (Compile "cannot communicate with compiled function") | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 191 | | SOME r => (compiled_rewriter := NONE; r) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 192 | end | 
| 23174 | 193 | |
| 46534 | 194 | fun compile eqs = | 
| 23174 | 195 | let | 
| 46531 | 196 |         val _ = if exists (fn (a,_,_) => not (null a)) eqs then raise Compile ("cannot deal with guards") else ()
 | 
| 197 | val eqs = map (fn (_,b,c) => (b,c)) eqs | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 198 |         fun check (p, r) = if check_freevars (count_patternvars p) r then () else raise Compile ("unbound variables in rule") 
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 199 | val _ = map (fn (p, r) => | 
| 23663 | 200 | (check (p, r); | 
| 201 | case p of PVar => raise (Compile "pattern is just a variable") | _ => ())) eqs | |
| 23174 | 202 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 203 | load_rules "AM_Compiler" "AM_compiled_code" eqs | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32740diff
changeset | 204 | end | 
| 23174 | 205 | |
| 46537 | 206 | fun run prog t = prog t | 
| 46531 | 207 | |
| 23174 | 208 | end | 
| 209 |