src/HOLCF/Tools/Domain/domain_syntax.ML
author huffman
Thu, 19 Nov 2009 10:45:34 -0800
changeset 33789 c3fbdff7aed0
parent 33004 715566791eb0
child 33798 46cbbcbd4e68
permissions -rw-r--r--
separate conjuncts of isodefl theorem
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32126
a5042f260440 obey captialized directory names convention
haftmann
parents: 31288
diff changeset
     1
(*  Title:      HOLCF/Tools/Domain/domain_syntax.ML
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     2
    Author:     David von Oheimb
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     3
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     4
Syntax generator for domain command.
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     5
*)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
     6
30919
dcf8a7a66bd1 make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents: 30912
diff changeset
     7
signature DOMAIN_SYNTAX =
dcf8a7a66bd1 make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents: 30912
diff changeset
     8
sig
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
     9
  val calc_syntax:
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    10
      typ ->
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    11
      (string * typ list) *
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    12
      (binding * (bool * binding option * typ) list * mixfix) list ->
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    13
      (binding * typ * mixfix) list * ast Syntax.trrule list
31226
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
    14
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    15
  val add_syntax:
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    16
      string ->
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    17
      ((string * typ list) *
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    18
       (binding * (bool * binding option * typ) list * mixfix) list) list ->
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    19
      theory -> theory
30919
dcf8a7a66bd1 make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents: 30912
diff changeset
    20
end;
dcf8a7a66bd1 make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents: 30912
diff changeset
    21
dcf8a7a66bd1 make domain package ML interface more consistent with datatype package; use binding instead of bstring
huffman
parents: 30912
diff changeset
    22
31023
d027411c9a38 use opaque ascription for all HOLCF code
huffman
parents: 30919
diff changeset
    23
structure Domain_Syntax :> DOMAIN_SYNTAX =
31226
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
    24
struct
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    25
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    26
open Domain_Library;
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    27
infixr 5 -->; infixr 6 ->>;
31226
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
    28
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
    29
