| author | wenzelm | 
| Fri, 15 Oct 2021 19:25:31 +0200 | |
| changeset 74525 | c960bfcb91db | 
| parent 74446 | 2fdf37577f7b | 
| child 74577 | d4829a7333e2 | 
| permissions | -rw-r--r-- | 
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1  | 
(* Title: Pure/term.ML  | 
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
2  | 
Author: Lawrence C Paulson, Cambridge University Computer Laboratory  | 
| 29280 | 3  | 
Author: Makarius  | 
| 
1364
 
8ea1a962ad72
files now define a structure to allow SML/NJ to optimize the code
 
clasohm 
parents: 
1029 
diff
changeset
 | 
4  | 
|
| 4444 | 5  | 
Simply typed lambda-calculus: types, terms, and basic operations.  | 
| 0 | 6  | 
*)  | 
7  | 
||
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
8  | 
infix 9 $;  | 
| 
1364
 
8ea1a962ad72
files now define a structure to allow SML/NJ to optimize the code
 
clasohm 
parents: 
1029 
diff
changeset
 | 
9  | 
infixr 5 -->;  | 
| 4444 | 10  | 
infixr --->;  | 
11  | 
infix aconv;  | 
|
| 
1364
 
8ea1a962ad72
files now define a structure to allow SML/NJ to optimize the code
 
clasohm 
parents: 
1029 
diff
changeset
 | 
12  | 
|
| 4444 | 13  | 
signature BASIC_TERM =  | 
14  | 
sig  | 
|
| 34922 | 15  | 
type indexname = string * int  | 
16  | 
type class = string  | 
|
17  | 
type sort = class list  | 
|
18  | 
type arity = string * sort list * sort  | 
|
| 4444 | 19  | 
datatype typ =  | 
20  | 
Type of string * typ list |  | 
|
21  | 
TFree of string * sort |  | 
|
22  | 
TVar of indexname * sort  | 
|
| 16537 | 23  | 
datatype term =  | 
24  | 
Const of string * typ |  | 
|
25  | 
Free of string * typ |  | 
|
26  | 
Var of indexname * typ |  | 
|
27  | 
Bound of int |  | 
|
28  | 
Abs of string * typ * term |  | 
|
| 17756 | 29  | 
$ of term * term  | 
| 16537 | 30  | 
exception TYPE of string * typ list * term list  | 
31  | 
exception TERM of string * term list  | 
|
| 21353 | 32  | 
val dummyS: sort  | 
| 16710 | 33  | 
val dummyT: typ  | 
34  | 
val no_dummyT: typ -> typ  | 
|
| 4444 | 35  | 
val --> : typ * typ -> typ  | 
36  | 
val ---> : typ list * typ -> typ  | 
|
| 67703 | 37  | 
val is_Type: typ -> bool  | 
38  | 
val is_TFree: typ -> bool  | 
|
39  | 
val is_TVar: typ -> bool  | 
|
| 16710 | 40  | 
val dest_Type: typ -> string * typ list  | 
| 67703 | 41  | 
val dest_TFree: typ -> string * sort  | 
| 16710 | 42  | 
val dest_TVar: typ -> indexname * sort  | 
43  | 
val is_Bound: term -> bool  | 
|
44  | 
val is_Const: term -> bool  | 
|
45  | 
val is_Free: term -> bool  | 
|
46  | 
val is_Var: term -> bool  | 
|
47  | 
val dest_Const: term -> string * typ  | 
|
48  | 
val dest_Free: term -> string * typ  | 
|
49  | 
val dest_Var: term -> indexname * typ  | 
|
| 35227 | 50  | 
val dest_comb: term -> term * term  | 
| 4444 | 51  | 
val domain_type: typ -> typ  | 
| 4480 | 52  | 
val range_type: typ -> typ  | 
| 40840 | 53  | 
val dest_funT: typ -> typ * typ  | 
| 4444 | 54  | 
val binder_types: typ -> typ list  | 
55  | 
val body_type: typ -> typ  | 
|
56  | 
val strip_type: typ -> typ list * typ  | 
|
| 16710 | 57  | 
val type_of1: typ list * term -> typ  | 
| 4444 | 58  | 
val type_of: term -> typ  | 
| 16710 | 59  | 
val fastype_of1: typ list * term -> typ  | 
| 4444 | 60  | 
val fastype_of: term -> typ  | 
| 18927 | 61  | 
val strip_abs: term -> (string * typ) list * term  | 
| 4444 | 62  | 
val strip_abs_body: term -> term  | 
63  | 
val strip_abs_vars: term -> (string * typ) list  | 
|
64  | 
val strip_qnt_body: string -> term -> term  | 
|
65  | 
val strip_qnt_vars: string -> term -> (string * typ) list  | 
|
66  | 
val list_comb: term * term list -> term  | 
|
67  | 
val strip_comb: term -> term * term list  | 
|
68  | 
val head_of: term -> term  | 
|
69  | 
val size_of_term: term -> int  | 
|
| 
29882
 
29154e67731d
New command find_consts searching for constants by type (by Timothy Bourke).
 
kleing 
parents: 
29286 
diff
changeset
 | 
70  | 
val size_of_typ: typ -> int  | 
| 18847 | 71  | 
val map_atyps: (typ -> typ) -> typ -> typ  | 
72  | 
val map_aterms: (term -> term) -> term -> term  | 
|
| 4444 | 73  | 
val map_type_tvar: (indexname * sort -> typ) -> typ -> typ  | 
74  | 
val map_type_tfree: (string * sort -> typ) -> typ -> typ  | 
|
| 
20548
 
8ef25fe585a8
renamed Term.map_term_types to Term.map_types (cf. Term.fold_types);
 
wenzelm 
parents: 
20531 
diff
changeset
 | 
75  | 
val map_types: (typ -> typ) -> term -> term  | 
| 16943 | 76  | 
val fold_atyps: (typ -> 'a -> 'a) -> typ -> 'a -> 'a  | 
| 35986 | 77  | 
val fold_atyps_sorts: (typ * sort -> 'a -> 'a) -> typ -> 'a -> 'a  | 
| 16943 | 78  | 
val fold_aterms: (term -> 'a -> 'a) -> term -> 'a -> 'a  | 
79  | 
val fold_term_types: (term -> typ -> 'a -> 'a) -> term -> 'a -> 'a  | 
|
80  | 
val fold_types: (typ -> 'a -> 'a) -> term -> 'a -> 'a  | 
|
| 24483 | 81  | 
val burrow_types: (typ list -> typ list) -> term list -> term list  | 
| 16710 | 82  | 
val aconv: term * term -> bool  | 
| 4444 | 83  | 
val propT: typ  | 
84  | 
val strip_all_body: term -> term  | 
|
85  | 
val strip_all_vars: term -> (string * typ) list  | 
|
86  | 
val incr_bv: int * int * term -> term  | 
|
87  | 
val incr_boundvars: int -> term -> term  | 
|
88  | 
val add_loose_bnos: term * int * int list -> int list  | 
|
89  | 
val loose_bnos: term -> int list  | 
|
90  | 
val loose_bvar: term * int -> bool  | 
|
91  | 
val loose_bvar1: term * int -> bool  | 
|
92  | 
val subst_bounds: term list * term -> term  | 
|
93  | 
val subst_bound: term * term -> term  | 
|
94  | 
val betapply: term * term -> term  | 
|
| 18183 | 95  | 
val betapplys: term * term list -> term  | 
| 4444 | 96  | 
val subst_free: (term * term) list -> term -> term  | 
97  | 
val abstract_over: term * term -> term  | 
|
| 11922 | 98  | 
val lambda: term -> term -> term  | 
| 44241 | 99  | 
val absfree: string * typ -> term -> term  | 
100  | 
val absdummy: typ -> term -> term  | 
|
| 16710 | 101  | 
val subst_atomic: (term * term) list -> term -> term  | 
102  | 
val typ_subst_atomic: (typ * typ) list -> typ -> typ  | 
|
103  | 
val subst_atomic_types: (typ * typ) list -> term -> term  | 
|
104  | 
val typ_subst_TVars: (indexname * typ) list -> typ -> typ  | 
|
105  | 
val subst_TVars: (indexname * typ) list -> term -> term  | 
|
106  | 
val subst_Vars: (indexname * term) list -> term -> term  | 
|
107  | 
val subst_vars: (indexname * typ) list * (indexname * term) list -> term -> term  | 
|
108  | 
val is_first_order: string list -> term -> bool  | 
|
| 4444 | 109  | 
val maxidx_of_typ: typ -> int  | 
110  | 
val maxidx_of_typs: typ list -> int  | 
|
111  | 
val maxidx_of_term: term -> int  | 
|
| 61248 | 112  | 
val fold_subtypes: (typ -> 'a -> 'a) -> typ -> 'a -> 'a  | 
| 19909 | 113  | 
val exists_subtype: (typ -> bool) -> typ -> bool  | 
| 20531 | 114  | 
val exists_type: (typ -> bool) -> term -> bool  | 
| 16943 | 115  | 
val exists_subterm: (term -> bool) -> term -> bool  | 
| 16710 | 116  | 
val exists_Const: (string * typ -> bool) -> term -> bool  | 
| 4444 | 117  | 
end;  | 
| 0 | 118  | 
|
| 4444 | 119  | 
signature TERM =  | 
120  | 
sig  | 
|
121  | 
include BASIC_TERM  | 
|
| 19394 | 122  | 
val aT: sort -> typ  | 
123  | 
val itselfT: typ -> typ  | 
|
124  | 
val a_itselfT: typ  | 
|
| 22908 | 125  | 
val argument_type_of: term -> int -> typ  | 
| 
46219
 
426ed18eba43
discontinued old-style Term.list_abs in favour of plain Term.abs;
 
wenzelm 
parents: 
46218 
diff
changeset
 | 
