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