芪æãªãhabrayuzerãããããã«ã¡ã¯ïŒ
åä»ãã©ã ãèšç®ãã€ãŸãäŸååã«é¢ããããã€ãã®æ¬ãèªãã åŸãè峿·±ããã¿ãŒã³ãèŠãŸããïŒã©ãã§ããæåã®äŸã¯ãœãŒãããããªã¹ãåã®å®çŸ©ã§ãã ãã¹ãŠã¯åé¡ãããŸãããããã®å®çŸ©ãè¶
ãããã®ã¯ãããŸããã§ããã ããã§ããã®ã®ã£ãããèŠã€ããŠããªã¹ããååŸããŠå¥ã®ãªã¹ããš2ã€ã®èšŒæãè¿ã颿°ãå®è£
ããŸããã 1ã€ã¯çµæãå
¥åã®é åã§ããããšã蚌æãããã1ã€ã¯çµæããœãŒãããããªã¹ãã§ããããšã蚌æããŸãã
æ£åŒãªèª¬æ
ãã®ããŒãã§ã¯ãåŸã§äœ¿çšããäž»ãªã¿ã€ããšããã€ãã®è£å©æ©èœã瀺ããŸãã ãŸããAgdaã®è峿·±ãæ§æäžã®é
åãããã«ç€ºãããŸãã Agdaã«ããŸã詳ãããªã人ã®ããã«ãäŒè°
SPbHUG / FProg 2012-07 ã§ Jan Malakhovskyã®
ãããª/ã¹ã©ã€ããèŠãããšããå§ãããŸãã ãŸãã¯
ãAgda Webãµã€ã ïŒå€§ããã¯ãããŸããïŒãŸãã¯
ãã®ãã¥ãŒããªã¢ã« ããããã¥ã¢ã«ããããã
ãªã¹ãå®çŸ©
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)
ããã«ãªã¹ãããããŸãã æšæºã©ã€ãã©ãªããååŸããå®çŸ©ã ã芧ã®ãšããããªã¹ãã¢ã€ãã ã¯ãä»»æã®ã¿ã€ãã®å€ãããã«ã¯ã¿ã€ããã¿ã€ãã®ã¿ã€ããªã©ã®å€ã«ããããšãã§ããŸãã ããã¯ã髿¬¡ããªã¢ãŒãã£ãºã ã®äœ¿çšã«ããå¯èœã§ããã¬ãã«ãæ
åœãããã©ã¡ãŒã¿ãŒãå°å
¥ãããŸããã€ãŸããéåžžã®åã¯
Set 0åã
Set 0ã¯
Set 1åãªã©ã§ãã
ãŸãããã®å®çŸ©ã§ã¯ãAgdaã§æŒç®åãã©ã®ããã«å®£èšãããŠããããã€ãŸãåŒæ°ãããå Žæã«ã¢ã³ããŒã¹ã³ã¢ã䜿çšããŠå®£èšã§ããŸãã ãã®ã¡ãœããã䜿çšãããšãåäžã®èŠçŽ
[_]ãããªã¹ããè¿ã颿°ãªã©ãããŸããŸãªéåžžã«è峿·±ã圢åŒãå®çŸ©ã§ããããšã«æ³šæããŠãã ããã
ãã¹ãŠã®æŒç®åïŒã¢ã³ããŒã¹ã³ã¢ä»ãã®ã³ã³ãããŒã¿ïŒã«å¯ŸããŠãåªå
床ãšçµåæ§ãæå®ã§ããããšã«æ³šæããŠãã ããã ãŸããAgdaã§ã¯ãã¹ããŒã¹ãšãã©ã±ããïŒäžžæ¬åŒ§ããã³äžæ¬åŒ§ïŒã®ãªãUnicodeã·ãŒã±ã³ã¹ã¯çšèªã§ãã
ãŸããæ¬åŒ§ãšäžæ¬åŒ§ã«ã泚æãæãå¿
èŠããããŸããåã瀺ãäžæ¬åŒ§ã¯ããã®åŒæ°ãæé»çã§ãããã³ã³ãã€ã©ãŒã«ãã£ãŠåºåãããããšã瀺ããŸãã
ããœãŒãæžã¿ãªã¹ãããšå
¥åããŸã
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)
ããã¯ããœãŒãããããªã¹ãã®è¿°èªã®å®çŸ©ã§ãã èšèšè
ã¯å
¬çãšèŠãªãããã¹ãã§ãã
nilã®å
¬çãšç©ºã®ãªã¹ããš1ã€ã®èŠçŽ ããã®ãªã¹ãããœãŒãããããšããå
¬çããããŸãã ãŸãã
äžŠã¹æ¿ããããåã¯ãé åºãæ
åœããè¿°èª
_â€_ã«äŸåããŠããããšã
ããããŸã ãããã¯ãæ¯èŒé¢æ°ã®ãããªãã®ã§ãããäŸååã§ãïŒåŒæ°ã¯éåžžã®åã®å€ã§ãããçµæã¯å€ã蚌æã§ããåã§ãïŒã å