126  | 
val abs: string * typ -> term -> term  | 
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
127  | 
val add_tvar_namesT: typ -> indexname list -> indexname list  | 
| 
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
128  | 
val add_tvar_names: term -> indexname list -> indexname list  | 
| 16943 | 129  | 
val add_tvarsT: typ -> (indexname * sort) list -> (indexname * sort) list  | 
130  | 
val add_tvars: term -> (indexname * sort) list -> (indexname * sort) list  | 
|
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
131  | 
val add_var_names: term -> indexname list -> indexname list  | 
| 16943 | 132  | 
val add_vars: term -> (indexname * typ) list -> (indexname * typ) list  | 
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
133  | 
val add_tfree_namesT: typ -> string list -> string list  | 
| 
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
134  | 
val add_tfree_names: term -> string list -> string list  | 
| 16943 | 135  | 
val add_tfreesT: typ -> (string * sort) list -> (string * sort) list  | 
136  | 
val add_tfrees: term -> (string * sort) list -> (string * sort) list  | 
|
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
137  | 
val add_free_names: term -> string list -> string list  | 
| 16943 | 138  | 
val add_frees: term -> (string * typ) list -> (string * typ) list  | 
| 29286 | 139  | 
val add_const_names: term -> string list -> string list  | 
140  | 
val add_consts: term -> (string * typ) list -> (string * typ) list  | 
|
| 25050 | 141  | 
val hidden_polymorphism: term -> (indexname * sort) list  | 
| 29278 | 142  | 
val declare_typ_names: typ -> Name.context -> Name.context  | 
143  | 
val declare_term_names: term -> Name.context -> Name.context  | 
|
144  | 
val declare_term_frees: term -> Name.context -> Name.context  | 
|
145  | 
val variant_frees: term -> (string * 'a) list -> (string * 'a) list  | 
|
146  | 
val rename_wrt_term: term -> (string * 'a) list -> (string * 'a) list  | 
|
| 
29269
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
147  | 
val eq_ix: indexname * indexname -> bool  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
148  | 
val eq_tvar: (indexname * sort) * (indexname * sort) -> bool  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
149  | 
val eq_var: (indexname * typ) * (indexname * typ) -> bool  | 
| 
33537
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
150  | 
val aconv_untyped: term * term -> bool  | 
| 
29269
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
151  | 
val could_unify: term * term -> bool  | 
| 20109 | 152  | 
val strip_abs_eta: int -> term -> (string * typ) list * term  | 
| 48263 | 153  | 
val match_bvars: (term * term) -> (string * string) list -> (string * string) list  | 
| 22031 | 154  | 
val map_abs_vars: (string -> string) -> term -> term  | 
| 12981 | 155  | 
val rename_abs: term -> term -> term -> term option  | 
| 
42083
 
e1209fc7ecdc
added Term.is_open and Term.is_dependent convenience, to cover common situations of loose bounds;
 
wenzelm 
parents: 
40844 
diff
changeset
 | 
156  | 
val is_open: term -> bool  | 
| 
 
e1209fc7ecdc
added Term.is_open and Term.is_dependent convenience, to cover common situations of loose bounds;
 
wenzelm 
parents: 
40844 
diff
changeset
 | 
157  | 
val is_dependent: term -> bool  | 
| 
61655
 
f217bbe4e93e
avoid vacuous quantification, as usual for shared variable scope;
 
wenzelm 
parents: 
61248 
diff
changeset
 | 
158  | 
val term_name: term -> string  | 
| 
60404
 
422b63ef0147
clarified abstracted term bindings (again, see c8384ff11711);
 
wenzelm 
parents: 
60311 
diff
changeset
 | 
159  | 
val dependent_lambda_name: string * term -> term -> term  | 
| 32198 | 160  | 
val lambda_name: string * term -> term -> term  | 
| 25050 | 161  | 
val close_schematic_term: term -> term  | 
| 16710 | 162  | 
val maxidx_typ: typ -> int -> int  | 
163  | 
val maxidx_typs: typ list -> int -> int  | 
|
164  | 
val maxidx_term: term -> int -> int  | 
|
| 63619 | 165  | 
val could_beta_contract: term -> bool  | 
166  | 
val could_eta_contract: term -> bool  | 
|
167  | 
val could_beta_eta_contract: term -> bool  | 
|
| 74446 | 168  | 
val used_free: string -> term -> bool  | 
| 
74525
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
169  | 
exception USED_FREE of string * term  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
170  | 
val dest_abs_fresh: string -> term -> (string * typ) * term  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
171  | 
val dest_abs_global: term -> (string * typ) * term  | 
| 18253 | 172  | 
val dummy_pattern: typ -> term  | 
| 45156 | 173  | 
val dummy: term  | 
174  | 
val dummy_prop: term  | 
|
| 22723 | 175  | 
val is_dummy_pattern: term -> bool  | 
| 24733 | 176  | 
val free_dummy_patterns: term -> Name.context -> term * Name.context  | 
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
177  | 
val no_dummy_patterns: term -> term  | 
| 24762 | 178  | 
val replace_dummy_patterns: term -> int -> term * int  | 
| 16035 | 179  | 
val show_dummy_patterns: term -> term  | 
| 
14786
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
180  | 
val string_of_vname: indexname -> string  | 
| 
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
181  | 
val string_of_vname': indexname -> string  | 
| 4444 | 182  | 
end;  | 
183  | 
||
184  | 
structure Term: TERM =  | 
|
| 
1364
 
8ea1a962ad72
files now define a structure to allow SML/NJ to optimize the code
 
clasohm 
parents: 
1029 
diff
changeset
 | 
185  | 
struct  | 
| 0 | 186  | 
|
187  | 
(*Indexnames can be quickly renamed by adding an offset to the integer part,  | 
|
188  | 
for resolution.*)  | 
|
| 16537 | 189  | 
type indexname = string * int;  | 
| 0 | 190  | 
|
| 63611 | 191  | 
(*Types are classified by sorts.*)  | 
| 0 | 192  | 
type class = string;  | 
193  | 
type sort = class list;  | 
|
| 
14829
 
cfa5fe01a7b7
moved read_int etc. to library.ML; added type 'arity';
 
wenzelm 
parents: 
14786 
diff
changeset
 | 
194  | 
type arity = string * sort list * sort;  | 
| 0 | 195  | 
|
| 63611 | 196  | 
(*The sorts attached to TFrees and TVars specify the sort of that variable.*)  | 
| 0 | 197  | 
datatype typ = Type of string * typ list  | 
198  | 
| TFree of string * sort  | 
|
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
199  | 
| TVar of indexname * sort;  | 
| 0 | 200  | 
|
| 
6033
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
201  | 
(*Terms. Bound variables are indicated by depth number.  | 
| 0 | 202  | 
Free variables, (scheme) variables and constants have names.  | 
| 4626 | 203  | 
An term is "closed" if every bound variable of level "lev"  | 
| 13000 | 204  | 
is enclosed by at least "lev" abstractions.  | 
| 0 | 205  | 
|
206  | 
It is possible to create meaningless terms containing loose bound vars  | 
|
207  | 
or type mismatches. But such terms are not allowed in rules. *)  | 
|
208  | 
||
| 13000 | 209  | 
datatype term =  | 
| 0 | 210  | 
Const of string * typ  | 
| 13000 | 211  | 
| Free of string * typ  | 
| 0 | 212  | 
| Var of indexname * typ  | 
213  | 
| Bound of int  | 
|
214  | 
| Abs of string*typ*term  | 
|
| 3965 | 215  | 
| op $ of term*term;  | 
| 0 | 216  | 
|
| 16537 | 217  | 
(*Errors involving type mismatches*)  | 
| 0 | 218  | 
exception TYPE of string * typ list * term list;  | 
219  | 
||
| 16537 | 220  | 
(*Errors errors involving terms*)  | 
| 0 | 221  | 
exception TERM of string * term list;  | 
222  | 
||
223  | 
(*Note variable naming conventions!  | 
|
224  | 
a,b,c: string  | 
|
225  | 
f,g,h: functions (including terms of function type)  | 
|
226  | 
i,j,m,n: int  | 
|
227  | 
t,u: term  | 
|
228  | 
v,w: indexnames  | 
|
229  | 
x,y: any  | 
|
230  | 
A,B,C: term (denoting formulae)  | 
|
231  | 
T,U: typ  | 
|
232  | 
*)  | 
|
233  | 
||
234  | 
||
| 
6033
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
235  | 
(** Types **)  | 
| 
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
236  | 
|
| 21353 | 237  | 
(*dummies for type-inference etc.*)  | 
238  | 
val dummyS = [""];  | 
|
| 16537 | 239  | 
val dummyT = Type ("dummy", []);
 | 
240  | 
||
241  | 
fun no_dummyT typ =  | 
|
242  | 
let  | 
|
243  | 
    fun check (T as Type ("dummy", _)) =
 | 
|
244  | 
          raise TYPE ("Illegal occurrence of '_' dummy type", [T], [])
 | 
|
245  | 
| check (Type (_, Ts)) = List.app check Ts  | 
|
246  | 
| check _ = ();  | 
|
247  | 
in check typ; typ end;  | 
|
248  | 
||
| 
6033
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
249  | 
fun S --> T = Type("fun",[S,T]);
 | 
| 
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
250  | 
|
| 
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
251  | 
(*handy for multiple args: [T1,...,Tn]--->T gives T1-->(T2--> ... -->T)*)  | 
| 15570 | 252  | 
val op ---> = Library.foldr (op -->);  | 
| 
6033
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
253  | 
|
| 67703 | 254  | 
|
255  | 
(** Discriminators **)  | 
|
256  | 
||
257  | 
fun is_Type (Type _) = true  | 
|
258  | 
| is_Type _ = false;  | 
|
259  | 
||
260  | 
fun is_TFree (TFree _) = true  | 
|
261  | 
| is_TFree _ = false;  | 
|
262  | 
||
263  | 
fun is_TVar (TVar _) = true  | 
|
264  | 
| is_TVar _ = false;  | 
|
265  | 
||
266  | 
||
267  | 
(** Destructors **)  | 
|
268  | 
||
| 
6033
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
269  | 
fun dest_Type (Type x) = x  | 
| 
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
270  | 
  | dest_Type T = raise TYPE ("dest_Type", [T], []);
 | 
| 67703 | 271  | 
|
272  | 
fun dest_TFree (TFree x) = x  | 
|
273  | 
  | dest_TFree T = raise TYPE ("dest_TFree", [T], []);
 | 
|
274  | 
||
| 15914 | 275  | 
fun dest_TVar (TVar x) = x  | 
276  | 
  | dest_TVar T = raise TYPE ("dest_TVar", [T], []);
 | 
|
| 
6033
 
c8c69a4a7762
moved dest_Type to term.ML from HOL/Tools/primrec_package
 
paulson 
parents: 
5986 
diff
changeset
 | 
