| author | wenzelm | 
| Mon, 25 Sep 2023 20:56:44 +0200 | |
| changeset 78709 | ebafb2daabb7 | 
| parent 72278 | 199dc903131b | 
| permissions | -rw-r--r-- | 
| 47455 | 1 | (* Title: HOL/Matrix_LP/Compute_Oracle/am_ghc.ML | 
| 23663 | 2 | Author: Steven Obua | 
| 3 | *) | |
| 4 | ||
| 41952 
c7297638599b
cleanup of former settings GHC_PATH, EXEC_GHC, EXEC_OCAML, EXEC_SWIPL, EXEC_YAP -- discontinued implicit detection;
 wenzelm parents: 
41491diff
changeset | 5 | structure AM_GHC : ABSTRACT_MACHINE = | 
| 
c7297638599b
cleanup of former settings GHC_PATH, EXEC_GHC, EXEC_OCAML, EXEC_SWIPL, EXEC_YAP -- discontinued implicit detection;
 wenzelm parents: 
41491diff
changeset | 6 | struct | 
| 23663 | 7 | |
| 8 | open AbstractMachine; | |
| 9 | ||
| 65905 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 10 | type program = string * Path.T * (int Inttab.table) | 
| 23663 | 11 | |
| 12 | fun count_patternvars PVar = 1 | |
| 13 | | count_patternvars (PConst (_, ps)) = | |
| 14 | List.foldl (fn (p, count) => (count_patternvars p)+count) 0 ps | |
| 15 | ||
| 16 | fun update_arity arity code a = | |
| 17 | (case Inttab.lookup arity code of | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 18 | NONE => Inttab.update_new (code, a) arity | 
| 24134 
6e69e0031f34
added int type constraints to accomodate hacked SML/NJ;
 wenzelm parents: 
23663diff
changeset | 19 | | SOME (a': int) => if a > a' then Inttab.update (code, a) arity else arity) | 
| 23663 | 20 | |
| 21 | (* We have to find out the maximal arity of each constant *) | |
| 22 | fun collect_pattern_arity PVar arity = arity | |
| 23 | | collect_pattern_arity (PConst (c, args)) arity = fold collect_pattern_arity args (update_arity arity c (length args)) | |
| 24 | ||
| 25 | local | |
| 26 | fun collect applevel (Var _) arity = arity | |
| 27 | | collect applevel (Const c) arity = update_arity arity c applevel | |
| 28 | | collect applevel (Abs m) arity = collect 0 m arity | |
| 29 | | collect applevel (App (a,b)) arity = collect 0 b (collect (applevel + 1) a arity) | |
| 30 | in | |
| 31 | fun collect_term_arity t arity = collect 0 t arity | |
| 32 | end | |
| 33 | ||
| 34 | fun nlift level n (Var m) = if m < level then Var m else Var (m+n) | |
| 35 | | nlift level n (Const c) = Const c | |
| 36 | | nlift level n (App (a,b)) = App (nlift level n a, nlift level n b) | |
| 37 | | nlift level n (Abs b) = Abs (nlift (level+1) n b) | |
| 38 | ||
| 39 | fun rep n x = if n = 0 then [] else x::(rep (n-1) x) | |
| 40 | ||
| 41 | fun adjust_rules rules = | |
| 42 | let | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 43 | val arity = fold (fn (p, t) => fn arity => collect_term_arity t (collect_pattern_arity p arity)) rules Inttab.empty | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 44 | fun arity_of c = the (Inttab.lookup arity c) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 45 | fun adjust_pattern PVar = PVar | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 46 |           | adjust_pattern (C as PConst (c, args)) = if (length args <> arity_of c) then raise Compile ("Constant inside pattern must have maximal arity") else C
 | 
| 46531 | 47 |         fun adjust_rule (PVar, _) = raise Compile ("pattern may not be a variable")
 | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 48 | | adjust_rule (rule as (p as PConst (c, args),t)) = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 49 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 50 |                 val _ = if not (check_freevars (count_patternvars p) t) then raise Compile ("unbound variables on right hand side") else () 
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 51 | val args = map adjust_pattern args | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 52 | val len = length args | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 53 | val arity = arity_of c | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 54 | fun lift level n (Var m) = if m < level then Var m else Var (m+n) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 55 | | lift level n (Const c) = Const c | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 56 | | lift level n (App (a,b)) = App (lift level n a, lift level n b) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 57 | | lift level n (Abs b) = Abs (lift (level+1) n b) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 58 | val lift = lift 0 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 59 | fun adjust_term n t = if n=0 then t else adjust_term (n-1) (App (t, Var (n-1))) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 60 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 61 | if len = arity then | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 62 | rule | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 63 | else if arity >= len then | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 64 | (PConst (c, args @ (rep (arity-len) PVar)), adjust_term (arity-len) (lift (arity-len) t)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 65 | else (raise Compile "internal error in adjust_rule") | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 66 | end | 
| 23663 | 67 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 68 | (arity, map adjust_rule rules) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 69 | end | 
| 23663 | 70 | |
| 71 | fun print_term arity_of n = | |
| 72 | let | |
| 73 | fun str x = string_of_int x | |
| 74 |     fun protect_blank s = if exists_string Symbol.is_ascii_blank s then "(" ^ s ^")" else s
 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 75 | |
| 23663 | 76 | fun print_apps d f [] = f | 
| 77 |       | print_apps d f (a::args) = print_apps d ("app "^(protect_blank f)^" "^(protect_blank (print_term d a))) args
 | |
| 78 | and print_call d (App (a, b)) args = print_call d a (b::args) | |
| 79 | | print_call d (Const c) args = | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 80 | (case arity_of c of | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 81 |              NONE => print_apps d ("Const "^(str c)) args 
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 82 | | SOME a => | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 83 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 84 | val len = length args | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 85 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 86 | if a <= len then | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 87 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 88 | val s = "c"^(str c)^(implode (map (fn t => " "^(protect_blank (print_term d t))) (List.take (args, a)))) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 89 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 90 | print_apps d s (List.drop (args, a)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 91 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 92 | else | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 93 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 94 | fun mk_apps n t = if n = 0 then t else mk_apps (n-1) (App (t, Var (n-1))) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 95 | fun mk_lambdas n t = if n = 0 then t else mk_lambdas (n-1) (Abs t) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 96 | fun append_args [] t = t | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 97 | | append_args (c::cs) t = append_args cs (App (t, c)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 98 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 99 | print_term d (mk_lambdas (a-len) (mk_apps (a-len) (nlift 0 (a-len) (append_args args (Const c))))) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 100 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 101 | end) | 
| 23663 | 102 | | print_call d t args = print_apps d (print_term d t) args | 
| 103 | and print_term d (Var x) = if x < d then "b"^(str (d-x-1)) else "x"^(str (n-(x-d)-1)) | |
| 104 | | print_term d (Abs c) = "Abs (\\b"^(str d)^" -> "^(print_term (d + 1) c)^")" | |
| 105 | | print_term d t = print_call d t [] | |
| 106 | in | |
| 107 | print_term 0 | |
| 108 | end | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 109 | |
| 23663 | 110 | fun print_rule arity_of (p, t) = | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 111 | let | 
| 41491 | 112 | fun str x = string_of_int x | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 113 | fun print_pattern top n PVar = (n+1, "x"^(str n)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 114 | | print_pattern top n (PConst (c, [])) = (n, (if top then "c" else "C")^(str c)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 115 | | print_pattern top n (PConst (c, args)) = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 116 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 117 | val (n,s) = print_pattern_list (n, (if top then "c" else "C")^(str c)) args | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 118 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 119 |                 (n, if top then s else "("^s^")")
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 120 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 121 | and print_pattern_list r [] = r | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 122 | | print_pattern_list (n, p) (t::ts) = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 123 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 124 | val (n, t) = print_pattern false n t | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 125 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 126 | print_pattern_list (n, p^" "^t) ts | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 127 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 128 | val (n, pattern) = print_pattern true 0 p | 
| 23663 | 129 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 130 | pattern^" = "^(print_term arity_of n t) | 
| 23663 | 131 | end | 
| 132 | ||
| 133 | fun group_rules rules = | |
| 134 | let | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 135 | fun add_rule (r as (PConst (c,_), _)) groups = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 136 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 137 | val rs = (case Inttab.lookup groups c of NONE => [] | SOME rs => rs) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 138 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 139 | Inttab.update (c, r::rs) groups | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 140 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 141 | | add_rule _ _ = raise Compile "internal error group_rules" | 
| 23663 | 142 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 143 | fold_rev add_rule rules Inttab.empty | 
| 23663 | 144 | end | 
| 145 | ||
| 146 | fun haskell_prog name rules = | |
| 147 | let | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 148 | val buffer = Unsynchronized.ref "" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 149 | fun write s = (buffer := (!buffer)^s) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 150 | fun writeln s = (write s; write "\n") | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 151 | fun writelist [] = () | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 152 | | writelist (s::ss) = (writeln s; writelist ss) | 
| 41491 | 153 | fun str i = string_of_int i | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 154 | val (arity, rules) = adjust_rules rules | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 155 | val rules = group_rules rules | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 156 | val constants = Inttab.keys arity | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 157 | fun arity_of c = Inttab.lookup arity c | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 158 | fun rep_str s n = implode (rep n s) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 159 | fun indexed s n = s^(str n) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 160 | fun section n = if n = 0 then [] else (section (n-1))@[n-1] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 161 | fun make_show c = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 162 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 163 | val args = section (the (arity_of c)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 164 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 165 |                 "  show ("^(indexed "C" c)^(implode (map (indexed " a") args))^") = "
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 166 | ^"\""^(indexed "C" c)^"\""^(implode (map (fn a => "++(show "^(indexed "a" a)^")") args)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 167 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 168 | fun default_case c = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 169 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 170 | val args = implode (map (indexed " x") (section (the (arity_of c)))) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 171 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 172 | (indexed "c" c)^args^" = "^(indexed "C" c)^args | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 173 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 174 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 175 | "module "^name^" where", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 176 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 177 | "data Term = Const Integer | App Term Term | Abs (Term -> Term)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 178 | " "^(implode (map (fn c => " | C"^(str c)^(rep_str " Term" (the (arity_of c)))) constants)), | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 179 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 180 | "instance Show Term where"] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 181 | val _ = writelist (map make_show constants) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 182 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 183 | " show (Const c) = \"c\"++(show c)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 184 | " show (App a b) = \"A\"++(show a)++(show b)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 185 | " show (Abs _) = \"L\"", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 186 | ""] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 187 | val _ = writelist [ | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 188 | "app (Abs a) b = a b", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 189 | "app a b = App a b", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 190 | "", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 191 | "calc s c = writeFile s (show c)", | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 192 | ""] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 193 | fun list_group c = (writelist (case Inttab.lookup rules c of | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 194 | NONE => [default_case c, ""] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 195 | | SOME (rs as ((PConst (_, []), _)::rs')) => | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 196 | if not (null rs') then raise Compile "multiple declaration of constant" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 197 | else (map (print_rule arity_of) rs) @ [""] | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 198 | | SOME rs => (map (print_rule arity_of) rs) @ [default_case c, ""])) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 199 | val _ = map list_group constants | 
| 23663 | 200 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 201 | (arity, !buffer) | 
| 23663 | 202 | end | 
| 203 | ||
| 32740 | 204 | val guid_counter = Unsynchronized.ref 0 | 
| 23663 | 205 | fun get_guid () = | 
| 206 | let | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 207 | val c = !guid_counter | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 208 | val _ = guid_counter := !guid_counter + 1 | 
| 23663 | 209 | in | 
| 41491 | 210 | string_of_int (Time.toMicroseconds (Time.now ())) ^ string_of_int c | 
| 23663 | 211 | end | 
| 212 | ||
| 65905 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 213 | fun tmp_file s = Path.expand (File.tmp_path (Path.basic s)); | 
| 23663 | 214 | |
| 46534 | 215 | fun compile eqs = | 
| 23663 | 216 | let | 
| 46531 | 217 |         val _ = if exists (fn (a,_,_) => not (null a)) eqs then raise Compile ("cannot deal with guards") else ()
 | 
| 218 | val eqs = map (fn (_,b,c) => (b,c)) eqs | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 219 | val guid = get_guid () | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 220 | val module = "AMGHC_Prog_"^guid | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 221 | val (arity, source) = haskell_prog module eqs | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 222 | val module_file = tmp_file (module^".hs") | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 223 | val object_file = tmp_file (module^".o") | 
| 65905 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 224 | val _ = File.write module_file source | 
| 41952 
c7297638599b
cleanup of former settings GHC_PATH, EXEC_GHC, EXEC_OCAML, EXEC_SWIPL, EXEC_YAP -- discontinued implicit detection;
 wenzelm parents: 
41491diff
changeset | 225 | val _ = | 
| 72278 | 226 |           Isabelle_System.bash ("exec \"$ISABELLE_GHC\" -c " ^ File.bash_platform_path module_file)
 | 
| 65905 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 227 | val _ = | 
| 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 228 | if not (File.exists object_file) then | 
| 41952 
c7297638599b
cleanup of former settings GHC_PATH, EXEC_GHC, EXEC_OCAML, EXEC_SWIPL, EXEC_YAP -- discontinued implicit detection;
 wenzelm parents: 
41491diff
changeset | 229 |             raise Compile ("Failure compiling haskell code (ISABELLE_GHC='" ^ getenv "ISABELLE_GHC" ^ "')")
 | 
| 
c7297638599b
cleanup of former settings GHC_PATH, EXEC_GHC, EXEC_OCAML, EXEC_SWIPL, EXEC_YAP -- discontinued implicit detection;
 wenzelm parents: 
41491diff
changeset | 230 | else () | 
| 23663 | 231 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 232 | (guid, module_file, arity) | 
| 23663 | 233 | end | 
| 234 | ||
| 235 | fun parse_result arity_of result = | |
| 236 | let | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 237 | val result = String.explode result | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 238 | fun shift NONE x = SOME x | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 239 | | shift (SOME y) x = SOME (y*10 + x) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 240 | fun parse_int' x (#"0"::rest) = parse_int' (shift x 0) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 241 | | parse_int' x (#"1"::rest) = parse_int' (shift x 1) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 242 | | parse_int' x (#"2"::rest) = parse_int' (shift x 2) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 243 | | parse_int' x (#"3"::rest) = parse_int' (shift x 3) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 244 | | parse_int' x (#"4"::rest) = parse_int' (shift x 4) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 245 | | parse_int' x (#"5"::rest) = parse_int' (shift x 5) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 246 | | parse_int' x (#"6"::rest) = parse_int' (shift x 6) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 247 | | parse_int' x (#"7"::rest) = parse_int' (shift x 7) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 248 | | parse_int' x (#"8"::rest) = parse_int' (shift x 8) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 249 | | parse_int' x (#"9"::rest) = parse_int' (shift x 9) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 250 | | parse_int' x rest = (x, rest) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 251 | fun parse_int rest = parse_int' NONE rest | 
| 23663 | 252 | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 253 | fun parse (#"C"::rest) = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 254 | (case parse_int rest of | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 255 | (SOME c, rest) => | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 256 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 257 | val (args, rest) = parse_list (the (arity_of c)) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 258 | fun app_args [] t = t | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 259 | | app_args (x::xs) t = app_args xs (App (t, x)) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 260 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 261 | (app_args args (Const c), rest) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 262 | end | 
| 46531 | 263 | | (NONE, _) => raise Run "parse C") | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 264 | | parse (#"c"::rest) = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 265 | (case parse_int rest of | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 266 | (SOME c, rest) => (Const c, rest) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 267 | | _ => raise Run "parse c") | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 268 | | parse (#"A"::rest) = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 269 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 270 | val (a, rest) = parse rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 271 | val (b, rest) = parse rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 272 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 273 | (App (a,b), rest) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 274 | end | 
| 46531 | 275 | | parse (#"L"::_) = raise Run "there may be no abstraction in the result" | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 276 | | parse _ = raise Run "invalid result" | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 277 | and parse_list n rest = | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 278 | if n = 0 then | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 279 | ([], rest) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 280 | else | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 281 | let | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 282 | val (x, rest) = parse rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 283 | val (xs, rest) = parse_list (n-1) rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 284 | in | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 285 | (x::xs, rest) | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 286 | end | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 287 | val (parsed, rest) = parse result | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 288 | fun is_blank (#" "::rest) = is_blank rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 289 | | is_blank (#"\n"::rest) = is_blank rest | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 290 | | is_blank [] = true | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 291 | | is_blank _ = false | 
| 23663 | 292 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 293 | if is_blank rest then parsed else raise Run "non-blank suffix in result file" | 
| 23663 | 294 | end | 
| 295 | ||
| 296 | fun run (guid, module_file, arity) t = | |
| 297 | let | |
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 298 |         val _ = if check_freevars 0 t then () else raise Run ("can only compute closed terms")
 | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 299 | fun arity_of c = Inttab.lookup arity c | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 300 | val callguid = get_guid() | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 301 | val module = "AMGHC_Prog_"^guid | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 302 | val call = module^"_Call_"^callguid | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 303 | val result_file = tmp_file (module^"_Result_"^callguid^".txt") | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 304 | val call_file = tmp_file (call^".hs") | 
| 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 305 | val term = print_term arity_of 0 t | 
| 65905 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 306 | val call_source = | 
| 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 307 | "module "^call^" where\n\nimport "^module^"\n\ncall = "^module^".calc \""^ | 
| 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 308 |             File.platform_path result_file^"\" ("^term^")"
 | 
| 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 309 | val _ = File.write call_file call_source | 
| 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 310 | val _ = | 
| 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 311 |           Isabelle_System.bash ("exec \"$ISABELLE_GHC\" -e \""^call^".call\" "^
 | 
| 72278 | 312 | File.bash_platform_path module_file ^ " " ^ File.bash_platform_path call_file) | 
| 65905 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 313 | val result = File.read result_file handle IO.Io _ => | 
| 41952 
c7297638599b
cleanup of former settings GHC_PATH, EXEC_GHC, EXEC_OCAML, EXEC_SWIPL, EXEC_YAP -- discontinued implicit detection;
 wenzelm parents: 
41491diff
changeset | 314 |           raise Run ("Failure running haskell compiler (ISABELLE_GHC='" ^ getenv "ISABELLE_GHC" ^ "')")
 | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 315 | val t' = parse_result arity_of result | 
| 65905 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 316 | val _ = File.rm call_file | 
| 
6181ccb4ec8c
support for ISABELLE_GHC on Windows, using the native version (mingw32);
 wenzelm parents: 
47455diff
changeset | 317 | val _ = File.rm result_file | 
| 23663 | 318 | in | 
| 32960 
69916a850301
eliminated hard tabulators, guessing at each author's individual tab-width;
 wenzelm parents: 
32952diff
changeset | 319 | t' | 
| 23663 | 320 | end | 
| 321 | ||
| 322 | end | |
| 323 |