| author | paulson | 
| Wed, 09 Jun 2004 11:19:23 +0200 | |
| changeset 14890 | 51f28df21c8b | 
| parent 14682 | a5072752114c | 
| child 14981 | e73f8140af78 | 
| 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$ | 
| 12625 | 3 | Author: Tobias Mayr, David von Oheimb, and Markus Wenzel | 
| 12030 | 4 | License: GPL (GNU GENERAL PUBLIC LICENSE) | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 5 | |
| 14682 
a5072752114c
HOLCF: discontinued special version of 'constdefs';
 wenzelm parents: 
12876diff
changeset | 6 | HOLCF version of consts: handle continuous function types in mixfix | 
| 
a5072752114c
HOLCF: discontinued special version of 'constdefs';
 wenzelm parents: 
12876diff
changeset | 7 | syntax. | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 8 | *) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 9 | |
| 12625 | 10 | signature CONT_CONSTS = | 
| 11 | sig | |
| 12 | val add_consts: (bstring * string * mixfix) list -> theory -> theory | |
| 13 | val add_consts_i: (bstring * typ * mixfix) list -> theory -> theory | |
| 14 | end; | |
| 15 | ||
| 16 | structure ContConsts: CONT_CONSTS = | |
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 17 | struct | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 18 | |
| 12625 | 19 | |
| 20 | (* misc utils *) | |
| 4129 
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 | open HOLCFLogic; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 23 | |
| 12625 | 24 | fun first (x,_,_) = x; | 
| 25 | fun second (_,x,_) = x; | |
| 26 | fun third (_,_,x) = x; | |
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 27 | 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 | 28 | 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 | 29 | 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 | 30 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 31 | 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 | 32 | let fun filt [] = ([],[]) | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 33 | | filt (x::xs) = let val (ys,zs) = filt xs in | 
| 12625 | 34 | if pred x then (x::ys,zs) else (ys,x::zs) end | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 35 | in filt end; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 36 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 37 | fun change_arrow 0 T = T | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 38 | |   change_arrow n (Type(_,[S,T])) = Type ("fun",[S,change_arrow (n-1) T])
 | 
| 12625 | 39 | | change_arrow _ _ = sys_error "cont_consts: change_arrow"; | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 40 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 41 | 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 | 42 | fun argnames _ 0 = [] | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 43 | | 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 | 44 | val vnames = argnames (ord "A") n; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 45 | val extra_parse_rule = Syntax.ParseRule (Constant name2, Constant name1); | 
| 5700 | 46 | in [Syntax.ParsePrintRule (Syntax.mk_appl (Constant name2) (map Variable vnames), | 
| 12625 | 47 | foldl (fn (t,arg) => (Syntax.mk_appl (Constant "Rep_CFun") | 
| 48 | [t,Variable arg])) | |
| 49 | (Constant name1,vnames))] | |
| 11651 | 50 | @(case mx of InfixName _ => [extra_parse_rule] | 
| 51 | | InfixlName _ => [extra_parse_rule] | |
| 12625 | 52 | | InfixrName _ => [extra_parse_rule] | _ => []) end; | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 53 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 54 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 55 | (* transforming infix/mixfix declarations of constants with type ...->... | 
| 12625 | 56 | a declaration of such a constant is transformed to a normal declaration with | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 57 | 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 | 58 | 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 | 59 | 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 | 60 | *) | 
| 12625 | 61 | fun fix_mixfix (syn , T, mx as Infix p ) = | 
| 62 | (Syntax.const_name syn mx, T, InfixName (syn, p)) | |
| 63 | | fix_mixfix (syn , T, mx as Infixl p ) = | |
| 64 | (Syntax.const_name syn mx, T, InfixlName (syn, p)) | |
| 65 | | fix_mixfix (syn , T, mx as Infixr p ) = | |
| 66 | (Syntax.const_name syn mx, T, InfixrName (syn, p)) | |
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 67 | | fix_mixfix decl = decl; | 
| 12625 | 68 | fun transform decl = let | 
| 69 | val (c, T, mx) = fix_mixfix decl; | |
| 70 | val c2 = "_cont_" ^ c; | |
| 71 | val n = Syntax.mixfix_args mx | |
| 72 | in ((c , T,NoSyn), | |
| 73 | (c2,change_arrow n T,mx ), | |
| 74 | trans_rules c2 c n mx) end; | |
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 75 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 76 | 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 | 77 | | cfun_arity _ = 0; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 78 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 79 | fun is_contconst (_,_,NoSyn ) = false | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 80 | | is_contconst (_,_,Binder _) = false | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 81 | | is_contconst (c,T,mx ) = cfun_arity T >= Syntax.mixfix_args mx | 
| 12625 | 82 |                          handle ERROR => error ("in mixfix annotation for " ^
 | 
| 83 | quote (Syntax.const_name c mx)); | |
| 84 | ||
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 85 | |
| 12625 | 86 | (* add_consts(_i) *) | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 87 | |
| 12625 | 88 | fun gen_add_consts prep_typ raw_decls thy = | 
| 89 | let | |
| 90 | val decls = map (upd_second (Thm.typ_of o prep_typ (Theory.sign_of thy))) raw_decls; | |
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 91 | 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 | 92 | val transformed_decls = map transform contconst_decls; | 
| 12625 | 93 | in | 
| 94 | thy | |
| 95 | |> Theory.add_consts_i normal_decls | |
| 96 | |> Theory.add_consts_i (map first transformed_decls) | |
| 97 | |> Theory.add_syntax_i (map second transformed_decls) | |
| 98 | |> Theory.add_trrules_i (flat (map third transformed_decls)) | |
| 99 | end; | |
| 100 | ||
| 101 | val add_consts = gen_add_consts Thm.read_ctyp; | |
| 102 | val add_consts_i = gen_add_consts Thm.ctyp_of; | |
| 103 | ||
| 104 | ||
| 105 | (* outer syntax *) | |
| 106 | ||
| 107 | local structure P = OuterParse and K = OuterSyntax.Keyword in | |
| 108 | ||
| 109 | val constsP = | |
| 110 | OuterSyntax.command "consts" "declare constants (HOLCF)" K.thy_decl | |
| 12876 
a70df1e5bf10
got rid of explicit marginal comments (now stripped earlier from input);
 wenzelm parents: 
12625diff
changeset | 111 | (Scan.repeat1 P.const >> (Toplevel.theory o add_consts)); | 
| 12625 | 112 | |
| 14682 
a5072752114c
HOLCF: discontinued special version of 'constdefs';
 wenzelm parents: 
12876diff
changeset | 113 | val _ = OuterSyntax.add_parsers [constsP]; | 
| 12625 | 114 | |
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 115 | end; | 
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 116 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 117 | |
| 12625 | 118 | (* old-style theory syntax *) | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 119 | |
| 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 120 | val _ = ThySyn.add_syntax [] | 
| 12625 | 121 | [ThyParse.section "consts" "|> ContConsts.add_consts" ThyParse.const_decls]; | 
| 4129 
2fd816aa6206
HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
 wenzelm parents: diff
changeset | 122 | |
| 12625 | 123 | end; |