src/Pure/Tools/compute.ML
changeset 17412 e26cb20ef0cc
parent 17223 430edc6b7826
child 17795 5b18c3343028
equal deleted inserted replaced
17411:664434175578 17412:e26cb20ef0cc
    42 exception Mono of term;
    42 exception Mono of term;
    43 
    43 
    44 val remove_types =
    44 val remove_types =
    45     let
    45     let
    46         fun remove_types_var table invtable ccount vcount ldepth t =
    46         fun remove_types_var table invtable ccount vcount ldepth t =
    47             (case Termtab.curried_lookup table t of
    47             (case Termtab.lookup table t of
    48                  NONE =>
    48                  NONE =>
    49                  let
    49                  let
    50                      val a = AbstractMachine.Var vcount
    50                      val a = AbstractMachine.Var vcount
    51                  in
    51                  in
    52                      (Termtab.curried_update (t, a) table,
    52                      (Termtab.update (t, a) table,
    53                       AMTermTab.curried_update (a, t) invtable,
    53                       AMTermTab.update (a, t) invtable,
    54                       ccount,
    54                       ccount,
    55                       inc vcount,
    55                       inc vcount,
    56                       AbstractMachine.Var (add vcount ldepth))
    56                       AbstractMachine.Var (add vcount ldepth))
    57                  end
    57                  end
    58                | SOME (AbstractMachine.Var v) =>
    58                | SOME (AbstractMachine.Var v) =>
    59                  (table, invtable, ccount, vcount, AbstractMachine.Var (add v ldepth))
    59                  (table, invtable, ccount, vcount, AbstractMachine.Var (add v ldepth))
    60                | SOME _ => sys_error "remove_types_var: lookup should be a var")
    60                | SOME _ => sys_error "remove_types_var: lookup should be a var")
    61 
    61 
    62         fun remove_types_const table invtable ccount vcount ldepth t =
    62         fun remove_types_const table invtable ccount vcount ldepth t =
    63             (case Termtab.curried_lookup table t of
    63             (case Termtab.lookup table t of
    64                  NONE =>
    64                  NONE =>
    65                  let
    65                  let
    66                      val a = AbstractMachine.Const ccount
    66                      val a = AbstractMachine.Const ccount
    67                  in
    67                  in
    68                      (Termtab.curried_update (t, a) table,
    68                      (Termtab.update (t, a) table,
    69                       AMTermTab.curried_update (a, t) invtable,
    69                       AMTermTab.update (a, t) invtable,
    70                       inc ccount,
    70                       inc ccount,
    71                       vcount,
    71                       vcount,
    72                       a)
    72                       a)
    73                  end
    73                  end
    74                | SOME (c as AbstractMachine.Const _) =>
    74                | SOME (c as AbstractMachine.Const _) =>
   112 
   112 
   113 fun infer_types naming =
   113 fun infer_types naming =
   114     let
   114     let
   115         fun infer_types invtable ldepth bounds ty (AbstractMachine.Var v) =
   115         fun infer_types invtable ldepth bounds ty (AbstractMachine.Var v) =
   116             if v < ldepth then (Bound v, List.nth (bounds, v)) else
   116             if v < ldepth then (Bound v, List.nth (bounds, v)) else
   117             (case AMTermTab.curried_lookup invtable (AbstractMachine.Var (v-ldepth)) of
   117             (case AMTermTab.lookup invtable (AbstractMachine.Var (v-ldepth)) of
   118                  SOME (t as Var (_, ty)) => (t, ty)
   118                  SOME (t as Var (_, ty)) => (t, ty)
   119                | SOME (t as Free (_, ty)) => (t, ty)
   119                | SOME (t as Free (_, ty)) => (t, ty)
   120                | _ => sys_error "infer_types: lookup should deliver Var or Free")
   120                | _ => sys_error "infer_types: lookup should deliver Var or Free")
   121           | infer_types invtable ldepth _ ty (c as AbstractMachine.Const _) =
   121           | infer_types invtable ldepth _ ty (c as AbstractMachine.Const _) =
   122             (case AMTermTab.curried_lookup invtable c of
   122             (case AMTermTab.lookup invtable c of
   123                  SOME (c as Const (_, ty)) => (c, ty)
   123                  SOME (c as Const (_, ty)) => (c, ty)
   124                | _ => sys_error "infer_types: lookup should deliver Const")
   124                | _ => sys_error "infer_types: lookup should deliver Const")
   125           | infer_types invtable ldepth bounds (n,ty) (AbstractMachine.App (a, b)) =
   125           | infer_types invtable ldepth bounds (n,ty) (AbstractMachine.App (a, b)) =
   126             let
   126             let
   127                 val (a, aty) = infer_types invtable ldepth bounds (n+1, ty) a
   127                 val (a, aty) = infer_types invtable ldepth bounds (n+1, ty) a
   174                     (case prop of AbstractMachine.App x => x | _ =>
   174                     (case prop of AbstractMachine.App x => x | _ =>
   175                       sys_error "make: remove_types should deliver application")
   175                       sys_error "make: remove_types should deliver application")
   176 
   176 
   177                 fun make_pattern table invtable n vars (var as AbstractMachine.Var v) =
   177                 fun make_pattern table invtable n vars (var as AbstractMachine.Var v) =
   178                     let
   178                     let
   179                         val var' = valOf (AMTermTab.curried_lookup invtable var)
   179                         val var' = valOf (AMTermTab.lookup invtable var)
   180                         val table = Termtab.delete var' table
   180                         val table = Termtab.delete var' table
   181                         val invtable = AMTermTab.delete var invtable
   181                         val invtable = AMTermTab.delete var invtable
   182                         val vars = Inttab.curried_update_new (v, n) vars handle Inttab.DUP _ =>
   182                         val vars = Inttab.update_new (v, n) vars handle Inttab.DUP _ =>
   183                           raise (Make "no duplicate variable in pattern allowed")
   183                           raise (Make "no duplicate variable in pattern allowed")
   184                     in
   184                     in
   185                         (table, invtable, n+1, vars, AbstractMachine.PVar)
   185                         (table, invtable, n+1, vars, AbstractMachine.PVar)
   186                     end
   186                     end
   187                   | make_pattern table invtable n vars (AbstractMachine.Abs _) =
   187                   | make_pattern table invtable n vars (AbstractMachine.Abs _) =
   215                 (* finally, provide a function for renaming the
   215                 (* finally, provide a function for renaming the
   216                   pattern bound variables on the right hand side *)
   216                   pattern bound variables on the right hand side *)
   217 
   217 
   218                 fun rename ldepth vars (var as AbstractMachine.Var v) =
   218                 fun rename ldepth vars (var as AbstractMachine.Var v) =
   219                     if v < ldepth then var
   219                     if v < ldepth then var
   220                     else (case Inttab.curried_lookup vars (v - ldepth) of
   220                     else (case Inttab.lookup vars (v - ldepth) of
   221                               NONE => raise (Make "new variable on right hand side")
   221                               NONE => raise (Make "new variable on right hand side")
   222                             | SOME n => AbstractMachine.Var ((vcount-n-1)+ldepth))
   222                             | SOME n => AbstractMachine.Var ((vcount-n-1)+ldepth))
   223                   | rename ldepth vars (c as AbstractMachine.Const _) = c
   223                   | rename ldepth vars (c as AbstractMachine.Const _) = c
   224                   | rename ldepth vars (AbstractMachine.App (a, b)) =
   224                   | rename ldepth vars (AbstractMachine.App (a, b)) =
   225                     AbstractMachine.App (rename ldepth vars a, rename ldepth vars b)
   225                     AbstractMachine.App (rename ldepth vars a, rename ldepth vars b)