
ãã¶ã€ã³ãã¿ãŒã³ïŒ ç§ããããã«ã€ããŠåããŠç¥ã£ãã®ã¯ãç§ã倧åŠã®å€§åŠé¢çã ã£ããšãã®ãœãããŠã§ã¢èšèšã³ãŒã¹ã§ã§ããã ãã³ãã¬ãŒãã䜿çšããŠããŸããŸãª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ãããã¥ã¡ã³ãä»ããœãŒã¹ã³ãŒã