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) |