277  | 
|
| 16537 | 278  | 
|
| 0 | 279  | 
(** Discriminators **)  | 
280  | 
||
| 7318 | 281  | 
fun is_Bound (Bound _) = true  | 
282  | 
| is_Bound _ = false;  | 
|
283  | 
||
| 0 | 284  | 
fun is_Const (Const _) = true  | 
285  | 
| is_Const _ = false;  | 
|
286  | 
||
287  | 
fun is_Free (Free _) = true  | 
|
288  | 
| is_Free _ = false;  | 
|
289  | 
||
290  | 
fun is_Var (Var _) = true  | 
|
291  | 
| is_Var _ = false;  | 
|
292  | 
||
| 16537 | 293  | 
|
| 0 | 294  | 
(** Destructors **)  | 
295  | 
||
296  | 
fun dest_Const (Const x) = x  | 
|
297  | 
  | dest_Const t = raise TERM("dest_Const", [t]);
 | 
|
298  | 
||
299  | 
fun dest_Free (Free x) = x  | 
|
300  | 
  | dest_Free t = raise TERM("dest_Free", [t]);
 | 
|
301  | 
||
302  | 
fun dest_Var (Var x) = x  | 
|
303  | 
  | dest_Var t = raise TERM("dest_Var", [t]);
 | 
|
304  | 
||
| 35227 | 305  | 
fun dest_comb (t1 $ t2) = (t1, t2)  | 
306  | 
  | dest_comb t = raise TERM("dest_comb", [t]);
 | 
|
307  | 
||
| 0 | 308  | 
|
| 40841 | 309  | 
fun domain_type (Type ("fun", [T, _])) = T;
 | 
310  | 
||
311  | 
fun range_type (Type ("fun", [_, U])) = U;
 | 
|
| 4064 | 312  | 
|
| 40840 | 313  | 
fun dest_funT (Type ("fun", [T, U])) = (T, U)
 | 
314  | 
  | dest_funT T = raise TYPE ("dest_funT", [T], []);
 | 
|
315  | 
||
316  | 
||
| 63611 | 317  | 
(*maps [T1,...,Tn]--->T to the list [T1,T2,...,Tn]*)  | 
| 40841 | 318  | 
fun binder_types (Type ("fun", [T, U])) = T :: binder_types U
 | 
319  | 
| binder_types _ = [];  | 
|
| 0 | 320  | 
|
| 63611 | 321  | 
(*maps [T1,...,Tn]--->T to T*)  | 
| 40841 | 322  | 
fun body_type (Type ("fun", [_, U])) = body_type U
 | 
323  | 
| body_type T = T;  | 
|
| 0 | 324  | 
|
| 63611 | 325  | 
(*maps [T1,...,Tn]--->T to ([T1,T2,...,Tn], T)*)  | 
| 40841 | 326  | 
fun strip_type T = (binder_types T, body_type T);  | 
| 0 | 327  | 
|
328  | 
||
329  | 
(*Compute the type of the term, checking that combinations are well-typed  | 
|
330  | 
Ts = [T0,T1,...] holds types of bound variables 0, 1, ...*)  | 
|
331  | 
fun type_of1 (Ts, Const (_,T)) = T  | 
|
332  | 
| type_of1 (Ts, Free (_,T)) = T  | 
|
| 30146 | 333  | 
| type_of1 (Ts, Bound i) = (nth Ts i  | 
| 43278 | 334  | 
        handle General.Subscript => raise TYPE("type_of: bound variable", [], [Bound i]))
 | 
| 0 | 335  | 
| type_of1 (Ts, Var (_,T)) = T  | 
336  | 
| type_of1 (Ts, Abs (_,T,body)) = T --> type_of1(T::Ts, body)  | 
|
| 13000 | 337  | 
| type_of1 (Ts, f$u) =  | 
| 0 | 338  | 
let val U = type_of1(Ts,u)  | 
339  | 
and T = type_of1(Ts,f)  | 
|
340  | 
in case T of  | 
|
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
341  | 
            Type("fun",[T1,T2]) =>
 | 
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
342  | 
if T1=U then T2 else raise TYPE  | 
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
343  | 
                    ("type_of: type mismatch in application", [T1,U], [f$u])
 | 
| 13000 | 344  | 
| _ => raise TYPE  | 
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
345  | 
                    ("type_of: function type is expected in application",
 | 
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
346  | 
[T,U], [f$u])  | 
| 0 | 347  | 
end;  | 
348  | 
||
349  | 
fun type_of t : typ = type_of1 ([],t);  | 
|
350  | 
||
| 
73351
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
351  | 
(*Determine the type of a term, with minimal checking*)  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
352  | 
local  | 
| 61 | 353  | 
|
| 
73351
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
354  | 
fun fastype_of_term Ts (Abs (_, T, t)) = T --> fastype_of_term (T :: Ts) t  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
355  | 
| fastype_of_term Ts (t $ _) = range_type_of Ts t  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
356  | 
| fastype_of_term Ts a = fastype_of_atom Ts a  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
357  | 
and fastype_of_atom _ (Const (_, T)) = T  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
358  | 
| fastype_of_atom _ (Free (_, T)) = T  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
359  | 
| fastype_of_atom _ (Var (_, T)) = T  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
360  | 
| fastype_of_atom Ts (Bound i) = fastype_of_bound Ts i  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
361  | 
and fastype_of_bound (T :: Ts) i = if i = 0 then T else fastype_of_bound Ts (i - 1)  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
362  | 
  | fastype_of_bound [] i = raise TERM ("fastype_of: Bound", [Bound i])
 | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
363  | 
and range_type_of Ts (Abs (_, T, u)) = fastype_of_term (T :: Ts) u  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
364  | 
| range_type_of Ts (t $ u) = range_type_ofT (t $ u) (range_type_of Ts t)  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
365  | 
| range_type_of Ts a = range_type_ofT a (fastype_of_atom Ts a)  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
366  | 
and range_type_ofT _ (Type ("fun", [_, T])) = T
 | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
367  | 
  | range_type_ofT t _ = raise TERM ("fastype_of: expected function type", [t]);
 | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
368  | 
|
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
369  | 
in  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
370  | 
|
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
371  | 
val fastype_of1 = uncurry fastype_of_term;  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
372  | 
val fastype_of = fastype_of_term [];  | 
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
373  | 
|
| 
 
88dd8a6a42ba
slightly more efficient Term.fastype_of (only little impact in regular applications);
 
wenzelm 
parents: 
67721 
diff
changeset
 | 
374  | 
end;  | 
| 0 | 375  | 
|
| 16678 | 376  | 
(*Determine the argument type of a function*)  | 
| 22908 | 377  | 
fun argument_type_of tm k =  | 
| 16678 | 378  | 
let  | 
379  | 
    fun argT i (Type ("fun", [T, U])) = if i = 0 then T else argT (i - 1) U
 | 
|
380  | 
      | argT _ T = raise TYPE ("argument_type_of", [T], []);
 | 
|
381  | 
||
382  | 
fun arg 0 _ (Abs (_, T, _)) = T  | 
|
383  | 
| arg i Ts (Abs (_, T, t)) = arg (i - 1) (T :: Ts) t  | 
|
384  | 
| arg i Ts (t $ _) = arg (i + 1) Ts t  | 
|
385  | 
| arg i Ts a = argT i (fastype_of1 (Ts, a));  | 
|
| 22908 | 386  | 
in arg k [] tm end;  | 
| 16678 | 387  | 
|
| 0 | 388  | 
|
| 
46219
 
426ed18eba43
discontinued old-style Term.list_abs in favour of plain Term.abs;
 
wenzelm 
parents: 
46218 
diff
changeset
 | 
389  | 
fun abs (x, T) t = Abs (x, T, t);  | 
| 10806 | 390  | 
|
| 18927 | 391  | 
fun strip_abs (Abs (a, T, t)) =  | 
392  | 
let val (a', t') = strip_abs t  | 
|
393  | 
in ((a, T) :: a', t') end  | 
|
394  | 
| strip_abs t = ([], t);  | 
|
395  | 
||
| 63611 | 396  | 
(*maps (x1,...,xn)t to t*)  | 
| 13000 | 397  | 
fun strip_abs_body (Abs(_,_,t)) = strip_abs_body t  | 
| 0 | 398  | 
| strip_abs_body u = u;  | 
399  | 
||
| 63611 | 400  | 
(*maps (x1,...,xn)t to [x1, ..., xn]*)  | 
| 13000 | 401  | 
fun strip_abs_vars (Abs(a,T,t)) = (a,T) :: strip_abs_vars t  | 
| 0 | 402  | 
| strip_abs_vars u = [] : (string*typ) list;  | 
403  | 
||
404  | 
||
405  | 
fun strip_qnt_body qnt =  | 
|
406  | 
let fun strip(tm as Const(c,_)$Abs(_,_,t)) = if c=qnt then strip t else tm  | 
|
407  | 
| strip t = t  | 
|
408  | 
in strip end;  | 
|
409  | 
||
410  | 
fun strip_qnt_vars qnt =  | 
|
411  | 
let fun strip(Const(c,_)$Abs(a,T,t)) = if c=qnt then (a,T)::strip t else []  | 
|
412  | 
| strip t = [] : (string*typ) list  | 
|
413  | 
in strip end;  | 
|
414  | 
||
415  | 
||
| 63611 | 416  | 
(*maps (f, [t1,...,tn]) to f(t1,...,tn)*)  | 
| 15570 | 417  | 
val list_comb : term * term list -> term = Library.foldl (op $);  | 
| 0 | 418  | 
|
419  | 
||
| 63611 | 420  | 
(*maps f(t1,...,tn) to (f, [t1,...,tn]) ; naturally tail-recursive*)  | 
| 13000 | 421  | 
fun strip_comb u : term * term list =  | 
| 0 | 422  | 
let fun stripc (f$t, ts) = stripc (f, t::ts)  | 
| 13000 | 423  | 
| stripc x = x  | 
| 0 | 424  | 
in stripc(u,[]) end;  | 
425  | 
||
426  | 
||
| 63611 | 427  | 
(*maps f(t1,...,tn) to f , which is never a combination*)  | 
| 0 | 428  | 
fun head_of (f$t) = head_of f  | 
429  | 
| head_of u = u;  | 
|
430  | 
||
| 16599 | 431  | 
(*number of atoms and abstractions in a term*)  | 
432  | 
fun size_of_term tm =  | 
|
433  | 
let  | 
|
| 
30144
 
56ae4893e8ae
tuned/unified size_of_term and size_of_typ, eliminated obsolete foldl;
 
wenzelm 
parents: 
29882 
diff
changeset
 | 
434  | 
fun add_size (t $ u) n = add_size t (add_size u n)  | 
| 
 
56ae4893e8ae
tuned/unified size_of_term and size_of_typ, eliminated obsolete foldl;
 
wenzelm 
parents: 
29882 
diff
changeset
 | 
435  | 
| add_size (Abs (_ ,_, t)) n = add_size t (n + 1)  | 
| 
 
