| author | wenzelm | 
| Mon, 23 Jul 2012 18:21:26 +0200 | |
| changeset 48452 | 4ad6182d5bb9 | 
| parent 48074 | c6d514717d7b | 
| child 49561 | 26fc70e983c2 | 
| permissions | -rw-r--r-- | 
| 37744 | 1 | (* Title: Tools/Code/code_thingol.ML | 
| 24219 | 2 | Author: Florian Haftmann, TU Muenchen | 
| 3 | ||
| 4 | Intermediate language ("Thin-gol") representing executable code.
 | |
| 24918 | 5 | Representation and translation. | 
| 24219 | 6 | *) | 
| 7 | ||
| 8 | infix 8 `%%; | |
| 9 | infix 4 `$; | |
| 10 | infix 4 `$$; | |
| 31724 | 11 | infixr 3 `|=>; | 
| 12 | infixr 3 `|==>; | |
| 24219 | 13 | |
| 14 | signature BASIC_CODE_THINGOL = | |
| 15 | sig | |
| 16 | type vname = string; | |
| 17 | datatype dict = | |
| 41782 | 18 | Dict of string list * plain_dict | 
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 19 | and plain_dict = | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 20 | Dict_Const of string * dict list list | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 21 | | Dict_Var of vname * (int * int); | 
| 24219 | 22 | datatype itype = | 
| 23 | `%% of string * itype list | |
| 24 | | ITyVar of vname; | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 25 |   type const = { name: string, typargs: itype list, dicts: dict list list,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 26 | dom: itype list, range: itype, annotate: bool }; | 
| 24219 | 27 | datatype iterm = | 
| 24591 | 28 | IConst of const | 
| 31889 | 29 | | IVar of vname option | 
| 24219 | 30 | | `$ of iterm * iterm | 
| 31888 | 31 | | `|=> of (vname option * itype) * iterm | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 32 |     | ICase of { term: iterm, typ: itype, clauses: (iterm * iterm) list, primitive: iterm };
 | 
