æé¢ã®å°ãå³-ããã¯èœã¡ãŸããããã¯æ¶ããŸãïŒ
ã¹ããŒãã®å·ŠåŽ-ãŸã ä¿åã§ããŸããïŒ
ããããå·éã«ã圌ã¯è¡ããªããã°ãªããªã
éã®ãã£ã2/4ã§ãïŒ
ãŠã©ãžããŒã«ã»ãŽã£ãœãããŒã ããŒããç· ãã ãäœåã®åé¢ãå®å
šã«ç¡éã«èŠãããšããããã¯æå³çã«å°ããªæçã«åå²ãããããšãäœåãªããããŸãã æåã®å埩ã§ã¯ãéåžžã«
å°ããªãã®ãéžæããŸããïŒ
éåžžã«ç°¡åãªãã§ãã«ãŒ(board (name chess-board-10x10) (dim "aj") (dim "10-1") (dir (name nw) -1 -1) (dir (name ne) 1 -1) (dir (name se) 1 1) (dir (name sw) -1 1) ) (piece (name Man) (pre (check is-friend?) (take) (log position) (let captured 0) ) (post (check (<= max-captured captured)) (set! max-captured captured) (log " - " position) (drop) ) (move (check (any nw ne)) (check is-empty?) ) (move (while true (let dir (any nw ne sw se)) (check dir) (check is-enemy?) (capture) (inc! captured) (check dir) (check is-empty?) (end-move) ) ) ) (game (name "Simple Checkers") (board chess-board-10x10) (players (White (Man a1 c1 e1 g1 i1 b2 d2 f2 h2 j2 a3 c3 e3 g3 i3)) (Black (Man b8 d8 f8 h8 j8 a7 c7 e7 g7 i7 b6 d6 f6 h6 j6)) ) )
女æ§ãããªããŠãïŒ éåžžã®ã
ãã§ãã«ãŒ ãã«ãŒã«ïŒé§ãé£ã³è¶ããïŒã«åŸã£ãŠãé§ã¯åé²ããæµããåããããšãã§ããŸãã ããŒãã®æåŸã®è¡ã«éãããšãã圌ãã¯äœã«ãå€ãããŸããããåŒãåããèš±å¯ãããŠããã®ã§ã圌ãã¯æµã®äžéšãåŒãåãããšãã§ããŸãã ãã®ç¹ã§ãéçºäžã®ã²ãŒã ã¯ã以åã®
èšäºã® 1ã€ã§èª¬æãããŠããããªã»ãã¢ã®ãã§ãã«ãŒãã«äŒŒãŠããŸãã ãã£ããã£ã¯å¿
é ã§ãããå¯èœãªãã¹ãŠã®åãã®ãã¡ããã¬ãŒã€ãŒã¯æ倧æ°ã®é§ãåãåããéžæããå¿
èŠããããŸãã ãã¬ãŒã€ãŒã®1人ã次ã®ç§»åãå®äºã§ããªãïŒããã¯ãããŠãããããã¹ãŠã®ããŒã¹ã倱ã£ãïŒãšãã²ãŒã ã¯çµäºããŸãã
ãã¡ãããã次ã®ãã§ãã«ãŒã®ã³ãŒãã£ã³ã°ãã«ã€ããŠã¯è©±ããŠããŸããïŒããã¯ããå°ãªãåŽåã§è¡ãããšãã§ããŸãïŒã ã·ã³ãã«ãª
DSLã䜿çšããŠãçæ³çã«ã¯é«åºŠãªããã°ã©ãã³ã°ã¹ãã«ã䜿çšããã«ïŒã€ãŸãã
Zillions of Gamesãå®å
šã«ãªãŒãã³ã§ã¯ãã¹ãã©ãããã©ãŒã ãªãããžã§ã¯ãã§ïŒããªãè€éãªããžãã¯ã²ãŒã ãèšè¿°ããããšãã§ãããã¡ã¿ã²ãŒã ãã·ã¹ãã ãéçºããããšæããŸãã
ã¯ã¬ã€ãžãŒãã·ã¢ã³ã¹ã¿ãã¯ãã·ã³
ç§ã¯éåžžã«é·ãé1ã€ã®è³ªåã«ã€ããŠèããŸããã å®éãã²ãŒã ã®èª¬æãã§ããã ã宣èšçã«ããããã«ã
é決å®çããã°ã©ãã³ã°ãå¿
èŠã§ãïŒ æ¬¡ã®ã³ãŒããèŠãŠãã ããïŒ
(move (check (any nw ne)) (check is-empty?) )
ããã¯ãäœåã®ããµã€ã¬ã³ããã ãŒãã®èª¬æã§ãã ãŸããã¿ãŒã²ããã»ã«ã空ã§ãã
éããå³ã¯ãå西ã
ãŸã㯠ãåæ±ãã«ç§»åã§ãããšèšãããŠããŸãã 䞊åå®è¡ã«ã€ããŠã¯è©±ããŠããŸããïŒãã®çš®ã®ãæé©åãã¯ãéçºã®çŸåšã®æ®µéã§ã¯ææå°æ©ã§ãïŒã ç°¡åã«èšãã°ãããããã®æ°åã«ã¯ïŒå°ãªããšãïŒ2ã€ã®ç§»åã®éžæè¢ãããããããããèæ
®ããå¿
èŠããããŸãã
æ¹åãéžæããç¬éïŒé決å®æ§ã®ãã€ã³ããšåŒã³ãŸãããïŒããã³ãŒã¹ã®æ£ç¢ºæ§ã®åŸç¶ã®ãã§ãã¯ã«å
è¡ããããšãéåžžã«éèŠã§ãã ãã§ãã¯ã®ãããããå®è¡ãããªãå ŽåïŒããšãã°ãããŒããè¶
ããŠïŒãéžæãããªãã·ã§ã³ã®åæã¯ããã«åæ¢ããŸãã ãé決å®æ§ã®ãã€ã³ããã«æ»ãã次ã®ãªãã·ã§ã³ãéžæããŸãã å®éãããã¯æã宣èšçãªåœ¢åŒã§è¡šçŸãããã
ãªã¿ãŒã³ä»ãæ€çŽ¢ ãã®ããã®ããç¥ãããã¢ã«ãŽãªãºã ã§ãã åæ§ã«ãããšãã°ã
æ£èŠè¡šçŸã解éã§ããŸãã
any圢åŒã¯ãã²ãŒã ã®èª¬æã«ãããé決å®æ§ã®å¯äžã®ãœãŒã¹ã§ã¯ãããŸããã ãã§ãã«ãŒã§ã¯ãè€æ°ã®ãã£ããã£ãããã§ãŒã³ã§ãå®è¡ã§ããŸãïŒããã«ããã£ããã£ã®ç¶ç¶ãå¯èœã§ããã°ãå®è¡ããå¿
èŠããããŸãïŒã ã³ãŒãã§ã¯æ¬¡ã®ããã«ãªããŸãã
(move (while true (let dir (any nw ne sw se)) (check dir) (check is-enemy?) (capture) (check dir) (check is-empty?) (end-move) ) )
ãç¡éã®ããµã€ã¯ã«ã«æ©ãŸãããªãã§ãã ããïŒ é¢é£ããæ¡ä»¶ã«éåããå ŽåãïŒå¯Ÿå¿ããã³ãŒã¹ãªãã·ã§ã³ã®åæãšãšãã«ïŒãã§ãã¯ãã§ãã¯ã®ããããã«ãã£ãŠäžæãããŸãã ãã®ã³ãŒãã¯åã®ã³ãŒããããå°ãè€éã§ãããç解ããããšã¯ããªãå¯èœã§ãã ã«ãŒãã®åå埩ã§è¡ãããåŠçã¯æ¬¡ã®ãšããã§ãïŒã¹ããããã€ã¹ãããïŒã
- 4ã€ã®æ¹åã®ãããã ïŒäœ¿ãæ
£ããæŒç®åany ïŒãéžæããå€æ°ã«ä¿åããŸã
- éžæããæ¹åã«ç§»åããŸãïŒå¯èœãªå ŽåïŒ
- ç§ãã¡ã移åãããã£ãŒã«ãã«ã¯ãæµã®ãã£ã®ã¥ã¢ãããã¯ãã§ãïŒããã§ãªããã°ããã¹ãŠãäžæããŸãïŒïŒ
- ç§ãã¡ã¯æ°åãåããŸãïŒçŸåšã ãã«ã³ã®ã¹ãã©ã€ãã«å¯Ÿæããããã®æªçœ®ãæ€èšããŠããŸããïŒ
- ãããŠãåãæ¹åã«ç§»åãç¶ããŸãïŒç§»åããå Žæãããããšã確èªããŸãïŒ
- ã¿ãŒã²ããã»ã«ã¯ç©ºã§ãªããã°ãªããŸããïŒ
- ...
ãã®åŸãéæ³ãå§ãŸããŸãã
移åçµäºãã©ãŒã ã¯ããã®æç¹ã§ç§»å
ãå®äº
ã§ããããšã瀺ããŠãããïŒç¡éïŒã«ãŒãã§ã¯å
ã«é²ãå¿
èŠããããŸãïŒ å®éãããã¯æ¬¡ã®æ¬äŒŒã³ãŒããå®è¡ããããšã«çžåœããŸãããã§ã«ããªãã¿ã®ãã®ãåã³ã¢ãªãŒãã«å
¥ããŸãã
(if (any true false) (execute post-actions) (generate-move) )
ããã«ã
ã©ããéåžžã«æ®éçã§ããããããã®å©ããåããŠãããã©ãŒãã³ã¹ã®ãã1ã€ã®åå è
ãæžãæããããšãã§ããŸããããã¯ãããŸã§æ¥é°ã«æ®ã£ãŠããŸããã
checkã¹ããŒãã¡ã³ãã«çžåœããæ¬äŒŒã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
(if (not <condition>) (any) )
éžæãªãã§ãªãã·ã§ã³ãéžæããããšã¯ããœãŒããå®äºããããã®åªããã¡ã¿ãã¡ãŒã§ãã ãã¡ãããããã¯
ãã§ãã¯ããã®æ¹æ³ã§å®è£
ãããããšãæå³ããŸãããããã®ããã«å®è£
ã§ããŸãïŒ
ç¯å²å€anyæŒç®åã«ã¯ããããžã§ã¯ãéçºã®çŸåšã®æ®µéã§ã¯èæ
®ããªãä»ã®æçšãªã¢ããªã±ãŒã·ã§ã³ã®å¯èœæ§ããããŸãã ããšãã°ã
ãã§ã¹ã®ã²ãŒã ãçµäºããæ¡ä»¶ã¯æ¬¡ã®ããã«ãªããŸãã
(game (name chess-game) (loss (exists? (any King) (if is-friend? (check is-attacked?) ) (check no-moves?) ) ) )
çŽæçã«ã¯ããã®èšé²ã¯ç解ã§ããŸããããã®å®è£
ã®è©³çŽ°ã«é¢ããŠã¯ããŸã æ°ã«ããŸããã ãã§ã¹ã«çããããããããããŸãã
äžè¬ã«ã
äœããã¹ããã¯ç解ã§ããŸãããã
ã©ãããã°ããã®ã§ããããïŒ
anyæŒç®åïŒããã³ãã以äžïŒã¯ã
æ¡åŒµæ©èœã䜿çšããŠå®è£
ã§ããŸãããJavaã«ã¯æ¡åŒµæ©èœããããŸããïŒ ãã°ããã®éãã«ãŒãã«ã®éçºã
Schemeã«åãæ¿ããããšãçå£ã«èããŸããïŒ
Schemeã§ã¯ãç¶ç¶ã ãã§ãªãããã¹ãŠããã®äžã«æ§ç¯ãããŠããŸãïŒã ïŒãæ¡åŒµããåŒã®æ§ææšã«ãã蟌ãã é·ãå®éšã®åŸïŒç§ã¯ãã§ã«çµ¶æã®æ倧ã®æ·±ãã«ããã
Lispãåãšã¡ã€ã³
ã§å°ããªæçã§èªãã§ããïŒãããã§ã
ilammy ïŒãç§ã¯å¥ã®æ¹æ³ãããããšã«æ°ã¥ããã
ãã¯ãŒããã³ã«ã€ããŠå°ã誰ã«ãããããªãããSchemeã¯
ããªãŒã»ãã©ãã§ããã®äœåã§ç¹°ãè¿ãèšåãããŠããããã¯ãŒãã®ãã³ããéåžžã«æãåºãããã èè
ã
ããã説æããæ¹æ³
ã¯æ¬¡ã®ãšããã§ãã
ãã¯ãŒãã®ãã³ã¯ãååŒã®ããã«è²©å£²ããããã«äœ¿çšã§ããŸã-å€ãã®å Žåããã¯ãŒãã¯ååŒãåºå®ããããã³ãå£ããããšãšããããå£ããéã®ãã³ããŒã¯è²Žéãªèžè¡äœåã§ãã ãããŠãã¡ããããã³ã¯æŠåšãšããŠäœ¿çšãããŸãããããäž»ãªç®çã§ãã ãã£ã¹ã¯ãæããããã«æã¡äžããããç å°æ®»ã®ãã¯ãŒããã³ã®å¹³ããªäžžããã³ã¯ãæµãç°¡åã«æ¬éŠããããã«ãæ£ããæããããå Žåãææè
ã«æ»ããŸãã ãã²ãããšåŒã°ããããŸãäžè¬çã§ã¯ãªãé·ããã³ã¯ãäŒçµ±çã«çœå
µæŠã§äœ¿çšãããŸãã ã¹ã«ãã³ãžã£ãŒã±ãŒãã¯ããšããšãããšãã°èŠå¡ã®å£ãå®ããšããªã©ãä¿è·ç®çã§äœ¿çšãããŠããŸããã ãã¯ãŒãã®ãã³ã¯ãå°ãªããšããã¯ãŒããé£ã¹ãããšãã§ããŸãã
æ£ããç解ãããã ç§ã¯Schemeèšèªã
éåžžã«å°æ¬ããŠããŸãïŒç§ã®ãã³ã®å°äººã®ããã«ïŒã ãã®èšèªã
倧奜ãã§ãïŒ ããããç§ã¯ïŒçµ¶æããïŒå®éã®ãããžã§ã¯ãã§çå£ã«äœ¿çšãããã³ã«ããã®æã«äœ¿çšããä»ã®ããã°ã©ãã³ã°èšèªã§åé¡ã
ç°ãªãæ¹æ³ã§è§£æ±ºããæ¹æ³ã
çªç¶æãã€ããŸãã å人çã«ã¯ãããã¯Schemeã®æã䟡å€ã®ãã財ç£ã§ãã ãã®èšèªã¯æ³ååãåŒã³èµ·ãããŸãïŒ
äžè¬çã«ãç§å¯ã¯ç°¡åã§ãã ããã°ã©ã ãäžé£ã®ã³ãã³ããšèŠãªããšïŒã³ãã³ããä»»æã«å¶åŸ¡ãããå¯èœæ§ãããïŒãç¶ç¶ã®å®è£
ãæããã«ãªããŸãã å®éãç¶ç¶ã¯ã³ãã³ãã®ã¢ãã¬ã¹ãšããã¹ãŠã®å€æ°ã®ä¿åãããç¶æ
ã«ãããŸããã ããã¯ã
ASTåŒã䜿çšãããšãã«å¯ŸåŠããå¿
èŠããããã®ãããã¯ããã«ç°¡åã§ãã
ãããã»ããµãèªäœã«ã€ããŠã¯ãçåã¯çããŸããã§ããã
ã¹ã¿ãã¯ããããã·ã³ã¯ããã®æçšæ§ãè€æ°å蚌æããŠããŸããããã«ãç§ã¯ãããã«å¯ŸåŠããªããã°ãªããŸããã§ããã å¯äžã®æ¬ ç¹ã¯ãã¹ã¿ãã¯äžã®ãªãã©ã³ãã®æ£ããé åºã
åžžã«ç£èŠããããã«ãããã°ã©ããŒã®éåžžã«é«ãè³æ Œãå¿
èŠãªããšã§ãã ç§ã«ãšã£ãŠã¯ãDSLã¬ãã«ã§ã³ãã³ããžã®ã¢ã¯ã»ã¹ãéãã€ããã¯ãªãã®ã§ãããã¯åé¡ã§ã¯ãããŸããã ã¹ã¿ãã¯ãã·ã³ã³ãã³ãã¯ã
å
éšè¡šç€ºã®ã¿ã«äœ¿çšãããŸãã
å¥ã®çŽ æŽãããæ©äŒã¹ã¿ãã¯ãã·ã³ã³ãã³ãã䜿çšãããšãå¥ã®èå³æ·±ãæ©äŒãéãããŸãã ZRFïŒZillions of GamesïŒããã³GDLïŒ
Ludi Project ïŒåœ¢åŒã®ã²ãŒã ã®èª¬æãšã®äºææ§ã確ä¿ããããšæ¢ã«
æžããŠããŸãã ãããã®èšèªã¯äž¡æ¹ãšãLispã«äŒŒãŠããã
XSLTã䜿çšããŠãããã®èª¬æããã®å Žã§èªåã®åœ¢åŒã«å€æããäºå®ã§ãã é£ããã§ãããããªãå¯èœã§ãã
æ®å¿µãªããããã®æ¹æ³ã¯
Axiomã«ã¯é©ããŠããŸããã ForthScriptãã·ã³ãXSLTã¹ã¯ãªããã«çµã¿èŸŒãŸããããšã¯ã»ãšãã©ãããŸããã ããããã¹ã¿ãã¯ãã·ã³ã䜿çšããŠãããããDSLããã€ãã¹ããŠãïŒååã«ææžåãããïŒAxiomã³ãã³ãã·ã¹ãã ãè€è£œããŠå
éšè¡šçŸã«çŽæ¥ããŒãããããšã劚ãããã®ã¯äœã§ããïŒ èè
ã¯æ°ã«ããªããšæããŸãïŒããããç§ã¯åœŒã«å°ããŸãïŒã
ãã®åŸããã¹ãŠãç°¡åã§ãã ã³ãã³ããã§ãŒã³ã®å®è¡ã¯ãã»ãšãã©ã®å Žåã
AbstractPorocessorã§ã®äžé£ã®ã³ãã³ãã®å®è¡ã§ãã
Ifããã³
Jumpã³ãã³ãã¯ãåå²æ©èœãšã«ãŒãæ©èœãæäŸããŸãã
Anyã¯éæ³ã«æºã¡ãŠããŸããã
Checkã®å®è£
ã¯éåžžã«ç°¡åã§ãã
CommandFactoryã¯ãååã§ã³ãã³ããäœæããããã®äŸ¿å©ãªã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã 1ã€ã ããæ°åãæãããããšãã§ããŸãã ãé決å®æ§ã®ãã€ã³ãããžã®ããŒã«ããã¯ãå®è£
ããã«ã¯ãããã°ã©ã ã®å®è¡äžã«å€åãããã¹ãŠã®å€æ°ã®ç¶æ
ãèŠããŠåŸ©å
ããããšãåŠã¶å¿
èŠããããŸãã ãããŸãããïŒ
ACIDã§ã¯ãªã
å
ã«é²ãåã«ãäœã«çæãããã決å®ããŸãã ãªã¹ãã¯é·ãã§ãããæ¬åœã«ããããã¹ãŠå¿
èŠã§ãïŒ æ¬åŒ§å
ã«ã¯ãããŒã¿ã¹ãã¬ãŒãžã®ç¬Šå·ã瀺ãããŠããããã®å€ã¯åŸã§è§£èªããŸãã
- æ°åã®é
眮ïŒå·ã®äžéšïŒ
- å³ã®å±æ§å€ïŒç¶æ
ã®äžéšïŒ
- äœçœ®å±æ§å€ïŒç¶æ
ã®äžéšïŒ
- äœçœ®å€ïŒäžæïŒ
- ããŒã«ã«å€æ°ã®å€ïŒäžæçïŒ
圢ç¶é
眮æ
å ±ã¯å€ã§ã¯ãããŸããïŒè€æ°ã®é¢é£ããã¹ã«ã©ãŒå€ã§æ§æãããŠããŸãïŒã ä»ã®å€ã¯å
¥åãããŸããããããã®ååã¯ç¹å®ã®ã¿ã€ãã«æ°žç¶çã«é¢é£ä»ããããŸããã ããã«ãå¯èœãªå Žåã¯æé»çãªåå€æãé©çšãããŸãã çŸåšã3çš®é¡ã®å€ããµããŒããããŠããŸãã
å®éããªã³ã¯ããããŸã (while true (let dir (any ...)) (check dir) ... )
ããã§ã
anyã¯ãããã²ãŒã·ã§ã³ã³ãã³ããå®è¡ããããã«åŸã§äœ¿çšãããæååãè¿ããŸãïŒããã²ãŒã·ã§ã³ã®å®è¡æ¹æ³ã«ã€ããŠã¯åŸè¿°ããŸãïŒã
dirã«æ ŒçŽãããŠããå€ããªã³ã¯ãšããŠããŒã¯ãããŠããªãå Žåã
checkã¯ãããããŒã«å€ãšããŠè§£éããŸãïŒè¡ã空ã§ã¯ãªããã0ãã«çãããªããããããã¯ãtrueãã«ãªããŸãïŒã
ã»ãšãã©ã®å Žåããªã¹ãã¿ã€ãã®ãµããŒããè¿œå ããŸãïŒããã
㯠Ordoã
Goãªã©ã®ã²ãŒã ãå®è£
ããããã«å¿
èŠã«
ãªããŸã ïŒã ããã«ãçŸæç¹ã§ã¯ãããã©ãŒãã³ã¹ã®æé©åãšRAMã®äœ¿çšã«é¢é£ããåé¡ãæ€èšããŠããŸããã ãããã¿ã€ããèšç»ã©ããã«æ©èœããå Žåãããšãã°ãããããã¹ã¯ã䜿çšããŠå€æ°ã®ããŒã«å€ãæ ŒçŽããããšãèããããšãå¯èœã«ãªããŸãã
æ¬åŒ§ã®æå³ã¯äœã§ããïŒãç¶æ
ããšã¯ãããŒãäžã®å¯Ÿå¿ããäœçœ®ãæ£ç¢ºã«åŸ©å
ããããã«å¿
èŠãªæ
å ±ãæå³ããããšãç解ããããšãéèŠã§ãã ããšãã°ãããŒãäžã«ããŒã¹ãé
眮ããããšã¯ã確ãã«å·ã®äžéšã§ãã ããè€éãªäŸã¯ã圢ç¶ã®å±æ§ã§ãã
ãã£ã¹ãã£ã³ã°ãå®è¡ããããã®æ¡ä»¶ã®1ã€ã¯ã以åã®ãã¹ãŠã®ç§»åäžã«
ãã£ã¹ãã£ã³ã°ã«é¢ä¿ãã人ç©ãäžåã§ããããšã§ãã ããŒã«å€ãå«ãFigureã®å±æ§ã«ãã®ãããªèšå·ãä¿åãããšäŸ¿å©ã§ãã ããŒã¹ã䜿çšããŠç§»åãå®è¡ããå Žåããã®å€ãå€æŽãããã®åŸã®ãã£ã¹ããäžå¯èœã«ããŸãã ãã®æ
å ±ã¯ç°ãªãäœçœ®éã§è»¢éããããããç¶æ
ã®äžéšã§ãã åæ§ã«ãç¹å®ã®å³ã§ã¯ãªããäœçœ®å
šäœã«é¢é£ä»ããããå±æ§ãå®çŸ©ã§ããŸãã çŸåšã®å埩ã§ã¯å±æ§ã䜿çšããŸããããããã¯ã¢ãŒããã¯ãã£ã®éåžžã«éèŠãªèŠçŽ ã§ãããããå®è£
ããŸãã
äžæçãªå€ã¯ç¶æ
ã®äžéšã§ã¯ãªããããç°ãªãåãã«å¯Ÿå¿ããäœçœ®éã§è»¢éãããŸããã æãåçŽãªäŸã¯ããŒã«ã«å€æ°ã§ãã åŸã§äœ¿çšããããã«ãååã«å€ãé¢é£ä»ããããšãã§ããŸãã ããŒã«ã«å€æ°ã®ã¹ã³ãŒãã¯ã
letã³ãã³ãã«ããå®çŸ©ã®å Žæããã³ãã³ããã§ãŒã³ã®çµãããŸã§ã§ãã ããã¯ã
letã³ãã³ãæ§æãšSchemeã§äœ¿çšãããæ§æã®éãã説æããŠããŸãã
(seq (let <> <>) ... < > ... )
ããã¯éåžžã«éèŠãªãã€ã³ãã§ãã
ã ãŒããã¬ãŒãºã§ã ãŒããèšç®ãããšãã«ãäºåã¢ã¯ã·ã§ã³ãã¬ãŒãºã®1ã€ïŒ
ãã¬ãã¬ãŒãºïŒã§å®£èšãããå€æ°ã䜿çšã§ããå¿
èŠãããããã§ãã ãŸãã宣èšãããå€æ°ã¯ãæçµã¢ã¯ã·ã§ã³ïŒ
ãã¹ããã¬ãŒãºïŒãå®è¡ãããšãã«äœ¿çšå¯èœãªãŸãŸã§ãªããã°ãªããŸããã å€æ°ã¯ãç¹°ãè¿ããã
let宣èšãšéè€ããå ŽåããããŸãã ããã«ãããŒã«ã«å€æ°ã®å€ã¯
setã䜿çšããŠå€æŽã§ããŸã
ïŒ ã å€æ°ãåé€ããæ©èœïŒã¹ã³ãŒããéããïŒã¯ãã¹ã¿ãã¯ãã·ã³ã®ã³ãã³ãã¬ãã«ïŒãè¡ççãªãå€æ°ã決å®ããããïŒã§
å®è£
ãããŠããŸãããDSLã¬ãã«ã§ã¯ãŸã ãµããŒããããŠããŸããã
æéããŒã¿ã®ããè€éãªäŸã¯ããäœçœ®å€ãã§ãã å Žåã«ãã£ãŠã¯ãå€ãååã ãã§ãªããããŒãäžã®ç¹å®ã®å Žæã«é¢é£ä»ããå¿
èŠããããŸãã ããšãã°ã
Halmaãã¡ããªãŒã®ã²ãŒã ã§ã¯ãã³ãŒã¹ãèšç®ãããšãã«ãã«ãŒããåé¿ããããã«ã蚪åããããŒããã£ãŒã«ããããŒã¯ããå¿
èŠããããŸãã ã³ãŒã¹èšç®ãå®äºãããšããã®æ
å ±ã¯äžèŠã«ãªããŸãïŒç¶æ
ã®äžéšãšããŠä¿åããã«ã¯è²»çšãããããããŸãïŒã å±æ§ã ãã§ãªããçŸåšã®å埩ã§ã¯äœçœ®å€ã䜿çšããŸããïŒç§ã®ç掻ãè€éã«ããªãããã§ãïŒã 圌ãã®å©ããããã°ãããã«ã³ã®ã¹ãã©ã€ããã®ã«ãŒã«ãå®æœããããšã¯å¯èœã§ãããããé·è·é¢ãã ããªããã°ãããã¯é¢ä¿ãããŸããã
ãã®å³ã¯ãã³ãŒã¹ã®èšç®ã«äœ¿çšããããã¹ãŠã®ã¿ã€ãã®ã¹ãã¬ãŒãžã瀺ããŠããŸãã ããŒããããã²ãŒã ã®ããŒã¿ïŒããŒãããããžãªã©ïŒã¯å¯Ÿè±¡å€ã§ãã ãããã¯éåžžã«è€éã«ãªãå¯èœæ§ããããŸããã移åãžã§ãã¬ãŒã¿ãŒã®èŠ³ç¹ããã¯ãäžå®ã§ãã å³ã®é
眮ã«é¢ãããã¹ãŠã®æ
å ±ãããã³ããŒã«ã«å€æ°ãé€ãåè¿°ã®ãã¹ãŠã®å€ã¯ã
Stateã«ä¿åãããŸãã
ç¶æ
ãªããžã§ã¯ãã¯è€è£œã§ããŸãããè€è£œããããªããžã§ã¯ãã«ã¯ç¶æ
èŠçŽ ã«é¢ããæ
å ±ã®ã¿ãå
¥ããŸãïŒäœçœ®ã®å€ã¯ç Žæ£ãããŸãïŒã
LocalEnvironmentã®äž»ãªã¿ã¹ã¯ã¯ãããŒã«ã«å€æ°ã管çããããšã§ãã
IEnvironmentã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããã«å¿
èŠãªãã¹ãŠã®ã¡ãœãããæäŸããŸãã ããã«ãå€æ°åã®ä»£ããã«å®æ°ïŒæ°å€ãåŒçšç¬Šä»ãæååããªãã©ã«
trueããã³
false ïŒãæž¡ãããå Žåã
getã¡ãœããã¯å¯Ÿå¿ããå€ãè¿ããŸãã ãããã®è¡ã«å¯Ÿå¿ããå€ã¯ã
ã»ããã§ã¯å€æŽã§ããŸãã
ïŒ ãŸãã¯
letã§ãªãŒããŒã©ã€ããããŸãã
DSLã®èŠ³ç¹ããã¯ãããåºãã®ååïŒåŒçšç¬Šãªãã®æååïŒã«èšåãããšã
getã³ãã³ããå®è¡ãããŸãã ãã®ã³ãã³ããå®è¡ããçµæã¯ãã³ãã³ããåŠçãããç°å¢ã«ãã£ãŠç°ãªããŸãã ãã¹ãŠã®ç°å¢ã¯ããã§ãŒã³ã§ãæ¥ç¶ãããŠããã
LocalEnvironmentãååãç¥ããªãå Žåã¯ã
StateEnvironmentã«å€ãããŸãã ãããã楜ãã¿ãå§ãŸããŸãã ãã®ã¢ãžã¥ãŒã«ã¯ãããã²ãŒã·ã§ã³ãå¶åŸ¡ããããŒãäžã®ããŒã¹ã®é
眮ã«é¢ããæ
å ±ãžã®ã¢ã¯ã»ã¹ãæäŸãããç䌌å€æ°ããžã®ã¢ã¯ã»ã¹ãæäŸããŸãã
å€èŠ³ã¯æ¬¡ã®ãšããã§ãã ã¢ãã«ãéåžžã®ãã§ã¹ç€ã®äœçœ®ã決å®ãããšããŸãã ãã®å ŽåãDSLã®ä»»æã®äœçœ®ã®ååãå€æ°åã§ãããã®ããã«äœ¿çšã§ããŸãã ãå€æ°ãã®å€ïŒããšãã°ãã
a1 ãïŒã
LocalEnvironmentã§èŠæ±ããã次ã«
StateEnvironmentã§èŠæ±ãã
ãŸã ã ãã®ç°å¢ã¯
Stateã«é¢é£ä»ããããŠãããã¢ãã«ã«ãã£ãŠå®çŸ©ããããã¹ãŠã®äœçœ®ã«é¢ããå®å
šãªæ
å ±ããããŸãã èŠæ±ãããäœçœ®ãååšããå Žåã
trueãè¿ãããå¯äœçšãšããŠãåä¿¡ããäœçœ®ã®ååã
Stateã®çŸåšã®äœçœ®ãå®çŸ©ããå€æ°ã«æ ŒçŽãããŸãã ãã以å€ã®å Žåã
falseãè¿ãããå¯äœçšã¯å®è¡ãããŸããã æ¹åã®ååã¯åãæ¹æ³ã§åŠçãããŸãïŒèŠæ±ã®æç¹ã§ãç¶æ
ã®ãçŸåšã®äœçœ®ãã決å®ããå¿
èŠãããç¹ãç°ãªããŸãïŒã æ¬äŒŒå€æ°ããã²ãŒã·ã§ã³ã«å ããŠã
StateEnvironmentã¯ãéåžžã«æçšãªæ
å ±ãžã®ã¢ã¯ã»ã¹ãæäŸããããã«ããã€ãã®ååãå®çŸ©ããŸãã
- position-çŸåšã®äœçœ®ã®åå
- 空ã§ããïŒ -çŸåšã®äœçœ®ã空ã®å Žåã¯true
- 空ã§ã¯ãªãïŒ -çŸåšã®äœçœ®ã空ã®å Žåã¯false
- åéã§ããïŒ -ãã£ãŒã«ãã«å奜çãªäººç©ãããå Žåã¯true
- åéãããªãïŒ -å奜çãªäººç©ããã£ãŒã«ãã«ããªãå Žåã¯true
- æµã§ããïŒ -æµå¯Ÿçãªäººç©ããã£ãŒã«ãã«ããå Žåã¯true
- æµãããªãïŒ -æµå¯Ÿçãªäººç©ããã£ãŒã«ãã«ããªãå Žåã¯true
- player-çŸåšã®äœçœ®ã«ããããŒã¹ãææããŠãããã¬ãŒã€ãŒã®åå
- piece-çŸåšã®äœçœ®ã«ããå³ã®ã¿ã€ã
ãã©ãŒã -éåžžããã³ç¹å¥äžã§èšã£ãããšãããç§ã説æããŠããDSLãšã¹ã¿ãã¯ããããã·ã³ã®ã³ãã³ããã§ãŒã³ã®éã«ç¹å®ã®ãæŠå¿µçãªãã®ã£ãããããããšã«æ°ã¥ãããšããã§ã«å¯èœã§ããã ããã¯ã
ã¹ããŒãã¡ã³ãã¯ã©ã¹ã®ãã¡ã€ã³ã§ãã ãããã®åã¯ã©ã¹ã®ã¿ã¹ã¯ã¯ã圌ã«ç¥ãããŠãã圢åŒãæ§æããããŒã¯ã³ã®ã·ãŒã±ã³ã¹ãã¹ã¿ãã¯ãã·ã³ã®åœä»€ã®æ£ãããã§ãŒã³ã«å€æããããšã§ãïŒã€ãŸããã³ãŒãçæïŒã ããšãã°ã
ExpressionStatementã¯ãã¹ãŠã®ãéåžžã®ããã©ãŒã ïŒã€ãŸããç¹å¥ã§ã¯ãªããã©ãŒã ïŒãåŠçããŸãã ããããã¹ãŠã®ç®è¡åŒã®ä»çµã¿ã§ãïŒãšããã§ãã¢ãªãã£ã¯è§æ¬åŒ§ã§å®çŸ©ãããŠãããããå ç®ãä¹ç®ãªã©ã®é¢æ°ã¯2ã€ã®ãªãã©ã³ãã®ã¿ã«å¶éãããŸãããããã€ãã¹ã¯åé
ã«ãªããŸãïŒã
ç¹å¥ãªåœ¢åŒã¯ããªãã©ã³ããåŠçããç¹å¥ãªé åºãå®è£
ããŸãã 圌ãã®å
žåçãªä»£è¡šè
ã¯ã
IfStatement ïŒ
elseå¥ããµããŒããããŠããŸãïŒãš
WhileStatementã§ãã
OrStatementããã³
AndStatementãã©ãŒã ããè«çåŒã®ã
ç°¡ç¥è©äŸ¡ããå®è£
ãããããç¹å¥ã§ãã ããã¯ãç䌌å€æ°ãåŒã§äœ¿çšã§ãããã®ã¢ã¯ã»ã¹ãå¯äœçšã«é¢é£ä»ããããããéèŠã§ãã
(
StateStatement ) ,
State . , , , ( ). , , « », :
(check (and (is-empty? n nw) (is-empty? n ne) (is-empty? e ne) (is-empty? e se) (is-empty? s se) (is-empty? s sw) (is-empty? w sw) (is-empty? w nw) ) )
,
is-empty? , . , ( , , ), , , ?
StateEnvironment - , ,
PlayersEnvironment . â . , â , , . , ( ). , ,
PlayerEnvironment false (
StateEnvironment ,
is-friend? is-enemy? ). :
- current-player â ,
- next-player â ,
- turn-number â '' ( â )
- turn-order â ''
PlayersEnvironment , , ,
GlobalEnvironment , ( ). ,
ACID ? - ,
ITransactional .
, . â . , ,
LocalEnvironment ( )
State ( ).
StateEnvironment â
State ,
PlayersEnvironment . ,
Processor , .
«»
äžèšã§ãã»ãšãã©ã®çš®é¡ã®ãã©ããã®ã«ãŒã«ã«åŸã£ãŠããã£ããã£ãå¯èœã§ããã°ããããå®äºããå¿
èŠããããšæ¢ã«è¿°ã¹ãŸããïŒããããã£ããã£ã®åªå
é äœãšåŒã³ãŸãïŒãã²ãŒã ã®äžéšã®ããŒãžã§ã³ãããšãã°åœéãã©ããã§ã¯ãããã«å³ããã«ãŒã«ïŒéåžžã¯ãå€æ°æ±ºã«ãŒã«ããšåŒã°ããŸãïŒãé©çšãããŸããããã«å¿ããŠãå¯èœãªãã¹ãŠã®åãã®ãã¡ããã¬ãŒã€ãŒã¯æ倧æ°ã®æµã®é§ãåãåããéžæããªããã°ãªããŸããããã§ãã«ãŒãäœçœ®çã§æŠç¥çãªã²ãŒã ã«å€ããã®ã¯ãããã£ããã£ã®åªå
é äœãã§ããããããªããã°ãã²ãŒã ã¯ããŸãé¢çœããªãã§ãããïŒãããããã®ã«ãŒã«ã¯DSLã«ã©ã®ããã«åæ ãããŸããïŒ (piece (name Man) (pre ... (let captured 0) ) (post (check (<= max-captured captured)) (set! max-captured captured) ... ) ... (move (while true (let dir (any nw ne sw se)) ... (check is-enemy?) (capture) (inc! captured) ... ) ) )
ãã¹ãã®ããªãããŒãªãã§ãã¯ããå£ããäžå€åŒããšåŒã³ãŸãã圌ã¯ã©ã®ããã«åããŠããŸããïŒæ§æ解æã®éçšã§ã1ã€ã®ããŒã¹ããšã移åãè¡ããããšããŸãããã¹ãã€ã³ã®ãã§ãã¯ã¯æåããå€æ°max-capturedã«ä¿åãããŸãããããã§ããã§ãã¯äžã®æ¡ä»¶ã«éåããããããšãããªããã¹ãŠã®åããæåŠãããŸããå€æ°max-capturedã¯éåžžã«ç¹å¥ãªå Žæã«ä¿åããå¿
èŠãããããšã¯æããã§ããç¶æ
ã®ããŒã«ããã¯ã®åœ±é¿ãåããŠã¯ãªãããæãéèŠãªããšã¯ãèšç®ãããåãã®ãã¹ãŠã®ããªã¢ã³ãïŒã»ãšãã©ç°ãªãçŸå®ãŸã§ïŒã§å©çšã§ããã¯ãã§ããå°çç°å¢ â .
let ,
set! get -!
attribute let , ,
.
, , â ! , . - , , , , , , ⊠!
ã°ããŒãã«å€æ°max-capturedãå€æŽããããã³ã«ä»¥åã«å®è¡ããããã¹ãŠã®ãã§ãã¯ãéåãæ€åºãããå Žåã察å¿ãã移åãæåŠããŸãããããã®åãã®äžå€åŒã¯ããããã®çææã«å®è¡ãããŸããããæ倧ãã£ããã£ãããå€æŽã«ãã£ãŠç Žå£ãããŸããïŒããã¯æ¬åœã«é£ããå Žæã§ããããããæ©èœãããã©ããã¯ãŸã ããããŸãããMoveGeneratorã§ããå¿
èŠããããã®ãããžãã¯ãããã¹ãŠç®¡çããŸããåãã¯éšåçã§ãããããã»ã©ã§ã¯ãããŸãã, , ZoG. , ZSG-. , ,
, . , . , , . , . Axiom
DLL Engine , ZSG. , , , , , ( ), , . .
ZoG â . , ( ), «» . . , . . , ( , )
. , , .
Dagaz ! ,
. , , ,
IState , . . ,
. DSL.
log ( , , ).
MoveLogger ,
ITransactional .
. , , ( , ). , ( , ). , , ( , ). , AI .
, . ZoG, , . , , , . , , , . Dagaz
take ,
« » ,
drop . ,
cascade ,
from to , , (, ). ( ), « » (
,
,
.).
, « » (, ), ? , , ( â « », ). « »
. ( ), , . « », .
( , "
"), , ! , "
", . « » ( , « ») .
no-moves? . , ( ) . .
unit-
, unit-, , unit- ! , ,
TDD , unit-, , ! () (, mock- ), . , ,
â . Unit- , ,
, ,
ããã®ã¢ãããŒãã¯æ¬åœã«å¹æçã§ãïŒãã¹ããäœæããéçšã§ããã§ã«ããã€ãã®é倧ãªãšã©ãŒãèŠã€ããŠä¿®æ£ããŸããããããžã§ã¯ãå
šäœããããã°ãã段éã§ã®åæ§ã®ä¿®æ£ã¯ãã¯ããã«è²»çšãããããŸãã, unit- ( , ) , , . , - ( ), unit- , . - , unit- API ( ), , . , , unit- , ( , ). .