2ã¯ã
xâ€y ïŒ
xâ€yãåã§ãããå
xâ€yã®å€ã
xâ€yã§ãããšãã蚌æããã
å Žå ã
ã«ãªãŒ-ãã¯ãŒãååãåç
§ïŒãšãã®èšŒæãããå Žåã ãå
é ã
yã®ãªã¹ãããœãŒããããããã«ïŒãã®èšŒæã¯
Sorted_â€_ïŒyâ·lïŒåã®å€ã§ã
ïŒ ããªã¹ã
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â)
ã¿ã€ãïŒè¿°èªïŒãé åãã åŒæ°ã¯2ã€ã®ãªã¹ãã§ãã å°å
¥ãããå
¬çã¯æ¬¡ã®
ãšããã§ã
ãrefl-ãªã¹ãã¯ããèªäœã®é åã§ãã
perm-ãããªã¹ã
lãå¥ã®ãªã¹ã
lã®é åã§ããããšã®èšŒæãããå ŽåïŒãã®èšŒæã¯å
permutation lïŒlâ++xââ·xââ·lâïŒã®å€ã§ã ïŒãä»»æã®2ã€ã®
ãªã¹ããäžŠã¹æ¿ããå ŽåèŠçŽ ãé
眮ãããšãæ°ãããªã¹ãã¯æåã®ãªã¹ãã®é åã§ããããšãããããŸãã
ãéããšå
¥åããŸã
data _â_ {ab} (A : Set a) (B : Set b) : Set (a â b) where injâ : (x : A) â A â B injâ : (y : B) â A â B
ããŠãããã§ã¯ãã¹ãŠãåçŽã§ã-ããã¯äŸååã§ã¯ãªã-Haskellã®ããããã®é¡äŒŒç©ã§ãã
補åã®çš®é¡
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
ããã¯ã¿ãã«ã®é¡äŒŒç©ã§ãã ãã®åã¯ã³ã³ã¹ãã©ã¯ã¿ã1ã€ããæã€ããšãã§ããªãããã
ã¬ã³ãŒãã䜿çšãããŸãã ãã®å®çŸ©ã¯äŸååã䜿çšããŸããæåã®èŠçŽ ã¯ç¹å®ã®å€ã§ããã2çªç®ã¯ãã®èŠçŽ ã«å¯Ÿããäœããã®è¿°èªã®å®è¡ã®èšŒæã§ãã ãããããã¡ããããã®ããã«äœ¿çšããå¿
èŠã¯ãããŸãããéåžžã®ã¿ãã«ã®ããã«ïŒ
_Ã_ãä»ããŠïŒå®è¡ã§ããŸã-èŠçŽ éã®äŸåé¢ä¿ã¯ç¡èŠãããŸãã
æ§æã䜿çšãããšãåçŽãªå¯èœæ§ãå°ãªãå Žåã«æ°ããæ§ææ§æãå®çŸ©ã§ããŸãã
ãœãŒãæ©èœ
sort : {A : Set} {_â€_ : A â A â Set} â (â xy â (x †y) â (y †x)) â (l : List A) â Σ[ l' â¶ List A ] (Sorted _â€_ l' à Permutation l l')
æåŸã«ããœãŒã颿°ã®ã¿ã€ãã説æããŸãïŒãã®é¢æ°ã¯ãé åºã決å®ããïŒæé»ã®ïŒè¿°èªãããã³å
¥åå€ã«å¯ŸããŠã1çªç®ã2çªç®ãã倧ããããŸãã¯2çªç®ã1çªç®ãã倧ãããšãã蚌æãè¿ã颿°ãåãå
¥ããŸãã èªè
ã¯ããœãŒãããããªã¹ãçµæã®èšŒæãäœæããããã«ãã®é¢æ°ã䜿çšããããšæšæž¬ãããšæããŸãã ãŸãããã¡ãããå
¥åãã©ã¡ãŒã¿ãŒã®1ã€ã¯ãœãŒãããããªã¹ãã§ãã
ãœãŒã颿°ã¯ããªã¹ããš2ã€ã®èšŒæïŒãœãŒããšé åïŒãè¿ããŸãã
ãœãŒãæ©èœã®å®è£
ãã¡ãããããã§ã¯ãã®é¢æ°ã®å®è£
ã¯ãããŸãããã³ãŒãã衚瀺ããŠãã¿ãŸããããèªåã§èª¬æããŠãã¿ãŸããã ãããã£ãŠããœãŒã颿°ãäœæãããšãã«å¿
èŠãªããã€ãã®è£å©é¢æ°ã®èšŒæïŒå®è£
ïŒãæäŸããŸãã
åäœãããœãŒã¹ã¯ããã«ãããŸãã䜿çšãããAgda-2.3.1ããã³æšæºã©ã€ãã©ãª-0.6
{-# 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
ããã§ãããããã«ããã¹ãŠãåçŽã§ããå
¬çã¯1ã€ã ãã§ããã2ã€ã®ãªããžã§ã¯ããåäžã§ããå Žåã«çãããšããããšã§ãã ãŸããç䟡æ§ã®èšŒæãåŠçããããã®è£å©é¢æ°ãå®çŸ©ããŸãã ããã§ã¯ãã¹ãŠãæç¢ºã ãšæããŸãã
â¡-elimã®äŸã§ã®ã¿èª¬æããŸãïŒ
xâ¡yåã®åŒæ°ã®å¯äžã®å€ã¯
reflã§ãããæé»ã®ãã©ã¡ãŒã¿ãŒã1ã€ãããwhich
-elim refl _ pè¡ã§ã¯åæã«
xãš
yã«çãããããå€
p typeããã³
P xããã³
P y ãããã³
pã®å€ã
P yåã®å Žåããã®ç¶æ³ã§ã¯ããã¯
â¡-elim颿°ã®çµæã«ãªã
ãŸã ã
飿³é£çµæäœ
++-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)
ããã§ãHaskellã®å Žåã®ããã«ã
$ã¯ã¢ããªã±ãŒã·ã§ã³æŒç®åã«ãããŸããã å®çŸ©ããããã®é¢æ°ïŒãŸãã¯è£é¡ãšèšããŸãïŒã3ã€ã®ä»»æã®ãªã¹ãã®é£çµæäœã®çµåæ§ã蚌æããããšã¯æããã§ãã ã³ã³ãã€ã«äžã«ãæ¢åã®å®çŸ©ã䜿çšããŠçšèªãéšåçã«åæžãããããšã«æ³šæããŠãã ããã ãã®æ©èœã§ã¯ã次ã®ããšãè¡ãããŸãã
æé
â¡-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â
ãããã®æ©èœã¯ããè峿·±ããã®ã§ãã ããã§ãåãå®çãŸãã¯è£é¡ãšã¿ãªãã察å¿ããåã®çšèªã蚌æ ãšèŠãªãå Žåãç¹å®ã®ã¹ããŒãã¡ã³ãã®èšŒæ ïŒããã³å¯Ÿå¿ããåã®çšèªïŒãããã€ãã£ãŠãããããšã¯æããã§ãã ããšãã°ãäžèšã®æ©èœã¯ç°¡åã«èšŒæã§ããããã«æããŸãã ãŸããç§ãåŒçšãããœãŒãæžã¿ãªã¹ãã®ã¿ã€ããäžçš®ã®ã·ã³ã°ã«ãã³ã§ããããšãè峿·±ãã§ããåã¿ã€ãã«ã¯1ã€ã®ä»£è¡šããããŸãã é åã«é¢ããŠã¯ã1ã€ã®ã¿ã€ãã«å¯ŸããŠãç¡éã®æ°ã®ç°ãªãçšèªãååšããå¯èœæ§ããããŸãïŒããšãã°ããªã¹ãã倿Žãããªãããã«ãåãèŠçŽ ã2ååé
眮ã§ããŸãïŒã
èªç¶æ°ã§æ³šæãã
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
ãããŠæåŸã«ãèªç¶æ°ã®é åºã決å®ããããã®è§£æ±ºæé ã ïŒå€æ°ã®ååã®ä»ãæ¹ã«æ³šæããŠãã ãã-ã¹ããŒã¹ã®ãªãçšèªãæã€ãã®ãã¹ãŠãïŒè¿°èª
_â€_ã䜿çšãããŸãã 2ã€ã®å
¬çãå°å
¥ããã1ã€ã¯ä»»æã®æ°ããŒã以äžã§ããããšã瀺ãããã1ã€ã¯ã1ã€ã®æ°ããã1ã€ãã倧ããå Žåã1ã€ã远å ãããå Žåã«æ¯çãä¿æãããããšã瀺ããŸãã
ããã§ã
withæ§æã䜿çšãããŠããŸããããã®äœ¿çšæ³ã¯éåžžã«æç¢ºã ãšæããŸãã
ããã ãã§ã:)
ãã®ãããªããã°ã©ã ãæžãããšã¯éåžžã«è峿·±ããšèªåããèšããŸãã