src/HOLCF/Tools/cont_consts.ML
author blanchet
Fri, 18 Dec 2009 12:00:44 +0100
changeset 34127 85257fa296f6
parent 33245 65232054ffd0
child 35129 ed24ba6f69aa
permissions -rw-r--r--
merged
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     1
(*  Title:      HOLCF/Tools/cont_consts.ML
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     2
    Author:     Tobias Mayr, David von Oheimb, and Markus Wenzel
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     3
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     4
HOLCF version of consts: handle continuous function types in mixfix
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     5
syntax.
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     6
*)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     7
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     8
signature CONT_CONSTS =
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     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
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    12
end;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    13
33245
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    14
structure ContConsts: CONT_CONSTS =
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    15
struct
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    16
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    17
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    18
(* misc utils *)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    19
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    20
fun first  (x,_,_) = x;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    21
fun second (_,x,_) = x;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    22
fun third  (_,_,x) = x;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    23
fun upd_first  f (x,y,z) = (f x,   y,   z);
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    24
fun upd_second f (x,y,z) = (  x, f y,   z);
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    25
fun upd_third  f (x,y,z) = (  x,   y, f z);
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    26
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    27
fun change_arrow 0 T               = T
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    28
|   change_arrow n (Type(_,[S,T])) = Type ("fun",[S,change_arrow (n-1) T])
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    29
|   change_arrow _ _               = sys_error "cont_consts: change_arrow";
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    30
33245
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    31
fun trans_rules name2 name1 n mx =
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    32
  let
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    33
    fun argnames _ 0 = []
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    34
    |   argnames c n = chr c::argnames (c+1) (n-1);
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    35
    val vnames = argnames (ord "A") n;
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    36
    val extra_parse_rule = Syntax.ParseRule (Constant name2, Constant name1);
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    37
  in
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    38
    [Syntax.ParsePrintRule
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    39
      (Syntax.mk_appl (Constant name2) (map Variable vnames),
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    40
        fold (fn arg => fn t => Syntax.mk_appl (Constant "Rep_CFun") [t, Variable arg])
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    41
          vnames (Constant name1))] @
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    42
    (case mx of
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    43
      InfixName _ => [extra_parse_rule]
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    44
    | InfixlName _ => [extra_parse_rule]
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    45
    | InfixrName _ => [extra_parse_rule]
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    46
    | _ => [])
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    47
  end;
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    48
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    49
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    50
(* transforming infix/mixfix declarations of constants with type ...->...
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    51
   a declaration of such a constant is transformed to a normal declaration with
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    52
   an internal name, the same type, and nofix. Additionally, a purely syntactic
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    53
   declaration with the original name, type ...=>..., and the original mixfix
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    54
   is generated and connected to the other declaration via some translation.
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    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
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    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
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    66
fun transform decl =
65232054ffd0 eliminated some old folds;
wenzelm
parents: 31023
diff changeset
    67
    let
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    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
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    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
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    75
30910
a7cc0ef93269 set up domain package in Domain.thy
huffman
parents: 30345
diff changeset
    76
fun cfun_arity (Type(n,[_,T])) = if n = @{type_name "->"} then 1+cfun_arity T else 0
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    77
|   cfun_arity _               = 0;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    78
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    79
fun is_contconst (_,_,NoSyn   ) = false
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    80
|   is_contconst (_,_,Binder _) = false
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    81
|   is_contconst (c,T,mx      ) = cfun_arity T >= Syntax.mixfix_args mx
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    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
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    84
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    85
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    86
(* add_consts(_i) *)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    87
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    88
fun gen_add_consts prep_typ raw_decls thy =
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    89
  let
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    90
    val decls = map (upd_second (prep_typ thy)) raw_decls;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    91
    val (contconst_decls, normal_decls) = List.partition is_contconst decls;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    92
    val transformed_decls = map transform contconst_decls;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    93
  in
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    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
76fd85bbf139 more uniform handling of binding in packages;
wenzelm
parents: 24867
diff changeset
    96
      (normal_decls @ map first transformed_decls @ map second transformed_decls)
76fd85bbf139 more uniform handling of binding in packages;
wenzelm
parents: 24867
diff changeset
    97
    |> Sign.add_trrules_i (maps third transformed_decls)
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    98
  end;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    99
24707
dfeb98f84e93 Syntax.parse/check/read;
wenzelm
parents: 23152
diff changeset
   100
val add_consts = gen_add_consts Syntax.read_typ_global;
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   101
val add_consts_i = gen_add_consts Sign.certify_typ;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   102
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   103
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   104
(* outer syntax *)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   105
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   106
local structure P = OuterParse and K = OuterKeyword in
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   107
24867
e5b55d7be9bb simplified interfaces for outer syntax;
wenzelm
parents: 24707
diff changeset
   108
val _ =
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   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
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   111
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   112
end;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   113
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   114
end;