src/Pure/term.ML
changeset 21797 25b97f5057f2
parent 21742 a330e58226d0
child 21975 1152dc45d591
equal deleted inserted replaced
21796:481094a3dd1f 21797:25b97f5057f2
   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