fun calc_syntax
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    30
      (dtypeprod : typ)
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    31
      ((dname : string, typevars : typ list), 
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    32
       (cons': (binding * (bool * binding option * typ) list * mixfix) list))
31226
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
    33
    : (binding * typ * mixfix) list * ast Syntax.trrule list =
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
    34
    let
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    35
      (* ----- constants concerning the isomorphism ------------------------------- *)
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    36
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    37
      local
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    38
        fun opt_lazy (lazy,_,t) = if lazy then mk_uT t else t
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    39
        fun prod     (_,args,_) = case args of [] => oneT
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    40
                                             | _ => foldr1 mk_sprodT (map opt_lazy args);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    41
        fun freetvar s = let val tvar = mk_TFree s in
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    42
                           if tvar mem typevars then freetvar ("t"^s) else tvar end;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    43
        fun when_type (_,args,_) = List.foldr (op ->>) (freetvar "t") (map third args);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    44
      in
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    45
      val dtype  = Type(dname,typevars);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    46
      val dtype2 = foldr1 mk_ssumT (map prod cons');
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    47
      val dnam = Long_Name.base_name dname;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    48
      fun dbind s = Binding.name (dnam ^ s);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    49
      val const_rep  = (dbind "_rep" ,              dtype  ->> dtype2, NoSyn);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    50
      val const_abs  = (dbind "_abs" ,              dtype2 ->> dtype , NoSyn);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    51
      val const_when = (dbind "_when", List.foldr (op ->>) (dtype ->> freetvar "t") (map when_type cons'), NoSyn);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    52
      val const_copy = (dbind "_copy", dtypeprod ->> dtype  ->> dtype , NoSyn);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    53
      end;
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    54
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    55
      (* ----- constants concerning constructors, discriminators, and selectors --- *)
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    56
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    57
      local
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    58
        val escape = let
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    59
          fun esc (c::cs) = if c mem ["'","_","(",")","/"] then "'"::c::esc cs
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    60
                            else      c::esc cs
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    61
            |   esc []      = []
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    62
        in implode o esc o Symbol.explode end;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    63
        fun dis_name_ con     = Binding.name ("is_" ^ strip_esc (Binding.name_of con));
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    64
        fun mat_name_ con     = Binding.name ("match_" ^ strip_esc (Binding.name_of con));
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    65
        fun pat_name_ con     = Binding.name (strip_esc (Binding.name_of con) ^ "_pat");
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    66
        fun con (name,args,mx) = (name, List.foldr (op ->>) dtype (map third args), mx);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    67
        fun dis (con,args,mx) = (dis_name_ con, dtype->>trT,
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    68
                                 Mixfix(escape ("is_" ^ Binding.name_of con), [], Syntax.max_pri));
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    69
        (* strictly speaking, these constants have one argument,
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    70
         but the mixfix (without arguments) is introduced only
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    71
             to generate parse rules for non-alphanumeric names*)
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    72
        fun freetvar s n      = let val tvar = mk_TFree (s ^ string_of_int n) in
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    73
                                  if tvar mem typevars then freetvar ("t"^s) n else tvar end;
33004
715566791eb0 always qualify NJ's old List.foldl/foldr in Isabelle/ML;
wenzelm
parents: 32952
diff changeset
    74
        fun mk_matT (a,bs,c)  = a ->> List.foldr (op ->>) (mk_maybeT c) bs ->> mk_maybeT c;
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    75
        fun mat (con,args,mx) = (mat_name_ con,
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    76
                                 mk_matT(dtype, map third args, freetvar "t" 1),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    77
                                 Mixfix(escape ("match_" ^ Binding.name_of con), [], Syntax.max_pri));
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    78
        fun sel1 (_,sel,typ)  = Option.map (fn s => (s,dtype ->> typ,NoSyn)) sel;
32952
aeb1e44fbc19 replaced String.concat by implode;
wenzelm
parents: 32126
diff changeset
    79
        fun sel (con,args,mx) = map_filter sel1 args;
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    80
        fun mk_patT (a,b)     = a ->> mk_maybeT b;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    81
        fun pat_arg_typ n arg = mk_patT (third arg, freetvar "t" n);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    82
        fun pat (con,args,mx) = (pat_name_ con,
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    83
                                 (mapn pat_arg_typ 1 args)
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    84
                                   --->
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    85
                                   mk_patT (dtype, mk_ctupleT (map (freetvar "t") (1 upto length args))),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    86
                                 Mixfix(escape (Binding.name_of con ^ "_pat"), [], Syntax.max_pri));
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    87
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    88
      in
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    89
      val consts_con = map con cons';
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    90
      val consts_dis = map dis cons';
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    91
      val consts_mat = map mat cons';
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    92
      val consts_pat = map pat cons';
32952
aeb1e44fbc19 replaced String.concat by implode;
wenzelm
parents: 32126
diff changeset
    93
      val consts_sel = maps sel cons';
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    94
      end;
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    95
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    96
      (* ----- constants concerning induction ------------------------------------- *)
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
    97
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    98
      val const_take   = (dbind "_take"  , HOLogic.natT-->dtype->>dtype, NoSyn);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
    99
      val const_finite = (dbind "_finite", dtype-->HOLogic.boolT       , NoSyn);
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   100
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   101
      (* ----- case translation --------------------------------------------------- *)
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   102
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   103
      local open Syntax in
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   104
      local
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   105
        fun c_ast con mx = Constant (Syntax.const_name mx (Binding.name_of con));
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   106
        fun expvar n     = Variable ("e"^(string_of_int n));
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   107
        fun argvar n m _ = Variable ("a"^(string_of_int n)^"_"^
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   108
                                     (string_of_int m));
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   109
        fun argvars n args = mapn (argvar n) 1 args;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   110
        fun app s (l,r)  = mk_appl (Constant s) [l,r];
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   111
        val cabs = app "_cabs";
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   112
        val capp = app "Rep_CFun";
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   113
        fun con1 n (con,args,mx) = Library.foldl capp (c_ast con mx, argvars n args);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   114
        fun case1 n (con,args,mx) = app "_case1" (con1 n (con,args,mx), expvar n);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   115
        fun arg1 n (con,args,_) = List.foldr cabs (expvar n) (argvars n args);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   116
        fun when1 n m = if n = m then arg1 n else K (Constant "UU");
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   117
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   118
        fun app_var x = mk_appl (Constant "_variable") [x, Variable "rhs"];
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   119
        fun app_pat x = mk_appl (Constant "_pat") [x];
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   120
        fun args_list [] = Constant "_noargs"
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   121
          |   args_list xs = foldr1 (app "_args") xs;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   122
      in
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   123
      val case_trans =
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   124
          ParsePrintRule
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   125
            (app "_case_syntax" (Variable "x", foldr1 (app "_case2") (mapn case1 1 cons')),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   126
             capp (Library.foldl capp (Constant (dnam^"_when"), mapn arg1 1 cons'), Variable "x"));
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   127
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   128
      fun one_abscon_trans n (con,mx,args) =
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   129
          ParsePrintRule
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   130
            (cabs (con1 n (con,mx,args), expvar n),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   131
             Library.foldl capp (Constant (dnam^"_when"), mapn (when1 n) 1 cons'));
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   132
      val abscon_trans = mapn one_abscon_trans 1 cons';
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   133
          
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   134
      fun one_case_trans (con,args,mx) =
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   135
          let
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   136
            val cname = c_ast con mx;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   137
            val pname = Constant (strip_esc (Binding.name_of con) ^ "_pat");
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   138
            val ns = 1 upto length args;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   139
            val xs = map (fn n => Variable ("x"^(string_of_int n))) ns;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   140
            val ps = map (fn n => Variable ("p"^(string_of_int n))) ns;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   141
            val vs = map (fn n => Variable ("v"^(string_of_int n))) ns;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   142
          in
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   143
            [ParseRule (app_pat (Library.foldl capp (cname, xs)),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   144
                        mk_appl pname (map app_pat xs)),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   145
             ParseRule (app_var (Library.foldl capp (cname, xs)),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   146
                        app_var (args_list xs)),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   147
             PrintRule (Library.foldl capp (cname, ListPair.map (app "_match") (ps,vs)),
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   148
                        app "_match" (mk_appl pname ps, args_list vs))]
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   149
          end;
32952
aeb1e44fbc19 replaced String.concat by implode;
wenzelm
parents: 32126
diff changeset
   150
      val Case_trans = maps one_case_trans cons';
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   151
      end;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   152
      end;
31226
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   153
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   154
    in ([const_rep, const_abs, const_when, const_copy] @ 
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   155
        consts_con @ consts_dis @ consts_mat @ consts_pat @ consts_sel @
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   156
        [const_take, const_finite],
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   157
        (case_trans::(abscon_trans @ Case_trans)))
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   158
    end; (* let *)
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   159
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   160
(* ----- putting all the syntax stuff together ------------------------------ *)
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   161
31226
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   162
fun add_syntax
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   163
      (comp_dnam : string)
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   164
      (eqs' : ((string * typ list) *
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   165
               (binding * (bool * binding option * typ) list * mixfix) list) list)
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   166
      (thy'' : theory) =
31226
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   167
    let
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   168
      val dtypes  = map (Type o fst) eqs';
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   169
      val boolT   = HOLogic.boolT;
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   170
      val funprod = foldr1 HOLogic.mk_prodT (map (fn tp => tp ->> tp          ) dtypes);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   171
      val relprod = foldr1 HOLogic.mk_prodT (map (fn tp => tp --> tp --> boolT) dtypes);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   172
      val const_copy = (Binding.name (comp_dnam^"_copy"), funprod ->> funprod, NoSyn);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   173
      val const_bisim = (Binding.name (comp_dnam^"_bisim"), relprod --> boolT, NoSyn);
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   174
      val ctt : ((binding * typ * mixfix) list * ast Syntax.trrule list) list = map (calc_syntax funprod) eqs';
32952
aeb1e44fbc19 replaced String.concat by implode;
wenzelm
parents: 32126
diff changeset
   175
    in thy'' |> ContConsts.add_consts_i (maps fst ctt @ 
31288
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   176
                                         (if length eqs'>1 then [const_copy] else[])@
67dff9c5b2bd remove hard tabs, fix indentation
huffman
parents: 31226
diff changeset
   177
                                         [const_bisim])
32952
aeb1e44fbc19 replaced String.concat by implode;
wenzelm
parents: 32126
diff changeset
   178
             |> Sign.add_trrules_i (maps snd ctt)
31226
1dffa9a056b5 indentation; export Domain_Syntax.calc_syntax
huffman
parents: 31023
diff changeset
   179
    end; (* let *)
23152
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   180
9497234a2743 moved HOLCF tools to canonical place;
wenzelm
parents:
diff changeset
   181
end; (* struct *)