signature TERM_ORD = sig val fast_indexname_ord: indexname ord val sort_ord: sort ord val typ_ord: typ ord val fast_term_ord: term ord val syntax_term_ord: term ord val indexname_ord: indexname ord val tvar_ord: (indexname * sort) ord val var_ord: (indexname * typ) ord val term_ord: term ord val hd_ord: term ord val term_lpo: (term -> int) -> term ord end;
structure Term_Ord: TERM_ORD = struct
(* fast syntactic ordering -- tuned for inequalities *)
val fast_indexname_ord =
pointer_eq_ord (int_ord o apply2 snd ||| fast_string_ord o apply2 fst);
val sort_ord =
pointer_eq_ord (dict_ord fast_string_ord);
fun struct_ord tu = if pointer_eq tu then EQUAL else
(case tu of
(Abs (_, _, t), Abs (_, _, u)) => struct_ord (t, u)
| (t1 $ t2, u1 $ u2) =>
(case struct_ord (t1, u1) of EQUAL => struct_ord (t2, u2) | ord => ord)
| (t, u) => int_ord (cons_nr t, cons_nr u));
fun atoms_ord tu = if pointer_eq tu then EQUAL else
(case tu of
(Abs (_, _, t), Abs (_, _, u)) => atoms_ord (t, u)
| (t1 $ t2, u1 $ u2) =>
(case atoms_ord (t1, u1) of EQUAL => atoms_ord (t2, u2) | ord => ord)
| (Const (a, _), Const (b, _)) => fast_string_ord (a, b)
| (Free (x, _), Free (y, _)) => fast_string_ord (x, y)
| (Var (xi, _), Var (yj, _)) => fast_indexname_ord (xi, yj)
| (Bound i, Bound j) => int_ord (i, j)
| _ => EQUAL);
fun types_ord tu = if pointer_eq tu then EQUAL else
(case tu of
(Abs (_, T, t), Abs (_, U, u)) =>
(case typ_ord (T, U) of EQUAL => types_ord (t, u) | ord => ord)
| (t1 $ t2, u1 $ u2) =>
(case types_ord (t1, u1) of EQUAL => types_ord (t2, u2) | ord => ord)
| (Const (_, T), Const (_, U)) => typ_ord (T, U)
| (Free (_, T), Free (_, U)) => typ_ord (T, U)
| (Var (_, T), Var (_, U)) => typ_ord (T, U)
| _ => EQUAL);
fun comments_ord tu = if pointer_eq tu then EQUAL else
(case tu of
(Abs (x, _, t), Abs (y, _, u)) =>
(case fast_string_ord (x, y) of EQUAL => comments_ord (t, u) | ord => ord)
| (t1 $ t2, u1 $ u2) =>
(case comments_ord (t1, u1) of EQUAL => comments_ord (t2, u2) | ord => ord)
| _ => EQUAL);
in
val fast_term_ord = struct_ord ||| atoms_ord ||| types_ord;
val syntax_term_ord = fast_term_ord ||| comments_ord;
end;
(* term_ord *)
(*a linear well-founded AC-compatible ordering for terms: s<t<=>1.size(s)<size(t)or 2.size(s)=size(t)ands=f(...)andt=g(...)andf<gor 3.size(s)=size(t)ands=f(s1..sn)andt=f(t1..tn)and
(s1..sn) < (t1..tn) (lexicographically)*)
val indexname_ord = int_ord o apply2 #2 ||| string_ord o apply2 #1; val tvar_ord = prod_ord indexname_ord sort_ord; val var_ord = prod_ord indexname_ord typ_ord;
local
fun hd_depth (t $ _, n) = hd_depth (t, n + 1)
| hd_depth p = p;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.