Source code on Github
open import Prelude.Init; open SetAsType
open import Prelude.General
open import Prelude.Decidable
open import Prelude.DecEq.Core
open import Prelude.Null
open import Prelude.Lists.Permutations
open import Prelude.Lists.Empty
open import Prelude.Ord.Core
open import Prelude.Ord.Dec
module Prelude.Ord.Sort {A : Type ℓ}
⦃ _ : Ord A ⦄ ⦃ _ : OrdLaws A ⦄
⦃ _ : DecEq A ⦄ ⦃ _ : DecOrd A ⦄
where
private
TO = record {Carrier = A ; _≈_ = _ ; _≤_ = _≤_ ; isTotalOrder = isTotalOrder}
DTO = record {Carrier = A ; _≈_ = _ ; _≤_ = _≤_ ; isDecTotalOrder = isDecTotalOrder}
import Data.List.Relation.Unary.Sorted.TotalOrder TO as S
import Data.List.Relation.Unary.Sorted.TotalOrder.Properties as SP
open import Data.List.Relation.Unary.Sorted.TotalOrder TO public
using (Sorted)
renaming
( head to Sorted-head
; tail to Sorted-tail
; irrelevant to Sorted-irrelevant
)
open import Data.List.Sort.MergeSort DTO public
using (sort; sort-↗; sort-↭)
instance
Dec-Sorted : Sorted ⁇¹
Dec-Sorted .dec = S.sorted? _≤?_ _
Sorted? = Decidable¹ Sorted ∋ dec¹
private variable x : A; xs : List A; P : Pred A ℓ′
Unique-sort⁺ : Unique xs → Unique (sort xs)
Unique-sort⁺ = Unique-resp-↭ (↭-sym $ sort-↭ _)
Sorted-filter⁺ : (P? : Decidable¹ P) → Sorted xs → Sorted (filter P? xs)
Sorted-filter⁺ P? = SP.filter⁺ TO P?
postulate Sorted⇒sort-id : Sorted xs → sort xs ≡ xs
AllPairs⇒Sorted = SP.AllPairs⇒Sorted TO
Sorted⇒AllPairs = SP.Sorted⇒AllPairs TO
open L.Mem
∈-sort : x ∈ xs ↔ x ∈ sort xs
∈-sort = L.Perm.∈-resp-↭ (↭-sym $ sort-↭ _) , L.Perm.∈-resp-↭ (sort-↭ _)
∈-sort⁺ : x ∈ xs → x ∈ sort xs
∈-sort⁺ = ∈-sort .proj₁
∈-sort⁻ : x ∈ sort xs → x ∈ xs
∈-sort⁻ = ∈-sort .proj₂
Null-sort : Null xs ↔ Null (sort xs)
Null-sort = Null-↭ (↭-sym $ sort-↭ _) , Null-↭ (sort-↭ _)
Null-sort⁺ : Null xs → Null (sort xs)
Null-sort⁺ = Null-sort .proj₁
Null-sort⁻ : Null (sort xs) → Null xs
Null-sort⁻ = Null-sort .proj₂