| author | immler | 
| Thu, 27 Dec 2018 21:00:50 +0100 | |
| changeset 69510 | 0f31dd2e540d | 
| 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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
36  | 
| print_pattern n (PConst (c, args)) =  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
37  | 
let  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
38  | 
val h = print_pattern n (PConst (c,[]))  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
39  | 
in  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
40  | 
print_pattern_list h args  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
41  | 
end  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
42  | 
and print_pattern_list r [] = r  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
43  | 
| print_pattern_list (n, p) (t::ts) =  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
44  | 
let  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
45  | 
val (n, t) = print_pattern n t  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
46  | 
in  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
47  | 
                print_pattern_list (n, "App ("^p^", "^t^")") ts
 | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
48  | 
end  | 
| 23174 | 49  | 
|
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
50  | 
val (n, pattern) = print_pattern 0 p  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
56  | 
| print_term d (Const c) = "c" ^ str c  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
63  | 
val term = print_term 0 t  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
67  | 
|
| 23174 | 68  | 
in  | 
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
83  | 
val buffer = Unsynchronized.ref ""  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
84  | 
fun write s = (buffer := (!buffer)^s)  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
85  | 
fun writeln s = (write s; write "\n")  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
86  | 
fun writelist [] = ()  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
89  | 
val _ = writelist [  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
90  | 
"structure "^name^" = struct",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
91  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
95  | 
val _ = writelist [  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
96  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
98  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
99  | 
"type state = bool * stack * term",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
100  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
102  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
103  | 
"fun proj_C (Continue s) = s",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
104  | 
" | proj_C _ = raise Match",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
105  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
106  | 
"fun proj_S (Stop s) = s",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
107  | 
" | proj_S _ = raise Match",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
108  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
109  | 
"fun cont (Continue _) = true",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
110  | 
" | cont _ = false",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
111  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
112  | 
"fun do_reduction reduce p =",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
113  | 
" let",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
114  | 
" val s = Unsynchronized.ref (Continue p)",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
116  | 
" in",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
117  | 
" proj_S (!s)",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
118  | 
" end",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
119  | 
""]  | 
| 23663 | 120  | 
|
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
121  | 
val _ = writelist [  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
132  | 
" | weak_reduce (true, stack, c) = Stop (stack, c)",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
133  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
135  | 
" let",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
137  | 
" in",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
138  | 
" case stack' of",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
139  | 
" SEmpty => Continue (false, SAbs stack, wnf)",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
141  | 
" end",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
147  | 
" | strong_reduce (true, stack, clos) = Stop (stack, clos)",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
148  | 
""]  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
149  | 
|
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
151  | 
val _ = writelist [  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
152  | 
                "fun importTerm ("^sname^".Var x) = Var x",
 | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
153  | 
                "  | importTerm ("^sname^".Const c) =  "^ic,
 | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
155  | 
                "  | importTerm ("^sname^".Abs m) = Abs (importTerm m)",
 | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
156  | 
""]  | 
| 23174 | 157  | 
|
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
159  | 
val _ = writelist [  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
160  | 
"fun exportTerm (Var x) = "^sname^".Var x",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
161  | 
" | exportTerm (Const c) = "^sname^".Const c",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
163  | 
" | exportTerm (Abs m) = "^sname^".Abs (exportTerm m)",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
166  | 
val _ = writelist (map ec constants)  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
167  | 
|
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
168  | 
val _ = writelist [  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
169  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
170  | 
"fun rewrite t = ",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
171  | 
" let",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
173  | 
" in",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
174  | 
" case stack of ",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
changeset
 | 
176  | 
" (SEmpty, snf) => exportTerm snf",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
179  | 
" end",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
180  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
181  | 
"val _ = "^sname^".set_compiled_rewriter rewrite",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
182  | 
"",  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
183  | 
"end;"]  | 
| 23174 | 184  | 
|
185  | 
in  | 
|
| 
32960
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
186  | 
compiled_rewriter := NONE;  | 
| 
62902
 
3c0f53eae166
more conventional theory syntax for ML bootstrap, with 'ML_file' instead of 'use';
 
wenzelm 
parents: 
62495 
diff
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: 
32740 
diff
changeset
 | 
189  | 
case !compiled_rewriter of  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
190  | 
NONE => raise (Compile "cannot communicate with compiled function")  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
191  | 
| SOME r => (compiled_rewriter := NONE; r)  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
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: 
32740 
diff
changeset
 | 
203  | 
load_rules "AM_Compiler" "AM_compiled_code" eqs  | 
| 
 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 
wenzelm 
parents: 
32740 
diff
changeset
 | 
204  | 
end  | 
| 23174 | 205  | 
|
| 46537 | 206  | 
fun run prog t = prog t  | 
| 46531 | 207  | 
|
| 23174 | 208  | 
end  | 
209  |