| 24219 | 33 | val `$$ : iterm * iterm list -> iterm; | 
| 31888 | 34 | val `|==> : (vname option * itype) list * iterm -> iterm; | 
| 24219 | 35 | type typscheme = (vname * sort) list * itype; | 
| 36 | end; | |
| 37 | ||
| 38 | signature CODE_THINGOL = | |
| 39 | sig | |
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 40 | include BASIC_CODE_THINGOL | 
| 34084 | 41 | val fun_tyco: string | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 42 |   val unfoldl: ('a -> ('a * 'b) option) -> 'a -> 'a * 'b list
 | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 43 |   val unfoldr: ('a -> ('b * 'a) option) -> 'a -> 'b list * 'a
 | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 44 | val unfold_fun: itype -> itype list * itype | 
| 37640 | 45 | val unfold_fun_n: int -> itype -> itype list * itype | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 46 | val unfold_app: iterm -> iterm * iterm list | 
| 31888 | 47 | val unfold_abs: iterm -> (vname option * itype) list * iterm | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 48 | val split_let: iterm -> (((iterm * itype) * iterm) * iterm) option | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 49 | val unfold_let: iterm -> ((iterm * itype) * iterm) list * iterm | 
| 31889 | 50 | val split_pat_abs: iterm -> ((iterm * itype) * iterm) option | 
| 51 | val unfold_pat_abs: iterm -> (iterm * itype) list * iterm | |
| 31049 | 52 | val unfold_const_app: iterm -> (const * iterm list) option | 
| 32909 | 53 | val is_IVar: iterm -> bool | 
| 41782 | 54 | val is_IAbs: iterm -> bool | 
| 31049 | 55 | val eta_expand: int -> const * iterm list -> iterm | 
| 41100 
6c0940392fb4
dictionary constants must permit explicit weakening of classes;
 haftmann parents: 
40844diff
changeset | 56 | val contains_dict_var: iterm -> bool | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 57 | val add_constnames: iterm -> string list -> string list | 
| 32917 | 58 | val add_tyconames: iterm -> string list -> string list | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 59 | val fold_varnames: (string -> 'a -> 'a) -> iterm -> 'a -> 'a | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 60 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 61 | type naming | 
| 28706 | 62 | val empty_naming: naming | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 63 | val lookup_class: naming -> class -> string option | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 64 | val lookup_classrel: naming -> class * class -> string option | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 65 | val lookup_tyco: naming -> string -> string option | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 66 | val lookup_instance: naming -> class * string -> string option | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 67 | val lookup_const: naming -> string -> string option | 
| 31054 | 68 | val ensure_declared_const: theory -> string -> naming -> string * naming | 
| 24219 | 69 | |
| 24918 | 70 | datatype stmt = | 
| 27024 | 71 | NoStmt | 
| 37437 | 72 | | Fun of string * ((typscheme * ((iterm list * iterm) * (thm option * bool)) list) * thm option) | 
| 48003 
1d11af40b106
dropped sort constraints on datatype specifications
 haftmann parents: 
47576diff
changeset | 73 | | Datatype of string * (vname list * | 
| 37448 
3bd4b3809bee
explicit type variable arguments for constructors
 haftmann parents: 
37447diff
changeset | 74 | ((string * vname list (*type argument wrt. canonical order*)) * itype list) list) | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 75 | | Datatypecons of string * string | 
| 37447 
ad3e04f289b6
transitive superclasses were also only a misunderstanding
 haftmann parents: 
37446diff
changeset | 76 | | Class of class * (vname * ((class * string) list * (string * itype) list)) | 
| 24219 | 77 | | Classrel of class * class | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 78 | | Classparam of string * class | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 79 |     | Classinst of { class: string, tyco: string, vs: (vname * sort) list,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 80 | superinsts: (class * (string * (string * dict list list))) list, | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 81 | inst_params: ((string * const) * (thm * bool)) list, | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 82 | superinst_params: ((string * const) * (thm * bool)) list }; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 83 | type program = stmt Graph.T | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 84 | val empty_funs: program -> string list | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 85 | val map_terms_bottom_up: (iterm -> iterm) -> iterm -> iterm | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 86 | val map_terms_stmt: (iterm -> iterm) -> stmt -> stmt | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 87 | val is_cons: program -> string -> bool | 
| 37440 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 88 | val is_case: stmt -> bool | 
| 32895 | 89 | val labelled_name: theory -> program -> string -> string | 
| 90 | val group_stmts: theory -> program | |
| 91 | -> ((string * stmt) list * (string * stmt) list | |
| 92 | * ((string * stmt) list * (string * stmt) list)) list | |
| 24219 | 93 | |
| 31036 | 94 | val read_const_exprs: theory -> string list -> string list * string list | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 95 | val consts_program: theory -> bool -> string list -> string list * (naming * program) | 
| 41184 | 96 | val dynamic_conv: theory -> (naming -> program | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 97 | -> ((string * sort) list * typscheme) * iterm -> string list -> conv) | 
| 38672 
f1f64375f662
preliminary versions of static_eval_conv(_simple)
 haftmann parents: 
38669diff
changeset | 98 | -> conv | 
| 41184 | 99 | val dynamic_value: theory -> ((term -> term) -> 'a -> 'a) -> (naming -> program | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 100 | -> ((string * sort) list * typscheme) * iterm -> string list -> 'a) | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 101 | -> term -> 'a | 
| 41346 | 102 | val static_conv: theory -> string list -> (naming -> program -> string list | 
| 103 | -> ((string * sort) list * typscheme) * iterm -> string list -> conv) | |
| 38672 
f1f64375f662
preliminary versions of static_eval_conv(_simple)
 haftmann parents: 
38669diff
changeset | 104 | -> conv | 
| 41184 | 105 | val static_conv_simple: theory -> string list | 
| 41346 | 106 | -> (program -> (string * sort) list -> term -> conv) -> conv | 
| 41184 | 107 | val static_value: theory -> ((term -> term) -> 'a -> 'a) -> string list -> | 
| 41346 | 108 | (naming -> program -> string list | 
| 109 | -> ((string * sort) list * typscheme) * iterm -> string list -> 'a) | |
| 39475 | 110 | -> term -> 'a | 
| 24219 | 111 | end; | 
| 112 | ||
| 28054 | 113 | structure Code_Thingol: CODE_THINGOL = | 
| 24219 | 114 | struct | 
| 115 | ||
| 116 | (** auxiliary **) | |
| 117 | ||
| 118 | fun unfoldl dest x = | |
| 119 | case dest x | |
| 120 | of NONE => (x, []) | |
| 121 | | SOME (x1, x2) => | |
| 122 | let val (x', xs') = unfoldl dest x1 in (x', xs' @ [x2]) end; | |
| 123 | ||
| 124 | fun unfoldr dest x = | |
| 125 | case dest x | |
| 126 | of NONE => ([], x) | |
| 127 | | SOME (x1, x2) => | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 128 | let val (xs', x') = unfoldr dest x2 in (x1 :: xs', x') end; | 
| 24219 | 129 | |
| 130 | ||
| 29962 
bd4dc7fa742d
tuned comments, stripped ID, deleted superfluous code
 haftmann parents: 
29952diff
changeset | 131 | (** language core - types, terms **) | 
| 24219 | 132 | |
| 133 | type vname = string; | |
| 134 | ||
| 135 | datatype dict = | |
| 41782 | 136 | Dict of string list * plain_dict | 
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 137 | and plain_dict = | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 138 | Dict_Const of string * dict list list | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 139 | | Dict_Var of vname * (int * int); | 
| 24219 | 140 | |
| 141 | datatype itype = | |
| 142 | `%% of string * itype list | |
| 143 | | ITyVar of vname; | |
| 144 | ||
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 145 | type const = { name: string, typargs: itype list, dicts: dict list list,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 146 | dom: itype list, range: itype, annotate: bool }; | 
| 24591 | 147 | |
| 24219 | 148 | datatype iterm = | 
| 24591 | 149 | IConst of const | 
| 31889 | 150 | | IVar of vname option | 
| 24219 | 151 | | `$ of iterm * iterm | 
| 31888 | 152 | | `|=> of (vname option * itype) * iterm | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 153 |   | ICase of { term: iterm, typ: itype, clauses: (iterm * iterm) list, primitive: iterm };
 | 
| 24219 | 154 | (*see also signature*) | 
| 155 | ||
| 32909 | 156 | fun is_IVar (IVar _) = true | 
| 157 | | is_IVar _ = false; | |
| 158 | ||
| 41782 | 159 | fun is_IAbs (_ `|=> _) = true | 
| 160 | | is_IAbs _ = false; | |
| 161 | ||
| 24219 | 162 | val op `$$ = Library.foldl (op `$); | 
| 31724 | 163 | val op `|==> = Library.foldr (op `|=>); | 
| 24219 | 164 | |
| 165 | val unfold_app = unfoldl | |
| 166 | (fn op `$ t => SOME t | |
| 167 | | _ => NONE); | |
| 168 | ||
| 31874 | 169 | val unfold_abs = unfoldr | 
| 170 | (fn op `|=> t => SOME t | |
| 24219 | 171 | | _ => NONE); | 
| 172 | ||
| 173 | val split_let = | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 174 |   (fn ICase { term = t, typ = ty, clauses = [(p, body)], ... } => SOME (((p, ty), t), body)
 | 
| 24219 | 175 | | _ => NONE); | 
| 176 | ||
| 177 | val unfold_let = unfoldr split_let; | |
| 178 | ||
| 179 | fun unfold_const_app t = | |
| 180 | case unfold_app t | |
| 181 | of (IConst c, ts) => SOME (c, ts) | |
| 182 | | _ => NONE; | |
| 183 | ||
| 32917 | 184 | fun fold_constexprs f = | 
| 185 | let | |
| 186 | fun fold' (IConst c) = f c | |
| 187 | | fold' (IVar _) = I | |
| 188 | | fold' (t1 `$ t2) = fold' t1 #> fold' t2 | |
| 189 | | fold' (_ `|=> t) = fold' t | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 190 |       | fold' (ICase { term = t, clauses = clauses, ... }) = fold' t
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 191 | #> fold (fn (p, body) => fold' p #> fold' body) clauses | 
| 32917 | 192 | in fold' end; | 
| 193 | ||
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 194 | val add_constnames = fold_constexprs (fn { name = c, ... } => insert (op =) c);
 | 
| 32917 | 195 | |
| 196 | fun add_tycos (tyco `%% tys) = insert (op =) tyco #> fold add_tycos tys | |
| 197 | | add_tycos (ITyVar _) = I; | |
| 198 | ||
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 199 | val add_tyconames = fold_constexprs (fn { typargs = tys, ... } => fold add_tycos tys);
 | 
| 24219 | 200 | |
| 201 | fun fold_varnames f = | |
| 202 | let | |
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 203 | fun fold_aux add f = | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 204 | let | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 205 | fun fold_term _ (IConst _) = I | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 206 | | fold_term vs (IVar (SOME v)) = if member (op =) vs v then I else f v | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 207 | | fold_term _ (IVar NONE) = I | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 208 | | fold_term vs (t1 `$ t2) = fold_term vs t1 #> fold_term vs t2 | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 209 | | fold_term vs ((SOME v, _) `|=> t) = fold_term (insert (op =) v vs) t | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 210 | | fold_term vs ((NONE, _) `|=> t) = fold_term vs t | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 211 |           | fold_term vs (ICase { term = t, clauses = clauses, ... }) = fold_term vs t #> fold (fold_case vs) clauses
 | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 212 | and fold_case vs (p, t) = fold_term (add p vs) t; | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 213 | in fold_term [] end; | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 214 | fun add t = fold_aux add (insert (op =)) t; | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 215 | in fold_aux add f end; | 
| 24219 | 216 | |
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 217 | fun exists_var t v = fold_varnames (fn w => fn b => v = w orelse b) t false; | 
| 31874 | 218 | |
| 31889 | 219 | fun split_pat_abs ((NONE, ty) `|=> t) = SOME ((IVar NONE, ty), t) | 
| 31888 | 220 | | split_pat_abs ((SOME v, ty) `|=> t) = SOME (case t | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 221 |      of ICase { term = IVar (SOME w), clauses = [(p, body)], ... } =>
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 222 | if v = w andalso (exists_var p v orelse not (exists_var body v)) | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 223 | then ((p, ty), body) | 
| 31889 | 224 | else ((IVar (SOME v), ty), t) | 
| 225 | | _ => ((IVar (SOME v), ty), t)) | |
| 31888 | 226 | | split_pat_abs _ = NONE; | 
| 31874 | 227 | |
| 228 | val unfold_pat_abs = unfoldr split_pat_abs; | |
| 24219 | 229 | |
| 31890 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 230 | fun unfold_abs_eta [] t = ([], t) | 
| 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 231 | | unfold_abs_eta (_ :: tys) (v_ty `|=> t) = | 
| 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 232 | let | 
| 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 233 | val (vs_tys, t') = unfold_abs_eta tys t; | 
| 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 234 | in (v_ty :: vs_tys, t') end | 
| 31892 | 235 | | unfold_abs_eta tys t = | 
| 31890 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 236 | let | 
| 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 237 | val ctxt = fold_varnames Name.declare t Name.context; | 
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
43326diff
changeset | 238 | val vs_tys = (map o apfst) SOME (Name.invent_names ctxt "a" tys); | 
| 31890 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 239 | in (vs_tys, t `$$ map (IVar o fst) vs_tys) end; | 
| 
e943b039f0ac
an intermediate step towards a refined translation of cases
 haftmann parents: 
31889diff
changeset | 240 | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 241 | fun eta_expand k (const as { name = c, dom = tys, ... }, ts) =
 | 
| 24219 | 242 | let | 
| 243 | val j = length ts; | |
| 244 | val l = k - j; | |
| 37841 | 245 | val _ = if l > length tys | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 246 |       then error ("Impossible eta-expansion for constant " ^ quote c) else ();
 | 
| 24219 | 247 | val ctxt = (fold o fold_varnames) Name.declare ts Name.context; | 
| 31889 | 248 | val vs_tys = (map o apfst) SOME | 
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
43326diff
changeset | 249 | (Name.invent_names ctxt "a" ((take l o drop j) tys)); | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 250 | in vs_tys `|==> IConst const `$$ ts @ map (IVar o fst) vs_tys end; | 
| 24219 | 251 | |
| 41100 
6c0940392fb4
dictionary constants must permit explicit weakening of classes;
 haftmann parents: 
40844diff
changeset | 252 | fun contains_dict_var t = | 
| 24662 
f79f6061525c
more precise treatment of free dictionary parameters for evaluation
 haftmann parents: 
24591diff
changeset | 253 | let | 
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 254 | fun cont_dict (Dict (_, d)) = cont_plain_dict d | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 255 | and cont_plain_dict (Dict_Const (_, dss)) = (exists o exists) cont_dict dss | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 256 | | cont_plain_dict (Dict_Var _) = true; | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 257 |     fun cont_term (IConst { dicts = dss, ... }) = (exists o exists) cont_dict dss
 | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 258 | | cont_term (IVar _) = false | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 259 | | cont_term (t1 `$ t2) = cont_term t1 orelse cont_term t2 | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 260 | | cont_term (_ `|=> t) = cont_term t | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 261 |       | cont_term (ICase { primitive = t, ... }) = cont_term t;
 | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 262 | in cont_term t end; | 
| 25621 | 263 | |
| 264 | ||
| 28688 | 265 | (** namings **) | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 266 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 267 | (* policies *) | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 268 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 269 | local | 
| 45188 
35870ec62ec7
removing dependency of the generic code generator to old code generator functions thyname_of_type and thyname_of_const
 bulwahn parents: 
45128diff
changeset | 270 | fun thyname_of_type thy = #theory_name o Name_Space.the_entry (Sign.type_space thy); | 
| 33172 | 271 | fun thyname_of_class thy = #theory_name o Name_Space.the_entry (Sign.class_space thy); | 
| 272 | fun thyname_of_instance thy inst = case AxClass.thynames_of_arity thy inst | |
| 273 |    of [] => error ("No such instance: " ^ quote (snd inst ^ " :: " ^ fst inst))
 | |
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 274 | | thyname :: _ => thyname; | 
| 28706 | 275 | fun thyname_of_const thy c = case AxClass.class_of_param thy c | 
| 276 | of SOME class => thyname_of_class thy class | |
| 35299 
4f4d5bf4ea08
proper distinction of code datatypes and abstypes
 haftmann parents: 
35226diff
changeset | 277 | | NONE => (case Code.get_type_of_constr_or_abstr thy c | 
| 45188 
35870ec62ec7
removing dependency of the generic code generator to old code generator functions thyname_of_type and thyname_of_const
 bulwahn parents: 
45128diff
changeset | 278 | of SOME (tyco, _) => thyname_of_type thy tyco | 
| 47574 | 279 | | NONE => #theory_name (Name_Space.the_entry (Sign.const_space thy) c)); | 
| 33420 | 280 | fun purify_base "==>" = "follows" | 
| 39566 | 281 | | purify_base "==" = "meta_eq" | 
| 31036 | 282 | | purify_base s = Name.desymbolize false s; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 283 | fun namify thy get_basename get_thyname name = | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 284 | let | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 285 | val prefix = get_thyname thy name; | 
| 31036 | 286 | val base = (purify_base o get_basename) name; | 
| 30364 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 287 | in Long_Name.append prefix base end; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 288 | in | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 289 | |
| 30364 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 290 | fun namify_class thy = namify thy Long_Name.base_name thyname_of_class; | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 291 | fun namify_classrel thy = namify thy (fn (sub_class, super_class) => | 
| 37431 | 292 | Long_Name.base_name super_class ^ "_" ^ Long_Name.base_name sub_class) | 
| 33172 | 293 | (fn thy => thyname_of_class thy o fst); | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 294 | (*order fits nicely with composed projections*) | 
| 28688 | 295 | fun namify_tyco thy "fun" = "Pure.fun" | 
| 45188 
35870ec62ec7
removing dependency of the generic code generator to old code generator functions thyname_of_type and thyname_of_const
 bulwahn parents: 
45128diff
changeset | 296 | | namify_tyco thy tyco = namify thy Long_Name.base_name thyname_of_type tyco; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 297 | fun namify_instance thy = namify thy (fn (class, tyco) => | 
| 30364 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 298 | Long_Name.base_name class ^ "_" ^ Long_Name.base_name tyco) thyname_of_instance; | 
| 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 299 | fun namify_const thy = namify thy Long_Name.base_name thyname_of_const; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 300 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 301 | end; (* local *) | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 302 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 303 | |
| 28688 | 304 | (* data *) | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 305 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 306 | datatype naming = Naming of {
 | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 307 | class: class Symtab.table * Name.context, | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30364diff
changeset | 308 | classrel: string Symreltab.table * Name.context, | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 309 | tyco: string Symtab.table * Name.context, | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30364diff
changeset | 310 | instance: string Symreltab.table * Name.context, | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 311 | const: string Symtab.table * Name.context | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 312 | } | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 313 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 314 | fun dest_Naming (Naming naming) = naming; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 315 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 316 | val empty_naming = Naming {
 | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 317 | class = (Symtab.empty, Name.context), | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30364diff
changeset | 318 | classrel = (Symreltab.empty, Name.context), | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 319 | tyco = (Symtab.empty, Name.context), | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30364diff
changeset | 320 | instance = (Symreltab.empty, Name.context), | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 321 | const = (Symtab.empty, Name.context) | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 322 | }; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 323 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 324 | local | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 325 | fun mk_naming (class, classrel, tyco, instance, const) = | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 326 |     Naming { class = class, classrel = classrel,
 | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 327 | tyco = tyco, instance = instance, const = const }; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 328 |   fun map_naming f (Naming { class, classrel, tyco, instance, const }) =
 | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 329 | mk_naming (f (class, classrel, tyco, instance, const)); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 330 | in | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 331 | fun map_class f = map_naming | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 332 | (fn (class, classrel, tyco, inst, const) => | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 333 | (f class, classrel, tyco, inst, const)); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 334 | fun map_classrel f = map_naming | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 335 | (fn (class, classrel, tyco, inst, const) => | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 336 | (class, f classrel, tyco, inst, const)); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 337 | fun map_tyco f = map_naming | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 338 | (fn (class, classrel, tyco, inst, const) => | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 339 | (class, classrel, f tyco, inst, const)); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 340 | fun map_instance f = map_naming | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 341 | (fn (class, classrel, tyco, inst, const) => | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 342 | (class, classrel, tyco, f inst, const)); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 343 | fun map_const f = map_naming | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 344 | (fn (class, classrel, tyco, inst, const) => | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 345 | (class, classrel, tyco, inst, f const)); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 346 | end; (*local*) | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 347 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 348 | fun add_variant update (thing, name) (tab, used) = | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 349 | let | 
| 43326 
47cf4bc789aa
simplified Name.variant -- discontinued builtin fold_map;
 wenzelm parents: 
43048diff
changeset | 350 | val (name', used') = Name.variant name used; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 351 | val tab' = update (thing, name') tab; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 352 | in (tab', used') end; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 353 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 354 | fun declare thy mapp lookup update namify thing = | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 355 | mapp (add_variant update (thing, namify thy thing)) | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 356 | #> `(fn naming => the (lookup naming thing)); | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 357 | |
| 28688 | 358 | |
| 359 | (* lookup and declare *) | |
| 360 | ||
| 361 | local | |
| 362 | ||
| 363 | val suffix_class = "class"; | |
| 364 | val suffix_classrel = "classrel" | |
| 365 | val suffix_tyco = "tyco"; | |
| 366 | val suffix_instance = "inst"; | |
| 367 | val suffix_const = "const"; | |
| 368 | ||
| 369 | fun add_suffix nsp NONE = NONE | |
| 30364 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 wenzelm parents: 
30280diff
changeset | 370 | | add_suffix nsp (SOME name) = SOME (Long_Name.append name nsp); | 
| 28688 | 371 | |
| 372 | in | |
| 373 | ||
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 374 | val lookup_class = add_suffix suffix_class | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 375 | oo Symtab.lookup o fst o #class o dest_Naming; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 376 | val lookup_classrel = add_suffix suffix_classrel | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30364diff
changeset | 377 | oo Symreltab.lookup o fst o #classrel o dest_Naming; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 378 | val lookup_tyco = add_suffix suffix_tyco | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 379 | oo Symtab.lookup o fst o #tyco o dest_Naming; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 380 | val lookup_instance = add_suffix suffix_instance | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30364diff
changeset | 381 | oo Symreltab.lookup o fst o #instance o dest_Naming; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 382 | val lookup_const = add_suffix suffix_const | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 383 | oo Symtab.lookup o fst o #const o dest_Naming; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 384 | |
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 385 | fun declare_class thy = declare thy map_class | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 386 | lookup_class Symtab.update_new namify_class; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 387 | fun declare_classrel thy = declare thy map_classrel | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30364diff
changeset | 388 | lookup_classrel Symreltab.update_new namify_classrel; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 389 | fun declare_tyco thy = declare thy map_tyco | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 390 | lookup_tyco Symtab.update_new namify_tyco; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 391 | fun declare_instance thy = declare thy map_instance | 
| 30648 
17365ef082f3
clarified relationship of modules Code_Name and Code_Printer
 haftmann parents: 
30364diff
changeset | 392 | lookup_instance Symreltab.update_new namify_instance; | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 393 | fun declare_const thy = declare thy map_const | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 394 | lookup_const Symtab.update_new namify_const; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 395 | |
| 31054 | 396 | fun ensure_declared_const thy const naming = | 
| 397 | case lookup_const naming const | |
| 398 | of SOME const' => (const', naming) | |
| 399 | | NONE => declare_const thy const naming; | |
| 400 | ||
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 401 | val fun_tyco = Long_Name.append (namify_tyco Pure.thy "fun") suffix_tyco | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 402 | (*depends on add_suffix*); | 
| 34084 | 403 | |
| 28688 | 404 | val unfold_fun = unfoldr | 
| 34084 | 405 | (fn tyco `%% [ty1, ty2] => if tyco = fun_tyco then SOME (ty1, ty2) else NONE | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 406 | | _ => NONE); | 
| 28688 | 407 | |
| 37640 | 408 | fun unfold_fun_n n ty = | 
| 409 | let | |
| 410 | val (tys1, ty1) = unfold_fun ty; | |
| 411 | val (tys3, tys2) = chop n tys1; | |
| 412 | val ty3 = Library.foldr (fn (ty1, ty2) => fun_tyco `%% [ty1, ty2]) (tys2, ty1); | |
| 413 | in (tys3, ty3) end; | |
| 414 | ||
| 28688 | 415 | end; (* local *) | 
| 416 | ||
| 24219 | 417 | |
| 27103 | 418 | (** statements, abstract programs **) | 
| 24219 | 419 | |
| 420 | type typscheme = (vname * sort) list * itype; | |
| 37447 
ad3e04f289b6
transitive superclasses were also only a misunderstanding
 haftmann parents: 
