159 val add_varnames: term -> indexname list -> indexname list |
159 val add_varnames: term -> indexname list -> indexname list |
160 val add_tfreesT: typ -> (string * sort) list -> (string * sort) list |
160 val add_tfreesT: typ -> (string * sort) list -> (string * sort) list |
161 val add_tfrees: term -> (string * sort) list -> (string * sort) list |
161 val add_tfrees: term -> (string * sort) list -> (string * sort) list |
162 val add_frees: term -> (string * typ) list -> (string * typ) list |
162 val add_frees: term -> (string * typ) list -> (string * typ) list |
163 val hidden_polymorphism: term -> typ -> (indexname * sort) list |
163 val hidden_polymorphism: term -> typ -> (indexname * sort) list |
|
164 val equiv_types: term * term -> bool |
164 val strip_abs_eta: int -> term -> (string * typ) list * term |
165 val strip_abs_eta: int -> term -> (string * typ) list * term |
165 val fast_indexname_ord: indexname * indexname -> order |
166 val fast_indexname_ord: indexname * indexname -> order |
166 val indexname_ord: indexname * indexname -> order |
167 val indexname_ord: indexname * indexname -> order |
167 val sort_ord: sort * sort -> order |
168 val sort_ord: sort * sort -> order |
168 val typ_ord: typ * typ -> order |
169 val typ_ord: typ * typ -> order |
506 (t1 $ u1, t2 $ u2) => t1 aconv t2 andalso u1 aconv u2 |
507 (t1 $ u1, t2 $ u2) => t1 aconv t2 andalso u1 aconv u2 |
507 | (Abs (_, T1, t1), Abs (_, T2, t2)) => t1 aconv t2 andalso T1 = T2 |
508 | (Abs (_, T1, t1), Abs (_, T2, t2)) => t1 aconv t2 andalso T1 = T2 |
508 | (a1, a2) => a1 = a2); |
509 | (a1, a2) => a1 = a2); |
509 |
510 |
510 |
511 |
|
512 (* equivalence up to renaming of types variables *) |
|
513 |
|
514 local |
|
515 |
|
516 val invent_names = Name.invents Name.context "'a"; |
|
517 |
|
518 fun standard_types t = |
|
519 let |
|
520 val tfrees = add_tfrees t []; |
|
521 val tvars = add_tvars t []; |
|
522 val env1 = map2 (fn (a, S) => fn a' => (TFree (a, S), TFree (a', []))) |
|
523 tfrees (invent_names (length tfrees)); |
|
524 val env2 = map2 (fn ((a, i), S) => fn a' => (TVar ((a, i), S), TVar ((a', 0), []))) |
|
525 tvars (invent_names (length tvars)); |
|
526 in map_types (map_atyps (perhaps (AList.lookup (op =) (env1 @ env2)))) t end; |
|
527 |
|
528 in |
|
529 |
|
530 val equiv_types = op aconv o pairself standard_types; |
|
531 |
|
532 end; |
|
533 |
|
534 |
511 (* fast syntactic ordering -- tuned for inequalities *) |
535 (* fast syntactic ordering -- tuned for inequalities *) |
512 |
536 |
513 fun fast_indexname_ord ((x, i), (y, j)) = |
537 fun fast_indexname_ord ((x, i), (y, j)) = |
514 (case int_ord (i, j) of EQUAL => fast_string_ord (x, y) | ord => ord); |
538 (case int_ord (i, j) of EQUAL => fast_string_ord (x, y) | ord => ord); |
515 |
539 |