src/Pure/Tools/nbe_codegen.ML
author haftmann
Fri, 03 Mar 2006 08:52:39 +0100
changeset 19177 68c6824d8bb6
parent 19167 f237c0cb3882
child 19178 9b295c37854f
permissions -rwxr-xr-x
improvements for nbe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     1
(*  ID:         $Id$
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
     2
    Author:     Klaus Aehlig, LMU Muenchen; Tobias Nipkow, TU Muenchen
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
     3
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
     4
Code generator for "normalization by evaluation".
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     5
*)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     6
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     7
(* Global asssumptions:
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     8
   For each function: there is at least one defining eqns and
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
     9
   all defining equations have same number of arguments.
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    10
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    11
FIXME
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
    12
fun MLname
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    13
val quote = quote;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    14
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    15
*)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    16
19118
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
    17
signature NBE_CODEGEN =
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
    18
sig
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    19
  val generate: (string -> bool) -> string * CodegenThingol.def -> string;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    20
  val nterm_to_term: theory -> NBE_Eval.nterm -> term;
19118
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
    21
end
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
    22
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
    23
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
    24
structure NBE_Codegen: NBE_CODEGEN =
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
    25
struct
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
    26
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    27
val Eval = "NBE_Eval";
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
    28
val Eval_mk_Fun  = Eval ^ ".mk_Fun";
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    29
val Eval_apply   = Eval ^ ".apply";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    30
val Eval_Constr  = Eval ^ ".Constr";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    31
val Eval_C       = Eval ^ ".C";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    32
val Eval_AbsN    = Eval ^ ".AbsN";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    33
val Eval_Fun     = Eval ^ ".Fun";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    34
val Eval_BVar    = Eval ^ ".BVar";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    35
val Eval_new_name = Eval ^ ".new_name";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    36
val Eval_to_term = Eval ^ ".to_term";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    37
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
    38
fun MLname s = "nbe_" ^ translate_string (fn "." => "_" | c => c) s;
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    39
fun MLvname s  = "v_" ^ MLname s;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    40
fun MLparam n  = "p_" ^ string_of_int n;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    41
fun MLintern s = "i_" ^ MLname s;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    42
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    43
fun MLparams n = map MLparam (1 upto n);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    44
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    45
structure S =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    46
struct
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    47
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    48
val quote = quote; (* FIXME *)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    49
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    50
fun app e1 e2 = "(" ^ e1 ^ " " ^ e2 ^ ")";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    51
fun abs v e = "(fn" ^ v ^ " => " ^ e ^ ")";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    52
fun tup es = "(" ^ commas es ^ ")";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    53
fun list es = "[" ^ commas es ^ "]";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    54
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    55
fun apps s ss = Library.foldl (uncurry app) (s, ss);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    56
fun nbe_apps s ss =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    57
  Library.foldr (fn (s,e) => app (app Eval_apply e) s) (ss,s);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    58
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    59
fun eqns name ees =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    60
  let fun eqn (es,e) = name ^ " " ^ space_implode " " es ^ " = " ^ e
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    61
  in "fun " ^ space_implode "\n  | " (map eqn ees) ^ ";\n" end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    62
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    63
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    64
fun Val v s = "val " ^ v ^ " = " ^ s;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    65
fun Let ds e = "let\n" ^ (space_implode "\n" ds) ^ " in " ^ e ^ " end"
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    66
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    67
end
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    68
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    69
val tab_lookup = S.app "NBE.lookup";
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
    70
