(* Title: HOL/ex/sorting.thy ID: $Id: Sorting.thy,v 1.13 2006/11/17 01:24:49 wenzelm Exp $ Author: Tobias Nipkow Copyright 1994 TU Muenchen *) header{*Sorting: Basic Theory*} theory Sorting imports Main Multiset begin consts sorted1:: "('a => 'a => bool) => 'a list => bool" sorted :: "('a => 'a => bool) => 'a list => bool" primrec "sorted1 le [] = True" "sorted1 le (x#xs) = ((case xs of [] => True | y#ys => le x y) & sorted1 le xs)" primrec "sorted le [] = True" "sorted le (x#xs) = ((∀y ∈ set xs. le x y) & sorted le xs)" definition total :: "('a => 'a => bool) => bool" where "total r = (∀x y. r x y | r y x)" definition transf :: "('a => 'a => bool) => bool" where "transf f = (∀x y z. f x y & f y z --> f x z)" (* Equivalence of two definitions of `sorted' *) lemma sorted1_is_sorted: "transf(le) ==> sorted1 le xs = sorted le xs"; apply(induct xs) apply simp apply(simp split: list.split) apply(unfold transf_def); apply(blast) done lemma sorted_append [simp]: "sorted le (xs@ys) = (sorted le xs & sorted le ys & (∀x ∈ set xs. ∀y ∈ set ys. le x y))" by (induct xs) auto end
lemma sorted1_is_sorted:
transf le ==> sorted1 le xs = Sorting.sorted le xs
lemma sorted_append:
Sorting.sorted le (xs @ ys) =
(Sorting.sorted le xs ∧ Sorting.sorted le ys ∧ (∀x∈set xs. ∀y∈set ys. le x y))