56ae4893e8ae
tuned/unified size_of_term and size_of_typ, eliminated obsolete foldl;
 
wenzelm 
parents: 
29882 
diff
changeset
 | 
436  | 
| add_size _ n = n + 1;  | 
| 
 
56ae4893e8ae
tuned/unified size_of_term and size_of_typ, eliminated obsolete foldl;
 
wenzelm 
parents: 
29882 
diff
changeset
 | 
437  | 
in add_size tm 0 end;  | 
| 0 | 438  | 
|
| 
30144
 
56ae4893e8ae
tuned/unified size_of_term and size_of_typ, eliminated obsolete foldl;
 
wenzelm 
parents: 
29882 
diff
changeset
 | 
439  | 
(*number of atoms and constructors in a type*)  | 
| 
29882
 
29154e67731d
New command find_consts searching for constants by type (by Timothy Bourke).
 
kleing 
parents: 
29286 
diff
changeset
 | 
440  | 
fun size_of_typ ty =  | 
| 
 
29154e67731d
New command find_consts searching for constants by type (by Timothy Bourke).
 
kleing 
parents: 
29286 
diff
changeset
 | 
441  | 
let  | 
| 
30144
 
56ae4893e8ae
tuned/unified size_of_term and size_of_typ, eliminated obsolete foldl;
 
wenzelm 
parents: 
29882 
diff
changeset
 | 
442  | 
fun add_size (Type (_, tys)) n = fold add_size tys (n + 1)  | 
| 
 
56ae4893e8ae
tuned/unified size_of_term and size_of_typ, eliminated obsolete foldl;
 
wenzelm 
parents: 
29882 
diff
changeset
 | 
443  | 
| add_size _ n = n + 1;  | 
| 
 
56ae4893e8ae
tuned/unified size_of_term and size_of_typ, eliminated obsolete foldl;
 
wenzelm 
parents: 
29882 
diff
changeset
 | 
444  | 
in add_size ty 0 end;  | 
| 
29882
 
29154e67731d
New command find_consts searching for constants by type (by Timothy Bourke).
 
kleing 
parents: 
29286 
diff
changeset
 | 
445  | 
|
| 18847 | 446  | 
fun map_atyps f (Type (a, Ts)) = Type (a, map (map_atyps f) Ts)  | 
| 
18976
 
4efb82669880
fixed the most silly bug conceivable in map_atyps
 
haftmann 
parents: 
18975 
diff
changeset
 | 
447  | 
| map_atyps f T = f T;  | 
| 18847 | 448  | 
|
449  | 
fun map_aterms f (t $ u) = map_aterms f t $ map_aterms f u  | 
|
450  | 
| map_aterms f (Abs (a, T, t)) = Abs (a, T, map_aterms f t)  | 
|
451  | 
| map_aterms f t = f t;  | 
|
452  | 
||
| 18981 | 453  | 
fun map_type_tvar f = map_atyps (fn TVar x => f x | T => T);  | 
454  | 
fun map_type_tfree f = map_atyps (fn TFree x => f x | T => T);  | 
|
| 
949
 
83c588d6fee9
Changed treatment of during type inference internally generated type
 
nipkow 
parents: 
728 
diff
changeset
 | 
455  | 
|
| 
20548
 
8ef25fe585a8
renamed Term.map_term_types to Term.map_types (cf. Term.fold_types);
 
wenzelm 
parents: 
20531 
diff
changeset
 | 
