| author | nipkow | 
| Sat, 19 Feb 2000 13:47:12 +0100 | |
| changeset 8263 | 699d4ad2ced3 | 
| parent 5700 | 491944c2fb12 | 
| child 11651 | 201b3f76c7b7 | 
| permissions | -rw-r--r-- | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 1 | (* Title: HOLCF/cont_consts.ML | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 2 | ID: $Id$ | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 3 | Author: Tobias Mayr and David von Oheimb | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 4 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 5 | Theory extender for consts section. | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 6 | *) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 7 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 8 | structure ContConsts = | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 9 | struct | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 10 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 11 | local | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 12 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 13 | open HOLCFLogic; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 14 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 15 | exception Impossible of string; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 16 | fun Imposs msg = raise Impossible ("ContConst:"^msg);
 | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 17 | fun first (x,_,_) = x; fun second (_,x,_) = x; fun third (_,_,x) = x; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 18 | fun upd_first f (x,y,z) = (f x, y, z); | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 19 | fun upd_second f (x,y,z) = ( x, f y, z); | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 20 | fun upd_third f (x,y,z) = ( x, y, f z); | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 21 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 22 | fun filter2 (pred: 'a->bool) : 'a list -> 'a list * 'a list = | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 23 | let fun filt [] = ([],[]) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 24 | | filt (x::xs) = let val (ys,zs) = filt xs in | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 25 | if pred x then (x::ys,zs) else (ys,x::zs) end | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 26 | in filt end; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 27 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 28 | fun change_arrow 0 T = T | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 29 | |   change_arrow n (Type(_,[S,T])) = Type ("fun",[S,change_arrow (n-1) T])
 | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 30 | | change_arrow _ _ = Imposs "change_arrow"; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 31 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 32 | fun trans_rules name2 name1 n mx = let | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 33 | fun argnames _ 0 = [] | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 34 | | argnames c n = chr c::argnames (c+1) (n-1); | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 35 | val vnames = argnames (ord "A") n; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 36 | val extra_parse_rule = Syntax.ParseRule (Constant name2, Constant name1); | 
| 5700 | 37 | in [Syntax.ParsePrintRule (Syntax.mk_appl (Constant name2) (map Variable vnames), | 
| 38 | foldl (fn (t,arg) => (Syntax.mk_appl (Constant "Rep_CFun") | |
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 39 | [t,Variable arg])) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 40 | (Constant name1,vnames))] | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 41 | @(case mx of InfixlName _ => [extra_parse_rule] | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 42 | | InfixrName _ => [extra_parse_rule] | _ => []) end; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 43 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 44 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 45 | (* transforming infix/mixfix declarations of constants with type ...->... | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 46 | a declaration of such a constant is transformed to a normal declaration with | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 47 | an internal name, the same type, and nofix. Additionally, a purely syntactic | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 48 | declaration with the original name, type ...=>..., and the original mixfix | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 49 | is generated and connected to the other declaration via some translation. | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 50 | *) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 51 | fun fix_mixfix (syn , T, mx as Infixl p ) = | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 52 | (Syntax.const_name syn mx, T, InfixlName (syn, p)) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 53 | | fix_mixfix (syn , T, mx as Infixr p ) = | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 54 | (Syntax.const_name syn mx, T, InfixrName (syn, p)) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 55 | | fix_mixfix decl = decl; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 56 | fun transform decl = let | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 57 | val (c, T, mx) = fix_mixfix decl; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 58 | val c2 = "@"^c; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 59 | val n = Syntax.mixfix_args mx | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 60 | in ((c , T,NoSyn), | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 61 | (c2,change_arrow n T,mx ), | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 62 | trans_rules c2 c n mx) end; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 63 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 64 | fun cfun_arity (Type(n,[_,T])) = if n = cfun_arrow then 1+cfun_arity T else 0 | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 65 | | cfun_arity _ = 0; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 66 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 67 | fun is_contconst (_,_,NoSyn ) = false | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 68 | | is_contconst (_,_,Binder _) = false | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 69 | | is_contconst (c,T,mx ) = cfun_arity T >= Syntax.mixfix_args mx | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 70 | 			 handle ERROR => error ("in mixfix annotation for " ^
 | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 71 | quote (Syntax.const_name c mx)); | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 72 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 73 | in (* local *) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 74 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 75 | fun ext_consts prep_typ raw_decls thy = | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 76 | let val decls = map (upd_second (typ_of o prep_typ (sign_of thy))) raw_decls; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 77 | val (contconst_decls, normal_decls) = filter2 is_contconst decls; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 78 | val transformed_decls = map transform contconst_decls; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 79 | in thy |> Theory.add_consts_i normal_decls | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 80 | |> Theory.add_consts_i (map first transformed_decls) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 81 | |> Theory.add_syntax_i (map second transformed_decls) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 82 | |> Theory.add_trrules_i (flat (map third transformed_decls)) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 83 | handle ERROR => | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 84 |       error ("The error(s) above occurred in (cont)consts section")
 | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 85 | end; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 86 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 87 | fun cert_typ sg typ = | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 88 | ctyp_of sg typ handle TYPE (msg, _, _) => error msg; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 89 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 90 | val add_consts = ext_consts read_ctyp; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 91 | val add_consts_i = ext_consts cert_typ; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 92 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 93 | end; (* local *) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 94 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 95 | end; (* struct *) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 96 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 97 | val _ = ThySyn.add_syntax [] | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 98 | [ThyParse.section "consts" "|> ContConsts.add_consts" ThyParse.const_decls]; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 99 |