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