data List {a} (A : Set a) : Set a where [] : List A _β·_ : (x : A) (xs : List A) β List A [_] : β {a} {A : Set a} β A β List A [ x ] = x β· [] _++_ : β {a} {A : Set a} β List A β List A β List A [] ++ ys = ys (x β· xs) ++ ys = x β· (xs ++ ys)
data Sorted {A} (_β€_ : A β A β Set) : List A β Set where nil : Sorted _β€_ [] one : {x : A} β Sorted _β€_ [ x ] two : {x : A} β β {yl} β x β€ y β Sorted _β€_ (y β· l) β Sorted _β€_ (x β· y β· l)
data Permutation {A} : List A β List A β Set where refl : β {l} β Permutation ll perm : β {l} lβ xβ xβ lβ β Permutation l (lβ ++ xβ β· xβ β· lβ) β Permutation l (lβ ++ xβ β· xβ β· lβ)
data _β_ {ab} (A : Set a) (B : Set b) : Set (a β b) where injβ : (x : A) β A β B injβ : (y : B) β A β B
record Ξ£ {ab} (A : Set a) (B : A β Set b) : Set (a β b) where constructor _,_ field projβ : A projβ : B projβ syntax Ξ£ A (Ξ» x β B) = Ξ£[ x βΆ A ] B _Γ_ : β {ab} (A : Set a) (B : Set b) β Set (a β b) A Γ B = Ξ£[ _ βΆ A ] B
sort : {A : Set} {_β€_ : A β A β Set} β (β xy β (x β€ y) β (y β€ x)) β (l : List A) β Ξ£[ l' βΆ List A ] (Sorted _β€_ l' Γ Permutation l l')
{-# OPTIONS --no-termination-check #-} module QuickSort where open import IO.Primitive using () renaming (putStrLn to putCoStrLn) open import Data.String using (toCostring; String) renaming (_++_ to _+s+_) open import Data.List open import Data.Nat open import Data.Nat.Show open import Data.Sum open import Data.Product open import Relation.Binary.Core open import Function data Sorted {A} (_β€_ : A β A β Set) : List A β Set where nil : Sorted _β€_ [] one : {x : A} β Sorted _β€_ [ x ] two : {x : A} β β {yl} β x β€ y β Sorted _β€_ (y β· l) β Sorted _β€_ (x β· y β· l) data Permutation {A} : List A β List A β Set where refl : β {l} β Permutation ll perm : β {l} lβ xβ xβ lβ β Permutation l (lβ ++ xβ β· xβ β· lβ) β Permutation l (lβ ++ xβ β· xβ β· lβ) β‘-elim : β {l} {A : Set l} {xy : A} β x β‘ y β (P : A β Set l) β P x β P y β‘-elim refl _ p = p β‘-sym : β {l} {A : Set l} {xy : A} β x β‘ y β y β‘ x β‘-sym refl = refl β‘-trans : β {l} {A : Set l} {xyz : A} β x β‘ y β y β‘ z β x β‘ z β‘-trans refl refl = refl ++-assoc : β {l} {A : Set l} (lβ lβ lβ : List A) β (lβ ++ lβ) ++ lβ β‘ lβ ++ (lβ ++ lβ) ++-assoc [] lβ lβ = refl ++-assoc (h β· t) lβ lβ = β‘-elim (β‘-sym $ ++-assoc t lβ lβ) (Ξ» x β h β· x β‘ h β· t ++ (lβ ++ lβ)) refl decNat : (xy : β) β (x β€ y) β (y β€ x) decNat zero y = injβ zβ€n decNat (suc x) (suc y) with decNat xy ... | injβ p = injβ (sβ€sp) ... | injβ p = injβ (sβ€sp) decNat (suc x) zero = injβ zβ€n perm-trans : β {A} {lβ lβ lβ : List A} β Permutation lβ lβ β Permutation lβ lβ β Permutation lβ lβ perm-trans p refl = p perm-trans pβ (perm lβ xβ xβ lβ pβ) = perm lβ xβ xβ lβ $ perm-trans pβ pβ perm-sym : β {A} {lβ lβ : List A} β Permutation lβ lβ β Permutation lβ lβ perm-sym refl = refl perm-sym (perm lβ xβ xβ lβ p) = perm-trans (perm lβ xβ xβ lβ refl) (perm-sym p) perm-del-ins-r : β {A} (lβ : List A) (x : A) (lβ lβ : List A) β Permutation (lβ ++ x β· lβ ++ lβ) (lβ ++ lβ ++ x β· lβ) perm-del-ins-r lβ x [] lβ = refl perm-del-ins-r lβ x (h β· t) lβ = perm-trans pβ pβ
where pβ : Permutation (lβ ++ x β· h β· t ++ lβ) (lβ ++ h β· x β· t ++ lβ) pβ = perm lβ hx (t ++ lβ) refl pβ : Permutation ((lβ ++ [ h ]) ++ x β· t ++ lβ) ((lβ ++ [ h ]) ++ t ++ x β· lβ) pβ = perm-del-ins-r (lβ ++ [ h ]) xt lβ pβ : (lβ ++ [ h ]) ++ t ++ x β· lβ β‘ lβ ++ h β· t ++ x β· lβ pβ = ++-assoc lβ [ h ] (t ++ x β· lβ) pβ : (lβ ++ [ h ]) ++ x β· t ++ lβ β‘ lβ ++ h β· x β· t ++ lβ pβ = ++-assoc lβ [ h ] (x β· t ++ lβ) pβ : Permutation ((lβ ++ [ h ]) ++ x β· t ++ lβ) (lβ ++ h β· t ++ x β· lβ) pβ = β‘-elim pβ (Ξ» y β Permutation ((lβ ++ [ h ]) ++ x β· t ++ lβ) y) pβ pβ
: Permutation (lβ ++ h β· x β· t ++ lβ) (lβ ++ h β· t ++ x β· lβ) pβ
= β‘-elim pβ (Ξ» y β Permutation y (lβ ++ h β· t ++ x β· lβ)) pβ perm-del-ins-l : β {A} (lβ lβ : List A) (x : A) (lβ : List A) β Permutation (lβ ++ lβ ++ x β· lβ) (lβ ++ x β· lβ ++ lβ) perm-del-ins-l lβ lβ x lβ = perm-sym $ perm-del-ins-r lβ x lβ lβ perm-++ : β {A} {xβ yβ xβ yβ : List A} β Permutation xβ yβ β Permutation xβ yβ β Permutation (xβ ++ xβ) (yβ ++ yβ) perm-++ refl refl = refl perm-++ (perm {xβ} lβ eβ eβ lβ p) (refl {zβ}) = perm-trans pβ
pβ where pβ : Permutation (xβ ++ zβ) ((lβ ++ eβ β· eβ β· lβ) ++ zβ) pβ = perm-++ p refl pβ : (lβ ++ eβ β· eβ β· lβ) ++ zβ β‘ lβ ++ (eβ β· eβ β· lβ) ++ zβ pβ = ++-assoc lβ (eβ β· eβ β· lβ) zβ pβ : lβ ++ (eβ β· eβ β· lβ) ++ zβ β‘ lβ ++ eβ β· (eβ β· lβ) ++ zβ pβ = β‘-elim (++-assoc [ eβ ] (eβ β· lβ) zβ) (Ξ» x β lβ ++ (eβ β· eβ β· lβ) ++ zβ β‘ lβ ++ x) refl pβ : lβ ++ eβ β· (eβ β· lβ) ++ zβ β‘ lβ ++ eβ β· eβ β· lβ ++ zβ pβ = β‘-elim (++-assoc [ eβ ] lβ zβ) (Ξ» x β lβ ++ eβ β· (eβ β· lβ) ++ zβ β‘ lβ ++ eβ β· x) refl gβ : (lβ ++ eβ β· eβ β· lβ) ++ zβ β‘ lβ ++ (eβ β· eβ β· lβ) ++ zβ gβ = ++-assoc lβ (eβ β· eβ β· lβ) zβ gβ : lβ ++ (eβ β· eβ β· lβ) ++ zβ β‘ lβ ++ eβ β· (eβ β· lβ) ++ zβ gβ = β‘-elim (++-assoc [ eβ ] (eβ β· lβ) zβ) (Ξ» x β lβ ++ (eβ β· eβ β· lβ) ++ zβ β‘ lβ ++ x) refl gβ : lβ ++ eβ β· (eβ β· lβ) ++ zβ β‘ lβ ++ eβ β· eβ β· lβ ++ zβ gβ = β‘-elim (++-assoc [ eβ ] lβ zβ) (Ξ» x β lβ ++ eβ β· (eβ β· lβ) ++ zβ β‘ lβ ++ eβ β· x) refl pβ
: Permutation (xβ ++ zβ) (lβ ++ eβ β· eβ β· lβ ++ zβ) pβ
= β‘-elim (β‘-trans pβ $ β‘-trans pβ pβ) (Permutation (xβ ++ zβ)) pβ pβ : Permutation (lβ ++ eβ β· eβ β· lβ ++ zβ) (lβ ++ eβ β· eβ β· lβ ++ zβ) pβ = perm lβ eβ eβ (lβ ++ zβ) refl pβ : Permutation (lβ ++ eβ β· eβ β· lβ ++ zβ) ((lβ ++ eβ β· eβ β· lβ) ++ zβ) pβ = β‘-elim (β‘-sym $ β‘-trans gβ $ β‘-trans gβ gβ) (Permutation (lβ ++ eβ β· eβ β· lβ ++ zβ)) pβ perm-++ {_} {xβ} {yβ} .{_} .{_} pβ (perm {xβ} lβ eβ eβ lβ pβ) = β‘-elim pβ (Permutation (xβ ++ xβ)) pβ where p' : Permutation (xβ ++ xβ) (yβ ++ lβ ++ eβ β· eβ β· lβ) p' = perm-++ pβ pβ pβ : yβ ++ lβ ++ eβ β· eβ β· lβ β‘ (yβ ++ lβ) ++ eβ β· eβ β· lβ pβ = β‘-sym $ ++-assoc yβ lβ (eβ β· eβ β· lβ) pβ : Permutation (xβ ++ xβ) ((yβ ++ lβ) ++ eβ β· eβ β· lβ) pβ = β‘-elim pβ (Permutation (xβ ++ xβ)) p' pβ
: Permutation ((yβ ++ lβ) ++ eβ β· eβ β· lβ) ((yβ ++ lβ) ++ eβ β· eβ β· lβ) pβ
= perm (yβ ++ lβ) eβ eβ lβ refl pβ : Permutation (xβ ++ xβ) ((yβ ++ lβ) ++ eβ β· eβ β· lβ) pβ = perm-trans pβ pβ
pβ : (yβ ++ lβ) ++ eβ β· eβ β· lβ β‘ yβ ++ lβ ++ eβ β· eβ β· lβ pβ = ++-assoc yβ lβ (eβ β· eβ β· lβ) ++-[] : β {l} {A : Set l} (l : List A) β l ++ [] β‘ l ++-[] [] = refl ++-[] (h β· t) = β‘-trans pβ pβ where pβ : (h β· t) ++ [] β‘ h β· t ++ [] pβ = ++-assoc [ h ] t [] pβ : h β· t ++ [] β‘ h β· t pβ = β‘-elim (++-[] t) (Ξ» x β h β· t ++ [] β‘ h β· x) refl data ConstrainedList {A} (P : A β Set) : List A β Set where [] : ConstrainedList P [] _β·_ : {x : A} {xs : List A} (p : P x) β ConstrainedList P xs β ConstrainedList P (x β· xs) infix 2 _β_ data _β_ {A} : A β List A β Set where exact : β ht β h β h β· t cons : β h {xl} β x β l β x β h β· l create-β : β {A} (lβ : List A) (x : A) (lβ : List A) β x β (lβ ++ x β· lβ) create-β [] x lβ = exact x lβ create-β (hβ β· tβ) x lβ = cons hβ $ create-β tβ x lβ perm-β : β {A l l'} {x : A} β x β l β Permutation l' l β x β l' perm-β p refl = p perm-β {A} .{lβ ++ xβ β· xβ β· lβ} {l'} {x} pβ (perm lβ xβ xβ lβ pβ) = perm-β (loop lβ xβ xβ lβ pβ) pβ where loop : β lβ xβ xβ lβ β x β lβ ++ xβ β· xβ β· lβ β x β lβ ++ xβ β· xβ β· lβ loop [] .x xβ lβ (exact .x .(xβ β· lβ)) = cons xβ $ exact x lβ loop [] .xβ .x .lβ (cons xβ (exact .x lβ)) = exact x (xβ β· lβ) loop [] .xβ .xβ lβ (cons xβ (cons xβ p)) = cons xβ $ cons xβ p loop (.x β· tβ) xβ xβ lβ (exact .x .(tβ ++ xβ β· xβ β· lβ)) = exact x (tβ ++ xβ β· xβ β· lβ) loop (.hβ β· tβ) xβ xβ lβ (cons hβ p) = cons hβ $ loop tβ xβ xβ lβ p constr-β : β {A l} {x : A} β β {P} β ConstrainedList P l β x β l β P x constr-β [] () constr-β (p β· _) (exact _ _) = p constr-β (_ β· cl) (cons _ p) = constr-β cl p sortedHelperβ : β {A _β€_} {h : A} β β {l'} β Sorted _β€_ l' β β {l} β Permutation ll' β ConstrainedList (Ξ» x β x β€ h) l β β {g'} β Sorted _β€_ (h β· g') β Sorted _β€_ (l' ++ h β· g') sortedHelperβ {_} {_β€_} {h} {l'} sl' pll' cl {g'} sg' = loop [] l' refl sl' where loop : β lβ lβ β lβ ++ lβ β‘ l' β Sorted _β€_ lβ β Sorted _β€_ (lβ ++ h β· g') loop _ .[] _ nil = sg' loop lβ .(x β· []) p (one {x}) = two (constr-β cl $ perm-β xβl' pll') sg' where xβl' : x β l' xβl' = β‘-elim p (Ξ» l β x β l) (create-β lβ x []) loop lβ .(x β· y β· l) pβ‘ (two {x} {y} {l} xβ€y ps) = two xβ€y $ loop (lβ ++ [ x ]) (y β· l) p' ps where p' : (lβ ++ [ x ]) ++ y β· l β‘ l' p' = β‘-trans (++-assoc lβ [ x ] (y β· l)) pβ‘ sortedHelperβ : β {A _β€_} {h : A} β β {l'} β Sorted _β€_ l' β β {l} β Permutation ll' β ConstrainedList (Ξ» x β x β€ h) l β β {g'} β Sorted _β€_ g' β β {g} β Permutation gg' β ConstrainedList (Ξ» x β h β€ x) g β Sorted _β€_ (l' ++ h β· g') sortedHelperβ sl' pll' cl nil _ _ = sortedHelperβ sl' pll' cl one sortedHelperβ sl' pll' cl {h β· t} sg' pgg' cg = sortedHelperβ sl' pll' cl $ two (constr-β cg $ perm-β (exact ht) pgg') sg' quickSort : {A : Set} {_β€_ : A β A β Set} β (β xy β (x β€ y) β (y β€ x)) β (l : List A) β Ξ£[ l' βΆ List A ] (Sorted _β€_ l' Γ Permutation l l') quickSort _ [] = [] , nil , refl quickSort {A} {_β€_} _β€?_ (h β· t) = loop t [] [] [] [] refl where loop : β ilg β ConstrainedList (Ξ» x β x β€ h) l β ConstrainedList (Ξ» x β h β€ x) g β Permutation t ((l ++ g) ++ i) β Ξ£[ l' βΆ List A ] (Sorted _β€_ l' Γ Permutation (h β· t) l') loop [] lg cl cg p = l' ++ h β· g' , sortedHelperβ sl' pll' cl sg' pgg' cg , perm-trans pβ pβ where lSort = quickSort _β€?_ l gSort = quickSort _β€?_ g l' = projβ lSort g' = projβ gSort sl' = projβ $ projβ lSort sg' = projβ $ projβ gSort pll' = projβ $ projβ lSort pgg' = projβ $ projβ gSort pβ : Permutation (l ++ g) (l' ++ g') pβ = perm-++ pll' pgg' pβ : Permutation t (l' ++ g') pβ = perm-trans (β‘-elim (++-[] (l ++ g)) (Ξ» x β Permutation tx) p) pβ pβ : Permutation (h β· t) (h β· l' ++ g') pβ = perm-++ (refl {_} {[ h ]}) pβ pβ : Permutation (h β· l' ++ g') (l' ++ h β· g') pβ = perm-del-ins-r [] hl' g' loop (h' β· t) lg cl cg p with h' β€? h ... | injβ h'β€h = loop t (h' β· l) g (h'β€h β· cl) cg (perm-trans p p') where p' : Permutation ((l ++ g) ++ h' β· t) (h' β· (l ++ g) ++ t) p' = perm-del-ins-l [] (l ++ g) h' t ... | injβ hβ€h' = loop tl (h' β· g) cl (hβ€h' β· cg) (perm-trans p p') where pβ : l ++ g ++ h' β· t β‘ (l ++ g) ++ h' β· t pβ = β‘-sym $ ++-assoc lg (h' β· t) pβ : l ++ (h' β· g) ++ t β‘ (l ++ h' β· g) ++ t pβ = β‘-sym $ ++-assoc l (h' β· g) t pβ : (h' β· g) ++ t β‘ h' β· g ++ t pβ = ++-assoc [ h' ] gt pβ : l ++ h' β· g ++ t β‘ l ++ (h' β· g) ++ t pβ = β‘-sym $ β‘-elim pβ (Ξ» x β l ++ x β‘ l ++ h' β· g ++ t) refl pβ
: Permutation (l ++ g ++ h' β· t) (l ++ h' β· g ++ t) pβ
= perm-del-ins-l lgh' t pβ : Permutation ((l ++ g) ++ h' β· t) (l ++ h' β· g ++ t) pβ = β‘-elim pβ (Ξ» x β Permutation x (l ++ h' β· g ++ t)) pβ
p' : Permutation ((l ++ g) ++ h' β· t) ((l ++ h' β· g) ++ t) p' = β‘-elim (β‘-trans pβ pβ) (Ξ» x β Permutation ((l ++ g) ++ h' β· t) x) pβ showl : List β β String showl [] = "[]" showl (h β· t) = show h +s+ "β·" +s+ showl t lβ : List β lβ = 19 β· 6 β· 13 β· 2 β· 8 β· 15 β· 1 β· 10 β· 11 β· 2 β· 17 β· 4 β· [ 3 ] lβ = quickSort decNat lβ main = putCoStrLn β toCostring $ showl $ projβ lβ
data _β‘_ {a} {A : Set a} (x : A) : A β Set a where refl : x β‘ x β‘-cong : β {ab} {A : Set a} {B : Set b} {xy} β x β‘ y β (f : A β B) β fx β‘ fy β‘-cong refl _ = refl β‘-elim : β {l} {A : Set l} {xy : A} β x β‘ y β (P : A β Set l) β P x β P y β‘-elim refl _ p = p β‘-sym : β {l} {A : Set l} {xy : A} β x β‘ y β y β‘ x β‘-sym refl = refl β‘-trans : β {l} {A : Set l} {xyz : A} β x β‘ y β y β‘ z β x β‘ z β‘-trans refl refl = refl
++-assoc : β {l} {A : Set l} (lβ lβ lβ : List A) β (lβ ++ lβ) ++ lβ β‘ lβ ++ (lβ ++ lβ) ++-assoc [] lβ lβ = refl ++-assoc (h β· t) lβ lβ = β‘-cong (++-assoc t lβ lβ) (Ξ» x β h β· x)
β‘-cong (++-assoc t lβ lβ) (Ξ» x β h β· x)
h β· (t ++ lβ) ++ lβ β‘ h β· t ++ (lβ ++ lβ)
(lβ ++ lβ) ++ lβ β‘ lβ ++ (lβ ++ lβ)
((h β· t) ++ lβ) ++ lβ β‘ (h β· t) ++ (lβ ++ lβ)
lβ = h β· t
((h β· t) ++ lβ) ++ lβ β‘ (h β· t) ++ (lβ ++ lβ)
h β· (t ++ lβ) ++ lβ β‘ h β· t ++ (lβ ++ lβ)
perm-trans : β {A} {lβ lβ lβ : List A} β Permutation lβ lβ β Permutation lβ lβ β Permutation lβ lβ perm-trans p refl = p perm-trans pβ (perm lβ xβ xβ lβ pβ) = perm lβ xβ xβ lβ $ perm-trans pβ pβ perm-sym : β {A} {lβ lβ : List A} β Permutation lβ lβ β Permutation lβ lβ perm-sym refl = refl perm-sym (perm lβ xβ xβ lβ p) = perm-trans (perm lβ xβ xβ lβ refl) (perm-sym p)
perm-del-ins-r : β {A} (lβ : List A) (x : A) (lβ lβ : List A) β Permutation (lβ ++ x β· lβ ++ lβ) (lβ ++ lβ ++ x β· lβ) perm-del-ins-r lβ x [] lβ = refl perm-del-ins-r lβ x (h β· t) lβ = perm-trans pβ pβ
where pβ : Permutation (lβ ++ x β· h β· t ++ lβ) (lβ ++ h β· x β· t ++ lβ) pβ = perm lβ hx (t ++ lβ) refl pβ : Permutation ((lβ ++ [ h ]) ++ x β· t ++ lβ) ((lβ ++ [ h ]) ++ t ++ x β· lβ) pβ = perm-del-ins-r (lβ ++ [ h ]) xt lβ pβ : (lβ ++ [ h ]) ++ t ++ x β· lβ β‘ lβ ++ h β· t ++ x β· lβ pβ = ++-assoc lβ [ h ] (t ++ x β· lβ) pβ : (lβ ++ [ h ]) ++ x β· t ++ lβ β‘ lβ ++ h β· x β· t ++ lβ pβ = ++-assoc lβ [ h ] (x β· t ++ lβ) pβ : Permutation ((lβ ++ [ h ]) ++ x β· t ++ lβ) (lβ ++ h β· t ++ x β· lβ) pβ = β‘-elim pβ (Ξ» y β Permutation ((lβ ++ [ h ]) ++ x β· t ++ lβ) y) pβ pβ
: Permutation (lβ ++ h β· x β· t ++ lβ) (lβ ++ h β· t ++ x β· lβ) pβ
= β‘-elim pβ (Ξ» y β Permutation y (lβ ++ h β· t ++ x β· lβ)) pβ perm-del-ins-l : β {A} (lβ lβ : List A) (x : A) (lβ : List A) β Permutation (lβ ++ lβ ++ x β· lβ) (lβ ++ x β· lβ ++ lβ) perm-del-ins-l lβ lβ x lβ = perm-sym $ perm-del-ins-r lβ x lβ lβ
data β : Set where zero : β suc : β β β data _β€_ : β β β β Set where zβ€n : β {n} β zero β€ n sβ€s : β {mn} (mβ€n : m β€ n) β suc m β€ suc n decNat : (xy : β) β (x β€ y) β (y β€ x) decNat zero y = injβ zβ€n decNat (suc x) (suc y) with decNat xy ... | injβ p = injβ (sβ€sp) ... | injβ p = injβ (sβ€sp) decNat (suc x) zero = injβ zβ€n
Source: https://habr.com/ru/post/148769/
All Articles