src/HOLCF/domain/library.ML
author clasohm
Tue, 30 Jan 1996 13:42:57 +0100
changeset 1461 6bcb44e4d6e5
parent 1274 ea0668a1c0ba
child 1637 b8a8ae2e5de1
permissions -rw-r--r--
expanded tabs
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     1
(* library.ML
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     2
   ID:         $Id$
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     3
   Author:      David von Oheimb
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     4
   Created: 18-Jul-95 extracted from syntax.ML, axioms.ML, extender.ML, interface.ML
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     5
   Updated: 30-Aug-95
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     6
   Copyright 1995 TU Muenchen
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     7
*)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     8
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
     9
(* ----- general support ---------------------------------------------------------- *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    10
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    11
fun Id x = x;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    12
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    13
fun mapn f n []      = []
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    14
|   mapn f n (x::xs) = (f n x) :: mapn f (n+1) xs;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    15
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    16
fun foldr'' f (l,f2) =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    17
  let fun itr []  = raise LIST "foldr''"
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    18
        | itr [a] = f2 a
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    19
        | itr (a::l) = f(a, itr l)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    20
  in  itr l  end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    21
fun foldr' f l = foldr'' f (l,Id);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    22
fun map_cumulr f start xs = foldr (fn (x,(ys,res)) => case f(x,res) of (y,res2) => 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    23
                                                      (y::ys,res2)) (xs,([],start));
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    24
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    25
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    26
fun first  (x,_,_) = x; fun second (_,x,_) = x; fun third  (_,_,x) = x;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    27
fun upd_first  f (x,y,z) = (f x,   y,   z);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    28
fun upd_second f (x,y,z) = (  x, f y,   z);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    29
fun upd_third  f (x,y,z) = (  x,   y, f z);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    30
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    31
(* fn : ('a -> 'a) -> ('a -> 'a) -> 'a -> 'b list -> int -> 'a *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    32
fun bin_branchr f1 f2 y is j = let
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    33
fun bb y 1 _ = y
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    34
|   bb y _ 0 = f1 y
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    35
|   bb y i j = if i=2 then (f2 y) else bb (f2 y) (i-1) (j-1)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    36
in bb y (length is) j end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    37
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    38
fun atomize thm = case concl_of thm of
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    39
      _ $ (Const("op &",_) $ _ $ _)       => atomize (thm RS conjunct1) @
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    40
                                             atomize (thm RS conjunct2)
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    41
    | _ $ (Const("All" ,_) $ Abs (s,_,_)) => atomize (thm RS 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    42
                                             (read_instantiate [("x","?"^s)] spec))
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    43
    | _                               => [thm];
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    44
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    45
(* ----- specific support for domain ---------------------------------------------- *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    46
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    47
structure Domain_Library = struct
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    48
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    49
exception Impossible of string;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    50
fun Imposs msg = raise Impossible ("Domain:"^msg);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    51
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    52
(* ----- name handling ----- *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    53
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    54
val strip_esc = let
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    55
  fun strip ("'" :: c :: cs) = c :: strip cs
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    56
  |   strip ["'"] = []
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    57
  |   strip (c :: cs) = c :: strip cs
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    58
  |   strip [] = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    59
in implode o strip o explode end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    60
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    61
fun extern_name con = case explode con of 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    62
                   ("o"::"p"::" "::rest) => implode rest
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    63
                   | _ => con;
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    64
fun dis_name  con = "is_"^ (extern_name con);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    65
fun dis_name_ con = "is_"^ (strip_esc   con);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    66
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    67
(*make distinct names out of the type list, 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    68
  forbidding "o", "x..","f..","P.." as names *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    69
(*a number string is added if necessary *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    70
fun mk_var_names types : string list = let
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    71
    fun typid (Type  (id,_)   ) = hd     (explode id)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    72
      | typid (TFree (id,_)   ) = hd (tl (explode id))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    73
      | typid (TVar ((id,_),_)) = hd (tl (explode id));
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    74
    fun nonreserved id = let val cs = explode id in
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    75
                         if not(hd cs mem ["x","f","P"]) then id
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    76
                         else implode(chr(1+ord (hd cs))::tl cs) end;
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    77
    fun index_vnames(vn::vns,tab) =
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    78
          (case assoc(tab,vn) of
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    79
             None => if vn mem vns
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    80
                     then (vn^"1") :: index_vnames(vns,(vn,2)::tab)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    81
                     else  vn      :: index_vnames(vns,        tab)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    82
           | Some(i) => (vn^(string_of_int i)) :: index_vnames(vns,(vn,i+1)::tab))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    83
      | index_vnames([],tab) = [];
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    84
in index_vnames(map (nonreserved o typid) types,[("o",1)]) end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    85
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    86
fun type_name_vars (Type(name,typevars)) = (name,typevars)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    87
|   type_name_vars _                     = Imposs "library:type_name_vars";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    88
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    89
(* ----- support for type and mixfix expressions ----- *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    90
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    91
fun mk_tvar s = TFree("'"^s,["pcpo"]);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    92
fun mk_typ t (S,T) = Type(t,[S,T]);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    93
infixr 5 -->;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    94
infixr 6 ~>; val op ~> = mk_typ "->";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    95
val NoSyn' = ThyOps.Mixfix NoSyn;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    96
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    97
(* ----- constructor list handling ----- *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
    98
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
    99
type cons = (string *                   (* operator name of constr *)
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   100
            ((bool*int)*                (*  (lazy,recursive element or ~1) *)
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   101
              string*                   (*   selector name    *)
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   102
              string)                   (*   argument name    *)
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   103
            list);                      (* argument list      *)
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   104
type eq = (string *             (* name      of abstracted type *)
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   105
           typ list) *          (* arguments of abstracted type *)
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   106
          cons list;            (* represented type, as a constructor list *)
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   107
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   108
val rec_of    = snd o first;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   109
val is_lazy   = fst o first;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   110
val sel_of    =       second;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   111
val     vname =       third;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   112
val upd_vname =   upd_third;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   113
fun is_rec         arg = rec_of arg >=0;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   114
fun is_nonlazy_rec arg = is_rec arg andalso not (is_lazy arg);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   115
fun nonlazy args       = map vname (filter_out is_lazy args);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   116
fun is_one_con_one_arg p cons = length cons = 1 andalso let val args = snd(hd cons) in
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   117
                                length args = 1 andalso p (hd args) end;
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   118
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   119
(* ----- support for term expressions ----- *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   120
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   121
fun % s = Free(s,dummyT);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   122
fun %# arg = %(vname arg);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   123
fun %% s = Const(s,dummyT);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   124
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   125
local open HOLogic in
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   126
val mk_trp = mk_Trueprop;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   127
fun mk_conj (S,T) = conj $ S $ T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   128
fun mk_disj (S,T) = disj $ S $ T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   129
fun mk_imp  (S,T) = imp  $ S $ T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   130
fun mk_lam  (x,T) = Abs(x,dummyT,T);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   131
fun mk_all  (x,P) = HOLogic.mk_all (x,dummyT,P);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   132
local 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   133
                    fun tf (Type (s,args)) = foldl (op $) (%s,map tf args)
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   134
                    |   tf (TFree(s,_   )) = %s
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   135
                    |   tf _              = Imposs "mk_constrainall";
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   136
in
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   137
fun mk_constrain      (typ,T) = %%"_constrain" $ T $ tf typ;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   138
fun mk_constrainall (x,typ,P) = %%"All" $ (%%"_constrainAbs"$Abs(x,dummyT,P)$tf typ);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   139
end;
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   140
                        
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   141
fun mk_ex   (x,P) = mk_exists (x,dummyT,P);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   142
fun mk_not     P  = Const("not" ,boolT --> boolT) $ P;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   143
end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   144
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   145
fun mk_All  (x,P) = %%"all" $ mk_lam(x,P); (* meta universal quantification *)
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   146
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   147
infixr 0 ===>;fun S ===> T = Const("==>", dummyT) $ S $ T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   148
infixr 0 ==>;fun S ==> T = mk_trp S ===> mk_trp T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   149
infix 0 ==;  fun S ==  T = Const("==", dummyT) $ S $ T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   150
infix 1 ===; fun S === T = Const("op =", dummyT) $ S $ T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   151
infix 1 ~=;  fun S ~=  T = mk_not (S === T);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   152
infix 1 <<;  fun S <<  T = Const("op <<", dummyT) $ S $ T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   153
infix 1 ~<<; fun S ~<< T = mk_not (S << T);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   154
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   155
infix 9 `  ; fun f`  x = %%"fapp" $ f $ x;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   156
infix 9 `% ; fun f`% s = f` % s;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   157
infix 9 `%%; fun f`%%s = f` %%s;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   158
fun mk_cfapp (F,As) = foldl (op `) (F,As);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   159
fun con_app2 con f args = mk_cfapp(%%con,map f args);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   160
fun con_app con = con_app2 con %#;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   161
fun if_rec  arg f y   = if is_rec arg then f (rec_of arg) else y;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   162
fun app_rec_arg p arg = if_rec arg (fn n => fn x => (p n)`x) Id (%# arg);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   163
val cproj    = bin_branchr (fn S => %%"cfst"`S) (fn S => %%"csnd"`S);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   164
val  proj    = bin_branchr (fn S => %%"fst" $S) (fn S => %%"snd" $S);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   165
fun lift tfn = foldr (fn (x,t)=> (mk_trp(tfn x) ===> t));
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   166
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   167
fun /\ v T = %%"fabs" $ mk_lam(v,T);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   168
fun /\# (arg,T) = /\ (vname arg) T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   169
infixr 9 oo; fun S oo T = %%"cfcomp"`S`T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   170
val UU = %%"UU";
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   171
fun strict f = f`UU === UU;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   172
fun defined t = t ~= UU;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   173
fun cpair (S,T) = %%"cpair"`S`T;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   174
fun lift_defined f = lift (fn x => defined (f x));
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   175
fun bound_arg vns v = Bound(length vns-find(v,vns)-1);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   176
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   177
fun cont_eta_contract (Const("fabs",TT) $ Abs(a,T,body)) = 
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   178
      (case cont_eta_contract body  of
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   179
        body' as (Const("fapp",Ta) $ f $ Bound 0) => 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   180
          if not (0 mem loose_bnos f) then incr_boundvars ~1 f 
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   181
          else   Const("fabs",TT) $ Abs(a,T,body')
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   182
      | body' => Const("fabs",TT) $ Abs(a,T,body'))
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   183
|   cont_eta_contract(f$t) = cont_eta_contract f $ cont_eta_contract t
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   184
|   cont_eta_contract t    = t;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   185
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   186
fun idx_name dnames s n = s ^ (if length dnames = 1 then "" else string_of_int n);
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   187
fun when_funs cons = if length cons = 1 then ["f"] 
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   188
                     else mapn (fn n => K("f"^(string_of_int n))) 1 cons;
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   189
fun when_body cons funarg = let
1461
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   190
        fun one_fun n (_,[]  ) = /\ "dummy" (funarg(1,n))
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   191
        |   one_fun n (_,args) = let
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   192
                val l2 = length args;
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   193
                fun idxs m arg = (if is_lazy arg then fn x=> %%"lift"`%%"ID"`x
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   194
                                                 else Id) (Bound(l2-m));
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   195
                in cont_eta_contract (foldr'' 
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   196
                         (fn (a,t) => %%"ssplit"`(/\# (a,t)))
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   197
                         (args,
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   198
                          fn a => /\# (a,(mk_cfapp(funarg (l2,n),mapn idxs 1 args))))
6bcb44e4d6e5 expanded tabs
clasohm
parents: 1274
diff changeset
   199
                         ) end;
1274
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   200
in foldr' (fn (x,y)=> %%"sswhen"`x`y) (mapn one_fun 1 cons) end;
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   201
ea0668a1c0ba added 8bit pragmas
regensbu
parents:
diff changeset
   202
end; (* struct *)