src/HOLCF/ax_ops/thy_ops.ML
author wenzelm
Tue, 28 Oct 1997 17:58:35 +0100
changeset 4029 22f2d1b17f97
parent 4008 2444085532c6
permissions -rw-r--r--
PureThy.add_store_axioms_i;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     1
(*  TTITLEF/thy_ops.ML
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     2
    ID:         $Id$
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     3
    Author:     Tobias Mayr
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     4
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     5
Additional theory file section for HOLCF: ops 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     6
3621
d3e248853428 tuned comments;
wenzelm
parents: 3534
diff changeset
     7
TODO:
d3e248853428 tuned comments;
wenzelm
parents: 3534
diff changeset
     8
  maybe AST-representation with "op name" instead of _I_...
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     9
*)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    10
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    11
signature THY_OPS =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    12
sig
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
    13
 (* continuous mixfixes (extension of datatype Mixfix.mixfix) *)
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    14
 datatype cmixfix =
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
    15
    Mixfix of Mixfix.mixfix |
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    16
    CInfixl of int | 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    17
    CInfixr of int |
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    18
    CMixfix of string * int list *int;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    19
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    20
 exception CINFIX of cmixfix;
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
    21
 val cmixfix_to_mixfix : cmixfix ->  Mixfix.mixfix;
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    22
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    23
 (* theory extenders : *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    24
 val add_ops          : {curried: bool, total: bool, strict: bool} ->
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    25
                        (string * string * cmixfix) list -> theory -> theory;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    26
 val add_ops_i        : {curried: bool, total: bool, strict: bool} ->
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    27
                        (string * typ * cmixfix) list -> theory -> theory;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    28
 val ops_keywords  : string list;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    29
 val ops_sections  : (string * (ThyParse.token list -> 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    30
                        (string * string) * ThyParse.token list)) list;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    31
 val opt_cmixfix: ThyParse.token list -> (string * ThyParse.token list);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    32
 val const_name    : string -> cmixfix -> string;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    33
end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    34
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    35
structure ThyOps : THY_OPS =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    36
struct
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    37
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    38
open HOLCFlogic;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    39
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    40
(** library ******************************************************)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    41
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    42
(* abbreviations *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    43
val internal = fst; (* cinfix-ops will have diffrent internal/external names *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    44
val external = snd;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    45
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    46
fun apsnd_of_three f = fn (a,b,c) => (a,f b,c);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    47
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    48
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    49
(******** ops ********************)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    50
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    51
(* the extended copy of mixfix *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    52
datatype cmixfix =
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
    53
    Mixfix of Mixfix.mixfix |
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    54
    CInfixl of int |
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    55
    CInfixr of int |
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    56
    CMixfix of string * int list *int;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    57
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    58
exception CINFIX of cmixfix;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    59
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    60
fun cmixfix_to_mixfix (Mixfix x) = x
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    61
  | cmixfix_to_mixfix x = raise CINFIX x;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    62
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    63
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    64
(** theory extender : add_ops *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    65
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    66
(* generating the declarations of the new constants. *************
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    67
   cinfix names x are internally non infix (renamed by mk_internal_name) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    68
   and externally non continous infix function names (changed by op_to_fun).
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    69
   Thus the cinfix declaration is splitted in an 'oldstyle' decl,
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    70
   which is NoSyn (non infix) and is added by add_consts_i,
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    71
   and an syn(tactic) decl, which is an infix function (not operation)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    72
   added by add_syntax_i, so that it can appear in input strings, but 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    73
   not in terms.
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    74
   The interface between internal and external names is realized by 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    75
   transrules A x B <=> _x ' A ' B (generated by xrules_of) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    76
   The boolean argument 'curried' distinguishes between curried and
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    77
   tupeled syntax of operation application *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    78
   
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    79
local
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    80
 fun strip ("'" :: c :: cs) = c :: strip cs
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    81
   | strip ["'"] = []
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    82
   | strip (c :: cs) = c :: strip cs
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    83
   | strip [] = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    84
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    85
 val strip_esc = implode o strip o explode;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    86
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    87
 fun infix_name c = "op " ^ strip_esc c;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    88
in
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    89
  val mk_internal_name = infix_name;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    90
(*
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    91
(* changing e.g. 'ab' to '_I_97_98'. 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    92
   Called by oldstyle, xrules_of, strictness_axms and totality_axms. *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    93
  fun mk_internal_name name =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    94
  let fun alphanum (s::ss) = "_"^(string_of_int (ord s))^(alphanum ss)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    95
        | alphanum [] = "";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    96
  in 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    97
      "_I"^(alphanum o explode) name
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    98
  end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    99
*)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   100
 (* extension of Pure/Syntax/mixfix.ML: SynExt.const_name *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   101
 fun const_name c (CInfixl _) = mk_internal_name c
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   102
   | const_name c (CInfixr _) = mk_internal_name c
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   103
   | const_name c (CMixfix _) = c
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   104
   | const_name c (Mixfix  x) = Syntax.const_name c x;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   105
end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   106
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   107
(* Changing a->b->c res. a*b->c to a=>b=>c. Called by syn_decls. *) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   108
(*####*)
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   109
fun op_to_fun true  sign (ty as Type(name ,[larg,t]))= if name = cfun_arrow
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   110
                  then Type("fun",[larg,op_to_fun true sign t]) else ty
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   111
  | op_to_fun false sign (ty as Type(name,[args,res])) = let
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1284
diff changeset
   112
                fun otf (Type("*",[larg,rargs])) = Type("fun",[larg,otf rargs])
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1284
diff changeset
   113
                |   otf t                        = Type("fun",[t,res]);
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   114
                in if name = cfun_arrow then otf args else ty end
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   115
  | op_to_fun _     sign t = t;
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   116
(*####*)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   117
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   118
(* oldstyle is called by add_ext_axioms(_i) *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   119
    (* the first part is just copying the homomorphic part of the structures *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   120
fun oldstyle ((name,typ,Mixfix(x))::tl) = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   121
         (name,typ,x)::(oldstyle tl)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   122
  | oldstyle ((name,typ,CInfixl(i))::tl) = 
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
   123
         (mk_internal_name name,typ,Mixfix.NoSyn)::
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   124
         (oldstyle tl)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   125
  | oldstyle ((name,typ,CInfixr(i))::tl) =
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
   126
         (mk_internal_name name,typ,Mixfix.NoSyn)::
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   127
         (oldstyle tl) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   128
  | oldstyle ((name,typ,CMixfix(x))::tl) =
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
   129
         (name,typ,Mixfix.NoSyn)::
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   130
         (oldstyle tl) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   131
  | oldstyle [] = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   132
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   133
(* generating the external purely syntactical infix functions. 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   134
   Called by add_ext_axioms(_i) *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   135
fun syn_decls curried sign ((name,typ,CInfixl(i))::tl) =
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
   136
     (name,op_to_fun curried sign typ,Mixfix.Infixl(i))::
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   137
      (syn_decls curried sign tl)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   138
  | syn_decls curried sign ((name,typ,CInfixr(i))::tl) =
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
   139
     (name,op_to_fun curried sign typ,Mixfix.Infixr(i))::
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   140
      (syn_decls curried sign tl)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   141
  | syn_decls curried sign ((name,typ,CMixfix(x))::tl) =
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
   142
     (name,op_to_fun curried sign typ,Mixfix.Mixfix(x))::
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   143
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   144
      (syn_decls curried sign tl)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   145
  | syn_decls curried sign (_::tl) = syn_decls curried sign tl
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   146
  | syn_decls _ _ [] = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   147
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   148
fun translate name vars rhs = 
3534
c245c88194ff renamed |-> <-| <-> to Parse/PrintRule;
wenzelm
parents: 2238
diff changeset
   149
    Syntax.ParsePrintRule ((Ast.mk_appl (Constant (mk_internal_name name)) 
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   150
		 (map Variable vars)), 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   151
		rhs); 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   152
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   153
(* generating the translation rules. Called by add_ext_axioms(_i) *)
1512
ce37c64244c0 Elimination of fully-functorial style.
paulson
parents: 1461
diff changeset
   154
local open Ast in 
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   155
fun xrules_of true ((name,typ,CInfixl(i))::tail) = 
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   156
    translate name ["A","B"]
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   157
     (mk_appl (Constant "@fapp") 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   158
      [(mk_appl (Constant "@fapp") 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   159
	[Constant (mk_internal_name name),Variable "A"]),Variable "B"])
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   160
    ::xrules_of true tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   161
  | xrules_of true ((name,typ,CInfixr(i))::tail) = 
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   162
    translate name ["A","B"]
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   163
     (mk_appl (Constant "@fapp") 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   164
      [(mk_appl (Constant "@fapp") 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   165
	[Constant (mk_internal_name name),Variable "A"]),Variable "B"])
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   166
    ::xrules_of true tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   167
(*####*)
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   168
  | xrules_of true ((name,typ,CMixfix(_))::tail) = 
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   169
        let fun argnames n (Type(name ,[_,t]))= if name = cfun_arrow then
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   170
					chr n :: argnames (n+1) t else []
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   171
            |   argnames _ _ = [];
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   172
            val names = argnames (ord"A") typ;
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   173
        in if names = [] then [] else 
3534
c245c88194ff renamed |-> <-| <-> to Parse/PrintRule;
wenzelm
parents: 2238
diff changeset
   174
	    [Syntax.ParsePrintRule (mk_appl (Constant name) (map Variable names),
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   175
			 foldl (fn (t,arg) => 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   176
				(mk_appl (Constant "@fapp") [t,Variable arg]))
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   177
			 (Constant name,names))] 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   178
        end
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   179
    @xrules_of true tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   180
(*####*)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   181
  | xrules_of false ((name,typ,CInfixl(i))::tail) = 
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   182
    translate name ["A","B"]
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   183
    (mk_appl (Constant "@fapp") [ Constant(mk_internal_name name),
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   184
     (mk_appl (Constant "@ctuple") [Variable "A",Variable "B"])])
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   185
    ::xrules_of false tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   186
  | xrules_of false ((name,typ,CInfixr(i))::tail) = 
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   187
    translate name ["A","B"]
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   188
    (mk_appl (Constant "@fapp") [ Constant(mk_internal_name name),
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   189
     (mk_appl (Constant "@ctuple") [Variable "A",Variable "B"])])
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   190
    ::xrules_of false tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   191
(*####*)
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   192
  | xrules_of false ((name,typ,CMixfix(_))::tail) = 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   193
        let fun foldr' f l =
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   194
	      let fun itr []  = raise LIST "foldr'"
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   195
		    | itr [a] = a
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   196
		    | itr (a::l) = f(a, itr l)
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   197
	      in  itr l end;
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   198
	    fun argnames n (Type("*" ,[_,t]))= chr n :: argnames (n+1) t
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   199
	    |   argnames n _ = [chr n];
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   200
	    val vars = map Variable (case typ of (Type(name ,[t,_])) =>
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   201
			if name = cfun_arrow then argnames (ord"A") t else []
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   202
						 | _ => []);
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   203
        in if vars = [] then [] else 
3534
c245c88194ff renamed |-> <-| <-> to Parse/PrintRule;
wenzelm
parents: 2238
diff changeset
   204
	    [Syntax.ParsePrintRule 
1810
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   205
	     (mk_appl (Constant name) vars,
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   206
	      mk_appl (Constant "@fapp")
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   207
	      [Constant name, 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   208
	       case vars of [v] => v
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   209
	                 | args => mk_appl (Constant "@ctuple")
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   210
			             [hd args,
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   211
				      foldr' (fn (t,arg) => 
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   212
					      mk_appl (Constant "_args")
0eef167ebe1b Translation infixes <->, etc., no longer available at top-level
paulson
parents: 1512
diff changeset
   213
					      [t,arg]) (tl args)]])]
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1284
diff changeset
   214
        end
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   215
    @xrules_of false tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   216
(*####*)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   217
  | xrules_of c ((name,typ,Mixfix(_))::tail) = xrules_of c tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   218
  | xrules_of _ [] = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   219
end; 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   220
(**** producing the new axioms ****************)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   221
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   222
datatype arguments = Curried_args of ((typ*typ) list) |
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   223
                     Tupeled_args of (typ list);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   224
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   225
fun num_of_args (Curried_args l) = length l
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   226
  | num_of_args (Tupeled_args l) = length l;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   227
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   228
fun types_of (Curried_args l) = map fst l
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   229
  | types_of (Tupeled_args l) = l;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   230
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   231
fun mk_mkNotEqUU_vars (typ::tl) cnt = mkNotEqUU (Free("x"^(string_of_int cnt),typ))::
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   232
                            (mk_mkNotEqUU_vars tl (cnt+1))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   233
  | mk_mkNotEqUU_vars [] _ = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   234
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   235
local
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   236
 (* T1*...*Tn goes to [T1,...,Tn] *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   237
 fun args_of_tupel (Type("*",[left,right])) = left::(args_of_tupel right)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   238
   | args_of_tupel T = [T];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   239
 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   240
 (* A1->...->An->R goes to [(A1,B1),...,(An,Bn)] where Bi=Ai->...->An->R 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   241
    Bi is the Type of the function that is applied to an Ai type argument *)
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   242
 fun args_of_curried (typ as (Type(name,[S,T]))) = if name = cfun_arrow then
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   243
      (S,typ) :: args_of_curried T else []
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   244
   | args_of_curried _ = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   245
in
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   246
 fun args_of_op true typ = Curried_args(rev(args_of_curried typ))
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   247
   | args_of_op false (typ as (Type(name,[S,T]))) = if name = cfun_arrow then
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   248
      Tupeled_args(args_of_tupel S) else Tupeled_args([])
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   249
   | args_of_op false _ = Tupeled_args([]);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   250
end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   251
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   252
(* generates for the type t the type of the fapp constant 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   253
   that will be applied to t *)
4008
2444085532c6 adapted domain and ax_ops package for name spaces
oheimb
parents: 3771
diff changeset
   254
fun mk_fapp_typ (typ as Type(_(*"->"*),argl)) = Type("fun",[typ,Type("fun",argl)]) 
1284
e5b95ee2616b removed incompatibility with sml
regensbu
parents: 1274
diff changeset
   255
  | mk_fapp_typ t = (
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   256
                    error("Internal error:mk_fapp_typ: wrong argument\n"));
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   257
                    
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   258
fun mk_arg_tupel_UU uu_pos [typ] n = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   259
     if n<>uu_pos then Free("x"^(string_of_int n),typ)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   260
                  else Const("UU",typ)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   261
  | mk_arg_tupel_UU uu_pos (typ::tail) n = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   262
     mkCPair
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   263
     (if n<>uu_pos then Free("x"^(string_of_int n),typ) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   264
                   else Const("UU",typ))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   265
     (mk_arg_tupel_UU uu_pos tail (n+1))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   266
  | mk_arg_tupel_UU _ [] _ = error("Internal error:mk_arg_tupel: empty list");
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   267
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   268
fun mk_app_UU cnt uu_pos fname (Curried_args((typ,ftyp)::tl)) = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   269
     Const("fapp",mk_fapp_typ ftyp) $
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   270
     (mk_app_UU (cnt-1) uu_pos fname (Curried_args tl))$ 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   271
     (if cnt = uu_pos then Const("UU",typ)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   272
                      else Free("x"^(string_of_int cnt),typ))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   273
  | mk_app_UU _ _ (name,typ) (Curried_args []) = Const(name,typ)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   274
  | mk_app_UU cnt uu_pos (name,typ) (Tupeled_args []) = Const(name,typ)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   275
  | mk_app_UU cnt uu_pos (name,typ) (Tupeled_args list) = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   276
     Const("fapp",mk_fapp_typ typ) $ Const(name,typ) $ 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   277
     mk_arg_tupel_UU uu_pos list 0;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   278
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   279
fun mk_app cnt fname args = mk_app_UU cnt (~1) fname args;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   280
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   281
(* producing the strictness axioms *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   282
local
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   283
 fun s_axm_of curried name typ args num cnt = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   284
       if cnt = num then 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   285
        error("Internal error: s_axm_of: arg is no operation "^(external name))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   286
       else 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   287
       let val app = mk_app_UU (num-1) cnt (internal name,typ) args
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   288
           val equation = HOLogic.mk_eq(app,Const("UU",fastype_of app)) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   289
       in 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   290
        if cnt = num-1 then equation
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   291
        else And $ equation $
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   292
             s_axm_of curried name typ args num (cnt+1)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   293
       end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   294
in
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   295
 fun strictness_axms curried ((rawname,typ,cmixfix)::tail) =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   296
  let val name = case cmixfix of
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   297
                      (CInfixl _) => (mk_internal_name rawname,rawname)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   298
                    | (CInfixr _) => (mk_internal_name rawname,rawname)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   299
                    |  _          => (rawname,rawname)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   300
      val args = args_of_op curried typ;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   301
      val num  = num_of_args args;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   302
  in
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   303
      ((external name)^"_strict",
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   304
       if num <> 0
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   305
       then HOLogic.mk_Trueprop(s_axm_of curried name typ args num 0) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   306
       else HOLogic.mk_Trueprop(True)) :: strictness_axms curried tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   307
  end
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   308
   | strictness_axms _ [] = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   309
end; (*local*)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   310
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   311
(* producing the totality axioms *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   312
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   313
fun totality_axms curried ((rawname,typ,cmixfix)::tail) =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   314
 let val name  = case cmixfix of
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   315
                     (CInfixl _) => (mk_internal_name rawname,rawname)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   316
                   | (CInfixr _) => (mk_internal_name rawname,rawname)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   317
                   | _           => (rawname,rawname)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   318
     val args  = args_of_op curried typ;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   319
     val prems = mk_mkNotEqUU_vars (if curried then rev (types_of args)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   320
                                           else (types_of args)) 0;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   321
     val term  = mk_app (num_of_args args - 1) (internal name,typ) args;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   322
 in
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   323
     ((external name)^"_total", 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   324
      if num_of_args args <> 0 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   325
      then Logic.list_implies (prems,mkNotEqUU term)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   326
      else HOLogic.mk_Trueprop(True)) :: totality_axms curried tail
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   327
 end
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   328
  | totality_axms _ [] = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   329
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   330
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   331
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   332
(* the theory extenders ****************************)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   333
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   334
fun add_ops {curried,strict,total} raw_decls thy =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   335
  let val {sign,...} = rep_theory thy;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   336
      val decls = map (apsnd_of_three (typ_of o read_ctyp sign)) raw_decls;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   337
      val oldstyledecls = oldstyle decls;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   338
      val syndecls = syn_decls curried sign decls;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   339
      val xrules = xrules_of curried decls;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   340
      val s_axms = (if strict then strictness_axms curried decls else []);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   341
      val t_axms = (if total  then totality_axms   curried decls else []);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   342
  in 
4029
22f2d1b17f97 PureThy.add_store_axioms_i;
wenzelm
parents: 4008
diff changeset
   343
  Theory.add_trrules_i xrules (PureThy.add_store_axioms_i (s_axms @ t_axms) 
3771
ede66fb99880 fully qualified names: Theory.add_XXX;
wenzelm
parents: 3621
diff changeset
   344
                     (Theory.add_syntax_i syndecls (Theory.add_consts_i oldstyledecls thy)))
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   345
  end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   346
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   347
fun add_ops_i {curried,strict,total} decls thy =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   348
  let val {sign,...} = rep_theory thy;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   349
      val oldstyledecls = oldstyle decls;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   350
      val syndecls = syn_decls curried sign decls;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   351
      val xrules = xrules_of curried decls;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   352
      val s_axms = (if strict then strictness_axms curried decls else []);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   353
      val t_axms = (if total  then totality_axms   curried decls else []);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   354
  in 
4029
22f2d1b17f97 PureThy.add_store_axioms_i;
wenzelm
parents: 4008
diff changeset
   355
  Theory.add_trrules_i xrules (PureThy.add_store_axioms_i (s_axms @ t_axms) 
3771
ede66fb99880 fully qualified names: Theory.add_XXX;
wenzelm
parents: 3621
diff changeset
   356
                     (Theory.add_syntax_i syndecls (Theory.add_consts_i oldstyledecls thy)))
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   357
  end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   358
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   359
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   360
(* parser: ops_decls ********************************)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   361
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   362
local open ThyParse 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   363
in
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   364
(* the following is an adapted version of const_decls from thy_parse.ML *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   365
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   366
val names1 = list1 name;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   367
2238
c72a23bbe762 Eta-expanded some declarations that are illegal under value polymorphism
paulson
parents: 1810
diff changeset
   368
fun split_decls decls = flat (map (fn (xs, y) => map (rpair y) xs) decls);
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   369
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   370
fun mk_triple2 (x, (y, z)) = mk_triple (x, y, z);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   371
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   372
fun mk_strict_vals [] = ""
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   373
  | mk_strict_vals [name] =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   374
      "get_axiom thy \""^name^"_strict\"\n"
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   375
  | mk_strict_vals (name::tail) =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   376
      "get_axiom thy \""^name^"_strict\",\n"^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   377
      mk_strict_vals tail;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   378
  
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   379
fun mk_total_vals [] = ""
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   380
  | mk_total_vals [name] = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   381
      "get_axiom thy \""^name^"_total\"\n"
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   382
  | mk_total_vals (name::tail) =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   383
      "get_axiom thy \""^name^"_total\",\n"^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   384
      mk_total_vals tail;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   385
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   386
fun mk_ops_decls (((curried,strict),total),list) =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   387
          (* call for the theory extender *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   388
           ("|> ThyOps.add_ops \n"^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   389
            "{ curried = "^curried^" , strict = "^strict^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   390
               " , total = "^total^" } \n"^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   391
            (mk_big_list o map mk_triple2) list^";\n"^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   392
            "val strict_axms = []; val total_axms = [];\nval thy = thy\n",
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   393
          (* additional declarations *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   394
            (if strict="true" then "val strict_axms = strict_axms @ [\n"^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   395
               mk_strict_vals (map (strip_quotes o fst) list)^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   396
               "];\n"             
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   397
             else "")^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   398
            (if total="true" then "val total_axms = total_axms @ [\n"^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   399
               mk_total_vals (map (strip_quotes o fst) list)^
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   400
               "];\n"             
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   401
             else ""));
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   402
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   403
(* mixfix annotations *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   404
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   405
fun cat_parens pre1 pre2 s = cat pre1 (parens (cat pre2 s));
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   406
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   407
val infxl = "infixl" $$-- !! nat >> cat_parens "ThyOps.Mixfix" "Infixl";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   408
val infxr = "infixr" $$-- !! nat >> cat_parens "ThyOps.Mixfix" "Infixr";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   409
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   410
val cinfxl = "cinfixl" $$-- !! nat >> cat "ThyOps.CInfixl";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   411
val cinfxr = "cinfixr" $$-- !! nat >> cat "ThyOps.CInfixr";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   412
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   413
val opt_pris = optional ("[" $$-- !! (list nat --$$ "]")) [] >> mk_list;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   414
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   415
val cmixfx = "cmixfix" $$-- string -- !! (opt_pris -- optional nat "max_pri")
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   416
  >> (cat "ThyOps.CMixfix" o mk_triple2);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   417
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   418
val bindr = "binder" $$--
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   419
  !! (string -- ( ("[" $$-- nat --$$ "]") -- nat
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   420
                || nat >> (fn n => (n,n))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   421
     )          )
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   422
  >> (cat_parens "ThyOps.Mixfix" "Binder" o mk_triple2);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   423
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   424
val mixfx = string -- !! (opt_pris -- optional nat "max_pri")
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   425
  >> (cat_parens "ThyOps.Mixfix" "Mixfix" o mk_triple2);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   426
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   427
fun opt_syn fx = optional ("(" $$-- fx --$$ ")") "ThyOps.Mixfix NoSyn";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   428
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   429
val opt_cmixfix = opt_syn (mixfx || infxl || infxr || bindr || 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   430
                              cinfxl || cinfxr || cmixfx);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   431
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   432
fun ops_decls toks= 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   433
               (optional ($$ "curried" >> K "true") "false" --
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   434
                optional ($$ "strict" >> K "true") "false" --
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   435
                optional ($$ "total" >> K "true") "false" -- 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   436
                (repeat1 (names1 --$$ "::" -- !! (string -- opt_cmixfix)) 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   437
                 >> split_decls)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   438
                >> mk_ops_decls) toks
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   439
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   440
end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   441
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   442
(*** new keywords and sections: ******************************************)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   443
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   444
val ops_keywords = ["curried","strict","total","cinfixl","cinfixr","cmixfix"];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   445
     (* "::" is already a pure keyword *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   446
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   447
val ops_sections = [("ops"    , ops_decls) ];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   448
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   449
end; (* the structure ThyOps *)