| author | blanchet |
| Fri, 18 Dec 2009 12:00:44 +0100 | |
| changeset 34127 | 85257fa296f6 |
| parent 33245 | 65232054ffd0 |
| child 35129 | ed24ba6f69aa |
| permissions | -rw-r--r-- |
| 23152 | 1 |
(* Title: HOLCF/Tools/cont_consts.ML |
2 |
Author: Tobias Mayr, David von Oheimb, and Markus Wenzel |
|
3 |
||
4 |
HOLCF version of consts: handle continuous function types in mixfix |
|
5 |
syntax. |
|
6 |
*) |
|
7 |
||
8 |
signature CONT_CONSTS = |
|
9 |
sig |
|
|
30919
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
10 |
val add_consts: (binding * string * mixfix) list -> theory -> theory |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
11 |
val add_consts_i: (binding * typ * mixfix) list -> theory -> theory |
| 23152 | 12 |
end; |
13 |
||
| 33245 | 14 |
structure ContConsts: CONT_CONSTS = |
| 23152 | 15 |
struct |
16 |
||
17 |
||
18 |
(* misc utils *) |
|
19 |
||
20 |
fun first (x,_,_) = x; |
|
21 |
fun second (_,x,_) = x; |
|
22 |
fun third (_,_,x) = x; |
|
23 |
fun upd_first f (x,y,z) = (f x, y, z); |
|
24 |
fun upd_second f (x,y,z) = ( x, f y, z); |
|
25 |
fun upd_third f (x,y,z) = ( x, y, f z); |
|
26 |
||
27 |
fun change_arrow 0 T = T |
|
28 |
| change_arrow n (Type(_,[S,T])) = Type ("fun",[S,change_arrow (n-1) T])
|
|
29 |
| change_arrow _ _ = sys_error "cont_consts: change_arrow"; |
|
30 |
||
| 33245 | 31 |
fun trans_rules name2 name1 n mx = |
32 |
let |
|
33 |
fun argnames _ 0 = [] |
|
34 |
| argnames c n = chr c::argnames (c+1) (n-1); |
|
35 |
val vnames = argnames (ord "A") n; |
|
36 |
val extra_parse_rule = Syntax.ParseRule (Constant name2, Constant name1); |
|
37 |
in |
|
38 |
[Syntax.ParsePrintRule |
|
39 |
(Syntax.mk_appl (Constant name2) (map Variable vnames), |
|
40 |
fold (fn arg => fn t => Syntax.mk_appl (Constant "Rep_CFun") [t, Variable arg]) |
|
41 |
vnames (Constant name1))] @ |
|
42 |
(case mx of |
|
43 |
InfixName _ => [extra_parse_rule] |
|
44 |
| InfixlName _ => [extra_parse_rule] |
|
45 |
| InfixrName _ => [extra_parse_rule] |
|
46 |
| _ => []) |
|
47 |
end; |
|
| 23152 | 48 |
|
49 |
||
50 |
(* transforming infix/mixfix declarations of constants with type ...->... |
|
51 |
a declaration of such a constant is transformed to a normal declaration with |
|
52 |
an internal name, the same type, and nofix. Additionally, a purely syntactic |
|
53 |
declaration with the original name, type ...=>..., and the original mixfix |
|
54 |
is generated and connected to the other declaration via some translation. |
|
55 |
*) |
|
|
30919
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
56 |
fun const_binding mx = Binding.name o Syntax.const_name mx o Binding.name_of; |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
57 |
|
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
58 |
fun fix_mixfix (syn , T, mx as Infix p ) = |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
59 |
(const_binding mx syn, T, InfixName (Binding.name_of syn, p)) |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
60 |
| fix_mixfix (syn , T, mx as Infixl p ) = |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
61 |
(const_binding mx syn, T, InfixlName (Binding.name_of syn, p)) |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
62 |
| fix_mixfix (syn , T, mx as Infixr p ) = |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
63 |
(const_binding mx syn, T, InfixrName (Binding.name_of syn, p)) |
| 23152 | 64 |
| fix_mixfix decl = decl; |
|
30919
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
65 |
|
| 33245 | 66 |
fun transform decl = |
67 |
let |
|
| 23152 | 68 |
val (c, T, mx) = fix_mixfix decl; |
|
30919
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
69 |
val c1 = Binding.name_of c; |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
70 |
val c2 = "_cont_" ^ c1; |
| 23152 | 71 |
val n = Syntax.mixfix_args mx |
|
30919
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
72 |
in ((c, T, NoSyn), |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
73 |
(Binding.name c2, change_arrow n T, mx), |
|
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
74 |
trans_rules c2 c1 n mx) end; |
| 23152 | 75 |
|
| 30910 | 76 |
fun cfun_arity (Type(n,[_,T])) = if n = @{type_name "->"} then 1+cfun_arity T else 0
|
| 23152 | 77 |
| cfun_arity _ = 0; |
78 |
||
79 |
fun is_contconst (_,_,NoSyn ) = false |
|
80 |
| is_contconst (_,_,Binder _) = false |
|
81 |
| is_contconst (c,T,mx ) = cfun_arity T >= Syntax.mixfix_args mx |
|
82 |
handle ERROR msg => cat_error msg ("in mixfix annotation for " ^
|
|
|
30919
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
83 |
quote (Syntax.const_name mx (Binding.name_of c))); |
| 23152 | 84 |
|
85 |
||
86 |
(* add_consts(_i) *) |
|
87 |
||
88 |
fun gen_add_consts prep_typ raw_decls thy = |
|
89 |
let |
|
90 |
val decls = map (upd_second (prep_typ thy)) raw_decls; |
|
91 |
val (contconst_decls, normal_decls) = List.partition is_contconst decls; |
|
92 |
val transformed_decls = map transform contconst_decls; |
|
93 |
in |
|
94 |
thy |
|
|
30919
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
95 |
|> Sign.add_consts_i |
| 30345 | 96 |
(normal_decls @ map first transformed_decls @ map second transformed_decls) |
97 |
|> Sign.add_trrules_i (maps third transformed_decls) |
|
| 23152 | 98 |
end; |
99 |
||
| 24707 | 100 |
val add_consts = gen_add_consts Syntax.read_typ_global; |
| 23152 | 101 |
val add_consts_i = gen_add_consts Sign.certify_typ; |
102 |
||
103 |
||
104 |
(* outer syntax *) |
|
105 |
||
106 |
local structure P = OuterParse and K = OuterKeyword in |
|
107 |
||
| 24867 | 108 |
val _ = |
| 23152 | 109 |
OuterSyntax.command "consts" "declare constants (HOLCF)" K.thy_decl |
|
30919
dcf8a7a66bd1
make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents:
30910
diff
changeset
|
110 |
(Scan.repeat1 P.const_binding >> (Toplevel.theory o add_consts)); |
| 23152 | 111 |
|
112 |
end; |
|
113 |
||
114 |
end; |