37446diff
changeset | 421 | datatype stmt = | 
| 27024 | 422 | NoStmt | 
| 37437 | 423 | | Fun of string * ((typscheme * ((iterm list * iterm) * (thm option * bool)) list) * thm option) | 
| 48003 
1d11af40b106
dropped sort constraints on datatype specifications
 haftmann parents: 
47576diff
changeset | 424 | | Datatype of string * (vname list * ((string * vname list) * itype list) list) | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 425 | | Datatypecons of string * string | 
| 37447 
ad3e04f289b6
transitive superclasses were also only a misunderstanding
 haftmann parents: 
37446diff
changeset | 426 | | Class of class * (vname * ((class * string) list * (string * itype) list)) | 
| 24219 | 427 | | Classrel of class * class | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 428 | | Classparam of string * class | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 429 |   | Classinst of { class: string, tyco: string, vs: (vname * sort) list,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 430 | superinsts: (class * (string * (string * dict list list))) list, | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 431 | inst_params: ((string * const) * (thm * bool)) list, | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 432 | superinst_params: ((string * const) * (thm * bool)) list }; | 
| 24219 | 433 | |
| 27103 | 434 | type program = stmt Graph.T; | 
| 24219 | 435 | |
| 27103 | 436 | fun empty_funs program = | 
| 47576 | 437 | Graph.fold (fn (_, (Fun (c, ((_, []), _)), _)) => cons c | _ => I) program []; | 
| 24219 | 438 | |
| 27711 | 439 | fun map_terms_bottom_up f (t as IConst _) = f t | 
| 440 | | map_terms_bottom_up f (t as IVar _) = f t | |
| 441 | | map_terms_bottom_up f (t1 `$ t2) = f | |
| 442 | (map_terms_bottom_up f t1 `$ map_terms_bottom_up f t2) | |
| 31724 | 443 | | map_terms_bottom_up f ((v, ty) `|=> t) = f | 
| 444 | ((v, ty) `|=> map_terms_bottom_up f t) | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 445 |   | map_terms_bottom_up f (ICase { term = t, typ = ty, clauses = clauses, primitive = t0 }) = f
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 446 |       (ICase { term = map_terms_bottom_up f t, typ = ty,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 447 | clauses = (map o pairself) (map_terms_bottom_up f) clauses, | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 448 | primitive = map_terms_bottom_up f t0 }); | 
| 27711 | 449 | |
| 37448 
3bd4b3809bee
explicit type variable arguments for constructors
 haftmann parents: 
37447diff
changeset | 450 | fun map_classparam_instances_as_term f = | 
| 
3bd4b3809bee
explicit type variable arguments for constructors
 haftmann parents: 
37447diff
changeset | 451 | (map o apfst o apsnd) (fn const => case f (IConst const) of IConst const' => const') | 
| 
3bd4b3809bee
explicit type variable arguments for constructors
 haftmann parents: 
