ãã¶ã€ã³ãã¿ãŒã³ïŒ ç§ããããã«ã€ããŠåããŠç¥ã£ãã®ã¯ãç§ã倧åŠã®å€§åŠé¢çã ã£ããšãã®ãœãããŠã§ã¢èšèšã³ãŒã¹ã§ã§ããã ãã³ãã¬ãŒãã䜿çšããŠããŸããŸãªJavaããã°ã©ã ãäœæããŸããã ãã以æ¥ããã®ãã¬ãŒãºã¯OOPã®ãããªãã®ã«é¢é£ä»ããããŠããŸãã ããããAgdaèšèªãç解ããŠãããšãThe Power Of Piãšããèšäºã«åºããããŸããããã®èšäºã§ã¯ãäŸååãæã€èšèªã®ãã¶ã€ã³ãã¿ãŒã³ã«ã€ããŠèª¬æããŠããŸãã
ãã®æçš¿ã§ã¯ãViewãšåŒã°ãããããã®ãã³ãã¬ãŒãã®1ã€ã«ã€ããŠèª¬æããŸãã ããã«ãããã«ã¹ã¿ã ãã¿ãŒã³ãããã³ã°ã«ãŒã«ãå®è£ ã§ããŸãã ãããã©ã®ãããªãã¿ãŒã³ã§ããããã«ã¹ã¿ã ãã¿ãŒã³ãããã³ã°ãšã¯äœããäŸååã®ããèšèªã§ã®ãã¿ãŒã³ãããã³ã°ã®æ©èœã¯äœãããããŠéçåä»ãïŒHaskellãScalaãOcamlãFïŒïŒã䜿çšããé¢æ°åããã°ã©ãã³ã°èšèªã«ç²ŸéããŠããå Žå-ãã£ãããžããããïŒ
ãã¥ãŒãšãŠãŒã¶ãŒãã¿ãŒã³ãããã³ã°
æåã«ããŠãŒã¶ãŒãã¿ãŒã³ãããã³ã°ãšã¯äœããèããŸãããã ããã€ãã®xsãªã¹ããæäœããŠããã¿ãŒã³ãããã³ã°ãå®è¡ããŠã¿ãŸãããã
match xs with [] -> ... (y : ys) -> ...
ããã§ã¯ã xsã空ã®ãªã¹ããŸãã¯headèŠçŽ ãšããã«å²ãåœãŠããããªã¹ãã§æ§æããããªã¹ãã®ãããããšããŠèŠãŸãã ããããããšãã°ãããã€ãã®2ã€ã®ãªã¹ãysãšzsã®é£çµã§æ§æããããªã¹ããšããŠxsã調ã¹ããå Žåã¯ã©ãã§ããããã ã®ãããªãã®
match xs with [] -> ... (ys ++ zs) -> ...
èšãæããã°ããã¿ãŒã³ãããã³ã°ã®çµæãšããŠããŒã¿æ§é ãã©ã®ããã«è¡šçŸããããã«åœ±é¿ãäžããããšèããŠããŸãã ãããã«ã¹ã¿ã ãã¿ãŒã³ãããã³ã°ãšåŒã³ãŸãã
èšäºãé²ãã«ã€ããŠãç§ãã¡ã®ç®æšã¯ã次ã®ç¶æ³ã«åãããŠã«ã¹ã¿ã ãã¿ãŒã³ãããã³ã°ãå®è£ ããããšã§ãã åºå®é·ã®ããããã¯ãã«ã䜿çšããŸãã åæã«ãåã®ãã¯ãã«ã®é·ããçŽæ¥æå®ããæ©èœããããŸãã ããšãã°ã ãããè¡šèšæ³[32]ã¯ã ãããã32ãããã®ãã¯ãã«ã§ããããšãæå³ããŸã ã ãã¿ãŒã³ãããã³ã°ã®éçšã§ãããšãã°æ¬¡ã®ããã«ãããŸããŸãªæ¹æ³ã§ãã¯ãã«ãçããéšåã«åå²ã§ããããã«ããããšèããŠããŸãã
swapAB : [32] -> [32] swapAB [abcd] = [bacd]
ãã®é¢æ°ã¯32ããããã¯ãã«ãåãå ¥ããããã4ã€ã®éšåã«åå²ããŸããåéšåã¯8ããããã¯ãã«ã§ãããæåã®2ã€ã®8ãããã¯ãŒãã亀æããŸãã 圌女ã¯ãåãæåãåããŠããããã16ãããã®2ã€ã®éšåã«åå²ã§ããŸããã ãã®ãããªæ©èœã¯ãæå·åãœãããŠã§ã¢ãäœæãããšãã«åœ¹ç«ã¡ãŸãã ããšãã°ãæå·åã¢ã«ãŽãªãºã ãèšè¿°ããããšã§åŒ·åãããCryptolèšèªã®äžå¿ã«ã¯ãåæ§ã®ãã®ããããŸãã Agdaã§ãããå®è£ ããæ¹æ³ãèŠãŠã¿ãŸãããã
ã«ã¹ã¿ã ãã¿ãŒã³ãããã³ã°ãå®è£ ããããã®äžè¬çãªã¹ããŒã ã¯æ¬¡ã®ãšããã§ãã
- ãœãŒã¹ããŒã¿ã¿ã€ãã®Viewãã³ãã¬ãŒããå®è£
ãã
- å¿ èŠãªãã©ãŒã ã®å ã®åã®å€ãã³ã³ã¹ãã©ã¯ã¿ãè¡šãViewããŒã¿åãå®çŸ©ããŸã
- å ã®ããŒã¿åã®å€ããViewåã®å€ãæ§ç¯ãããã¥ãŒé¢æ°ãäœæããŸã
- ãã¥ãŒé¢æ°åŒã³åºãçµæã§ãã¿ãŒã³ãããã³ã°ã䜿çšãã
ãããã®ç¹ãæ±ãåã«ãããã€ãã®åºæ¬çãªããŒã¿åãå®çŸ©ããŸãã
Agdaã®èªç¶æ°ãšãã¯ãã«
èªç¶æ°ã¯ååž°çã«æ±ºå®ãããŸãïŒ
data Nat : Set where Zero : Nat Suc : Nat -> Nat
Natã®ã¿ã€ãã決å®ãããšãããã®ã¿ã€ãã瀺ããŸãïŒ æ°å3ãNatåã§ããããã«ã Natèªäœã®åã¯Setåã§ãã ã»ããã¯ãAgdaã®çµã¿èŸŒã¿ã¿ã€ãã§ãã ãã ãããªããããå¿ èŠãªã®ããç解ããããšã¯åœ¹ã«ç«ã¡ãŸããããã¹ãŠã®åãSetåã§ãããšåçŽã«ä»®å®ã§ããŸãããããã¯æ£ãããããŸããã
Natåã«ã¯2ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒããããŸããåŒæ°ãæããªãZeroãš ãåŒæ°ã1ã€æã€ã³ã³ã¹ãã©ã¯ã¿ãŒSucã§ãã ãããã£ãŠãæ°å€3ã¯ïŒSucïŒSucïŒSuc ZeroïŒïŒïŒã®ããã«ãªããŸããã€ãŸããïŒ1 +ïŒ1 +ïŒ1 + 0ïŒïŒïŒã®ããã«ãªããŸãã ãã ããAgdaã«ã¯ãªãã©ã«ãçµã¿èŸŒãŸããŠãããããé·ãSucãã§ãŒã³ã®ä»£ããã«ãåã«3ãšæžãããšãã§ããŸã ã
ãã¯ãã«ã¯ã次ã®ããã«å®çŸ©ãããåºå®é·ã®ãªã¹ãã§ãã
data Vec (A : Set) : Nat -> Set where [] : Vec A Zero _::_ : {n : Nat} -> A -> Vec A n -> Vec A (Suc n)
Natãšã¯ç°ãªãã Vecåã«ã¯2ã€ã®ãã©ã¡ãŒã¿ãŒããããŸããAåãšNatåã®å€ã§ãã 2çªç®ã®Vecãã©ã¡ãŒã¿ãŒã¯åã§ã¯ãªãå€ã§ããããã Vecã¯äŸååã§ãã ãã©ã¡ãŒã¿ãŒãã³ãã³ã§åºåãããŠãããšããäºå®ã¯ãããšãã°èšå·->ã§ã¯ãªããå¶ç¶ã§ã¯ãããŸããã å®éãã³ãã³ã®åŸã«èšè¿°ãããã®ã¯ããã©ã¡ãŒã¿ãŒã§ã¯ãªããããããã€ã³ããã¯ã¹ã§ãã ãã ããç§ãã¡ã«ãšã£ãŠããã®éãã¯ç¹å¥ãªåœ¹å²ãæãããããã¹ãŠããã©ã¡ãŒã¿ãŒãšåŒã³ãŸãã
æåã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ç©ºã®ãã¯ã¿ãŒãäœæããŸãã Agdaã§ã¯ãç°ãªãæåã·ãŒã±ã³ã¹ãååãšããŠäœ¿çšã§ãããããã³ã³ã¹ãã©ã¯ã¿ãŒ[]ãåŒã³åºãããšãã§ããŸãã
2çªç®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯ããã¯ãã«nã®ãµã€ãºãã¿ã€ãAã®ãã¯ãã«ã®èŠçŽ ããµã€ãºnã®ãã¯ãã«ã®3ã€ã®åŒæ°ãåãããµã€ãºïŒn + 1ïŒã®ãã¯ãã«ãè¿ããŸãã Vecã¿ã€ãèªäœã®æåã®ãã©ã¡ãŒã¿ãŒãšåæ§ã«ãæåã®åŒæ°ã«ããã¿ã€ãã ãã§ãªãåå-nïŒNatãæå®ããããšã«æ³šæããŠãã ããã 3çªç®ã®åŒæ°ãšæ»ãå€ã宣èšãããšãã«ãã®å€ãåç §ããããããããå¿ èŠã§ãã ããã«ãæåã®åŒæ°ã¯äžæ¬åŒ§ã§å²ãŸããŸãã ãããã£ãŠãAgdaã§ã¯æé»çãªåŒæ°ãè¡šçŸãããŸãã å®éã nã®å€ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®3çªç®ã®åŒæ°ããäžæã«åŸ©å ã§ãããšããããšã§ãã å®éããã¯ãã«ãæž¡ããšããã®ãµã€ãºãããããã¿ã€ãã§æå®ãããŸãã ãããã£ãŠãå®éã«ã¯ãæåã®åŒæ°ãæž¡ãããšã¯ã§ããŸãããAgdaèªäœãäœããã¹ãããæšæž¬ããŸãã ãããã£ãŠãã³ã³ã¹ãã©ã¯ã¿ãŒ_ :: _ã®åŒã³åºãã¯ã _ :: _ {n} a someVecãŸãã¯_ :: _ a someVecã®ããã«ãªããŸãã ããããããã ãã§ã¯ãããŸããïŒ å®éãã³ã³ã¹ãã©ã¯ã¿ãŒåã®äžç·ã¯ãæ¿å ¥èªã§ããããšã瀺ããŠããŸãã 2ã€ã®æ瀺çãªåŒæ°ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®ååã®åŸã«ã§ã¯ãªããã¢ã³ããŒã¹ã³ã¢ã®ä»£ããã«ããã¹ãŠãã¹ããŒã¹ã§åºåã£ãŠèšè¿°ããããšãã§ããŸãã ãã®çµæããã¯ã¿ãŒãäœæããäŸã次ã«ç€ºããŸãã
v1 : Vec Nat 2 v1 = 1 :: (2 :: [])
次ã®ããã«æžãããšã¯ã§ããªãããšã«æ³šæããŠãã ããã
v1 : Vec Nat 3 v1 = 1 :: (2 :: [])
ã³ã³ã¹ãã©ã¯ã¿ãŒ[]ã¯é·ã0ã®ãã¯ãã«ãäœæããæåã®ã³ã³ã¹ãã©ã¯ã¿ãŒ::ã¯é·ã1ã®ãã¯ãã«ã2çªç®ã®::ã¯é·ã2ã®ãã¯ãã«ã§ããVecNat 2ãååŸããŸããã3ãå¿ èŠã§ããåæšè«ã·ã¹ãã ã§ã¯ãã®ãããªã³ãŒããã³ã³ãã€ã«ã§ããŸããã
ãšãããããã¯ã¿ãŒã«å¯Ÿããããã€ãã®æäœãå¿ èŠã«ãªããŸãã
_++_ : forall {A mn} -> Vec A m -> Vec A n -> Vec A (m + n) take : forall {A m} -> (n : Nat) -> Vec A (n + m) -> Vec A n drop : forall {A m} -> (n : Nat) -> Vec A (n + m) -> Vec A m
ããã¯ãã¯ãã«ã®é£çµã§ãããæäœã¯ãæåã®nåã®èŠçŽ ãååŸãããã³ãæåã®nåã®èŠçŽ ãç Žæ£ãã§ãããHaskellã®ãªã¹ãã®å Žåãšåæ§ã§ãã forall {A mn}ã®ãããªã¬ã³ãŒãã¯ãåŒæ°A ã m ãããã³nãæé»çã§ãããšããäºå®ã«å ããŠããããã®ã¿ã€ããæå®ããããªãããšãæå³ããAgdaã«æ瀺çãªåŒæ°ã«åºã¥ããŠæ±ºå®ããããã«èŠæ±ããŸãã
ããããã¯ãã«ã¿ã€ã
ãã¿ãŒã³ãããã³ã°ãå®è£ ããããããã¯ãã«ã®ã¿ã€ãã¯ãéåžžã«åçŽã«èŠããŸãã
data Bit : Set where O : Bit I : Bit Word : Nat -> Set Word n = Vec Bit n
Wordã¯Vec Bitã®å矩èªã§ãããããã䜿çšããŠ32ããããã¯ãã«ãããããšããŠå®£èšã§ããŸãïŒWord 32 ã
ãã¿ãŒã³ãããã³ã°ã«ç§»ãåã«ãäŸååãããå Žåã®æ©èœãèŠãŠã¿ãŸãããã
äŸååãããå Žåã®ãã¿ãŒã³ãããã³ã°æ©èœ
次ã®ããŒã¿åãæ€èšããŠãã ããã
data _==_ {A : Set} : A -> A -> Set where Refl : {x : A} -> x == x
ã¿ã€ãïŒx == yïŒã¯ ãã¿ã€ãAã® 2ã€ã®ç¹å®ã®å€ã«ãã£ãŠãã©ã¡ãŒã¿ãŒåããããæ³åã®ãšããã xãšyã®å€ãçãããšããã¹ããŒãã¡ã³ããè¡šããŸãã åäžã®Reflã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšãããšã xãšyã®ç°ãªãå€ã«å¯ŸããŠã¿ã€ãïŒx == yïŒã®å€ãäœæã§ããªããªããŸãã äŸïŒ
eq : (3 == 3) eq = Refl notEq : (3 == 4) notEq = ?
æåã®ã±ãŒã¹ã§ã¯ãã¿ã€ãïŒ3 == 3ïŒã®å€ãæ§ç¯ããå¿ èŠãããããããå¯èœã«ããã³ã³ã¹ãã©ã¯ã¿ãŒ-ReflããããŸãã type ïŒ3 == 4ïŒã®å€ãæ§ç¯ããããšã¯ã§ããŸãã-Refl㯠typeã«é©ããŠããããtype ==ã«ã¯ä»ã®ã³ã³ã¹ãã©ã¯ã¿ããããŸããã
次ã«ããã®æ©èœãæ€èšããŸãã
f : (x : Nat) -> (y : Nat) -> (x == y) -> Nat
ãã®é¢æ°ã®åŒæ°ã®ãã¿ãŒã³ãããã³ã°ã¯ã©ã®ããã«ãªããŸããïŒ æããã«ã3çªç®ã®åŒæ°ã«ã¯ãã¿ã€ã==ã«ã¯ä»ã®ã³ã³ã¹ãã©ã¯ã¿ããªãããã Reflãèšè¿°ããŸãã ãã®å Žåãæåã®åŒæ°ãš2çªç®ã®åŒæ°ãåãæ°ã§ããããšãèªåçã«ããããŸãïŒ ãã®ãããªå ŽåãAgdaã§ã¯ãããããããããã¿ãŒã³ã䜿çšããŠãã®äºå®ã«æ瀺çã«æ³šæããå¿ èŠããããŸãã
fx .x Refl = x
ãã®ãããªã¬ã³ãŒãã¯ã2çªç®ã®åŒæ°ïŒããããå²ãåœãŠãããæåã®åŒæ°ãšåãååïŒããæåã®åŒæ°ãšäžèŽãããã®ãšåãã§ããããšãæå³ããŸãã Reflãšæ¯èŒããåŸã«åãåã£ãç䟡æ å ±ã倱ããããªãã®ã§ã ããšãã°.xã®ä»£ããã«yãæžãããšã¯ã§ããŸããã
ããããã®çµè«ã¯ããã§ããäŸååãæã€èšèªã§ã¯ãä»»æã®åŒæ°ã®ãã¿ãŒã³ãããã³ã°ã®åŸãä»ã®åŒæ°ã«é¢ããè¿œå æ å ±ãååŸã§ããŸãã
èŠèŽåæ°
Wordã¿ã€ãã®ãã¥ãŒãäœæããåã«ãããç°¡åãªäŸãèããŠãéæãããããšãç解ããŠãã ããã
ãªã¹ãã®ã¿ã€ããèæ ®ããŠãã ããã
data List (A : Set) : Set where [] : List A _::_ : A -> List A -> List A
ããã¯Haskellã®å Žåãšåãéåžžã®ãªã¹ãã§ããæåã®èŠçŽ ãšãªã¹ãããšããŠååž°çã«è¡šç€ºãããŸãã ããªã¹ããšæåŸã®ã¢ã€ãã ããšåããªã¹ãã衚瀺ã§ããããã«ããããšèããŠããŸãã ããã®SnocViewããŒã¿åãååŸããŸãããã
data SnocView {A : Set} : List A -> Set where [] : SnocView [] _:::_ : (xs : List A) -> (x : A) -> SnocView (xs ++ (x :: []))
ããã§ã¯++æŒç®åã䜿çšãããŸã-Haskellã®å Žåã®ããã«ãããã¯ãªã¹ãã®é£çµã§ãã SnocViewåã®å€ã®äŸïŒ
sx : SnocView (1 :: 2 :: 3 :: []) sx = (1 :: 2 :: []) ::: 3
SnocViewã¿ã€ã㯠ããªã¹ãããã³æåŸã®ã¢ã€ãã ãã¥ãŒãæ§ç¯ããããªã¹ãã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããããšã«æ³šæããŠãã ããã
次ã«ã æž¡ããããªã¹ãã®SnocViewåã®å€ãäœæããsnocViewé¢æ°ãäœæããŸãã
snocView : {A : Set} -> (xs : List A) -> SnocView xs snocView [] = [] snocView (x :: xs) with snocView xs snocView (x :: .[]) | [] = [] ::: x snocView (x :: .(ys ++ (y :: []))) | ys ::: y = (x :: ys) ::: y
å€ãã®ããšããããŸããé çªã«å§ããŸãããã 空ã®ãªã¹ãã®å Žåã¯æããã§ãã空ã®ãªã¹ãã¯äºçŽ°ãªSnocViewãæäŸããŸãã ããã«ããªã¹ãã空ã§ãªãå Žåã¯ãwithæ§é ã䜿çšããŸãïŒããã§ã®é·ãã€ã³ãã³ãã¯èªã¿ãããã®ã¿ãç®çãšããŠããŸãïŒã ãã®æ§ç¯ã¯ãHaskellã§ã®æ§ç¯ã®å Žåãšã»ãŒåãã¿ã¹ã¯ãå®è¡ããŸããã€ãŸããé¢æ°æ¬äœã§ãã¿ãŒã³ãããã³ã°ãå®è¡ããããã«äœ¿çšãããŸãã snocView xsãžã®ååž°åŒã³åºããããããããã¿ãŒã³ã¯ãåçŽããŒã®å³åŽã«è¡šç€ºãããŸãã ãã®ãããååž°åŒã³åºãã«ãã£ãŠç°¡åãªSnocViewãæäŸãããå Žåã xsãªã¹ãã¯ç©ºã§ãã£ãããã SnocView for x :: []ã¯[] ::: xã§ãã 2çªç®ã®ã±ãŒã¹ã§ã¯ã SnocView for xsãys ::: yã®ããã«ãªãããã SnocView for x :: xsãååŸããã«ã¯ã ysã®ãããã«xãè¿œå ããå¿ èŠããããŸãã
äžæãªç¹ã¯ã瞊ç·ã®å·ŠåŽã«ç€ºãããŠãããã®ã ãã§ãã åã«èª¬æããããã«ãäŸååãååšããå Žåã®ãã¿ãŒã³ãããã³ã°ã«ãããä»ã®é¢æ°åŒæ°ã«é¢ããè¿œå æ å ±ãåŸãããšãã§ããŸãã ãã®äŸã§ã¯ã snocView xsã®ååž°åŒã³åºãã®ãã¿ãŒã³ãããã³ã°ã«ããã xsãªã¹ãã®å€ã«é¢ããæ å ±ãåŸãããŸãã ãã®æ å ±ã¯ãåçŽããŒã®å·ŠåŽã«ããããããã¿ãŒã³ã䜿çšããŠç€ºãããŸãã ããšãã°ã2çªç®ã®ã±ãŒã¹ã§ã¯ã snocView xsãys ::: yãäžããããšãç¥ããšããªã¹ãxsã ysãš1ã€ã®èŠçŽ y :: []ã®ãªã¹ãã®é£çµãšããŠæ§ç¯ãããŠããããšãããããŸãã
snocViewã䜿çšããŠãæž¡ããããªã¹ããåšæçã«å³ã«ã·ããããé¢æ°ãäœæããäŸã次ã«ç€ºããŸãã
rotateRight : {A : Set} -> List A -> List A rotateRight xs with snocView xs rotateRight ._ | [] = [] rotateRight ._ | ys ::: y = y :: ys
ããã§ã¯ã¢ã³ããŒã¹ã³ã¢ã䜿çšããŸããã ããã¯ãã¢ã³ããŒã¹ã³ã¢ã®ä»£ããã«ããæå³ã«èå³ããªãå Žåã«å®è¡ã§ããŸãã ãšãŠãç°¡æœã§çŸããããã§ãïŒ ãã®äŸã¯ãå®éãäŸååãæã€èšèªã§ã«ã¹ã¿ã ãã¿ãŒã³ãããã³ã°ãå®è£ ããæ¹æ³ã瀺ããŠããŸãã ããã§ã¯ãWordã¿ã€ãã§åãããšãããæ¹æ³ãèŠãŠã¿ãŸãããïŒ
Wordã®SplitView
åã®äŸãšåæ§ã«ã2ã€ã®ãã®ãå¿ èŠã§ããç¹å¥ãªSplitViewããŒã¿åãšã Wordåã®ç¹å®ã®å€ã«å¯ŸããŠSplitViewå€ãäœæããsplitViewé¢æ°ã§ãã
ãŸãã Vecã¿ã€ããæäœããããã®2ã€ã®è¿œå æ©èœãå¿ èŠã§ãã
split : forall {A} -> (n : Nat) -> (m : Nat) -> Vec A (m * n) -> Vec (Vec A n) m split n Zero [] = [] split n (Suc k) xs = (take n xs) :: (split nk (drop n xs)) concat : forall {A nm } -> Vec (Vec A n) m -> Vec A (m * n) concat [] = [] concat (xs :: xss) = xs ++ concat xss
SplitViewã¿ã€ãã¯æ¬¡ã®ããã«ãªããŸãã
data SplitView {A : Set} : {n : Nat} -> (m : Nat) -> Vec A (m * n) -> Set where [_] : forall {mn} -> (xss : Vec (Vec A n) m) -> SplitView m (concat xss)
ãã®ã¿ã€ãã¯ãæ°å€mãšãã¯ãã«ã«ãã£ãŠãã©ã¡ãŒã¿ãŒåãããŸãã mã¯ããã¯ãã«ãåå²ããéšåã®æ°ã瀺ããŸãã ãããããã¯ãã«ã®é·ããmã®åæ°ã§ããçç±ã§ãã å¯äžã®ã³ã³ã¹ãã©ã¯ã¿ã«ããããã®ã¿ã€ãã®å€ã次ã®ããã«æžã蟌ãããšãã§ããŸãã
[ a :: b :: c :: d :: [] ]
ããã§ãaãbãcãããã³dã¯é·ãnã®ãã¯ãã«ã§ãã
次ã¯splitViewé¢æ°ã§ãã
splitView : {A : Set} -> (n : Nat) -> (m : Nat) -> (xs : Vec A (m * n)) -> SplitView m xs
å®è£ ããã«ã¯ã転éããããã¯ãã«ãããããé·ãnã® måã®éšåã«åå²ããã³ã³ã¹ãã©ã¯ã¿ãŒ[_]ã«æž¡ãå¿ èŠããããŸã ã
splitView nm xs = [ split nm xs ]
ãã ãããã®ãããªå®çŸ©ã¯ã³ã³ãã€ã©ãŒã«åãå ¥ããããŸããã å®éãã³ã³ã¹ãã©ã¯ã¿ãŒ[_]ã¯ã SplitView mïŒconcat xssïŒåã®å€ãè¿ããŸãã ãã®å Žåã xssã¯split nm xsã§ãããããåŒ[split nm xs]ã¯SplitView mïŒconcatïŒsplit nm xsïŒïŒã¿ã€ãã§ã ã åæã«ãé¢æ°ã®ã·ã°ããã£ã¯ã SplitView m xsåãè¿ãããšã瀺ããŸããxsã¯é¢æ°ã®3çªç®ã®åŒæ°ã§ãã åŒxsãšconcatïŒsplit nm xsïŒã¯ãŸã£ããåããã®ã§ããããšãç解ããŠããŸããconcaté¢æ°ãšsplité¢æ°ãã©ã®ããã«æ©èœããããç¥ã£ãŠããããã§ãã ãããã³ã³ãã€ã©ã«çŽåŸãããŸãããã
ãŸããäžèšã®splitViewæ¬äœã次ã®åœ¢åŒã«æžãæããŸãã
splitView nm xs with [ split nm xs ] splitView nm xs | v = v
ãã®å®çŸ©ã¯ãåã®å®çŸ©ãšåãçç±ã§ã³ã³ãã€ã©ãŒã«åãå ¥ããããŸãããvã¯SplitView mïŒconcatïŒsplit nm xsïŒïŒã¿ã€ãã§ããã SplitView m xsã§ãªããã°ãªããŸããã å®çŸ©ãåŒãç¶ãå€æŽããŸãã
splitView nm xs with concat (split nm xs) | [ split nm xs ] splitView nm xs | ys | v = v
withæ§é ã¯ãè€æ°ã®åŒã«ãããã¿ãŒã³ãããã³ã°ã«äœ¿çšã§ããŸãããããã®åŒã¯ã瞊æ£ã§äºãã«åºåãããŠããŸãã ããã«ãwithã䜿çšãããšãæ±åãšåŒã°ããå¹æãåŸãããŸãã é¢æ°ã®åŒæ°ã®åãšæ§ç¯ããå¿ èŠãããåŒã®åã¯ããã¿ãŒã³ãããã³ã°ãå®è¡ããåŒã«ãã£ãŠç°ãªãå Žåããããšããäºå®ã«çŸããŸãã ããšãã°ãé¢æ°ãããå Žå
fxy with e fxy | p = ...
次ã«ãäžè¬åã®çµæãšããŠãåŒæ°xããã³yã®åãããã³æ¬äœã§æ§ç¯ããå¿ èŠãããåŒã®åã§ã®åŒeã®ãã¹ãŠã®åºçŸãpã«çœ®ãæããããŸãã ãããŠãwithã«ããã€ãã®åŒãããå Žå
fxy with e1 | e2 | e3 fxy | p1 | p2 | p3 = ...
次ã«ãç¹ã«ã p2ããã³p3ã§ã®e1ã®åºçŸã¯ãã¹ãŠp1ã«çœ®ãæãããã p3ã§ã®e2ã®åºçŸã¯p2ã«çœ®ãæããããŸãã
splitViewã®å®çŸ©ã§ã¯ã concatïŒsplit nm xsïŒãwithã«è¿œå ããããšã«ãããã¿ã€ãvã¯SplitView mïŒconcatïŒsplit nm xsïŒïŒããSplitView m ysã«å€æŽãããŸãã ããã§ã xsãšysãåããã®ã§ããããšã蚌æããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã次ã®é¢æ°ãå¿ èŠã§ãã
splitConcatLemma : forall {A} -> (n : Nat) -> (m : Nat) -> (xs : Vec A (m * n)) -> concat (split nm xs) == xs
転éããããã¯ãã«ã«åŸã£ãŠãå¿ èŠãªåŒconcatïŒsplit nm xsïŒãšxsãçããããšã瀺ããããªãã¿ã®ã¿ã€ã==ã®å€ãæ§ç¯ããŸãã ãã®é¢æ°ã䜿çšããŠã次ã®ããŒãžã§ã³ã®splitViewãååŸããŸãã
splitView nm xs with concat (split nm xs) | [ split nm xs ] | splitConcatLemma nm xs splitView nm xs | ys | v | eq = v
ããã§å€æŽãããåã¯ãããŸããããwithã®æåã®åŒãšåãäžè¬åå¹æã«ããã eqã¯ys == xsåã«ãªããŸãã ããã§ãé¢æ°ãæ©èœãããããã®ãã¹ãŠãã§ããŸããã eqå€ã§ãã¿ãŒã³ãããã³ã°ãå®è¡ããŸãã
splitView nm xs with concat (split nm xs) | [ split nm xs ] | splitConcatLemma nm xs splitView nm xs | .xs | v | Refl = v
ãã£ãïŒ ããã§ãã¹ãŠãæ©èœããŸãïŒ
ããã§ã¯ã splitConcatLemmaé¢æ°ã®å®çŸ©ã¯æäŸããŸããã§ããã ããã¯ãViewãã³ãã¬ãŒãã«é¢ããäŒè©±ã«ãšã£ãŠéèŠã§ã¯ãããŸãããããã«ããã§ã«ããŠã³ããŒããããŠããããšã¯ééããããŸããã ãããããããŸã§èªãã åæ¢ãªæŠå£«ãã¡ã¯ãçµãããè¿ã¥ããŠããŸãã
æåŸã«ã splitViewã䜿çšããã«ã¹ã¿ã ãã¿ãŒã³ãããã³ã°ã«ããswapABé¢æ°ã®å®è£ ïŒ
swapAB : Word 32 -> Word 32 swapAB xs with splitView 8 4 xs swapAB ._ | [ a :: b :: c :: d :: [] ] = concat (b :: a :: c :: d :: [])
ãããã«
ãã®èšäºãèªãã åŸã質åããããŸããäŸååã®ãªãèšèªã§åãã¢ãããŒãã䜿çšããããšã¯å¯èœã§ããïŒ å®éãå¿ èŠãªåœ¢åŒã§ãœãŒã¹ã¿ã€ããè¡šãããšãã§ããããŒã¿ã¿ã€ããèšå®ãããœãŒã¹ã¿ã€ãã®å ¥åå€ããã¿ãŒã²ããå€ãäœæããé¢æ°ãäœæããã ãã§ããã
äŸååã®ãªãèšèªã§ãã®ã¢ãããŒãã䜿çšããããšã®éãã¯ãå ã®å€ãšã®æ¥è§Šã倱ãããšã§ãã ããšãã°ã SnocViewã®ã¿ã€ãã¯ã äœæãããªã¹ãã®å€ã«äŸåããŸããã€ãŸããå ã®å€ãšãã¥ãŒã®é¢ä¿ã¯ãã¿ã€ãã®ã¬ãã«ã§ç¶æãããŸãã ãã®ããã SnocView xsã®å€ã«å¯ŸããŠãã¿ãŒã³ãããã³ã°ãå®è¡ãããšãå ã®ãªã¹ãxsãæ£ç¢ºã«ã©ã®ããã«èŠãããã«é¢ããæ å ±ãããããŸãã äŸååããªããšããã®ãããªæ å ±ã®åä¿¡ã¯æ©èœããŸããã
æåã®ãã®ããçãã2çªç®ã®éãã¯ãäŸååããªããšããã¥ãŒãæ§ç¯ããé¢æ°ãäžè¬çãããããšã§ãã ããšãã°ã snocViewé¢æ°ã®ã¿ã€ãã¯æ¬¡ã®ãšããã§ãã
snocView : {A : Set} -> (xs : List A) -> SnocView xs
é¢æ°æ¬äœã¯å®å šã«ä»»æã§ã¯ããåŸãªãããšã¯æããã§ã-SnocViewãxsã«äŸåããŠãããšããäºå®ã«ãã£ãŠå¶éãããŠããŸãã äŸååããªãå Žåããã®é¢æ°ã¯åã«ãªããŸã
snocView : List A -> SnocView
ãããŠãããšãã°ãå ¥åæã«ç©ºã®ãªã¹ããè¿ãã ãã§ãã»ãšãã©åœ¹ã«ç«ããªããªããŸãã
ãããã£ãŠãèšäºãThe Power Of PiïŒäŸååãéèŠã§ãïŒããéå§ããèšèã§æçš¿ãçµäºããŸãïŒ
åç §ïŒ
ãã³ã©ã¹ã»ãªãŠãªãŒããŠãŒã¿ãŒã»ã¹ãŠã£ã¢ã¹ãã©ãThe Power Of Piã
ããã¥ã¡ã³ãä»ã
ãœãŒã¹ã³ãŒã