456  | 
fun map_types f =  | 
| 16678 | 457  | 
let  | 
458  | 
fun map_aux (Const (a, T)) = Const (a, f T)  | 
|
459  | 
| map_aux (Free (a, T)) = Free (a, f T)  | 
|
460  | 
| map_aux (Var (v, T)) = Var (v, f T)  | 
|
| 39293 | 461  | 
| map_aux (Bound i) = Bound i  | 
| 16678 | 462  | 
| map_aux (Abs (a, T, t)) = Abs (a, f T, map_aux t)  | 
463  | 
| map_aux (t $ u) = map_aux t $ map_aux u;  | 
|
464  | 
in map_aux end;  | 
|
| 0 | 465  | 
|
466  | 
||
| 16943 | 467  | 
(* fold types and terms *)  | 
468  | 
||
469  | 
fun fold_atyps f (Type (_, Ts)) = fold (fold_atyps f) Ts  | 
|
470  | 
| fold_atyps f T = f T;  | 
|
471  | 
||
| 35986 | 472  | 
fun fold_atyps_sorts f =  | 
473  | 
fold_atyps (fn T as TFree (_, S) => f (T, S) | T as TVar (_, S) => f (T, S));  | 
|
474  | 
||
| 16943 | 475  | 
fun fold_aterms f (t $ u) = fold_aterms f t #> fold_aterms f u  | 
476  | 
| fold_aterms f (Abs (_, _, t)) = fold_aterms f t  | 
|
477  | 
| fold_aterms f a = f a;  | 
|
478  | 
||
479  | 
fun fold_term_types f (t as Const (_, T)) = f t T  | 
|
480  | 
| fold_term_types f (t as Free (_, T)) = f t T  | 
|
481  | 
| fold_term_types f (t as Var (_, T)) = f t T  | 
|
482  | 
| fold_term_types f (Bound _) = I  | 
|
483  | 
| fold_term_types f (t as Abs (_, T, b)) = f t T #> fold_term_types f b  | 
|
484  | 
| fold_term_types f (t $ u) = fold_term_types f t #> fold_term_types f u;  | 
|
485  | 
||
486  | 
fun fold_types f = fold_term_types (K f);  | 
|
487  | 
||
| 24483 | 488  | 
fun replace_types (Const (c, _)) (T :: Ts) = (Const (c, T), Ts)  | 
489  | 
| replace_types (Free (x, _)) (T :: Ts) = (Free (x, T), Ts)  | 
|
490  | 
| replace_types (Var (xi, _)) (T :: Ts) = (Var (xi, T), Ts)  | 
|
491  | 
| replace_types (Bound i) Ts = (Bound i, Ts)  | 
|
492  | 
| replace_types (Abs (x, _, b)) (T :: Ts) =  | 
|
493  | 
let val (b', Ts') = replace_types b Ts  | 
|
494  | 
in (Abs (x, T, b'), Ts') end  | 
|
495  | 
| replace_types (t $ u) Ts =  | 
|
496  | 
let  | 
|
497  | 
val (t', Ts') = replace_types t Ts;  | 
|
498  | 
val (u', Ts'') = replace_types u Ts';  | 
|
499  | 
in (t' $ u', Ts'') end;  | 
|
500  | 
||
501  | 
fun burrow_types f ts =  | 
|
502  | 
let  | 
|
| 
49674
 
dbadb4d03cbc
report sort assignment of visible type variables;
 
wenzelm 
parents: 
48263 
diff
changeset
 | 
503  | 
val Ts = rev ((fold o fold_types) cons ts []);  | 
| 24483 | 504  | 
val Ts' = f Ts;  | 
505  | 
val (ts', []) = fold_map replace_types ts Ts';  | 
|
506  | 
in ts' end;  | 
|
507  | 
||
| 16943 | 508  | 
(*collect variables*)  | 
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
509  | 
val add_tvar_namesT = fold_atyps (fn TVar (xi, _) => insert (op =) xi | _ => I);  | 
| 
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
510  | 
val add_tvar_names = fold_types add_tvar_namesT;  | 
| 16943 | 511  | 
val add_tvarsT = fold_atyps (fn TVar v => insert (op =) v | _ => I);  | 
512  | 
val add_tvars = fold_types add_tvarsT;  | 
|
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
513  | 
val add_var_names = fold_aterms (fn Var (xi, _) => insert (op =) xi | _ => I);  | 
| 16943 | 514  | 
val add_vars = fold_aterms (fn Var v => insert (op =) v | _ => I);  | 
| 33697 | 515  | 
val add_tfree_namesT = fold_atyps (fn TFree (a, _) => insert (op =) a | _ => I);  | 
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
516  | 
val add_tfree_names = fold_types add_tfree_namesT;  | 
| 16943 | 517  | 
val add_tfreesT = fold_atyps (fn TFree v => insert (op =) v | _ => I);  | 
518  | 
val add_tfrees = fold_types add_tfreesT;  | 
|
| 
29257
 
660234d959f7
provide canonical add_tvar_namesT, add_tvar_names, add_tfree_namesT, add_tfree_names, add_free_names;
 
wenzelm 
parents: 
29256 
diff
changeset
 | 
519  | 
val add_free_names = fold_aterms (fn Free (x, _) => insert (op =) x | _ => I);  | 
| 16943 | 520  | 
val add_frees = fold_aterms (fn Free v => insert (op =) v | _ => I);  | 
| 29286 | 521  | 
val add_const_names = fold_aterms (fn Const (c, _) => insert (op =) c | _ => I);  | 
522  | 
val add_consts = fold_aterms (fn Const c => insert (op =) c | _ => I);  | 
|
| 16943 | 523  | 
|
| 25050 | 524  | 
(*extra type variables in a term, not covered by its type*)  | 
525  | 
fun hidden_polymorphism t =  | 
|
| 21682 | 526  | 
let  | 
| 25050 | 527  | 
val T = fastype_of t;  | 
| 21682 | 528  | 
val tvarsT = add_tvarsT T [];  | 
529  | 
val extra_tvars = fold_types (fold_atyps  | 
|
530  | 
(fn TVar v => if member (op =) tvarsT v then I else insert (op =) v | _ => I)) t [];  | 
|
531  | 
in extra_tvars end;  | 
|
532  | 
||
| 16943 | 533  | 
|
| 29278 | 534  | 
(* renaming variables *)  | 
535  | 
||
536  | 
val declare_typ_names = fold_atyps (fn TFree (a, _) => Name.declare a | _ => I);  | 
|
537  | 
||
538  | 
fun declare_term_names tm =  | 
|
539  | 
fold_aterms  | 
|
| 
30364
 
577edc39b501
moved basic algebra of long names from structure NameSpace to Long_Name;
 
wenzelm 
parents: 
30285 
diff
changeset
 | 
540  | 
(fn Const (a, _) => Name.declare (Long_Name.base_name a)  | 
| 29278 | 541  | 
| Free (a, _) => Name.declare a  | 
542  | 
| _ => I) tm #>  | 
|
543  | 
fold_types declare_typ_names tm;  | 
|
544  | 
||
545  | 
val declare_term_frees = fold_aterms (fn Free (x, _) => Name.declare x | _ => I);  | 
|
546  | 
||
547  | 
fun variant_frees t frees =  | 
|
| 
43326
 
47cf4bc789aa
simplified Name.variant -- discontinued builtin fold_map;
 
wenzelm 
parents: 
43324 
diff
changeset
 | 
548  | 
fst (fold_map Name.variant (map fst frees) (declare_term_names t Name.context)) ~~  | 
| 
 
47cf4bc789aa
simplified Name.variant -- discontinued builtin fold_map;
 
wenzelm 
parents: 
43324 
diff
changeset
 | 
549  | 
map snd frees;  | 
| 29278 | 550  | 
|
551  | 
fun rename_wrt_term t frees = rev (variant_frees t frees); (*reversed result!*)  | 
|
552  | 
||
553  | 
||
| 25050 | 554  | 
|
| 
29269
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
555  | 
(** Comparing terms **)  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
556  | 
|
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
557  | 
(* variables *)  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
558  | 
|
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
559  | 
fun eq_ix ((x, i): indexname, (y, j)) = i = j andalso x = y;  | 
| 16537 | 560  | 
|
| 
29269
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
561  | 
fun eq_tvar ((xi, S: sort), (xi', S')) = eq_ix (xi, xi') andalso S = S';  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
562  | 
fun eq_var ((xi, T: typ), (xi', T')) = eq_ix (xi, xi') andalso T = T';  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
563  | 
|
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
564  | 
|
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
565  | 
(* alpha equivalence *)  | 
| 20511 | 566  | 
|
567  | 
fun tm1 aconv tm2 =  | 
|
568  | 
pointer_eq (tm1, tm2) orelse  | 
|
569  | 
(case (tm1, tm2) of  | 
|
570  | 
(t1 $ u1, t2 $ u2) => t1 aconv t2 andalso u1 aconv u2  | 
|
571  | 
| (Abs (_, T1, t1), Abs (_, T2, t2)) => t1 aconv t2 andalso T1 = T2  | 
|
572  | 
| (a1, a2) => a1 = a2);  | 
|
573  | 
||
| 
33537
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
574  | 
fun aconv_untyped (tm1, tm2) =  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
575  | 
pointer_eq (tm1, tm2) orelse  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
576  | 
(case (tm1, tm2) of  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
577  | 
(t1 $ u1, t2 $ u2) => aconv_untyped (t1, t2) andalso aconv_untyped (u1, u2)  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
578  | 
| (Abs (_, _, t1), Abs (_, _, t2)) => aconv_untyped (t1, t2)  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
579  | 
| (Const (a, _), Const (b, _)) => a = b  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
580  | 
| (Free (x, _), Free (y, _)) => x = y  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
581  | 
| (Var (xi, _), Var (yj, _)) => xi = yj  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
582  | 
| (Bound i, Bound j) => i = j  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
583  | 
| _ => false);  | 
| 
 
06c87d2c5b5a
locale_const/target_notation: uniform use of Term.aconv_untyped;
 
wenzelm 
parents: 
33063 
diff
changeset
 | 
584  | 
|
| 20511 | 585  | 
|
| 
29269
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
586  | 
(*A fast unification filter: true unless the two terms cannot be unified.  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
587  | 
Terms must be NORMAL. Treats all Vars as distinct. *)  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
588  | 
fun could_unify (t, u) =  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
589  | 
let  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
590  | 
fun matchrands (f $ t) (g $ u) = could_unify (t, u) andalso matchrands f g  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
591  | 
| matchrands _ _ = true;  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
592  | 
in  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
593  | 
case (head_of t, head_of u) of  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
594  | 
(_, Var _) => true  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
595  | 
| (Var _, _) => true  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
596  | 
| (Const (a, _), Const (b, _)) => a = b andalso matchrands t u  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
597  | 
| (Free (a, _), Free (b, _)) => a = b andalso matchrands t u  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
598  | 
| (Bound i, Bound j) => i = j andalso matchrands t u  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
599  | 
| (Abs _, _) => true (*because of possible eta equality*)  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
600  | 
| (_, Abs _) => true  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
601  | 
| _ => false  | 
| 
 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 
wenzelm 
parents: 
29265 
diff
changeset
 | 
602  | 
end;  | 
| 16678 | 603  | 
|
| 16570 | 604  | 
|
| 16537 | 605  | 
|
| 0 | 606  | 
(** Connectives of higher order logic **)  | 
607  | 
||
| 24850 | 608  | 
fun aT S = TFree (Name.aT, S);  | 
| 19394 | 609  | 
|
| 375 | 610  | 
fun itselfT ty = Type ("itself", [ty]);
 | 
| 24850 | 611  | 
val a_itselfT = itselfT (TFree (Name.aT, []));  | 
| 375 | 612  | 
|
| 
46217
 
7b19666f0e3d
renamed Term.all to Logic.all_const, in accordance to HOLogic.all_const;
 
wenzelm 
parents: 
46215 
diff
changeset
 | 
613  | 
val propT : typ = Type ("prop",[]);
 | 
| 0 | 614  | 
|
| 67721 | 615  | 
(*maps \<And>x1...xn. t to t*)  | 
| 60311 | 616  | 
fun strip_all_body (Const ("Pure.all", _) $ Abs (_, _, t)) = strip_all_body t
 | 
617  | 
| strip_all_body t = t;  | 
|
| 0 | 618  | 
|
| 67721 | 619  | 
(*maps \<And>x1...xn. t to [x1, ..., xn]*)  | 
| 60311 | 620  | 
fun strip_all_vars (Const ("Pure.all", _) $ Abs (a, T, t)) = (a, T) :: strip_all_vars t
 | 
621  | 
| strip_all_vars t = [];  | 
|
| 0 | 622  | 
|
623  | 
(*increments a term's non-local bound variables  | 
|
624  | 
required when moving a term within abstractions  | 
|
625  | 
inc is increment for bound variables  | 
|
626  | 
lev is level at which a bound variable is considered 'loose'*)  | 
|
| 13000 | 627  | 
fun incr_bv (inc, lev, u as Bound i) = if i>=lev then Bound(i+inc) else u  | 
| 0 | 628  | 
| incr_bv (inc, lev, Abs(a,T,body)) =  | 
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
629  | 
Abs(a, T, incr_bv(inc,lev+1,body))  | 
| 13000 | 630  | 
| incr_bv (inc, lev, f$t) =  | 
| 0 | 631  | 
incr_bv(inc,lev,f) $ incr_bv(inc,lev,t)  | 
632  | 
| incr_bv (inc, lev, u) = u;  | 
|
633  | 
||
634  | 
fun incr_boundvars 0 t = t  | 
|
635  | 
| incr_boundvars inc t = incr_bv(inc,0,t);  | 
|
636  | 
||
| 12981 | 637  | 
(*Scan a pair of terms; while they are similar,  | 
638  | 
accumulate corresponding bound vars in "al"*)  | 
|
639  | 
fun match_bvs(Abs(x,_,s),Abs(y,_,t), al) =  | 
|
640  | 
match_bvs(s, t, if x="" orelse y="" then al  | 
|
641  | 
else (x,y)::al)  | 
|
642  | 
| match_bvs(f$s, g$t, al) = match_bvs(f,g,match_bvs(s,t,al))  | 
|
643  | 
| match_bvs(_,_,al) = al;  | 
|
644  | 
||
645  | 
(* strip abstractions created by parameters *)  | 
|
| 48263 | 646  | 
fun match_bvars (s,t) al = match_bvs(strip_abs_body s, strip_abs_body t, al);  | 
| 12981 | 647  | 
|
| 22031 | 648  | 
fun map_abs_vars f (t $ u) = map_abs_vars f t $ map_abs_vars f u  | 
649  | 
| map_abs_vars f (Abs (a, T, t)) = Abs (f a, T, map_abs_vars f t)  | 
|
650  | 
| map_abs_vars f t = t;  | 
|
651  | 
||
| 12981 | 652  | 
fun rename_abs pat obj t =  | 
653  | 
let  | 
|
654  | 
val ren = match_bvs (pat, obj, []);  | 
|
655  | 
fun ren_abs (Abs (x, T, b)) =  | 
|
| 18942 | 656  | 
Abs (the_default x (AList.lookup (op =) ren x), T, ren_abs b)  | 
| 12981 | 657  | 
| ren_abs (f $ t) = ren_abs f $ ren_abs t  | 
658  | 
| ren_abs t = t  | 
|
| 15531 | 659  | 
in if null ren then NONE else SOME (ren_abs t) end;  | 
| 0 | 660  | 
|
661  | 
(*Accumulate all 'loose' bound vars referring to level 'lev' or beyond.  | 
|
662  | 
(Bound 0) is loose at level 0 *)  | 
|
| 13000 | 663  | 
fun add_loose_bnos (Bound i, lev, js) =  | 
| 20854 | 664  | 
if i<lev then js else insert (op =) (i - lev) js  | 
| 0 | 665  | 
| add_loose_bnos (Abs (_,_,t), lev, js) = add_loose_bnos (t, lev+1, js)  | 
666  | 
| add_loose_bnos (f$t, lev, js) =  | 
|
| 13000 | 667  | 
add_loose_bnos (f, lev, add_loose_bnos (t, lev, js))  | 
| 0 | 668  | 
| add_loose_bnos (_, _, js) = js;  | 
669  | 
||
670  | 
fun loose_bnos t = add_loose_bnos (t, 0, []);  | 
|
671  | 
||
672  | 
(* loose_bvar(t,k) iff t contains a 'loose' bound variable referring to  | 
|
673  | 
level k or beyond. *)  | 
|
674  | 
fun loose_bvar(Bound i,k) = i >= k  | 
|
675  | 
| loose_bvar(f$t, k) = loose_bvar(f,k) orelse loose_bvar(t,k)  | 
|
676  | 
| loose_bvar(Abs(_,_,t),k) = loose_bvar(t,k+1)  | 
|
677  | 
| loose_bvar _ = false;  | 
|
678  | 
||
| 2792 | 679  | 
fun loose_bvar1(Bound i,k) = i = k  | 
680  | 
| loose_bvar1(f$t, k) = loose_bvar1(f,k) orelse loose_bvar1(t,k)  | 
|
681  | 
| loose_bvar1(Abs(_,_,t),k) = loose_bvar1(t,k+1)  | 
|
682  | 
| loose_bvar1 _ = false;  | 
|
| 0 | 683  | 
|
| 
42083
 
e1209fc7ecdc
added Term.is_open and Term.is_dependent convenience, to cover common situations of loose bounds;
 
wenzelm 
parents: 
40844 
diff
changeset
 | 
684  | 
fun is_open t = loose_bvar (t, 0);  | 
| 
 
e1209fc7ecdc
added Term.is_open and Term.is_dependent convenience, to cover common situations of loose bounds;
 
wenzelm 
parents: 
40844 
diff
changeset
 | 
685  | 
fun is_dependent t = loose_bvar1 (t, 0);  | 
| 
 
e1209fc7ecdc
added Term.is_open and Term.is_dependent convenience, to cover common situations of loose bounds;
 
wenzelm 
parents: 
40844 
diff
changeset
 | 
686  | 
|
| 0 | 687  | 
(*Substitute arguments for loose bound variables.  | 
688  | 
Beta-reduction of arg(n-1)...arg0 into t replacing (Bound i) with (argi).  | 
|
| 67721 | 689  | 
Note that for ((\<lambda>x y. c) a b), the bound vars in c are x=1 and y=0  | 
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
690  | 
and the appropriate call is subst_bounds([b,a], c) .  | 
| 0 | 691  | 
Loose bound variables >=n are reduced by "n" to  | 
692  | 
compensate for the disappearance of lambdas.  | 
|
693  | 
*)  | 
|
| 13000 | 694  | 
fun subst_bounds (args: term list, t) : term =  | 
| 19065 | 695  | 
let  | 
696  | 
val n = length args;  | 
|
697  | 
fun subst (t as Bound i, lev) =  | 
|
| 32020 | 698  | 
(if i < lev then raise Same.SAME (*var is locally bound*)  | 
| 30146 | 699  | 
else incr_boundvars lev (nth args (i - lev))  | 
| 43278 | 700  | 
handle General.Subscript => Bound (i - n)) (*loose: change it*)  | 
| 19065 | 701  | 
| subst (Abs (a, T, body), lev) = Abs (a, T, subst (body, lev + 1))  | 
702  | 
| subst (f $ t, lev) =  | 
|
| 32020 | 703  | 
(subst (f, lev) $ (subst (t, lev) handle Same.SAME => t)  | 
704  | 
handle Same.SAME => f $ subst (t, lev))  | 
|
705  | 
| subst _ = raise Same.SAME;  | 
|
706  | 
in case args of [] => t | _ => (subst (t, 0) handle Same.SAME => t) end;  | 
|
| 0 | 707  | 
|
| 
2192
 
3bf092b5310b
Optimizations: removal of polymorphic equality; one-argument case
 
paulson 
parents: 
2182 
diff
changeset
 | 
708  | 
(*Special case: one argument*)  | 
| 13000 | 709  | 
fun subst_bound (arg, t) : term =  | 
| 19065 | 710  | 
let  | 
711  | 
fun subst (Bound i, lev) =  | 
|
| 32020 | 712  | 
if i < lev then raise Same.SAME (*var is locally bound*)  | 
| 19065 | 713  | 
else if i = lev then incr_boundvars lev arg  | 
714  | 
else Bound (i - 1) (*loose: change it*)  | 
|
715  | 
| subst (Abs (a, T, body), lev) = Abs (a, T, subst (body, lev + 1))  | 
|
716  | 
| subst (f $ t, lev) =  | 
|
| 32020 | 717  | 
(subst (f, lev) $ (subst (t, lev) handle Same.SAME => t)  | 
718  | 
handle Same.SAME => f $ subst (t, lev))  | 
|
719  | 
| subst _ = raise Same.SAME;  | 
|
720  | 
in subst (t, 0) handle Same.SAME => t end;  | 
|
| 
2192
 
3bf092b5310b
Optimizations: removal of polymorphic equality; one-argument case
 
paulson 
parents: 
2182 
diff
changeset
 | 
721  | 
|
| 0 | 722  | 
(*beta-reduce if possible, else form application*)  | 
| 
2192
 
3bf092b5310b
Optimizations: removal of polymorphic equality; one-argument case
 
paulson 
parents: 
2182 
diff
changeset
 | 
723  | 
fun betapply (Abs(_,_,t), u) = subst_bound (u,t)  | 
| 0 | 724  | 
| betapply (f,u) = f$u;  | 
725  | 
||
| 18183 | 726  | 
val betapplys = Library.foldl betapply;  | 
727  | 
||
| 
14786
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
728  | 
|
| 20109 | 729  | 
(*unfolding abstractions with substitution  | 
730  | 
of bound variables and implicit eta-expansion*)  | 
|
731  | 
fun strip_abs_eta k t =  | 
|
732  | 
let  | 
|
| 29278 | 733  | 
val used = fold_aterms declare_term_frees t Name.context;  | 
| 20109 | 734  | 
fun strip_abs t (0, used) = (([], t), (0, used))  | 
735  | 
| strip_abs (Abs (v, T, t)) (k, used) =  | 
|
736  | 
let  | 
|
| 
43326
 
47cf4bc789aa
simplified Name.variant -- discontinued builtin fold_map;
 
wenzelm 
parents: 
43324 
diff
changeset
 | 
737  | 
val (v', used') = Name.variant v used;  | 
| 21013 | 738  | 
val t' = subst_bound (Free (v', T), t);  | 
| 20122 | 739  | 
val ((vs, t''), (k', used'')) = strip_abs t' (k - 1, used');  | 
740  | 
in (((v', T) :: vs, t''), (k', used'')) end  | 
|
| 20109 | 741  | 
| strip_abs t (k, used) = (([], t), (k, used));  | 
742  | 
fun expand_eta [] t _ = ([], t)  | 
|
743  | 
| expand_eta (T::Ts) t used =  | 
|
744  | 
let  | 
|
| 
43326
 
47cf4bc789aa
simplified Name.variant -- discontinued builtin fold_map;
 
wenzelm 
parents: 
43324 
diff
changeset
 | 
745  | 
val (v, used') = Name.variant "" used;  | 
| 20122 | 746  | 
val (vs, t') = expand_eta Ts (t $ Free (v, T)) used';  | 
| 20109 | 747  | 
in ((v, T) :: vs, t') end;  | 
748  | 
val ((vs1, t'), (k', used')) = strip_abs t (k, used);  | 
|
| 40844 | 749  | 
val Ts = fst (chop k' (binder_types (fastype_of t')));  | 
| 20109 | 750  | 
val (vs2, t'') = expand_eta Ts t' used';  | 
751  | 
in (vs1 @ vs2, t'') end;  | 
|
752  | 
||
753  | 
||
| 0 | 754  | 
(*Substitute new for free occurrences of old in a term*)  | 
| 29256 | 755  | 
fun subst_free [] = I  | 
| 0 | 756  | 
| subst_free pairs =  | 
| 13000 | 757  | 
let fun substf u =  | 
| 17314 | 758  | 
case AList.lookup (op aconv) pairs u of  | 
| 15531 | 759  | 
SOME u' => u'  | 
760  | 
| NONE => (case u of Abs(a,T,t) => Abs(a, T, substf t)  | 
|
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
761  | 
| t$u' => substf t $ substf u'  | 
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
762  | 
| _ => u)  | 
| 0 | 763  | 
in substf end;  | 
764  | 
||
| 13000 | 765  | 
(*Abstraction of the term "body" over its occurrences of v,  | 
| 0 | 766  | 
which must contain no loose bound variables.  | 
767  | 
The resulting term is ready to become the body of an Abs.*)  | 
|
| 16882 | 768  | 
fun abstract_over (v, body) =  | 
769  | 
let  | 
|
| 16990 | 770  | 
fun abs lev tm =  | 
771  | 
if v aconv tm then Bound lev  | 
|
| 16882 | 772  | 
else  | 
| 16990 | 773  | 
(case tm of  | 
774  | 
Abs (a, T, t) => Abs (a, T, abs (lev + 1) t)  | 
|
| 32020 | 775  | 
| t $ u =>  | 
776  | 
(abs lev t $ (abs lev u handle Same.SAME => u)  | 
|
777  | 
handle Same.SAME => t $ abs lev u)  | 
|
778  | 
| _ => raise Same.SAME);  | 
|
779  | 
in abs 0 body handle Same.SAME => body end;  | 
|
| 0 | 780  | 
|
| 32198 | 781  | 
fun term_name (Const (x, _)) = Long_Name.base_name x  | 
782  | 
| term_name (Free (x, _)) = x  | 
|
783  | 
| term_name (Var ((x, _), _)) = x  | 
|
784  | 
| term_name _ = Name.uu;  | 
|
785  | 
||
| 
60404
 
422b63ef0147
clarified abstracted term bindings (again, see c8384ff11711);
 
wenzelm 
parents: 
60311 
diff
changeset
 | 
786  | 
fun dependent_lambda_name (x, v) t =  | 
| 
 
422b63ef0147
clarified abstracted term bindings (again, see c8384ff11711);
 
wenzelm 
parents: 
60311 
diff
changeset
 | 
787  | 
let val t' = abstract_over (v, t)  | 
| 
 
422b63ef0147
clarified abstracted term bindings (again, see c8384ff11711);
 
wenzelm 
parents: 
60311 
diff
changeset
 | 
788  | 
in if is_dependent t' then Abs (if x = "" then term_name v else x, fastype_of v, t') else t end;  | 
| 
 
422b63ef0147
clarified abstracted term bindings (again, see c8384ff11711);
 
wenzelm 
parents: 
60311 
diff
changeset
 | 
789  | 
|
| 32198 | 790  | 
fun lambda_name (x, v) t =  | 
791  | 
Abs (if x = "" then term_name v else x, fastype_of v, abstract_over (v, t));  | 
|
792  | 
||
793  | 
fun lambda v t = lambda_name ("", v) t;
 | 
|
| 0 | 794  | 
|
| 44241 | 795  | 
fun absfree (a, T) body = Abs (a, T, abstract_over (Free (a, T), body));  | 
796  | 
fun absdummy T body = Abs (Name.uu_, T, body);  | 
|
| 0 | 797  | 
|
| 16678 | 798  | 
(*Replace the ATOMIC term ti by ui; inst = [(t1,u1), ..., (tn,un)].  | 
| 0 | 799  | 
A simultaneous substitution: [ (a,b), (b,a) ] swaps a and b. *)  | 
| 16678 | 800  | 
fun subst_atomic [] tm = tm  | 
801  | 
| subst_atomic inst tm =  | 
|
802  | 
let  | 
|
803  | 
fun subst (Abs (a, T, body)) = Abs (a, T, subst body)  | 
|
804  | 
| subst (t $ u) = subst t $ subst u  | 
|
| 18942 | 805  | 
| subst t = the_default t (AList.lookup (op aconv) inst t);  | 
| 16678 | 806  | 
in subst tm end;  | 
| 0 | 807  | 
|
| 16678 | 808  | 
(*Replace the ATOMIC type Ti by Ui; inst = [(T1,U1), ..., (Tn,Un)].*)  | 
809  | 
fun typ_subst_atomic [] ty = ty  | 
|
810  | 
| typ_subst_atomic inst ty =  | 
|
811  | 
let  | 
|
812  | 
fun subst (Type (a, Ts)) = Type (a, map subst Ts)  | 
|
| 18942 | 813  | 
| subst T = the_default T (AList.lookup (op = : typ * typ -> bool) inst T);  | 
| 16678 | 814  | 
in subst ty end;  | 
| 15797 | 815  | 
|
| 16678 | 816  | 
fun subst_atomic_types [] tm = tm  | 
| 
20548
 
8ef25fe585a8
renamed Term.map_term_types to Term.map_types (cf. Term.fold_types);
 
wenzelm 
parents: 
20531 
diff
changeset
 | 
817  | 
| subst_atomic_types inst tm = map_types (typ_subst_atomic inst) tm;  | 
| 16678 | 818  | 
|
819  | 
fun typ_subst_TVars [] ty = ty  | 
|
820  | 
| typ_subst_TVars inst ty =  | 
|
821  | 
let  | 
|
822  | 
fun subst (Type (a, Ts)) = Type (a, map subst Ts)  | 
|
| 18942 | 823  | 
| subst (T as TVar (xi, _)) = the_default T (AList.lookup (op =) inst xi)  | 
| 16678 | 824  | 
| subst T = T;  | 
825  | 
in subst ty end;  | 
|
| 0 | 826  | 
|
| 16678 | 827  | 
fun subst_TVars [] tm = tm  | 
| 
20548
 
8ef25fe585a8
renamed Term.map_term_types to Term.map_types (cf. Term.fold_types);
 
wenzelm 
parents: 
20531 
diff
changeset
 | 
828  | 
| subst_TVars inst tm = map_types (typ_subst_TVars inst) tm;  | 
| 0 | 829  | 
|
| 16678 | 830  | 
fun subst_Vars [] tm = tm  | 
831  | 
| subst_Vars inst tm =  | 
|
832  | 
let  | 
|
| 18942 | 833  | 
fun subst (t as Var (xi, _)) = the_default t (AList.lookup (op =) inst xi)  | 
| 16678 | 834  | 
| subst (Abs (a, T, t)) = Abs (a, T, subst t)  | 
835  | 
| subst (t $ u) = subst t $ subst u  | 
|
836  | 
| subst t = t;  | 
|
837  | 
in subst tm end;  | 
|
| 0 | 838  | 
|
| 16678 | 839  | 
fun subst_vars ([], []) tm = tm  | 
840  | 
| subst_vars ([], inst) tm = subst_Vars inst tm  | 
|
841  | 
| subst_vars (instT, inst) tm =  | 
|
842  | 
let  | 
|
843  | 
fun subst (Const (a, T)) = Const (a, typ_subst_TVars instT T)  | 
|
844  | 
| subst (Free (a, T)) = Free (a, typ_subst_TVars instT T)  | 
|
| 32784 | 845  | 
| subst (Var (xi, T)) =  | 
| 17271 | 846  | 
(case AList.lookup (op =) inst xi of  | 
| 16678 | 847  | 
NONE => Var (xi, typ_subst_TVars instT T)  | 
848  | 
| SOME t => t)  | 
|
849  | 
| subst (t as Bound _) = t  | 
|
850  | 
| subst (Abs (a, T, t)) = Abs (a, typ_subst_TVars instT T, subst t)  | 
|
851  | 
| subst (t $ u) = subst t $ subst u;  | 
|
852  | 
in subst tm end;  | 
|
| 0 | 853  | 
|
| 25050 | 854  | 
fun close_schematic_term t =  | 
855  | 
let  | 
|
| 56243 | 856  | 
    val extra_types = map (fn v => Const ("Pure.type", itselfT (TVar v))) (hidden_polymorphism t);
 | 
| 
30285
 
a135bfab6e83
close_schematic_term: uniform order of types/terms;
 
wenzelm 
parents: 
30280 
diff
changeset
 | 
857  | 
val extra_terms = map Var (add_vars t []);  | 
| 
 
a135bfab6e83
close_schematic_term: uniform order of types/terms;
 
wenzelm 
parents: 
30280 
diff
changeset
 | 
858  | 
in fold lambda (extra_terms @ extra_types) t end;  | 
| 25050 | 859  | 
|
860  | 
||
| 0 | 861  | 
|
| 15573 | 862  | 
(** Identifying first-order terms **)  | 
863  | 
||
| 20199 | 864  | 
(*Differs from proofterm/is_fun in its treatment of TVar*)  | 
| 29256 | 865  | 
fun is_funtype (Type ("fun", [_, _])) = true
 | 
| 20199 | 866  | 
| is_funtype _ = false;  | 
867  | 
||
| 15573 | 868  | 
(*Argument Ts is a reverse list of binder types, needed if term t contains Bound vars*)  | 
| 29256 | 869  | 
fun has_not_funtype Ts t = not (is_funtype (fastype_of1 (Ts, t)));  | 
| 15573 | 870  | 
|
| 16537 | 871  | 
(*First order means in all terms of the form f(t1,...,tn) no argument has a  | 
| 16589 | 872  | 
function type. The supplied quantifiers are excluded: their argument always  | 
873  | 
has a function type through a recursive call into its body.*)  | 
|
| 16667 | 874  | 
fun is_first_order quants =  | 
| 16589 | 875  | 
let fun first_order1 Ts (Abs (_,T,body)) = first_order1 (T::Ts) body  | 
| 16667 | 876  | 
| first_order1 Ts (Const(q,_) $ Abs(a,T,body)) =  | 
| 20664 | 877  | 
member (op =) quants q andalso (*it is a known quantifier*)  | 
| 16589 | 878  | 
not (is_funtype T) andalso first_order1 (T::Ts) body  | 
| 16667 | 879  | 
| first_order1 Ts t =  | 
880  | 
case strip_comb t of  | 
|
881  | 
(Var _, ts) => forall (first_order1 Ts andf has_not_funtype Ts) ts  | 
|
882  | 
| (Free _, ts) => forall (first_order1 Ts andf has_not_funtype Ts) ts  | 
|
883  | 
| (Const _, ts) => forall (first_order1 Ts andf has_not_funtype Ts) ts  | 
|
884  | 
| (Bound _, ts) => forall (first_order1 Ts andf has_not_funtype Ts) ts  | 
|
885  | 
| (Abs _, ts) => false (*not in beta-normal form*)  | 
|
886  | 
| _ => error "first_order: unexpected case"  | 
|
| 16589 | 887  | 
in first_order1 [] end;  | 
| 15573 | 888  | 
|
| 16710 | 889  | 
|
| 16990 | 890  | 
(* maximum index of typs and terms *)  | 
| 0 | 891  | 
|
| 16710 | 892  | 
fun maxidx_typ (TVar ((_, j), _)) i = Int.max (i, j)  | 
893  | 
| maxidx_typ (Type (_, Ts)) i = maxidx_typs Ts i  | 
|
894  | 
| maxidx_typ (TFree _) i = i  | 
|
895  | 
and maxidx_typs [] i = i  | 
|
896  | 
| maxidx_typs (T :: Ts) i = maxidx_typs Ts (maxidx_typ T i);  | 
|
| 0 | 897  | 
|
| 16710 | 898  | 
fun maxidx_term (Var ((_, j), T)) i = maxidx_typ T (Int.max (i, j))  | 
899  | 
| maxidx_term (Const (_, T)) i = maxidx_typ T i  | 
|
900  | 
| maxidx_term (Free (_, T)) i = maxidx_typ T i  | 
|
901  | 
| maxidx_term (Bound _) i = i  | 
|
902  | 
| maxidx_term (Abs (_, T, t)) i = maxidx_term t (maxidx_typ T i)  | 
|
903  | 
| maxidx_term (t $ u) i = maxidx_term u (maxidx_term t i);  | 
|
| 0 | 904  | 
|
| 16710 | 905  | 
fun maxidx_of_typ T = maxidx_typ T ~1;  | 
906  | 
fun maxidx_of_typs Ts = maxidx_typs Ts ~1;  | 
|
907  | 
fun maxidx_of_term t = maxidx_term t ~1;  | 
|
| 13665 | 908  | 
|
| 0 | 909  | 
|
910  | 
||
| 
29270
 
0eade173f77e
moved old add_type_XXX, add_term_XXX etc. to structure OldTerm;
 
wenzelm 
parents: 
29269 
diff
changeset
 | 
911  | 
(** misc syntax operations **)  | 
| 0 | 912  | 
|
| 19909 | 913  | 
(* substructure *)  | 
| 
4017
 
63878e2587a7
add_typ_classes, add_typ_tycons, add_term_classes, add_term_tycons,
 
wenzelm 
parents: 
3965 
diff
changeset
 | 
914  | 
|
| 61248 | 915  | 
fun fold_subtypes f =  | 
916  | 
let  | 
|
917  | 
fun iter ty =  | 
|
918  | 
(case ty of Type (_, Ts) => f ty #> fold iter Ts | _ => f ty);  | 
|
919  | 
in iter end;  | 
|
920  | 
||
| 19909 | 921  | 
fun exists_subtype P =  | 
922  | 
let  | 
|
923  | 
fun ex ty = P ty orelse  | 
|
924  | 
(case ty of Type (_, Ts) => exists ex Ts | _ => false);  | 
|
925  | 
in ex end;  | 
|
| 13646 | 926  | 
|
| 20531 | 927  | 
fun exists_type P =  | 
928  | 
let  | 
|
929  | 
fun ex (Const (_, T)) = P T  | 
|
930  | 
| ex (Free (_, T)) = P T  | 
|
931  | 
| ex (Var (_, T)) = P T  | 
|
932  | 
| ex (Bound _) = false  | 
|
933  | 
| ex (Abs (_, T, t)) = P T orelse ex t  | 
|
934  | 
| ex (t $ u) = ex t orelse ex u;  | 
|
935  | 
in ex end;  | 
|
936  | 
||
| 16943 | 937  | 
fun exists_subterm P =  | 
938  | 
let  | 
|
939  | 
fun ex tm = P tm orelse  | 
|
940  | 
(case tm of  | 
|
941  | 
t $ u => ex t orelse ex u  | 
|
942  | 
| Abs (_, _, t) => ex t  | 
|
943  | 
| _ => false);  | 
|
944  | 
in ex end;  | 
|
| 
16108
 
cf468b93a02e
Implement cycle-free overloading, so that definitions cannot harm consistency any more (except of course via interaction with axioms).
 
obua 
parents: 
16035 
diff
changeset
 | 
945  | 
|
| 
29270
 
0eade173f77e
moved old add_type_XXX, add_term_XXX etc. to structure OldTerm;
 
wenzelm 
parents: 
29269 
diff
changeset
 | 
946  | 
fun exists_Const P = exists_subterm (fn Const c => P c | _ => false);  | 
| 
 
0eade173f77e
moved old add_type_XXX, add_term_XXX etc. to structure OldTerm;
 
wenzelm 
parents: 
29269 
diff
changeset
 | 
947  | 
|
| 63619 | 948  | 
|
949  | 
(* contraction *)  | 
|
950  | 
||
951  | 
fun could_beta_contract (Abs _ $ _) = true  | 
|
952  | 
| could_beta_contract (t $ u) = could_beta_contract t orelse could_beta_contract u  | 
|
953  | 
| could_beta_contract (Abs (_, _, b)) = could_beta_contract b  | 
|
954  | 
| could_beta_contract _ = false;  | 
|
955  | 
||
956  | 
fun could_eta_contract (Abs (_, _, _ $ Bound 0)) = true  | 
|
957  | 
| could_eta_contract (Abs (_, _, b)) = could_eta_contract b  | 
|
958  | 
| could_eta_contract (t $ u) = could_eta_contract t orelse could_eta_contract u  | 
|
959  | 
| could_eta_contract _ = false;  | 
|
960  | 
||
961  | 
fun could_beta_eta_contract (Abs _ $ _) = true  | 
|
962  | 
| could_beta_eta_contract (Abs (_, _, _ $ Bound 0)) = true  | 
|
963  | 
| could_beta_eta_contract (Abs (_, _, b)) = could_beta_eta_contract b  | 
|
964  | 
| could_beta_eta_contract (t $ u) = could_beta_eta_contract t orelse could_beta_eta_contract u  | 
|
965  | 
| could_beta_eta_contract _ = false;  | 
|
| 24671 | 966  | 
|
967  | 
||
| 20199 | 968  | 
(* dest abstraction *)  | 
| 0 | 969  | 
|
| 
74525
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
970  | 
(*ASSUMPTION: x is fresh wrt. the current context, but the check  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
971  | 
of used_free merely guards against gross mistakes*)  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
972  | 
|
| 74407 | 973  | 
fun used_free x =  | 
| 16678 | 974  | 
let  | 
| 74407 | 975  | 
fun used (Free (y, _)) = (x = y)  | 
976  | 
| used (t $ u) = used t orelse used u  | 
|
977  | 
| used (Abs (_, _, t)) = used t  | 
|
978  | 
| used _ = false;  | 
|
979  | 
in used end;  | 
|
980  | 
||
| 
74525
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
981  | 
exception USED_FREE of string * term;  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
982  | 
|
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
983  | 
fun subst_abs v b = (v, subst_bound (Free v, b));  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
984  | 
|
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
985  | 
fun dest_abs_fresh x t =  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
986  | 
(case t of  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
987  | 
Abs (_, T, b) =>  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
988  | 
if used_free x b then raise USED_FREE (x, t)  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
989  | 
else subst_abs (x, T) b  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
990  | 
  | _ => raise TERM ("dest_abs", [t]));
 | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
991  | 
|
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
992  | 
fun dest_abs_global t =  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
993  | 
(case t of  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
994  | 
Abs (x, T, b) =>  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
995  | 
if used_free x b then  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
996  | 
let  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
997  | 
val used = Name.build_context (declare_term_frees b);  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
998  | 
val x' = #1 (Name.variant x used);  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
999  | 
in subst_abs (x', T) b end  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
1000  | 
else subst_abs (x, T) b  | 
| 
 
c960bfcb91db
discontinued Term.dest_abs / Logic.dest_all, which are officially superseded by Variable.dest_abs etc., but there are also Term.dest_abs_global to recover existing tools easily;
 
wenzelm 
parents: 
74446 
diff
changeset
 | 
1001  | 
  | _ => raise TERM ("dest_abs", [t]));
 | 
| 16678 | 1002  | 
|
| 20160 | 1003  | 
|
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1004  | 
(* dummy patterns *)  | 
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1005  | 
|
| 56241 | 1006  | 
fun dummy_pattern T = Const ("Pure.dummy_pattern", T);
 | 
| 45156 | 1007  | 
val dummy = dummy_pattern dummyT;  | 
1008  | 
val dummy_prop = dummy_pattern propT;  | 
|
| 18253 | 1009  | 
|
| 56241 | 1010  | 
fun is_dummy_pattern (Const ("Pure.dummy_pattern", _)) = true
 | 
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1011  | 
| is_dummy_pattern _ = false;  | 
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1012  | 
|
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1013  | 
fun no_dummy_patterns tm =  | 
| 16787 | 1014  | 
if not (fold_aterms (fn t => fn b => b orelse is_dummy_pattern t) tm false) then tm  | 
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1015  | 
  else raise TERM ("Illegal occurrence of '_' dummy pattern", [tm]);
 | 
| 
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1016  | 
|
| 56241 | 1017  | 
fun free_dummy_patterns (Const ("Pure.dummy_pattern", T)) used =
 | 
| 
43329
 
84472e198515
tuned signature: Name.invent and Name.invent_names;
 
wenzelm 
parents: 
43326 
diff
changeset
 | 
1018  | 
let val [x] = Name.invent used Name.uu 1  | 
| 24733 | 1019  | 
in (Free (Name.internal x, T), Name.declare x used) end  | 
1020  | 
| free_dummy_patterns (Abs (x, T, b)) used =  | 
|
1021  | 
let val (b', used') = free_dummy_patterns b used  | 
|
1022  | 
in (Abs (x, T, b'), used') end  | 
|
1023  | 
| free_dummy_patterns (t $ u) used =  | 
|
1024  | 
let  | 
|
1025  | 
val (t', used') = free_dummy_patterns t used;  | 
|
1026  | 
val (u', used'') = free_dummy_patterns u used';  | 
|
1027  | 
in (t' $ u', used'') end  | 
|
1028  | 
| free_dummy_patterns a used = (a, used);  | 
|
1029  | 
||
| 56241 | 1030  | 
fun replace_dummy Ts (Const ("Pure.dummy_pattern", T)) i =
 | 
| 33063 | 1031  | 
      (list_comb (Var (("_dummy_", i), Ts ---> T), map_range Bound (length Ts)), i + 1)
 | 
| 24762 | 1032  | 
| replace_dummy Ts (Abs (x, T, t)) i =  | 
1033  | 
let val (t', i') = replace_dummy (T :: Ts) t i  | 
|
1034  | 
in (Abs (x, T, t'), i') end  | 
|
1035  | 
| replace_dummy Ts (t $ u) i =  | 
|
1036  | 
let  | 
|
1037  | 
val (t', i') = replace_dummy Ts t i;  | 
|
1038  | 
val (u', i'') = replace_dummy Ts u i';  | 
|
1039  | 
in (t' $ u', i'') end  | 
|
1040  | 
| replace_dummy _ a i = (a, i);  | 
|
| 11903 | 1041  | 
|
1042  | 
val replace_dummy_patterns = replace_dummy [];  | 
|
| 
9536
 
b79b002f32ae
added dummy_patternN, no_dummy_patterns, replace_dummy_patterns;
 
wenzelm 
parents: 
9319 
diff
changeset
 | 
1043  | 
|
| 45156 | 1044  | 
fun show_dummy_patterns (Var (("_dummy_", _), T)) = dummy_pattern T
 | 
| 16035 | 1045  | 
| show_dummy_patterns (t $ u) = show_dummy_patterns t $ show_dummy_patterns u  | 
1046  | 
| show_dummy_patterns (Abs (x, T, t)) = Abs (x, T, show_dummy_patterns t)  | 
|
1047  | 
| show_dummy_patterns a = a;  | 
|
1048  | 
||
| 13484 | 1049  | 
|
| 20100 | 1050  | 
(* display variables *)  | 
1051  | 
||
| 
14786
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
1052  | 
fun string_of_vname (x, i) =  | 
| 
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
1053  | 
let  | 
| 15986 | 1054  | 
val idx = string_of_int i;  | 
1055  | 
val dot =  | 
|
1056  | 
(case rev (Symbol.explode x) of  | 
|
| 
62529
 
8b7bdfc09f3b
clarified treatment of fragments of Isabelle symbols during bootstrap;
 
wenzelm 
parents: 
61655 
diff
changeset
 | 
1057  | 
_ :: "\<^sub>" :: _ => false  | 
| 15986 | 1058  | 
| c :: _ => Symbol.is_digit c  | 
1059  | 
| _ => true);  | 
|
| 
14786
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
1060  | 
in  | 
| 
38980
 
af73cf0dc31f
turned show_question_marks into proper configuration option;
 
wenzelm 
parents: 
35986 
diff
changeset
 | 
1061  | 
if dot then "?" ^ x ^ "." ^ idx  | 
| 
 
af73cf0dc31f
turned show_question_marks into proper configuration option;
 
wenzelm 
parents: 
35986 
diff
changeset
 | 
1062  | 
else if i <> 0 then "?" ^ x ^ idx  | 
| 
 
af73cf0dc31f
turned show_question_marks into proper configuration option;
 
wenzelm 
parents: 
35986 
diff
changeset
 | 
1063  | 
else "?" ^ x  | 
| 
14786
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
1064  | 
end;  | 
| 
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
1065  | 
|
| 
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
1066  | 
fun string_of_vname' (x, ~1) = x  | 
| 
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
1067  | 
| string_of_vname' xi = string_of_vname xi;  | 
| 
 
24a7bc97a27a
moved some sort ops to sorts.ML; added string_of_vname (from Syntax module);
 
wenzelm 
parents: 
14695 
diff
changeset
 | 
1068  | 
|
| 
1364
 
8ea1a962ad72
files now define a structure to allow SML/NJ to optimize the code
 
clasohm 
parents: 
1029 
diff
changeset
 | 
1069  | 
end;  | 
| 
 
8ea1a962ad72
files now define a structure to allow SML/NJ to optimize the code
 
clasohm 
parents: 
1029 
diff
changeset
 | 
1070  | 
|
| 40841 | 1071  | 
structure Basic_Term: BASIC_TERM = Term;  | 
1072  | 
open Basic_Term;  |