37447diff
changeset | 452 | |
| 27711 | 453 | fun map_terms_stmt f NoStmt = NoStmt | 
| 37437 | 454 | | map_terms_stmt f (Fun (c, ((tysm, eqs), case_cong))) = Fun (c, ((tysm, (map o apfst) | 
| 455 | (fn (ts, t) => (map f ts, f t)) eqs), case_cong)) | |
| 27711 | 456 | | map_terms_stmt f (stmt as Datatype _) = stmt | 
| 457 | | map_terms_stmt f (stmt as Datatypecons _) = stmt | |
| 458 | | map_terms_stmt f (stmt as Class _) = stmt | |
| 459 | | map_terms_stmt f (stmt as Classrel _) = stmt | |
| 460 | | map_terms_stmt f (stmt as Classparam _) = stmt | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 461 |   | map_terms_stmt f (Classinst { class, tyco, vs, superinsts,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 462 | inst_params, superinst_params }) = | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 463 |         Classinst { class = class, tyco = tyco, vs = vs, superinsts = superinsts,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 464 | inst_params = map_classparam_instances_as_term f inst_params, | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 465 | superinst_params = map_classparam_instances_as_term f superinst_params }; | 
| 27711 | 466 | |
| 27103 | 467 | fun is_cons program name = case Graph.get_node program name | 
| 24219 | 468 | of Datatypecons _ => true | 
| 469 | | _ => false; | |
| 470 | ||
| 37440 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 471 | fun is_case (Fun (_, (_, SOME _))) = true | 
| 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 472 | | is_case _ = false; | 
| 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 473 | |
| 42359 | 474 | fun labelled_name thy program name = | 
| 42361 | 475 | let val ctxt = Proof_Context.init_global thy in | 
| 42359 | 476 | case Graph.get_node program name of | 
| 477 | Fun (c, _) => quote (Code.string_of_const thy c) | |
| 42361 | 478 | | Datatype (tyco, _) => "type " ^ quote (Proof_Context.extern_type ctxt tyco) | 
| 42359 | 479 | | Datatypecons (c, _) => quote (Code.string_of_const thy c) | 
| 42361 | 480 | | Class (class, _) => "class " ^ quote (Proof_Context.extern_class ctxt class) | 
| 42359 | 481 | | Classrel (sub, super) => | 
| 482 | let | |
| 483 | val Class (sub, _) = Graph.get_node program sub; | |
| 484 | val Class (super, _) = Graph.get_node program super; | |
| 485 | in | |
| 42361 | 486 | quote (Proof_Context.extern_class ctxt sub ^ " < " ^ Proof_Context.extern_class ctxt super) | 
| 42359 | 487 | end | 
| 488 | | Classparam (c, _) => quote (Code.string_of_const thy c) | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 489 |     | Classinst { class, tyco, ... } =>
 | 
