src/Tools/nbe.ML
changeset 41037 6d6f23b3a879
parent 40730 2aa0390a2da7
child 41068 7e643e07be7f
equal deleted inserted replaced
41036:4acbacd6c5bc 41037:6d6f23b3a879
    16     | BVar of int * Univ list
    16     | BVar of int * Univ list
    17     | Abs of (int * (Univ list -> Univ)) * Univ list
    17     | Abs of (int * (Univ list -> Univ)) * Univ list
    18   val apps: Univ -> Univ list -> Univ        (*explicit applications*)
    18   val apps: Univ -> Univ list -> Univ        (*explicit applications*)
    19   val abss: int -> (Univ list -> Univ) -> Univ
    19   val abss: int -> (Univ list -> Univ) -> Univ
    20                                              (*abstractions as closures*)
    20                                              (*abstractions as closures*)
    21   val eq_Univ: Univ * Univ -> bool
    21   val same: Univ * Univ -> bool
    22 
    22 
    23   val put_result: (unit -> Univ list -> Univ list) -> Proof.context -> Proof.context
    23   val put_result: (unit -> Univ list -> Univ list) -> Proof.context -> Proof.context
    24   val trace: bool Unsynchronized.ref
    24   val trace: bool Unsynchronized.ref
    25 
    25 
    26   val setup: theory -> theory
    26   val setup: theory -> theory
   181         | GREATER => Abs ((k, f), ys @ xs) (*note: reverse convention also for apps!*)
   181         | GREATER => Abs ((k, f), ys @ xs) (*note: reverse convention also for apps!*)
   182       end
   182       end
   183   | apps (Const (name, xs)) ys = Const (name, ys @ xs)
   183   | apps (Const (name, xs)) ys = Const (name, ys @ xs)
   184   | apps (BVar (n, xs)) ys = BVar (n, ys @ xs);
   184   | apps (BVar (n, xs)) ys = BVar (n, ys @ xs);
   185 
   185 
   186 fun satisfy_abs (abs as ((n, f), xs)) some_k =
   186 fun same (Const (k, xs), Const (l, ys)) = k = l andalso eq_list same (xs, ys)
   187   let
   187   | same (DFree (s, k), DFree (t, l)) = s = t andalso k = l
   188     val ys = case some_k
   188   | same (BVar (k, xs), BVar (l, ys)) = k = l andalso eq_list same (xs, ys)
   189      of NONE => replicate n (BVar (0, []))
   189   | same _ = false;
   190       | SOME k => map_range (fn l => BVar (k + l, [])) n;
       
   191   in (apps (Abs abs) ys, ys) end;
       
   192 
       
   193 fun maxidx (Const (_, xs)) = fold maxidx xs
       
   194   | maxidx (DFree _) = I
       
   195   | maxidx (BVar (l, xs)) = fold maxidx xs #> Integer.max (l + 1)
       
   196   | maxidx (Abs abs) = maxidx (fst (satisfy_abs abs NONE));
       
   197 
       
   198 fun eq_Univ (Const (k, xs), Const (l, ys)) = k = l andalso eq_list eq_Univ (xs, ys)
       
   199   | eq_Univ (DFree (s, k), DFree (t, l)) = s = t andalso k = l
       
   200   | eq_Univ (BVar (k, xs), BVar (l, ys)) = k = l andalso eq_list eq_Univ (xs, ys)
       
   201   | eq_Univ (x as Abs abs, y) =
       
   202       let
       
   203         val (x, ys) = satisfy_abs abs ((SOME o maxidx x o maxidx y) 0)
       
   204       in eq_Univ (x, apps y ys) end
       
   205   | eq_Univ (x, y as Abs _) = eq_Univ (y, x)
       
   206   | eq_Univ _ = false;
       
   207 
   190 
   208 
   191 
   209 (** assembling and compiling ML code from terms **)
   192 (** assembling and compiling ML code from terms **)
   210 
   193 
   211 (* abstract ML syntax *)
   194 (* abstract ML syntax *)
   256   val name_put =    prefix ^ "put_result";
   239   val name_put =    prefix ^ "put_result";
   257   val name_ref =    prefix ^ "univs_ref";
   240   val name_ref =    prefix ^ "univs_ref";
   258   val name_const =  prefix ^ "Const";
   241   val name_const =  prefix ^ "Const";
   259   val name_abss =   prefix ^ "abss";
   242   val name_abss =   prefix ^ "abss";
   260   val name_apps =   prefix ^ "apps";
   243   val name_apps =   prefix ^ "apps";
   261   val name_eq =     prefix ^ "eq_Univ";
   244   val name_same =     prefix ^ "same";
   262 in
   245 in
   263 
   246 
   264 val univs_cookie = (Univs.get, put_result, name_put);
   247 val univs_cookie = (Univs.get, put_result, name_put);
   265 
   248 
   266 fun nbe_fun 0 "" = "nbe_value"
   249 fun nbe_fun 0 "" = "nbe_value"
   282   in name_const `$` ("(" ^ c' ^ ", " ^ ml_list (rev ts) ^ ")") end;
   265   in name_const `$` ("(" ^ c' ^ ", " ^ ml_list (rev ts) ^ ")") end;
   283 
   266 
   284 fun nbe_abss 0 f = f `$` ml_list []
   267 fun nbe_abss 0 f = f `$` ml_list []
   285   | nbe_abss n f = name_abss `$$` [string_of_int n, f];
   268   | nbe_abss n f = name_abss `$$` [string_of_int n, f];
   286 
   269 
   287 fun nbe_eq (v1, v2) = "(" ^ name_eq ^ " (" ^ nbe_bound v1 ^ ", " ^ nbe_bound v2 ^ "))";
   270 fun nbe_same (v1, v2) = "(" ^ name_same ^ " (" ^ nbe_bound v1 ^ ", " ^ nbe_bound v2 ^ "))";
   288 
   271 
   289 end;
   272 end;
   290 
   273 
   291 open Basic_Code_Thingol;
   274 open Basic_Code_Thingol;
   292 
   275 
   368           (fn c => fn _ => fn ts => nbe_apps_constr idx_of c ts) NONE;
   351           (fn c => fn _ => fn ts => nbe_apps_constr idx_of c ts) NONE;
   369         val assemble_rhs = assemble_iterm assemble_constapp match_cont;
   352         val assemble_rhs = assemble_iterm assemble_constapp match_cont;
   370         val (samepairs, args') = subst_nonlin_vars args;
   353         val (samepairs, args') = subst_nonlin_vars args;
   371         val s_args = map assemble_arg args';
   354         val s_args = map assemble_arg args';
   372         val s_rhs = if null samepairs then assemble_rhs rhs
   355         val s_rhs = if null samepairs then assemble_rhs rhs
   373           else ml_if (ml_and (map nbe_eq samepairs))
   356           else ml_if (ml_and (map nbe_same samepairs))
   374             (assemble_rhs rhs) default_rhs;
   357             (assemble_rhs rhs) default_rhs;
   375         val eqns = if is_eval then
   358         val eqns = if is_eval then
   376             [([ml_list (rev (dicts @ s_args))], s_rhs)]
   359             [([ml_list (rev (dicts @ s_args))], s_rhs)]
   377           else
   360           else
   378             [([ml_list (rev (dicts @ map2 ml_as default_args s_args))], s_rhs),
   361             [([ml_list (rev (dicts @ map2 ml_as default_args s_args))], s_rhs),