src/HOLCF/cont_consts.ML
author huffman
Sat, 04 Jun 2005 00:22:08 +0200
changeset 16221 879400e029bf
parent 15570 8d8c70b41bab
child 16621 78b32293a8b1
permissions -rw-r--r--
New theory with lemmas for the fixrec package
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
     3
    Author:     Tobias Mayr, David von Oheimb, and Markus Wenzel
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
     4
14682
a5072752114c HOLCF: discontinued special version of 'constdefs';
wenzelm
parents: 12876
diff changeset
     5
HOLCF version of consts: handle continuous function types in mixfix
a5072752114c HOLCF: discontinued special version of 'constdefs';
wenzelm
parents: 12876
diff changeset
     6
syntax.
4129
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
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
     9
signature CONT_CONSTS =
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    10
sig
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    11
  val add_consts: (bstring * string * mixfix) list -> theory -> theory
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    12
  val add_consts_i: (bstring * typ * mixfix) list -> theory -> theory
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    13
end;
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    14
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    15
structure ContConsts: CONT_CONSTS =
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    16
struct
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    17
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    18
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    19
(* misc utils *)
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    20
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    21
open HOLCFLogic;
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    22
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    23
fun first  (x,_,_) = x;
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    24
fun second (_,x,_) = x;
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    25
fun third  (_,_,x) = x;
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    26
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
    27
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
    28
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
    29
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    30
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
    31
  let fun filt []      = ([],[])
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    32
        | filt (x::xs) = let val (ys,zs) = filt xs in
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    33
                         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
    34
  in filt end;
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    35
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    36
fun change_arrow 0 T               = T
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    37
|   change_arrow n (Type(_,[S,T])) = Type ("fun",[S,change_arrow (n-1) T])
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    38
|   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
    39
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    40
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
    41
  fun argnames _ 0 = []
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    42
  |   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
    43
  val vnames = argnames (ord "A") n;
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    44
  val extra_parse_rule = Syntax.ParseRule (Constant name2, Constant name1);
5700
491944c2fb12 fixed Syntax module;
wenzelm
parents: 5291
diff changeset
    45
  in [Syntax.ParsePrintRule (Syntax.mk_appl (Constant name2) (map Variable vnames),
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 14981
diff changeset
    46
                          Library.foldl (fn (t,arg) => (Syntax.mk_appl (Constant "Rep_CFun")
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    47
                                                [t,Variable arg]))
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    48
                          (Constant name1,vnames))]
11651
201b3f76c7b7 support non-oriented infix;
wenzelm
parents: 5700
diff changeset
    49
     @(case mx of InfixName _ => [extra_parse_rule]
201b3f76c7b7 support non-oriented infix;
wenzelm
parents: 5700
diff changeset
    50
                | InfixlName _ => [extra_parse_rule]
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    51
                | InfixrName _ => [extra_parse_rule] | _ => []) end;
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    52
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
(* transforming infix/mixfix declarations of constants with type ...->...
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    55
   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
    56
   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
    57
   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
    58
   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
    59
*)
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    60
fun fix_mixfix (syn                     , T, mx as Infix           p ) =
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    61
               (Syntax.const_name syn mx, T,       InfixName (syn, p))
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    62
  | fix_mixfix (syn                     , T, mx as Infixl           p ) =
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    63
               (Syntax.const_name syn mx, T,       InfixlName (syn, p))
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    64
  | fix_mixfix (syn                     , T, mx as Infixr           p ) =
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    65
               (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
    66
  | fix_mixfix decl = decl;
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    67
fun transform decl = let
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    68
        val (c, T, mx) = fix_mixfix decl;
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    69
        val c2 = "_cont_" ^ c;
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    70
        val n  = Syntax.mixfix_args mx
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    71
    in     ((c ,               T,NoSyn),
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    72
            (c2,change_arrow n T,mx   ),
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    73
            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
    74
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    75
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
    76
|   cfun_arity _               = 0;
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    77
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    78
fun is_contconst (_,_,NoSyn   ) = false
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    79
|   is_contconst (_,_,Binder _) = false
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    80
|   is_contconst (c,T,mx      ) = cfun_arity T >= Syntax.mixfix_args mx
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    81
                         handle ERROR => error ("in mixfix annotation for " ^
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    82
                                               quote (Syntax.const_name c mx));
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    83
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    84
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    85
(* add_consts(_i) *)
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
    86
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    87
fun gen_add_consts prep_typ raw_decls thy =
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    88
  let
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    89
    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
    90
    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
    91
    val transformed_decls = map transform contconst_decls;
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    92
  in
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    93
    thy
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    94
    |> Theory.add_consts_i normal_decls
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    95
    |> Theory.add_consts_i (map first transformed_decls)
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    96
    |> Theory.add_syntax_i (map second transformed_decls)
15570
8d8c70b41bab Move towards standard functions.
skalberg
parents: 14981
diff changeset
    97
    |> Theory.add_trrules_i (List.concat (map third transformed_decls))
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    98
  end;
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
    99
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   100
val add_consts = gen_add_consts Thm.read_ctyp;
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   101
val add_consts_i = gen_add_consts Thm.ctyp_of;
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   102
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   103
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   104
(* outer syntax *)
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   105
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   106
local structure P = OuterParse and K = OuterSyntax.Keyword in
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   107
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   108
val constsP =
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   109
  OuterSyntax.command "consts" "declare constants (HOLCF)" K.thy_decl
12876
a70df1e5bf10 got rid of explicit marginal comments (now stripped earlier from input);
wenzelm
parents: 12625
diff changeset
   110
    (Scan.repeat1 P.const >> (Toplevel.theory o add_consts));
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   111
14682
a5072752114c HOLCF: discontinued special version of 'constdefs';
wenzelm
parents: 12876
diff changeset
   112
val _ = OuterSyntax.add_parsers [constsP];
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   113
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
   114
end;
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
   115
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
   116
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   117
(* old-style theory syntax *)
4129
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
   118
2fd816aa6206 HOLCFLogic.ML, contconsts.ML renamed to holcf_logic.ML, cont_consts.ML;
wenzelm
parents:
diff changeset
   119
val _ = ThySyn.add_syntax []
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   120
  [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
   121
12625
425ca8613a1d Isar version;
wenzelm
parents: 12030
diff changeset
   122
end;