signature AC_Sort = sig include Abbrev val sort : {assoc : thm, comm : thm, dest : term -> term * term, mk : term * term -> term, cmp : term * term -> order, combine : conv, preprocess : conv} -> conv end (* [sort {assoc,comm,dest,mk,cmp,combine,preprocess}] is a conversion for sorting terms with respect to an associative and commutative operator. It uses a merge sort internally, so should be reasonably efficient. The record's fields are: assoc: associativity theorem in standard r-to-l format: a + (b + c) = (a + b) + c can be universally quantified comm: commutativity theorem (can be universally quantified) dest: destructor function for operator mk: constructor function for operator cmp: comparison function for performing sort. Terms identified as EQUAL will be combined by combine conversion. combine: conv taking terms of the form (t1 op t2) where t1 and t2 have compared as equal. Should always succeed (can be ALL_CONV). preprocess: applied to all leaf terms as term is first examined. If it fails or raises UNCHANGED (i.e., both ALL_CONV and NO_CONV are OK here), nothing further is done. If it succeeds, further processing is performed on the resulting term E.g., combine can combine numeric literals; preprocess could convert a - b into a + -b, or -x into -1 * x, or ~~p into p. *)