Theory Sorted_Wrt
theory Sorted_Wrt
imports Main
begin
lemma sorted_wrt_filter:
"sorted_wrt P xs ⟹ sorted_wrt P (filter Q xs)"
by (induct xs) (auto)
lemma sorted_wrt_map_mono:
assumes "sorted_wrt Q xs"
and "⋀x y. Q x y ⟹ P (f x) (f y)"
shows "sorted_wrt P (map f xs)"
using assms by (induct xs) (auto)
lemma sorted_wrt_concat_map_map:
assumes "sorted_wrt Q xs"
and "sorted_wrt Q ys"
and "⋀a x y. Q x y ⟹ P (f x a) (f y a)"
and "⋀x y u v. x ∈ set xs ⟹ y ∈ set xs ⟹ Q u v ⟹ P (f x u) (f y v)"
shows "sorted_wrt P [f x y . y ← ys, x ← xs]"
using assms by (induct ys)
(auto simp: sorted_wrt_append intro: sorted_wrt_map_mono [of Q])
lemma sorted_wrt_concat_map:
assumes "sorted_wrt P (map h xs)"
and "⋀x. x ∈ set xs ⟹ sorted_wrt P (map h (f x))"
and "⋀x y u v. P (h x) (h y) ⟹ x ∈ set xs ⟹ y ∈ set xs ⟹ u ∈ set (f x) ⟹ v ∈ set (f y) ⟹ P (h u) (h v)"
shows "sorted_wrt P (concat (map (map h ∘ f) xs))"
using assms by (induct xs) (auto simp: sorted_wrt_append)
lemma sorted_wrt_map_distr:
assumes "sorted_wrt (λx y. P x y) (map f xs)"
shows "sorted_wrt (λx y. P (f x) (f y)) xs"
using assms
by (induct xs) (auto)
lemma sorted_wrt_tl:
"xs ≠ [] ⟹ sorted_wrt P xs ⟹ sorted_wrt P (tl xs)"
by (cases xs) (auto)
end