src/Pure/old_term.ML
changeset 29270 0eade173f77e
parent 29269 5c25a2012975
child 29282 40a1014cefaa
equal deleted inserted replaced
29269:5c25a2012975 29270:0eade173f77e
     4 Some old-style term operations.
     4 Some old-style term operations.
     5 *)
     5 *)
     6 
     6 
     7 signature OLD_TERM =
     7 signature OLD_TERM =
     8 sig
     8 sig
       
     9   val it_term_types: (typ * 'a -> 'a) -> term * 'a -> 'a
       
    10   val add_term_free_names: term * string list -> string list
       
    11   val add_term_names: term * string list -> string list
       
    12   val add_typ_tvars: typ * (indexname * sort) list -> (indexname * sort) list
       
    13   val add_typ_tfree_names: typ * string list -> string list
       
    14   val add_typ_tfrees: typ * (string * sort) list -> (string * sort) list
       
    15   val add_term_tvars: term * (indexname * sort) list -> (indexname * sort) list
       
    16   val add_term_tfrees: term * (string * sort) list -> (string * sort) list
       
    17   val add_term_tfree_names: term * string list -> string list
       
    18   val add_term_consts: term * string list -> string list
       
    19   val typ_tfrees: typ -> (string * sort) list
       
    20   val typ_tvars: typ -> (indexname * sort) list
       
    21   val term_tfrees: term -> (string * sort) list
       
    22   val term_tvars: term -> (indexname * sort) list
     9   val add_term_vars: term * term list -> term list
    23   val add_term_vars: term * term list -> term list
    10   val term_vars: term -> term list
    24   val term_vars: term -> term list
    11   val add_term_frees: term * term list -> term list
    25   val add_term_frees: term * term list -> term list
    12   val term_frees: term -> term list
    26   val term_frees: term -> term list
       
    27   val term_consts: term -> string list
    13 end;
    28 end;
    14 
    29 
    15 structure OldTerm: OLD_TERM =
    30 structure OldTerm: OLD_TERM =
    16 struct
    31 struct
    17 
    32 
    18 (*Accumulates the Vars in the term, suppressing duplicates*)
    33 (*iterate a function over all types in a term*)
       
    34 fun it_term_types f =
       
    35 let fun iter(Const(_,T), a) = f(T,a)
       
    36       | iter(Free(_,T), a) = f(T,a)
       
    37       | iter(Var(_,T), a) = f(T,a)
       
    38       | iter(Abs(_,T,t), a) = iter(t,f(T,a))
       
    39       | iter(f$u, a) = iter(f, iter(u, a))
       
    40       | iter(Bound _, a) = a
       
    41 in iter end
       
    42 
       
    43 (*Accumulates the names of Frees in the term, suppressing duplicates.*)
       
    44 fun add_term_free_names (Free(a,_), bs) = insert (op =) a bs
       
    45   | add_term_free_names (f$u, bs) = add_term_free_names (f, add_term_free_names(u, bs))
       
    46   | add_term_free_names (Abs(_,_,t), bs) = add_term_free_names(t,bs)
       
    47   | add_term_free_names (_, bs) = bs;
       
    48 
       
    49 (*Accumulates the names in the term, suppressing duplicates.
       
    50   Includes Frees and Consts.  For choosing unambiguous bound var names.*)
       
    51 fun add_term_names (Const(a,_), bs) = insert (op =) (NameSpace.base a) bs
       
    52   | add_term_names (Free(a,_), bs) = insert (op =) a bs
       
    53   | add_term_names (f$u, bs) = add_term_names (f, add_term_names(u, bs))
       
    54   | add_term_names (Abs(_,_,t), bs) = add_term_names(t,bs)
       
    55   | add_term_names (_, bs) = bs;
       
    56 
       
    57 (*Accumulates the TVars in a type, suppressing duplicates.*)
       
    58 fun add_typ_tvars(Type(_,Ts),vs) = List.foldr add_typ_tvars vs Ts
       
    59   | add_typ_tvars(TFree(_),vs) = vs
       
    60   | add_typ_tvars(TVar(v),vs) = insert (op =) v vs;
       
    61 
       
    62 (*Accumulates the TFrees in a type, suppressing duplicates.*)
       
    63 fun add_typ_tfree_names(Type(_,Ts),fs) = List.foldr add_typ_tfree_names fs Ts
       
    64   | add_typ_tfree_names(TFree(f,_),fs) = insert (op =) f fs
       
    65   | add_typ_tfree_names(TVar(_),fs) = fs;
       
    66 
       
    67 fun add_typ_tfrees(Type(_,Ts),fs) = List.foldr add_typ_tfrees fs Ts
       
    68   | add_typ_tfrees(TFree(f),fs) = insert (op =) f fs
       
    69   | add_typ_tfrees(TVar(_),fs) = fs;
       
    70 
       
    71 (*Accumulates the TVars in a term, suppressing duplicates.*)
       
    72 val add_term_tvars = it_term_types add_typ_tvars;
       
    73 
       
    74 (*Accumulates the TFrees in a term, suppressing duplicates.*)
       
    75 val add_term_tfrees = it_term_types add_typ_tfrees;
       
    76 val add_term_tfree_names = it_term_types add_typ_tfree_names;
       
    77 
       
    78 fun add_term_consts (Const (c, _), cs) = insert (op =) c cs
       
    79   | add_term_consts (t $ u, cs) = add_term_consts (t, add_term_consts (u, cs))
       
    80   | add_term_consts (Abs (_, _, t), cs) = add_term_consts (t, cs)
       
    81   | add_term_consts (_, cs) = cs;
       
    82 
       
    83 (*Non-list versions*)
       
    84 fun typ_tfrees T = add_typ_tfrees(T,[]);
       
    85 fun typ_tvars T = add_typ_tvars(T,[]);
       
    86 fun term_tfrees t = add_term_tfrees(t,[]);
       
    87 fun term_tvars t = add_term_tvars(t,[]);
       
    88 fun term_consts t = add_term_consts(t,[]);
       
    89 
       
    90 
       
    91 (*Accumulates the Vars in the term, suppressing duplicates.*)
    19 fun add_term_vars (t, vars: term list) = case t of
    92 fun add_term_vars (t, vars: term list) = case t of
    20     Var   _ => OrdList.insert TermOrd.term_ord t vars
    93     Var   _ => OrdList.insert TermOrd.term_ord t vars
    21   | Abs (_,_,body) => add_term_vars(body,vars)
    94   | Abs (_,_,body) => add_term_vars(body,vars)
    22   | f$t =>  add_term_vars (f, add_term_vars(t, vars))
    95   | f$t =>  add_term_vars (f, add_term_vars(t, vars))
    23   | _ => vars;
    96   | _ => vars;
    24 
    97 
    25 fun term_vars t = add_term_vars(t,[]);
    98 fun term_vars t = add_term_vars(t,[]);
    26 
    99 
    27 (*Accumulates the Frees in the term, suppressing duplicates*)
   100 (*Accumulates the Frees in the term, suppressing duplicates.*)
    28 fun add_term_frees (t, frees: term list) = case t of
   101 fun add_term_frees (t, frees: term list) = case t of
    29     Free   _ => OrdList.insert TermOrd.term_ord t frees
   102     Free   _ => OrdList.insert TermOrd.term_ord t frees
    30   | Abs (_,_,body) => add_term_frees(body,frees)
   103   | Abs (_,_,body) => add_term_frees(body,frees)
    31   | f$t =>  add_term_frees (f, add_term_frees(t, frees))
   104   | f$t =>  add_term_frees (f, add_term_frees(t, frees))
    32   | _ => frees;
   105   | _ => frees;