| 42359 | 490 | let | 
| 491 | val Class (class, _) = Graph.get_node program class; | |
| 492 | val Datatype (tyco, _) = Graph.get_node program tyco; | |
| 493 | in | |
| 42361 | 494 | quote (Proof_Context.extern_type ctxt tyco ^ " :: " ^ Proof_Context.extern_class ctxt class) | 
| 42359 | 495 | end | 
| 496 | end; | |
| 32895 | 497 | |
| 37440 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 498 | fun linear_stmts program = | 
| 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 499 | rev (Graph.strong_conn program) | 
| 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 500 | |> map (AList.make (Graph.get_node program)); | 
| 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 501 | |
| 32895 | 502 | fun group_stmts thy program = | 
| 503 | let | |
| 504 | fun is_fun (_, Fun _) = true | is_fun _ = false; | |
| 505 | fun is_datatypecons (_, Datatypecons _) = true | is_datatypecons _ = false; | |
| 506 | fun is_datatype (_, Datatype _) = true | is_datatype _ = false; | |
| 507 | fun is_class (_, Class _) = true | is_class _ = false; | |
| 508 | fun is_classrel (_, Classrel _) = true | is_classrel _ = false; | |
| 509 | fun is_classparam (_, Classparam _) = true | is_classparam _ = false; | |
| 510 | fun is_classinst (_, Classinst _) = true | is_classinst _ = false; | |
| 511 | fun group stmts = | |
| 512 | if forall (is_datatypecons orf is_datatype) stmts | |
| 513 | then (filter is_datatype stmts, [], ([], [])) | |
| 514 | else if forall (is_class orf is_classrel orf is_classparam) stmts | |
| 515 | then ([], filter is_class stmts, ([], [])) | |
| 516 | else if forall (is_fun orf is_classinst) stmts | |
| 517 | then ([], [], List.partition is_fun stmts) | |
| 518 |       else error ("Illegal mutual dependencies: " ^
 | |
| 519 | (commas o map (labelled_name thy program o fst)) stmts) | |
| 520 | in | |
| 37440 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 521 | linear_stmts program | 
| 32895 | 522 | |> map group | 
| 523 | end; | |
| 524 | ||
| 24219 | 525 | |
| 27103 | 526 | (** translation kernel **) | 
| 24219 | 527 | |
| 28724 | 528 | (* generic mechanisms *) | 
| 529 | ||
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 530 | fun ensure_stmt lookup declare generate thing (dep, (naming, program)) = | 
| 24219 | 531 | let | 
| 28706 | 532 | fun add_dep name = case dep of NONE => I | 
| 533 | | SOME dep => Graph.add_edge (dep, name); | |
| 534 | val (name, naming') = case lookup naming thing | |
| 535 | of SOME name => (name, naming) | |
| 536 | | NONE => declare thing naming; | |
| 47576 | 537 | in | 
| 538 | if can (Graph.get_node program) name | |
| 539 | then | |
| 540 | program | |
| 541 | |> add_dep name | |
| 542 | |> pair naming' | |
| 543 | |> pair dep | |
| 544 | |> pair name | |
| 545 | else | |
| 546 | program | |
| 547 | |> Graph.default_node (name, NoStmt) | |
| 548 | |> add_dep name | |
| 549 | |> pair naming' | |
| 550 | |> curry generate (SOME name) | |
| 551 | ||> snd | |
| 552 | |-> (fn stmt => (apsnd o Graph.map_node name) (K stmt)) | |
| 553 | |> pair dep | |
| 554 | |> pair name | |
| 24219 | 555 | end; | 
| 556 | ||
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 557 | exception PERMISSIVE of unit; | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 558 | |
| 37698 | 559 | fun translation_error thy permissive some_thm msg sub_msg = | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 560 | if permissive | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 561 | then raise PERMISSIVE () | 
| 42385 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 562 | else | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 563 | let | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 564 | val err_thm = | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 565 | (case some_thm of | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 566 | SOME thm => "\n(in code equation " ^ Display.string_of_thm_global thy thm ^ ")" | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 567 | | NONE => ""); | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 568 | in error (msg ^ err_thm ^ ":\n" ^ sub_msg) end; | 
| 37698 | 569 | |
| 48074 | 570 | fun maybe_permissive f prgrm = | 
| 571 | f prgrm |>> SOME handle PERMISSIVE () => (NONE, prgrm); | |
| 572 | ||
| 37698 | 573 | fun not_wellsorted thy permissive some_thm ty sort e = | 
| 574 | let | |
| 47005 
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
 wenzelm parents: 
46961diff
changeset | 575 | val err_class = Sorts.class_error (Context.pretty_global thy) e; | 
| 42385 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 576 | val err_typ = | 
| 47005 
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
 wenzelm parents: 
46961diff
changeset | 577 | "Type " ^ Syntax.string_of_typ_global thy ty ^ " not of sort " ^ | 
| 42385 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 578 | Syntax.string_of_sort_global thy sort; | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 579 | in | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 580 | translation_error thy permissive some_thm "Wellsortedness error" | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 581 | (err_typ ^ "\n" ^ err_class) | 
| 
b46b47775cbe
simplified Sorts.class_error: plain Proof.context;
 wenzelm parents: 
42383diff
changeset | 582 | end; | 
| 26972 | 583 | |
| 48074 | 584 | fun undefineds thy (dep, (naming, program)) = | 
| 585 | (map_filter (lookup_const naming) (Code.undefineds thy), | |
| 586 | (dep, (naming, program))); | |
| 587 | ||
| 47555 | 588 | |
| 44790 
c13fdf710a40
adding type inference for disambiguation annotations in code equation
 bulwahn parents: 
44789diff
changeset | 589 | (* inference of type annotations for disambiguation with type classes *) | 
| 
c13fdf710a40
adding type inference for disambiguation annotations in code equation
 bulwahn parents: 
44789diff
changeset | 590 | |
| 45000 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 591 | fun mk_tagged_type (true, T) = Type ("", [T])
 | 
| 47555 | 592 | | mk_tagged_type (false, T) = T; | 
| 45000 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 593 | |
| 44998 
f12ef61ea76e
determining the fastype of a case-pattern but ignoring dummy type constructors that were added as markers for type annotations
 bulwahn parents: 
44997diff
changeset | 594 | fun dest_tagged_type (Type ("", [T])) = (true, T)
 | 
| 47555 | 595 | | dest_tagged_type T = (false, T); | 
| 44998 
f12ef61ea76e
determining the fastype of a case-pattern but ignoring dummy type constructors that were added as markers for type annotations
 bulwahn parents: 
44997diff
changeset | 596 | |
| 47555 | 597 | val untag_term = map_types (snd o dest_tagged_type); | 
| 44998 
f12ef61ea76e
determining the fastype of a case-pattern but ignoring dummy type constructors that were added as markers for type annotations
 bulwahn parents: 
44997diff
changeset | 598 | |
| 45000 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 599 | fun tag_term (proj_sort, _) eqngr = | 
| 44997 | 600 | let | 
| 47555 | 601 | val has_sort_constraints = exists (not o null) o map proj_sort o Code_Preproc.sortargs eqngr; | 
| 47576 | 602 | fun tag (Const (_, T')) (Const (c, T)) = | 
| 45000 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 603 | Const (c, | 
| 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 604 | mk_tagged_type (not (null (Term.add_tvarsT T' [])) andalso has_sort_constraints c, T)) | 
| 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 605 | | tag (t1 $ u1) (t $ u) = tag t1 t $ tag u1 u | 
| 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 606 | | tag (Abs (_, _, t1)) (Abs (x, T, t)) = Abs (x, T, tag t1 t) | 
| 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 607 | | tag (Free _) (t as Free _) = t | 
| 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 608 | | tag (Var _) (t as Var _) = t | 
| 47555 | 609 | | tag (Bound _) (t as Bound _) = t; | 
| 44997 | 610 | in | 
| 45000 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 611 | tag | 
| 44997 | 612 | end | 
| 44790 
c13fdf710a40
adding type inference for disambiguation annotations in code equation
 bulwahn parents: 
44789diff
changeset | 613 | |
| 44997 | 614 | fun annotate thy algbr eqngr (c, ty) args rhs = | 
| 44790 
c13fdf710a40
adding type inference for disambiguation annotations in code equation
 bulwahn parents: 
44789diff
changeset | 615 | let | 
| 45128 
5af3a3203a76
discontinued obsolete alias structure ProofContext;
 wenzelm parents: 
45009diff
changeset | 616 | val ctxt = Proof_Context.init_global thy |> Config.put Type_Infer_Context.const_sorts false | 
| 44790 
c13fdf710a40
adding type inference for disambiguation annotations in code equation
 bulwahn parents: 
44789diff
changeset | 617 | val erase = map_types (fn _ => Type_Infer.anyT []) | 
| 
c13fdf710a40
adding type inference for disambiguation annotations in code equation
 bulwahn parents: 
44789diff
changeset | 618 | val reinfer = singleton (Type_Infer_Context.infer_types ctxt) | 
| 44996 
410eea28b0f7
also adding type annotations for the dynamic invocation
 bulwahn parents: 
44855diff
changeset | 619 | val lhs = list_comb (Const (c, ty), map (map_types Type.strip_sorts o fst) args) | 
| 
410eea28b0f7
also adding type annotations for the dynamic invocation
 bulwahn parents: 
44855diff
changeset | 620 | val reinferred_rhs = snd (Logic.dest_equals (reinfer (Logic.mk_equals (lhs, erase rhs)))) | 
| 44790 
c13fdf710a40
adding type inference for disambiguation annotations in code equation
 bulwahn parents: 
44789diff
changeset | 621 | in | 
| 45000 
0febe2089425
adding abstraction layer; more precise function names
 bulwahn parents: 
44999diff
changeset | 622 | tag_term algbr eqngr reinferred_rhs rhs | 
| 44996 
410eea28b0f7
also adding type annotations for the dynamic invocation
 bulwahn parents: 
44855diff
changeset | 623 | end | 
| 
410eea28b0f7
also adding type annotations for the dynamic invocation
 bulwahn parents: 
44855diff
changeset | 624 | |
| 44997 | 625 | fun annotate_eqns thy algbr eqngr (c, ty) eqns = | 
| 626 | map (apfst (fn (args, (rhs, some_abs)) => (args, | |
| 627 | (annotate thy algbr eqngr (c, ty) args rhs, some_abs)))) eqns | |
| 28724 | 628 | |
| 47555 | 629 | |
| 28724 | 630 | (* translation *) | 
| 631 | ||
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 632 | fun ensure_tyco thy algbr eqngr permissive tyco = | 
| 30932 | 633 | let | 
| 40726 
16dcfedc4eb7
keep type variable arguments of datatype constructors in bookkeeping
 haftmann parents: 
40711diff
changeset | 634 | val ((vs, cos), _) = Code.get_type thy tyco; | 
| 30932 | 635 | val stmt_datatype = | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 636 | fold_map (translate_tyvar_sort thy algbr eqngr permissive) vs | 
| 48003 
1d11af40b106
dropped sort constraints on datatype specifications
 haftmann parents: 
47576diff
changeset | 637 | #>> map fst | 
| 40726 
16dcfedc4eb7
keep type variable arguments of datatype constructors in bookkeeping
 haftmann parents: 
40711diff
changeset | 638 | ##>> fold_map (fn (c, (vs, tys)) => | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 639 | ensure_const thy algbr eqngr permissive c | 
| 40726 
16dcfedc4eb7
keep type variable arguments of datatype constructors in bookkeeping
 haftmann parents: 
40711diff
changeset | 640 | ##>> pair (map (unprefix "'" o fst) vs) | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 641 | ##>> fold_map (translate_typ thy algbr eqngr permissive) tys) cos | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 642 | #>> (fn info => Datatype (tyco, info)); | 
| 30932 | 643 | in ensure_stmt lookup_tyco (declare_tyco thy) stmt_datatype tyco end | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 644 | and ensure_const thy algbr eqngr permissive c = | 
| 30932 | 645 | let | 
| 646 | fun stmt_datatypecons tyco = | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 647 | ensure_tyco thy algbr eqngr permissive tyco | 
| 30932 | 648 | #>> (fn tyco => Datatypecons (c, tyco)); | 
| 649 | fun stmt_classparam class = | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 650 | ensure_class thy algbr eqngr permissive class | 
| 30932 | 651 | #>> (fn class => Classparam (c, class)); | 
| 34891 
99b9a6290446
code certificates as integral part of code generation
 haftmann parents: 
34251diff
changeset | 652 | fun stmt_fun cert = | 
| 32872 
019201eb7e07
variables in type schemes must be renamed simultaneously with variables in equations
 haftmann parents: 
32795diff
changeset | 653 | let | 
| 35226 | 654 | val ((vs, ty), eqns) = Code.equations_of_cert thy cert; | 
| 44997 | 655 | val eqns' = annotate_eqns thy algbr eqngr (c, ty) eqns | 
| 37440 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 656 | val some_case_cong = Code.get_case_cong thy c; | 
| 32872 
019201eb7e07
variables in type schemes must be renamed simultaneously with variables in equations
 haftmann parents: 
32795diff
changeset | 657 | in | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 658 | fold_map (translate_tyvar_sort thy algbr eqngr permissive) vs | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 659 | ##>> translate_typ thy algbr eqngr permissive ty | 
| 44791 | 660 | ##>> translate_eqns thy algbr eqngr permissive eqns' | 
| 37440 
a5d44161ba2a
maintain cong rules for case combinators; more precise permissiveness
 haftmann parents: 
37437diff
changeset | 661 | #>> (fn info => Fun (c, (info, some_case_cong))) | 
| 32872 
019201eb7e07
variables in type schemes must be renamed simultaneously with variables in equations
 haftmann parents: 
32795diff
changeset | 662 | end; | 
| 35299 
4f4d5bf4ea08
proper distinction of code datatypes and abstypes
 haftmann parents: 
35226diff
changeset | 663 | val stmt_const = case Code.get_type_of_constr_or_abstr thy c | 
| 35226 | 664 | of SOME (tyco, _) => stmt_datatypecons tyco | 
| 30932 | 665 | | NONE => (case AxClass.class_of_param thy c | 
| 666 | of SOME class => stmt_classparam class | |
| 34891 
99b9a6290446
code certificates as integral part of code generation
 haftmann parents: 
34251diff
changeset | 667 | | NONE => stmt_fun (Code_Preproc.cert eqngr c)) | 
| 30932 | 668 | in ensure_stmt lookup_const (declare_const thy) stmt_const c end | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 669 | and ensure_class thy (algbr as (_, algebra)) eqngr permissive class = | 
| 24918 | 670 | let | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 671 | val super_classes = (Sorts.minimize_sort algebra o Sorts.super_classes algebra) class; | 
| 24969 | 672 | val cs = #params (AxClass.get_info thy class); | 
| 24918 | 673 | val stmt_class = | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 674 | fold_map (fn super_class => ensure_class thy algbr eqngr permissive super_class | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 675 | ##>> ensure_classrel thy algbr eqngr permissive (class, super_class)) super_classes | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 676 | ##>> fold_map (fn (c, ty) => ensure_const thy algbr eqngr permissive c | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 677 | ##>> translate_typ thy algbr eqngr permissive ty) cs | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 678 | #>> (fn info => Class (class, (unprefix "'" Name.aT, info))) | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 679 | in ensure_stmt lookup_class (declare_class thy) stmt_class class end | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 680 | and ensure_classrel thy algbr eqngr permissive (sub_class, super_class) = | 
| 24918 | 681 | let | 
| 682 | val stmt_classrel = | |
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 683 | ensure_class thy algbr eqngr permissive sub_class | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 684 | ##>> ensure_class thy algbr eqngr permissive super_class | 
| 24918 | 685 | #>> Classrel; | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 686 | in ensure_stmt lookup_classrel (declare_classrel thy) stmt_classrel (sub_class, super_class) end | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 687 | and ensure_inst thy (algbr as (_, algebra)) eqngr permissive (class, tyco) = | 
| 24918 | 688 | let | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 689 | val super_classes = (Sorts.minimize_sort algebra o Sorts.super_classes algebra) class; | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 690 | val these_class_params = these o try (#params o AxClass.get_info thy); | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 691 | val class_params = these_class_params class; | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 692 | val superclass_params = maps these_class_params | 
| 37448 
3bd4b3809bee
explicit type variable arguments for constructors
 haftmann parents: 
37447diff
changeset | 693 | ((Sorts.complete_sort algebra o Sorts.super_classes algebra) class); | 
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
43326diff
changeset | 694 | val vs = Name.invent_names Name.context "'a" (Sorts.mg_domain algebra tyco [class]); | 
| 24918 | 695 | val sorts' = Sorts.mg_domain (Sign.classes_of thy) tyco [class]; | 
| 696 | val vs' = map2 (fn (v, sort1) => fn sort2 => (v, | |
| 697 | Sorts.inter_sort (Sign.classes_of thy) (sort1, sort2))) vs sorts'; | |
| 698 | val arity_typ = Type (tyco, map TFree vs); | |
| 699 | val arity_typ' = Type (tyco, map (fn (v, sort) => TVar ((v, 0), sort)) vs'); | |
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 700 | fun translate_super_instance super_class = | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 701 | ensure_class thy algbr eqngr permissive super_class | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 702 | ##>> ensure_classrel thy algbr eqngr permissive (class, super_class) | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 703 | ##>> translate_dicts thy algbr eqngr permissive NONE (arity_typ, [super_class]) | 
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 704 | #>> (fn ((super_class, classrel), [Dict ([], Dict_Const (inst, dss))]) => | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 705 | (super_class, (classrel, (inst, dss)))); | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 706 | fun translate_classparam_instance (c, ty) = | 
| 24918 | 707 | let | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 708 | val raw_const = Const (c, map_type_tfree (K arity_typ') ty); | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 709 | val thm = AxClass.unoverload_conv thy (Thm.cterm_of thy raw_const); | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 710 | val const = (apsnd Logic.unvarifyT_global o dest_Const o snd | 
| 24918 | 711 | o Logic.dest_equals o Thm.prop_of) thm; | 
| 712 | in | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 713 | ensure_const thy algbr eqngr permissive c | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 714 | ##>> translate_const thy algbr eqngr permissive (SOME thm) (const, NONE) | 
| 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 715 | #>> (fn (c, IConst const') => ((c, const'), (thm, true))) | 
| 24918 | 716 | end; | 
| 717 | val stmt_inst = | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 718 | ensure_class thy algbr eqngr permissive class | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 719 | ##>> ensure_tyco thy algbr eqngr permissive tyco | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 720 | ##>> fold_map (translate_tyvar_sort thy algbr eqngr permissive) vs | 
| 37384 
5aba26803073
more consistent naming aroud type classes and instances
 haftmann parents: 
37216diff
changeset | 721 | ##>> fold_map translate_super_instance super_classes | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 722 | ##>> fold_map translate_classparam_instance class_params | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 723 | ##>> fold_map translate_classparam_instance superclass_params | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 724 | #>> (fn (((((class, tyco), vs), superinsts), inst_params), superinst_params) => | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 725 |           Classinst { class = class, tyco = tyco, vs = vs,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 726 | superinsts = superinsts, inst_params = inst_params, superinst_params = superinst_params }); | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 727 | in ensure_stmt lookup_instance (declare_instance thy) stmt_inst (class, tyco) end | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 728 | and translate_typ thy algbr eqngr permissive (TFree (v, _)) = | 
| 30932 | 729 | pair (ITyVar (unprefix "'" v)) | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 730 | | translate_typ thy algbr eqngr permissive (Type (tyco, tys)) = | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 731 | ensure_tyco thy algbr eqngr permissive tyco | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 732 | ##>> fold_map (translate_typ thy algbr eqngr permissive) tys | 
| 30932 | 733 | #>> (fn (tyco, tys) => tyco `%% tys) | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 734 | and translate_term thy algbr eqngr permissive some_thm (Const (c, ty), some_abs) = | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 735 | translate_app thy algbr eqngr permissive some_thm (((c, ty), []), some_abs) | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 736 | | translate_term thy algbr eqngr permissive some_thm (Free (v, _), some_abs) = | 
| 31889 | 737 | pair (IVar (SOME v)) | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 738 | | translate_term thy algbr eqngr permissive some_thm (Abs (v, ty, t), some_abs) = | 
| 24918 | 739 | let | 
| 42284 | 740 | val (v', t') = Syntax_Trans.variant_abs (Name.desymbolize false v, ty, t); | 
| 32273 | 741 | val v'' = if member (op =) (Term.add_free_names t' []) v' | 
| 742 | then SOME v' else NONE | |
| 24918 | 743 | in | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 744 | translate_typ thy algbr eqngr permissive ty | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 745 | ##>> translate_term thy algbr eqngr permissive some_thm (t', some_abs) | 
| 32273 | 746 | #>> (fn (ty, t) => (v'', ty) `|=> t) | 
| 24918 | 747 | end | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 748 | | translate_term thy algbr eqngr permissive some_thm (t as _ $ _, some_abs) = | 
| 24918 | 749 | case strip_comb t | 
| 750 | of (Const (c, ty), ts) => | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 751 | translate_app thy algbr eqngr permissive some_thm (((c, ty), ts), some_abs) | 
| 24918 | 752 | | (t', ts) => | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 753 | translate_term thy algbr eqngr permissive some_thm (t', some_abs) | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 754 | ##>> fold_map (translate_term thy algbr eqngr permissive some_thm o rpair NONE) ts | 
| 24918 | 755 | #>> (fn (t, ts) => t `$$ ts) | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 756 | and translate_eqn thy algbr eqngr permissive ((args, (rhs, some_abs)), (some_thm, proper)) = | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 757 | fold_map (translate_term thy algbr eqngr permissive some_thm) args | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 758 | ##>> translate_term thy algbr eqngr permissive some_thm (rhs, some_abs) | 
| 35226 | 759 | #>> rpair (some_thm, proper) | 
| 48074 | 760 | and translate_eqns thy algbr eqngr permissive eqns = | 
| 761 | maybe_permissive (fold_map (translate_eqn thy algbr eqngr permissive) eqns) | |
| 762 | #>> these | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 763 | and translate_const thy algbr eqngr permissive some_thm ((c, ty), some_abs) = | 
| 30932 | 764 | let | 
| 37698 | 765 | val _ = if (case some_abs of NONE => true | SOME abs => not (c = abs)) | 
| 35226 | 766 | andalso Code.is_abstr thy c | 
| 37698 | 767 | then translation_error thy permissive some_thm | 
| 768 |           "Abstraction violation" ("constant " ^ Code.string_of_const thy c)
 | |
| 769 | else () | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 770 | val (annotate, ty') = dest_tagged_type ty; | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 771 | val typargs = Sign.const_typargs thy (c, ty'); | 
| 32873 | 772 | val sorts = Code_Preproc.sortargs eqngr c; | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 773 | val (dom, range) = Term.strip_type ty'; | 
| 26972 | 774 | in | 
| 37698 | 775 | ensure_const thy algbr eqngr permissive c | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 776 | ##>> fold_map (translate_typ thy algbr eqngr permissive) typargs | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 777 | ##>> fold_map (translate_dicts thy algbr eqngr permissive some_thm) (typargs ~~ sorts) | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 778 | ##>> fold_map (translate_typ thy algbr eqngr permissive) (range :: dom) | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 779 | #>> (fn (((c, typargs), dss), range :: dom) => | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 780 |       IConst { name = c, typargs = typargs, dicts = dss,
 | 
| 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 781 | dom = dom, range = range, annotate = annotate }) | 
| 26972 | 782 | end | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 783 | and translate_app_const thy algbr eqngr permissive some_thm ((c_ty, ts), some_abs) = | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 784 | translate_const thy algbr eqngr permissive some_thm (c_ty, some_abs) | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 785 | ##>> fold_map (translate_term thy algbr eqngr permissive some_thm o rpair NONE) ts | 
| 24918 | 786 | #>> (fn (t, ts) => t `$$ ts) | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 787 | and translate_case thy algbr eqngr permissive some_thm (num_args, (t_pos, case_pats)) (c_ty, ts) = | 
| 24918 | 788 | let | 
| 40844 | 789 | fun arg_types num_args ty = fst (chop num_args (binder_types ty)); | 
| 31892 | 790 | val tys = arg_types num_args (snd c_ty); | 
| 29952 
9aed85067721
unified variable names in case expressions; no exponential fork in translation of case expressions
 haftmann parents: 
29277diff
changeset | 791 | val ty = nth tys t_pos; | 
| 47437 
4625ee486ff6
generalise case certificates to allow ignored parameters
 Andreas Lochbihler parents: 
47005diff
changeset | 792 | fun mk_constr NONE t = NONE | 
| 47555 | 793 | | mk_constr (SOME c) t = | 
| 794 | let | |
| 795 | val n = Code.args_number thy c; | |
| 796 | in SOME ((c, arg_types n (fastype_of (untag_term t)) ---> ty), n) end; | |
| 797 | val constrs = | |
| 798 | if null case_pats then [] | |
| 799 | else map_filter I (map2 mk_constr case_pats (nth_drop t_pos ts)); | |
| 48074 | 800 | fun casify undefineds constrs ty t_app ts = | 
| 24918 | 801 | let | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 802 | fun collapse_clause vs_map ts body = | 
| 48074 | 803 | case body | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 804 |            of IConst { name = c, ... } => if member (op =) undefineds c
 | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 805 | then [] | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 806 | else [(ts, body)] | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 807 |             | ICase { term = IVar (SOME v), clauses = clauses, ... } =>
 | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 808 | if forall (fn (pat', body') => exists_var pat' v | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 809 | orelse not (exists_var body' v)) clauses | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 810 | then case AList.lookup (op =) vs_map v | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 811 | of SOME i => maps (fn (pat', body') => | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 812 | collapse_clause (AList.delete (op =) v vs_map) | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 813 | (nth_map i (K pat') ts) body') clauses | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 814 | | NONE => [(ts, body)] | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 815 | else [(ts, body)] | 
| 48074 | 816 | | _ => [(ts, body)]; | 
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 817 | fun mk_clause mk tys t = | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 818 | let | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 819 | val (vs, body) = unfold_abs_eta tys t; | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 820 | val vs_map = fold_index (fn (i, (SOME v, _)) => cons (v, i) | _ => I) vs []; | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 821 | val ts = map (IVar o fst) vs; | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 822 | in map mk (collapse_clause vs_map ts body) end; | 
| 31892 | 823 | val t = nth ts t_pos; | 
| 824 | val ts_clause = nth_drop t_pos ts; | |
| 31935 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 825 | val clauses = if null case_pats | 
| 
3896169e6ff9
cleaned up fundamental iml term functions; nested patterns
 haftmann parents: 
31892diff
changeset | 826 | then mk_clause (fn ([t], body) => (t, body)) [ty] (the_single ts_clause) | 
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 827 |           else maps (fn ((constr as IConst { dom = tys, ... }, n), t) =>
 | 
| 33957 | 828 | mk_clause (fn (ts, body) => (constr `$$ ts, body)) (take n tys) t) | 
| 47555 | 829 | (constrs ~~ (map_filter (fn (NONE, _) => NONE | (SOME _, t) => SOME t) | 
| 830 | (case_pats ~~ ts_clause))); | |
| 48072 
ace701efe203
prefer records with speaking labels over deeply nested tuples
 haftmann parents: 
48003diff
changeset | 831 |       in ICase { term = t, typ = ty, clauses = clauses, primitive = t_app `$$ ts } end;
 | 
| 24918 | 832 | in | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 833 | translate_const thy algbr eqngr permissive some_thm (c_ty, NONE) | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 834 | ##>> fold_map (fn (constr, n) => translate_const thy algbr eqngr permissive some_thm (constr, NONE) | 
| 47555 | 835 | #>> rpair n) constrs | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 836 | ##>> translate_typ thy algbr eqngr permissive ty | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 837 | ##>> fold_map (translate_term thy algbr eqngr permissive some_thm o rpair NONE) ts | 
| 48074 | 838 | ##>> undefineds thy | 
| 839 | #>> (fn ((((t, constrs), ty), ts), undefineds) => | |
| 840 | casify undefineds constrs ty t ts) | |
| 24918 | 841 | end | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 842 | and translate_app_case thy algbr eqngr permissive some_thm (case_scheme as (num_args, _)) ((c, ty), ts) = | 
| 29973 | 843 | if length ts < num_args then | 
| 844 | let | |
| 845 | val k = length ts; | |
| 33957 | 846 | val tys = (take (num_args - k) o drop k o fst o strip_type) ty; | 
| 29973 | 847 | val ctxt = (fold o fold_aterms) Term.declare_term_frees ts Name.context; | 
| 43329 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 wenzelm parents: 
43326diff
changeset | 848 | val vs = Name.invent_names ctxt "a" tys; | 
| 29973 | 849 | in | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 850 | fold_map (translate_typ thy algbr eqngr permissive) tys | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 851 | ##>> translate_case thy algbr eqngr permissive some_thm case_scheme ((c, ty), ts @ map Free vs) | 
| 31888 | 852 | #>> (fn (tys, t) => map2 (fn (v, _) => pair (SOME v)) vs tys `|==> t) | 
| 29973 | 853 | end | 
| 854 | else if length ts > num_args then | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 855 | translate_case thy algbr eqngr permissive some_thm case_scheme ((c, ty), take num_args ts) | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 856 | ##>> fold_map (translate_term thy algbr eqngr permissive some_thm o rpair NONE) (drop num_args ts) | 
| 29973 | 857 | #>> (fn (t, ts) => t `$$ ts) | 
| 858 | else | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 859 | translate_case thy algbr eqngr permissive some_thm case_scheme ((c, ty), ts) | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 860 | and translate_app thy algbr eqngr permissive some_thm (c_ty_ts as ((c, _), _), some_abs) = | 
| 29973 | 861 | case Code.get_case_scheme thy c | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 862 | of SOME case_scheme => translate_app_case thy algbr eqngr permissive some_thm case_scheme c_ty_ts | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 863 | | NONE => translate_app_const thy algbr eqngr permissive some_thm (c_ty_ts, some_abs) | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 864 | and translate_tyvar_sort thy (algbr as (proj_sort, _)) eqngr permissive (v, sort) = | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 865 | fold_map (ensure_class thy algbr eqngr permissive) (proj_sort sort) | 
| 30932 | 866 | #>> (fn sort => (unprefix "'" v, sort)) | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 867 | and translate_dicts thy (algbr as (proj_sort, algebra)) eqngr permissive some_thm (ty, sort) = | 
| 30932 | 868 | let | 
| 41100 
6c0940392fb4
dictionary constants must permit explicit weakening of classes;
 haftmann parents: 
40844diff
changeset | 869 | datatype typarg_witness = | 
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 870 | Weakening of (class * class) list * plain_typarg_witness | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 871 | and plain_typarg_witness = | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 872 | Global of (class * string) * typarg_witness list list | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 873 | | Local of string * (int * sort); | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 874 | fun class_relation ((Weakening (classrels, x)), sub_class) super_class = | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 875 | Weakening ((sub_class, super_class) :: classrels, x); | 
| 41100 
6c0940392fb4
dictionary constants must permit explicit weakening of classes;
 haftmann parents: 
40844diff
changeset | 876 | fun type_constructor (tyco, _) dss class = | 
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 877 | Weakening ([], Global ((class, tyco), (map o map) fst dss)); | 
| 30932 | 878 | fun type_variable (TFree (v, sort)) = | 
| 879 | let | |
| 880 | val sort' = proj_sort sort; | |
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 881 | in map_index (fn (n, class) => (Weakening ([], Local (v, (n, sort'))), class)) sort' end; | 
| 41100 
6c0940392fb4
dictionary constants must permit explicit weakening of classes;
 haftmann parents: 
40844diff
changeset | 882 | val typarg_witnesses = Sorts.of_sort_derivation algebra | 
| 36102 
a51d1d154c71
of_sort_derivation: pass-through full type information -- following the version by krauss/schropp;
 wenzelm parents: 
35961diff
changeset | 883 |       {class_relation = K (Sorts.classrel_derivation algebra class_relation),
 | 
| 35961 
00e48e1d9afd
Sorts.of_sort_derivation: do not use slow Graph.irreducible_paths here, which not always needed  (SUBTLE CHANGE IN SEMANTICS);
 wenzelm parents: 
35845diff
changeset | 884 | type_constructor = type_constructor, | 
| 37698 | 885 | type_variable = type_variable} (ty, proj_sort sort) | 
| 886 | handle Sorts.CLASS_ERROR e => not_wellsorted thy permissive some_thm ty sort e; | |
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 887 | fun mk_dict (Weakening (classrels, x)) = | 
| 41100 
6c0940392fb4
dictionary constants must permit explicit weakening of classes;
 haftmann parents: 
40844diff
changeset | 888 | fold_map (ensure_classrel thy algbr eqngr permissive) classrels | 
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 889 | ##>> mk_plain_dict x | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 890 | #>> Dict | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 891 | and mk_plain_dict (Global (inst, dss)) = | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 892 | ensure_inst thy algbr eqngr permissive inst | 
| 41100 
6c0940392fb4
dictionary constants must permit explicit weakening of classes;
 haftmann parents: 
40844diff
changeset | 893 | ##>> (fold_map o fold_map) mk_dict dss | 
| 41118 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 894 | #>> (fn (inst, dss) => Dict_Const (inst, dss)) | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 895 | | mk_plain_dict (Local (v, (n, sort))) = | 
| 
b290841cd3b0
separated dictionary weakning into separate type
 haftmann parents: 
41100diff
changeset | 896 | pair (Dict_Var (unprefix "'" v, (n, length sort))) | 
| 41100 
6c0940392fb4
dictionary constants must permit explicit weakening of classes;
 haftmann parents: 
40844diff
changeset | 897 | in fold_map mk_dict typarg_witnesses end; | 
| 24918 | 898 | |
| 25969 | 899 | |
| 27103 | 900 | (* store *) | 
| 901 | ||
| 34173 
458ced35abb8
reduced code generator cache to the baremost minimum
 haftmann parents: 
34084diff
changeset | 902 | structure Program = Code_Data | 
| 27103 | 903 | ( | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 904 | type T = naming * program; | 
| 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 905 | val empty = (empty_naming, Graph.empty); | 
| 27103 | 906 | ); | 
| 907 | ||
| 47571 | 908 | fun invoke_generation ignore_cache thy (algebra, eqngr) generate thing = | 
| 39397 | 909 | Program.change_yield (if ignore_cache then NONE else SOME thy) | 
| 910 | (fn naming_program => (NONE, naming_program) | |
| 47571 | 911 | |> generate thy algebra eqngr thing | 
| 912 | |-> (fn thing => fn (_, naming_program) => (thing, naming_program))); | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 913 | |
| 27103 | 914 | |
| 915 | (* program generation *) | |
| 916 | ||
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 917 | fun consts_program thy permissive consts = | 
| 27103 | 918 | let | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 919 | fun project_consts consts (naming, program) = | 
| 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 920 | if permissive then (consts, (naming, program)) | 
| 46614 
165886a4fe64
clarified Graph.restrict (formerly Graph.subgraph) based on public graph operations;
 wenzelm parents: 
45987diff
changeset | 921 | else (consts, (naming, Graph.restrict | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 922 | (member (op =) (Graph.all_succs program consts)) program)); | 
| 32873 | 923 | fun generate_consts thy algebra eqngr = | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 924 | fold_map (ensure_const thy algebra eqngr permissive); | 
| 27103 | 925 | in | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 926 | invoke_generation permissive thy (Code_Preproc.obtain false thy consts []) | 
| 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 927 | generate_consts consts | 
| 27103 | 928 | |-> project_consts | 
| 929 | end; | |
| 930 | ||
| 931 | ||
| 932 | (* value evaluation *) | |
| 25969 | 933 | |
| 32873 | 934 | fun ensure_value thy algbr eqngr t = | 
| 24918 | 935 | let | 
| 936 | val ty = fastype_of t; | |
| 937 | val vs = fold_term_types (K (fold_atyps (insert (eq_fst op =) | |
| 938 | o dest_TFree))) t []; | |
| 45987 | 939 | val t' = annotate thy algbr eqngr (Term.dummy_patternN, ty) [] t; | 
| 24918 | 940 | val stmt_value = | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 941 | fold_map (translate_tyvar_sort thy algbr eqngr false) vs | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 942 | ##>> translate_typ thy algbr eqngr false ty | 
| 44996 
410eea28b0f7
also adding type annotations for the dynamic invocation
 bulwahn parents: 
44855diff
changeset | 943 | ##>> translate_term thy algbr eqngr false NONE (t', NONE) | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 944 | #>> (fn ((vs, ty), t) => Fun | 
| 37437 | 945 | (Term.dummy_patternN, (((vs, ty), [(([], t), (NONE, true))]), NONE))); | 
| 31063 
88aaab83b6fc
dropped explicit suppport for frees in evaluation conversion stack
 haftmann parents: 
31054diff
changeset | 946 | fun term_value (dep, (naming, program1)) = | 
| 25969 | 947 | let | 
| 37437 | 948 | val Fun (_, ((vs_ty, [(([], t), _)]), _)) = | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 949 | Graph.get_node program1 Term.dummy_patternN; | 
| 44338 
700008399ee5
refined Graph implementation: more abstract/scalable Graph.Keys instead of plain lists -- order of adjacency is now standardized wrt. Key.ord;
 wenzelm parents: 
43329diff
changeset | 950 | val deps = Graph.immediate_succs program1 Term.dummy_patternN; | 
| 46665 
919dfcdf6d8a
discontinued slightly odd Graph.del_nodes (inefficient due to full Table.map);
 wenzelm parents: 
46614diff
changeset | 951 | val program2 = Graph.del_node Term.dummy_patternN program1; | 
| 27103 | 952 | val deps_all = Graph.all_succs program2 deps; | 
| 46614 
165886a4fe64
clarified Graph.restrict (formerly Graph.subgraph) based on public graph operations;
 wenzelm parents: 
45987diff
changeset | 953 | val program3 = Graph.restrict (member (op =) deps_all) program2; | 
| 31063 
88aaab83b6fc
dropped explicit suppport for frees in evaluation conversion stack
 haftmann parents: 
31054diff
changeset | 954 | in (((naming, program3), ((vs_ty, t), deps)), (dep, (naming, program2))) end; | 
| 26011 | 955 | in | 
| 28663 
bd8438543bf2
code identifier namings are no longer imperative
 haftmann parents: 
28423diff
changeset | 956 | ensure_stmt ((K o K) NONE) pair stmt_value Term.dummy_patternN | 
| 26011 | 957 | #> snd | 
| 31063 
88aaab83b6fc
dropped explicit suppport for frees in evaluation conversion stack
 haftmann parents: 
31054diff
changeset | 958 | #> term_value | 
| 26011 | 959 | end; | 
| 24219 | 960 | |
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 961 | fun original_sorts vs = | 
| 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 962 | map (fn (v, _) => (v, (the o AList.lookup (op =) vs o prefix "'") v)); | 
| 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 963 | |
| 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 964 | fun dynamic_evaluator thy evaluator algebra eqngr vs t = | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 965 | let | 
| 31063 
88aaab83b6fc
dropped explicit suppport for frees in evaluation conversion stack
 haftmann parents: 
31054diff
changeset | 966 | val (((naming, program), (((vs', ty'), t'), deps)), _) = | 
| 39397 | 967 | invoke_generation false thy (algebra, eqngr) ensure_value t; | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 968 | in evaluator naming program ((original_sorts vs vs', (vs', ty')), t') deps end; | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 969 | |
| 41184 | 970 | fun dynamic_conv thy evaluator = | 
| 971 | Code_Preproc.dynamic_conv thy (dynamic_evaluator thy evaluator); | |
| 39475 | 972 | |
| 41184 | 973 | fun dynamic_value thy postproc evaluator = | 
| 974 | Code_Preproc.dynamic_value thy postproc (dynamic_evaluator thy evaluator); | |
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 975 | |
| 41365 | 976 | fun lift_evaluation thy evaluation' algebra eqngr naming program vs t = | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 977 | let | 
| 47576 | 978 | val (((_, _), (((vs', ty'), t'), deps)), _) = | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 979 | ensure_value thy algebra eqngr t (NONE, (naming, program)); | 
| 41365 | 980 | in evaluation' ((original_sorts vs vs', (vs', ty')), t') deps end; | 
| 981 | ||
| 982 | fun lift_evaluator thy evaluator' consts algebra eqngr = | |
| 983 | let | |
| 984 | fun generate_consts thy algebra eqngr = | |
| 985 | fold_map (ensure_const thy algebra eqngr false); | |
| 986 | val (consts', (naming, program)) = | |
| 987 | invoke_generation true thy (algebra, eqngr) generate_consts consts; | |
| 988 | val evaluation' = evaluator' naming program consts'; | |
| 989 | in lift_evaluation thy evaluation' algebra eqngr naming program end; | |
| 990 | ||
| 991 | fun lift_evaluator_simple thy evaluator' consts algebra eqngr = | |
| 992 | let | |
| 993 | fun generate_consts thy algebra eqngr = | |
| 994 | fold_map (ensure_const thy algebra eqngr false); | |
| 47576 | 995 | val (_, (_, program)) = | 
| 41365 | 996 | invoke_generation true thy (algebra, eqngr) generate_consts consts; | 
| 997 | in evaluator' program end; | |
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 998 | |
| 41184 | 999 | fun static_conv thy consts conv = | 
| 41365 | 1000 | Code_Preproc.static_conv thy consts (lift_evaluator thy conv consts); | 
| 38672 
f1f64375f662
preliminary versions of static_eval_conv(_simple)
 haftmann parents: 
38669diff
changeset | 1001 | |
| 41184 | 1002 | fun static_conv_simple thy consts conv = | 
| 41365 | 1003 | Code_Preproc.static_conv thy consts (lift_evaluator_simple thy conv consts); | 
| 38672 
f1f64375f662
preliminary versions of static_eval_conv(_simple)
 haftmann parents: 
38669diff
changeset | 1004 | |
| 41184 | 1005 | fun static_value thy postproc consts evaluator = | 
| 41365 | 1006 | Code_Preproc.static_value thy postproc consts (lift_evaluator thy evaluator consts); | 
| 39487 
80b2cf3b0779
proper closures for static evaluation; no need for FIXMEs any longer
 haftmann parents: 
39475diff
changeset | 1007 | |
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1008 | |
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1009 | (** diagnostic commands **) | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1010 | |
| 31036 | 1011 | fun read_const_exprs thy = | 
| 1012 | let | |
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 1013 | fun consts_of thy' = Symtab.fold (fn (c, (_, NONE)) => cons c | _ => I) | 
| 47005 
421760a1efe7
maintain generic context naming in structure Name_Space (NB: empty = default_naming, init = local_naming);
 wenzelm parents: 
46961diff
changeset | 1014 | ((snd o #constants o Consts.dest o Sign.consts_of) thy') []; | 
| 36272 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 1015 | fun belongs_here thy' c = forall | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 1016 | (fn thy'' => not (Sign.declared_const thy'' c)) (Theory.parents_of thy'); | 
| 
4d358c582ffb
optionally ignore errors during translation of equations; tuned representation of abstraction points
 haftmann parents: 
36210diff
changeset | 1017 | fun consts_of_select thy' = filter (belongs_here thy') (consts_of thy'); | 
| 40711 
81bc73585eec
globbing constant expressions use more idiomatic underscore rather than star
 haftmann parents: 
39566diff
changeset | 1018 | fun read_const_expr "_" = ([], consts_of thy) | 
| 
81bc73585eec
globbing constant expressions use more idiomatic underscore rather than star
 haftmann parents: 
39566diff
changeset | 1019 | | read_const_expr s = if String.isSuffix "._" s | 
| 
81bc73585eec
globbing constant expressions use more idiomatic underscore rather than star
 haftmann parents: 
39566diff
changeset | 1020 | then ([], consts_of_select (Context.this_theory thy (unsuffix "._" s))) | 
| 31156 | 1021 | else ([Code.read_const thy s], []); | 
| 31036 | 1022 | in pairself flat o split_list o map read_const_expr end; | 
| 1023 | ||
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1024 | fun code_depgr thy consts = | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1025 | let | 
| 39397 | 1026 | val (_, eqngr) = Code_Preproc.obtain true thy consts []; | 
| 34173 
458ced35abb8
reduced code generator cache to the baremost minimum
 haftmann parents: 
34084diff
changeset | 1027 | val all_consts = Graph.all_succs eqngr consts; | 
| 46614 
165886a4fe64
clarified Graph.restrict (formerly Graph.subgraph) based on public graph operations;
 wenzelm parents: 
45987diff
changeset | 1028 | in Graph.restrict (member (op =) all_consts) eqngr end; | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1029 | |
| 31125 
80218ee73167
transferred code generator preprocessor into separate module
 haftmann parents: 
31088diff
changeset | 1030 | fun code_thms thy = Pretty.writeln o Code_Preproc.pretty thy o code_depgr thy; | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1031 | |
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1032 | fun code_deps thy consts = | 
| 27103 | 1033 | let | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1034 | val eqngr = code_depgr thy consts; | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1035 | val constss = Graph.strong_conn eqngr; | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1036 | val mapping = Symtab.empty |> fold (fn consts => fold (fn const => | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1037 | Symtab.update (const, consts)) consts) constss; | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1038 | fun succs consts = consts | 
| 44338 
700008399ee5
refined Graph implementation: more abstract/scalable Graph.Keys instead of plain lists -- order of adjacency is now standardized wrt. Key.ord;
 wenzelm parents: 
43329diff
changeset | 1039 | |> maps (Graph.immediate_succs eqngr) | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1040 | |> subtract (op =) consts | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1041 | |> map (the o Symtab.lookup mapping) | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1042 | |> distinct (op =); | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1043 | val conn = [] |> fold (fn consts => cons (consts, succs consts)) constss; | 
| 31156 | 1044 | fun namify consts = map (Code.string_of_const thy) consts | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1045 | |> commas; | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1046 | val prgr = map (fn (consts, constss) => | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1047 |       { name = namify consts, ID = namify consts, dir = "", unfold = true,
 | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1048 | path = "", parents = map namify constss }) conn; | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1049 | in Present.display_graph prgr end; | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1050 | |
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1051 | local | 
| 27103 | 1052 | |
| 31036 | 1053 | fun code_thms_cmd thy = code_thms thy o op @ o read_const_exprs thy; | 
| 1054 | fun code_deps_cmd thy = code_deps thy o op @ o read_const_exprs thy; | |
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1055 | |
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1056 | in | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1057 | |
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1058 | val _ = | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46665diff
changeset | 1059 |   Outer_Syntax.improper_command @{command_spec "code_thms"}
 | 
| 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46665diff
changeset | 1060 | "print system of code equations for code" | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36272diff
changeset | 1061 | (Scan.repeat1 Parse.term_group | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1062 | >> (fn cs => Toplevel.no_timing o Toplevel.unknown_theory | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1063 | o Toplevel.keep ((fn thy => code_thms_cmd thy cs) o Toplevel.theory_of))); | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1064 | |
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1065 | val _ = | 
| 46961 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46665diff
changeset | 1066 |   Outer_Syntax.improper_command @{command_spec "code_deps"}
 | 
| 
5c6955f487e5
outer syntax command definitions based on formal command_spec derived from theory header declarations;
 wenzelm parents: 
46665diff
changeset | 1067 | "visualize dependencies of code equations for code" | 
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
36272diff
changeset | 1068 | (Scan.repeat1 Parse.term_group | 
| 30942 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1069 | >> (fn cs => Toplevel.no_timing o Toplevel.unknown_theory | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1070 | o Toplevel.keep ((fn thy => code_deps_cmd thy cs) o Toplevel.theory_of))); | 
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1071 | |
| 
1e246776f876
diagnostic commands now in code_thingol; tuned code of funny continuations
 haftmann parents: 
30932diff
changeset | 1072 | end; | 
| 27103 | 1073 | |
| 24219 | 1074 | end; (*struct*) | 
| 1075 | ||
| 1076 | ||
| 28054 | 1077 | structure Basic_Code_Thingol: BASIC_CODE_THINGOL = Code_Thingol; |