| 2525 |      1 | (* Title:     HOL/MiniML/Generalize.thy
 | 
|  |      2 |    ID:        $Id$
 | 
|  |      3 |    Author:    Wolfgang Naraschewski and Tobias Nipkow
 | 
|  |      4 |    Copyright  1996 TU Muenchen
 | 
|  |      5 | 
 | 
|  |      6 | Generalizing type schemes with respect to a context
 | 
|  |      7 | *)
 | 
|  |      8 | 
 | 
|  |      9 | Generalize = Instance +
 | 
|  |     10 | 
 | 
|  |     11 | 
 | 
| 2625 |     12 | (* gen: binding (generalising) the variables which are not free in the context *)
 | 
| 2525 |     13 | 
 | 
|  |     14 | types ctxt = type_scheme list
 | 
|  |     15 |     
 | 
|  |     16 | consts
 | 
|  |     17 |   gen :: [ctxt, typ] => type_scheme
 | 
|  |     18 | 
 | 
| 5184 |     19 | primrec
 | 
| 2525 |     20 |   "gen A (TVar n) = (if (n:(free_tv A)) then (FVar n) else (BVar n))"
 | 
| 2625 |     21 |   "gen A (t1 -> t2) = (gen A t1) =-> (gen A t2)"
 | 
| 2525 |     22 | 
 | 
|  |     23 | (* executable version of gen: Implementation with free_tv_ML *)
 | 
|  |     24 | 
 | 
|  |     25 | consts
 | 
|  |     26 |   gen_ML_aux :: [nat list, typ] => type_scheme
 | 
|  |     27 | 
 | 
| 5184 |     28 | primrec
 | 
| 5518 |     29 |   "gen_ML_aux A (TVar n) = (if (n: set A) then (FVar n) else (BVar n))"
 | 
| 2625 |     30 |   "gen_ML_aux A (t1 -> t2) = (gen_ML_aux A t1) =-> (gen_ML_aux A t2)"
 | 
| 2525 |     31 | 
 | 
|  |     32 | consts
 | 
|  |     33 |   gen_ML :: [ctxt, typ] => type_scheme
 | 
|  |     34 | 
 | 
|  |     35 | defs
 | 
|  |     36 |   gen_ML_def "gen_ML A t == gen_ML_aux (free_tv_ML A) t"
 | 
|  |     37 | 
 | 
|  |     38 | end
 |