val tab_update = S.app "NBE.update";
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
    71
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    72
fun mk_nbeFUN(nm,e) =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    73
  S.app Eval_Fun (S.tup [S.abs(S.list [MLvname nm])e,S.list [],"1",
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    74
      S.abs(S.tup [])(S.Let 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    75
        [S.Val (MLintern "var") (S.app Eval_new_name (S.tup [])),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    76
         S.Val (MLvname nm) (S.app Eval_BVar (S.tup [(MLintern "var"), S.list []]))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    77
	(S.app Eval_AbsN(S.tup[MLintern "var",(S.app Eval_to_term e)])))]);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    78
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    79
fun take_last n xs = rev (Library.take(n, rev xs));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    80
fun drop_last n xs = rev (Library.drop(n, rev xs));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    81
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    82
fun selfcall nm ar args =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    83
	if (ar <= length args) then 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    84
	  S.nbe_apps (S.app (MLname nm) (S.list (take_last ar args)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    85
	             (drop_last ar args)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    86
        else S.app Eval_Fun (S.tup [MLname nm,S.list args,
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    87
	           string_of_int(ar - (length args)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    88
		   S.abs (S.tup []) (S.app Eval_C
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    89
	(S.quote nm))]);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    90
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
    91
open BasicCodegenThingol;
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    92
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
    93
fun mk_rexpr defined nm ar =
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    94
  let fun mk args t = case t of
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
    95
    IConst((s,_),_) => 
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
    96
    if s=nm then selfcall nm ar args
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
    97
    else if defined s then S.nbe_apps (MLname s) args
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
    98
    else S.app Eval_Constr (S.tup [S.quote s,S.list args ])
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
    99
  | IVar s => S.nbe_apps (MLvname s) args
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   100
  | e1 `$ e2 => mk (args @ [mk [] e2]) e1
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   101
  | (nm, _) `|-> e =>
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   102
      S.nbe_apps (mk_nbeFUN(nm, mk [] e)) args
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   103
  | IAbs (_, e) => mk args e
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   104
  | ICase (_, e) => mk args e
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   105
  | _ => sys_error "NBE mkexpr"
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   106
  in mk [] end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   107
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   108
val mk_lexpr =
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   109
  let fun mk args t = case t of
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   110
    IConst((s,_),_) =>
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   111
      S.app Eval_Constr (S.tup [S.quote s, S.list args])
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   112
  | IVar s => if args = [] then MLvname s else 
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   113
      sys_error "NBE mk_lexpr illegal higher order pattern"
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   114
  | e1 `$ e2 => mk (args @ [mk [] e2]) e1
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   115
  | IAbs (_, e) => mk args e
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   116
  | ICase (_, e) => mk args e
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   117
  | _ => sys_error "NBE mk_lexpr illegal pattern"
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   118
  in mk [] end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   119
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
   120
fun mk_eqn defined nm ar (lhs,e) =
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
   121
  ([S.list(map mk_lexpr (rev lhs))], mk_rexpr defined nm ar e);
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   122
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   123
fun consts_of (IConst ((s, _), _)) = insert (op =) s
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   124
  | consts_of (e1 `$ e2) =
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   125
      consts_of e1 #> consts_of e2
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   126
  | consts_of (_ `|-> e) = consts_of e
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   127
  | consts_of (IAbs (_, e)) = consts_of e
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   128
  | consts_of (ICase (_, e)) = consts_of e
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   129
  | consts_of _ = I;
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   130
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
   131
fun lookup nm = S.Val (MLname nm) (tab_lookup (S.quote nm));
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   132
19167
f237c0cb3882 refined representation of codegen intermediate language
haftmann
parents: 19147
diff changeset
   133
fun generate defined (nm, CodegenThingol.Fun (eqns, _)) =
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   134
      let
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   135
        val ar = length(fst(hd eqns));
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   136
        val params = S.list (rev (MLparams ar));
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   137
        val funs = Library.flat(map (fn (_,e) => consts_of e []) eqns) \ nm;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   138
        val globals = map lookup (filter defined funs);
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   139
        val default_eqn = ([params], S.app Eval_Constr (S.tup[S.quote nm,params]));
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   140
        val code = S.eqns (MLname nm)
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   141
                          (map (mk_eqn defined nm ar) eqns @ [default_eqn])
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   142
        val register = tab_update
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   143
            (S.app Eval_mk_Fun (S.tup[S.quote nm, MLname nm, string_of_int ar]))
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   144
      in
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   145
        S.Let (globals @ [code]) register
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   146
      end
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   147
  | generate _ _ = "";
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   148
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   149
open NBE_Eval;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   150
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   151
fun nterm_to_term thy t =
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   152
  let
19177
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   153
    fun consts_of (C s) = insert (op =) s
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   154
      | consts_of (V _) = I
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   155
      | consts_of (B _) = I
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   156
      | consts_of (A (t1, t2)) = consts_of t1 #> consts_of t2
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   157
      | consts_of (AbsN (_, t)) = consts_of t;
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   158
    val consts = consts_of t [];
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   159
    val the_const = AList.lookup (op =)
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   160
      (consts ~~ CodegenPackage.consts_of_idfs thy consts)
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   161
      #> the_default ("", dummyT);
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   162
    fun to_term bounds (C s) = Const (the_const s)
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   163
      | to_term bounds (V s) = Free (s, dummyT)
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   164
      | to_term bounds (B i) = Bound (find_index (fn j => i = j) bounds)
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   165
      | to_term bounds (A (t1, t2)) = to_term bounds t1 $ to_term bounds t2
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   166
      | to_term bounds (AbsN (i, t)) =
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   167
          Abs("u", dummyT, to_term (i::bounds) t);
68c6824d8bb6 improvements for nbe
haftmann
parents: 19167
diff changeset
   168
  in to_term [] t end;
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   169
19118
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
   170
end;
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
   171
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
   172
(*
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
   173
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   174
val use_show = fn s => (writeln ("\n---generated code:\n"^ s);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   175
     use_text(writeln o enclose "\n---compiler echo:\n" "\n---\n",
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   176
              writeln o enclose "\n--- compiler echo (with error!):\n" 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   177
                                "\n---\n")
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   178
      true s);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   179
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   180
val dummyIT = CodegenThingol.IType("DUMMY",[]);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   181
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
   182
use_show(NBE_Codegen.generate (the_context()) ("append",CodegenThingol.Fun(
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   183
  [([CodegenThingol.IConst(("Nil",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   184
     CodegenThingol.IVarE("ys",dummyIT)],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   185
    CodegenThingol.IVarE("ys",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   186
   ([CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   187
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   188
         CodegenThingol.IConst(("Cons",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   189
         CodegenThingol.IVarE("x",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   190
       CodegenThingol.IVarE("xs",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   191
     CodegenThingol.IVarE("ys",dummyIT)],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   192
    CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   193
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   194
         CodegenThingol.IConst(("Cons",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   195
         CodegenThingol.IVarE("x",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   196
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   197
         CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   198
           CodegenThingol.IConst(("append",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   199
           CodegenThingol.IVarE("xs",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   200
         CodegenThingol.IVarE("ys",dummyIT))))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   201
  ,([],dummyIT))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   202
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   203
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   204
let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   205
fun test a b = if a=b then () else error "oops!";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   206
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   207
val CNil = Const("Nil",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   208
val CCons = Const("Cons",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   209
val Cappend = Const("append",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   210
val Fx = Free("x",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   211
val Fy = Free("y",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   212
val Fxs = Free("xs",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   213
val Fys = Free("ys",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   214
open NBE_Eval
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   215
in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   216
test (nbe(CNil)) (C "Nil");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   217
test (nbe(CCons)) (C "Cons");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   218
test (nbe(Cappend)) (C "append");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   219
test (nbe(Cappend $ CNil $ CNil)) (C "Nil");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   220
test (nbe(Cappend $ Fxs)) (A (C "append", V "xs"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   221
test (nbe(Cappend $ Fxs $ Fys)) (A (A (C "append", V "xs"), V "ys"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   222
test (nbe(Cappend $ CNil $ Fxs)) (V "xs");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   223
test (nbe(Cappend $ (CCons $ Fx $ Fxs) $ Fys))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   224
     (A (A (C "Cons", V "x"), A (A (C "append", V "xs"), V "ys")));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   225
test (nbe(Cappend $ (CCons $ Fx $ Fxs) $ (CCons $ Fy $ Fys)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   226
     (A (A (C "Cons", V "x"), A (A (C "append", V "xs"), A (A (C "Cons", V "y"), V "ys"))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   227
test (nbe(Cappend $ (CCons $ Fx $ (CCons $ Fy $ Fxs)) $ (CCons$Fy$Fys)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   228
 (A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   229
      (A (C "Cons", V "x"),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   230
         A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   231
            (A (C "Cons", V "y"),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   232
               A (A (C "append", V "xs"), A (A (C "Cons", V "y"), V "ys")))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   233
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   234
end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   235
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   236
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
   237
use_show(NBE_Codegen.generate (the_context()) ("app",CodegenThingol.Fun(
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   238
  [
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   239
  ([CodegenThingol.IConst(("Nil",dummyIT),[])],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   240
    CodegenThingol.IAbs(CodegenThingol.IVarE("ys",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   241
                        CodegenThingol.IVarE("ys",dummyIT))),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   242
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   243
   ([CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   244
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   245
         CodegenThingol.IConst(("Cons",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   246
         CodegenThingol.IVarE("x",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   247
       CodegenThingol.IVarE("xs",dummyIT))],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   248
    CodegenThingol.IAbs(CodegenThingol.IVarE("ys",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   249
    CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   250
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   251
         CodegenThingol.IConst(("Cons",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   252
         CodegenThingol.IVarE("x",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   253
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   254
         CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   255
           CodegenThingol.IConst(("app",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   256
           CodegenThingol.IVarE("xs",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   257
         CodegenThingol.IVarE("ys",dummyIT)))))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   258
  ,([],dummyIT))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   259
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   260
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   261
let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   262
fun test a b = if a=b then () else error "oops!";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   263
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   264
val CNil = Const("Nil",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   265
val CCons = Const("Cons",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   266
val Cappend = Const("app",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   267
val Fx = Free("x",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   268
val Fy = Free("y",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   269
val Fxs = Free("xs",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   270
val Fys = Free("ys",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   271
open NBE_Eval
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   272
in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   273
test (nbe(CNil)) (C "Nil");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   274
test (nbe(CCons)) (C "Cons");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   275
test (nbe(Cappend)) (C "app");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   276
test (nbe(Cappend $ CNil)) (AbsN (1, B 1));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   277
test (nbe(Cappend $ CNil $ CNil)) (C "Nil");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   278
test (nbe(Cappend $ Fxs)) (A (C "app", V "xs"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   279
test (nbe(Cappend $ Fxs $ Fys)) (A (A (C "app", V "xs"), V "ys"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   280
test (nbe(Cappend $ CNil $ Fxs)) (V "xs");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   281
test (nbe(Cappend $ (CCons $ Fx $ Fxs) $ Fys))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   282
     (A (A (C "Cons", V "x"), A (A (C "app", V "xs"), V "ys")));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   283
test (nbe(Cappend $ (CCons $ Fx $ Fxs))) 
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   284
   (AbsN (1, A (A (C "Cons", V "x"), A (A (C "app", V "xs"), B 1))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   285
test (nbe(Cappend $ (CCons $ Fx $ Fxs) $ (CCons $ Fy $ Fys)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   286
     (A (A (C "Cons", V "x"), A (A (C "app", V "xs"), A (A (C "Cons", V "y"), V "ys"))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   287
test (nbe(Cappend $ (CCons $ Fx $ (CCons $ Fy $ Fxs)) $ (CCons$Fy$Fys)))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   288
 (A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   289
      (A (C "Cons", V "x"),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   290
         A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   291
            (A (C "Cons", V "y"),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   292
               A (A (C "app", V "xs"), A (A (C "Cons", V "y"), V "ys")))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   293
()
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   294
end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   295
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   296
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
   297
use_show(NBE_Codegen.generate (the_context()) ("add",CodegenThingol.Fun(
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   298
  [
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   299
  ([CodegenThingol.IConst(("0",dummyIT),[])],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   300
    CodegenThingol.IAbs(CodegenThingol.IVarE("n",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   301
                        CodegenThingol.IVarE("n",dummyIT))),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   302
   ([CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   303
       CodegenThingol.IConst(("S",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   304
       CodegenThingol.IVarE("n",dummyIT))],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   305
    CodegenThingol.IAbs(CodegenThingol.IVarE("m",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   306
      CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   307
         CodegenThingol.IConst(("S",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   308
           CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   309
             CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   310
               CodegenThingol.IConst(("add",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   311
               CodegenThingol.IVarE("n",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   312
             CodegenThingol.IVarE("m",dummyIT)))))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   313
  ,([],dummyIT))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   314
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   315
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   316
let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   317
fun test a b = if a=b then () else error "oops!";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   318
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   319
val C0 = Const("0",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   320
val CS = Const("S",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   321
val Cadd = Const("add",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   322
val Fx = Free("x",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   323
val Fy = Free("y",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   324
open NBE_Eval
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   325
in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   326
test (nbe(Cadd $ C0)) (AbsN (1, B 1));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   327
test (nbe(Cadd $ C0 $ C0)) (C "0");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   328
test (nbe(Cadd $ (CS $ (CS $ (CS $ Fx))) $ (CS $ (CS $ (CS $ Fy)))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   329
(A (C "S", A (C "S", A (C "S", A (A (C "add", V "x"), A (C "S", A (C "S", A (C "S", V "y")))))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   330
)
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   331
end;
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   332
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   333
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   334
19147
0f584853b6a4 added nbe, updated neb_*
nipkow
parents: 19118
diff changeset
   335
use_show(NBE_Codegen.generate (the_context()) ("mul",CodegenThingol.Fun(
19116
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   336
  [
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   337
  ([CodegenThingol.IConst(("0",dummyIT),[])],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   338
    CodegenThingol.IAbs(CodegenThingol.IVarE("n",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   339
                        CodegenThingol.IConst(("0",dummyIT),[]))),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   340
   ([CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   341
       CodegenThingol.IConst(("S",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   342
       CodegenThingol.IVarE("n",dummyIT))],
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   343
    CodegenThingol.IAbs(CodegenThingol.IVarE("m",dummyIT),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   344
      CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   345
       CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   346
         CodegenThingol.IConst(("add",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   347
        CodegenThingol.IVarE("m",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   348
           CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   349
             CodegenThingol.IApp(
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   350
               CodegenThingol.IConst(("mul",dummyIT),[]),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   351
               CodegenThingol.IVarE("n",dummyIT)),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   352
             CodegenThingol.IVarE("m",dummyIT)))))]
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   353
  ,([],dummyIT))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   354
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   355
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   356
let
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   357
fun test a b = if a=b then () else error "oops!";
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   358
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   359
val C0 = Const("0",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   360
val CS = Const("S",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   361
val Cmul = Const("mul",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   362
val Fx = Free("x",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   363
val Fy = Free("y",dummyT);
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   364
open NBE_Eval
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   365
in
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   366
test (nbe(Cmul $ C0)) (AbsN (1, C "0"));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   367
test (nbe(Cmul $ C0 $ Fx)) (C "0");
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   368
test (nbe(Cmul $ (CS $ (CS $ (CS $ C0)))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   369
(AbsN (1, A (A (C "add", B 1), A (A (C "add", B 1), A (A (C "add", B 1), C "0")))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   370
test (nbe(Cmul $ (CS $ (CS $ (CS $ Fx)))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   371
 (AbsN (1, A (A (C "add", B 1), A (A (C "add", B 1),
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   372
                     A (A (C "add", B 1), A (A (C "mul", V "x"), B 1))))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   373
test (nbe(Cmul $ (CS $ (CS $ Fx)) $ (CS $ (CS $ (CS $ Fy)))))
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   374
(A (C "S", A(C "S",A(C "S",A(A (C "add", V "y"),A(C "S",A(C "S",A(C "S",A
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   375
 (A (C "add", V "y"),A(A (C "mul", V "x"),A(C "S",A(C "S",A(C "S", V"y")))))))))))));
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   376
()
d065ec558092 New normalization-by-evaluation package
nipkow
parents:
diff changeset
   377
end;
19118
52f751b50716 added Tools/nbe, fixes
nipkow
parents: 19116
diff changeset
   378
*)