| author | wenzelm | 
| Fri, 24 Sep 2021 22:23:26 +0200 | |
| changeset 74362 | 0135a0c77b64 | 
| parent 74270 | ad2899cdd528 | 
| child 77723 | b761c91c2447 | 
| permissions | -rw-r--r-- | 
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 1 | (* Title: Pure/term_ord.ML | 
| 74265 | 2 | Author: Tobias Nipkow, TU Muenchen | 
| 3 | Author: Makarius | |
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 4 | |
| 74270 | 5 | Term orderings. | 
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 6 | *) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 7 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 8 | signature TERM_ORD = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 9 | sig | 
| 70586 | 10 | val fast_indexname_ord: indexname ord | 
| 11 | val sort_ord: sort ord | |
| 12 | val typ_ord: typ ord | |
| 13 | val fast_term_ord: term ord | |
| 14 | val syntax_term_ord: term ord | |
| 15 | val indexname_ord: indexname ord | |
| 16 | val tvar_ord: (indexname * sort) ord | |
| 17 | val var_ord: (indexname * typ) ord | |
| 18 | val term_ord: term ord | |
| 19 | val hd_ord: term ord | |
| 20 | val term_lpo: (term -> int) -> term ord | |
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 21 | end; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 22 | |
| 35408 | 23 | structure Term_Ord: TERM_ORD = | 
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 24 | struct | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 25 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 26 | (* fast syntactic ordering -- tuned for inequalities *) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 27 | |
| 74260 | 28 | val fast_indexname_ord = | 
| 29 | pointer_eq_ord (int_ord o apply2 snd ||| fast_string_ord o apply2 fst); | |
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 30 | |
| 74260 | 31 | val sort_ord = | 
| 32 | pointer_eq_ord (dict_ord fast_string_ord); | |
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 33 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 34 | local | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 35 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 36 | fun cons_nr (TVar _) = 0 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 37 | | cons_nr (TFree _) = 1 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 38 | | cons_nr (Type _) = 2; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 39 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 40 | in | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 41 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 42 | fun typ_ord TU = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 43 | if pointer_eq TU then EQUAL | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 44 | else | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 45 | (case TU of | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 46 | (Type (a, Ts), Type (b, Us)) => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 47 | (case fast_string_ord (a, b) of EQUAL => dict_ord typ_ord (Ts, Us) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 48 | | (TFree (a, S), TFree (b, S')) => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 49 | (case fast_string_ord (a, b) of EQUAL => sort_ord (S, S') | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 50 | | (TVar (xi, S), TVar (yj, S')) => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 51 | (case fast_indexname_ord (xi, yj) of EQUAL => sort_ord (S, S') | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 52 | | (T, U) => int_ord (cons_nr T, cons_nr U)); | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 53 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 54 | end; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 55 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 56 | local | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 57 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 58 | fun cons_nr (Const _) = 0 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 59 | | cons_nr (Free _) = 1 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 60 | | cons_nr (Var _) = 2 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 61 | | cons_nr (Bound _) = 3 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 62 | | cons_nr (Abs _) = 4 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 63 | | cons_nr (_ $ _) = 5; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 64 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 65 | fun struct_ord (Abs (_, _, t), Abs (_, _, u)) = struct_ord (t, u) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 66 | | struct_ord (t1 $ t2, u1 $ u2) = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 67 | (case struct_ord (t1, u1) of EQUAL => struct_ord (t2, u2) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 68 | | struct_ord (t, u) = int_ord (cons_nr t, cons_nr u); | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 69 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 70 | fun atoms_ord (Abs (_, _, t), Abs (_, _, u)) = atoms_ord (t, u) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 71 | | atoms_ord (t1 $ t2, u1 $ u2) = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 72 | (case atoms_ord (t1, u1) of EQUAL => atoms_ord (t2, u2) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 73 | | atoms_ord (Const (a, _), Const (b, _)) = fast_string_ord (a, b) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 74 | | atoms_ord (Free (x, _), Free (y, _)) = fast_string_ord (x, y) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 75 | | atoms_ord (Var (xi, _), Var (yj, _)) = fast_indexname_ord (xi, yj) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 76 | | atoms_ord (Bound i, Bound j) = int_ord (i, j) | 
| 43794 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 77 | | atoms_ord _ = EQUAL; | 
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 78 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 79 | fun types_ord (Abs (_, T, t), Abs (_, U, u)) = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 80 | (case typ_ord (T, U) of EQUAL => types_ord (t, u) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 81 | | types_ord (t1 $ t2, u1 $ u2) = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 82 | (case types_ord (t1, u1) of EQUAL => types_ord (t2, u2) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 83 | | types_ord (Const (_, T), Const (_, U)) = typ_ord (T, U) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 84 | | types_ord (Free (_, T), Free (_, U)) = typ_ord (T, U) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 85 | | types_ord (Var (_, T), Var (_, U)) = typ_ord (T, U) | 
| 43794 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 86 | | types_ord _ = EQUAL; | 
| 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 87 | |
| 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 88 | fun comments_ord (Abs (x, _, t), Abs (y, _, u)) = | 
| 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 89 | (case fast_string_ord (x, y) of EQUAL => comments_ord (t, u) | ord => ord) | 
| 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 90 | | comments_ord (t1 $ t2, u1 $ u2) = | 
| 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 91 | (case comments_ord (t1, u1) of EQUAL => comments_ord (t2, u2) | ord => ord) | 
| 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 92 | | comments_ord _ = EQUAL; | 
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 93 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 94 | in | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 95 | |
| 73863 | 96 | val fast_term_ord = pointer_eq_ord (struct_ord ||| atoms_ord ||| types_ord); | 
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 97 | |
| 73863 | 98 | val syntax_term_ord = fast_term_ord ||| comments_ord; | 
| 43794 
49cbbe2768a8
sub-structural sharing after Syntax.check phase, with global interning of logical entities (the latter is relevant when bypassing default parsing via YXML);
 wenzelm parents: 
37852diff
changeset | 99 | |
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 100 | end; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 101 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 102 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 103 | (* term_ord *) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 104 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 105 | (*a linear well-founded AC-compatible ordering for terms: | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 106 | s < t <=> 1. size(s) < size(t) or | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 107 | 2. size(s) = size(t) and s=f(...) and t=g(...) and f<g or | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 108 | 3. size(s) = size(t) and s=f(s1..sn) and t=f(t1..tn) and | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 109 | (s1..sn) < (t1..tn) (lexicographically)*) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 110 | |
| 73863 | 111 | val indexname_ord = int_ord o apply2 #2 ||| string_ord o apply2 #1; | 
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 112 | val tvar_ord = prod_ord indexname_ord sort_ord; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 113 | val var_ord = prod_ord indexname_ord typ_ord; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 114 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 115 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 116 | local | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 117 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 118 | fun hd_depth (t $ _, n) = hd_depth (t, n + 1) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 119 | | hd_depth p = p; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 120 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 121 | fun dest_hd (Const (a, T)) = (((a, 0), T), 0) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 122 | | dest_hd (Free (a, T)) = (((a, 0), T), 1) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 123 | | dest_hd (Var v) = (v, 2) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 124 |   | dest_hd (Bound i) = ((("", i), dummyT), 3)
 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 125 |   | dest_hd (Abs (_, T, _)) = ((("", 0), T), 4);
 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 126 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 127 | in | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 128 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 129 | fun term_ord tu = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 130 | if pointer_eq tu then EQUAL | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 131 | else | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 132 | (case tu of | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 133 | (Abs (_, T, t), Abs(_, U, u)) => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 134 | (case term_ord (t, u) of EQUAL => typ_ord (T, U) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 135 | | (t, u) => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 136 | (case int_ord (size_of_term t, size_of_term u) of | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 137 | EQUAL => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 138 | (case prod_ord hd_ord int_ord (hd_depth (t, 0), hd_depth (u, 0)) of | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 139 | EQUAL => args_ord (t, u) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 140 | | ord => ord)) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 141 | and hd_ord (f, g) = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 142 | prod_ord (prod_ord indexname_ord typ_ord) int_ord (dest_hd f, dest_hd g) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 143 | and args_ord (f $ t, g $ u) = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 144 | (case args_ord (f, g) of EQUAL => term_ord (t, u) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 145 | | args_ord _ = EQUAL; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 146 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 147 | end; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 148 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 149 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 150 | (* Lexicographic path order on terms *) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 151 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 152 | (* | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 153 | See Baader & Nipkow, Term rewriting, CUP 1998. | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 154 | Without variables. Const, Var, Bound, Free and Abs are treated all as | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 155 | constants. | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 156 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 157 | f_ord maps terms to integers and serves two purposes: | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 158 | - Predicate on constant symbols. Those that are not recognised by f_ord | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 159 | must be mapped to ~1. | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 160 | - Order on the recognised symbols. These must be mapped to distinct | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 161 | integers >= 0. | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 162 | The argument of f_ord is never an application. | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 163 | *) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 164 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 165 | local | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 166 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 167 | fun unrecognized (Const (a, T)) = ((1, ((a, 0), T)), 0) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 168 | | unrecognized (Free (a, T)) = ((1, ((a, 0), T)), 0) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 169 | | unrecognized (Var v) = ((1, v), 1) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 170 |   | unrecognized (Bound i) = ((1, (("", i), dummyT)), 2)
 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 171 |   | unrecognized (Abs (_, T, _)) = ((1, (("", 0), T)), 3);
 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 172 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 173 | fun dest_hd f_ord t = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 174 | let val ord = f_ord t | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 175 |   in if ord = ~1 then unrecognized t else ((0, (("", ord), fastype_of t)), 0) end;
 | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 176 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 177 | fun term_lpo f_ord (s, t) = | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 178 | let val (f, ss) = strip_comb s and (g, ts) = strip_comb t in | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 179 | if forall (fn si => term_lpo f_ord (si, t) = LESS) ss | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 180 | then case hd_ord f_ord (f, g) of | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 181 | GREATER => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 182 | if forall (fn ti => term_lpo f_ord (s, ti) = GREATER) ts | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 183 | then GREATER else LESS | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 184 | | EQUAL => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 185 | if forall (fn ti => term_lpo f_ord (s, ti) = GREATER) ts | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 186 | then list_ord (term_lpo f_ord) (ss, ts) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 187 | else LESS | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 188 | | LESS => LESS | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 189 | else GREATER | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 190 | end | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 191 | and hd_ord f_ord (f, g) = case (f, g) of | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 192 | (Abs (_, T, t), Abs (_, U, u)) => | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 193 | (case term_lpo f_ord (t, u) of EQUAL => typ_ord (T, U) | ord => ord) | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 194 | | (_, _) => prod_ord (prod_ord int_ord | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 195 | (prod_ord indexname_ord typ_ord)) int_ord | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 196 | (dest_hd f_ord f, dest_hd f_ord g); | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 197 | |
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 198 | in | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 199 | val term_lpo = term_lpo | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 200 | end; | 
| 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 201 | |
| 74270 | 202 | end; | 
| 203 | ||
| 29269 
5c25a2012975
moved term order operations to structure TermOrd (cf. Pure/term_ord.ML);
 wenzelm parents: diff
changeset | 204 | |
| 74265 | 205 | (* scalable collections *) | 
| 32841 | 206 | |
| 74270 | 207 | structure Vartab = Table(type key = indexname val ord = Term_Ord.fast_indexname_ord); | 
| 208 | structure Sorttab = Table(type key = sort val ord = Term_Ord.sort_ord); | |
| 209 | structure Typtab = Table(type key = typ val ord = Term_Ord.typ_ord); | |
| 74266 | 210 | |
| 74270 | 211 | structure Termtab: | 
| 212 | sig | |
| 213 | include TABLE; | |
| 214 | val term_cache: (term -> 'a) -> term -> 'a | |
| 215 | end = | |
| 74266 | 216 | struct | 
| 74270 | 217 | structure Table = Table(type key = term val ord = Term_Ord.fast_term_ord); | 
| 218 | open Table; | |
| 219 | fun term_cache f = Cache.create empty lookup update f; | |
| 74266 | 220 | end; | 
| 221 | ||
| 74270 | 222 | structure Var_Graph = Graph(type key = indexname val ord = Term_Ord.fast_indexname_ord); | 
| 223 | structure Sort_Graph = Graph(type key = sort val ord = Term_Ord.sort_ord); | |
| 224 | structure Typ_Graph = Graph(type key = typ val ord = Term_Ord.typ_ord); | |
| 225 | structure Term_Graph = Graph(type key = term val ord = Term_Ord.fast_term_ord); |