
ã¹ããŒãã®å·ŠåŽ-ãŸã ä¿åã§ããŸããïŒ
ããããå·éã«ã圌ã¯è¡ããªããã°ãªããªã
éã®ãã£ã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ã®æã䟡å€ã®ãã財ç£ã§ãã ãã®èšèªã¯æ³ååãåŒã³èµ·ãããŸãïŒ
ãã¯ãŒãã®ãã³ã¯ãååŒã®ããã«è²©å£²ããããã«äœ¿çšã§ããŸã-å€ãã®å Žåããã¯ãŒãã¯ååŒãåºå®ããããã³ãå£ããããšãšããããå£ããéã®ãã³ããŒã¯è²Žéãªèžè¡äœåã§ãã ãããŠãã¡ããããã³ã¯æŠåšãšããŠäœ¿çšãããŸãããããäž»ãªç®çã§ãã ãã£ã¹ã¯ãæããããã«æã¡äžããããç å°æ®»ã®ãã¯ãŒããã³ã®å¹³ããªäžžããã³ã¯ãæµãç°¡åã«æ¬éŠããããã«ãæ£ããæããããå Žåãææè ã«æ»ããŸãã ãã²ãããšåŒã°ããããŸãäžè¬çã§ã¯ãªãé·ããã³ã¯ãäŒçµ±çã«çœå µæŠã§äœ¿çšãããŸãã ã¹ã«ãã³ãžã£ãŒã±ãŒãã¯ããšããšãããšãã°èŠå¡ã®å£ãå®ããšããªã©ãä¿è·ç®çã§äœ¿çšãããŠããŸããã ãã¯ãŒãã®ãã³ã¯ãå°ãªããšããã¯ãŒããé£ã¹ãããšãã§ããŸãã

æ£ããçè§£ãããã ç§ã¯Schemeèšèªãéåžžã«å°æ¬ããŠããŸãïŒç§ã®ãã³ã®å°äººã®ããã«ïŒã ãã®èšèªã倧奜ãã§ãïŒ ããããç§ã¯ïŒçµ¶æããïŒå®éã®ãããžã§ã¯ãã§çå£ã«äœ¿çšãããã³ã«ããã®æã«äœ¿çšããä»ã®ããã°ã©ãã³ã°èšèªã§åé¡ãç°ãªãæ¹æ³ã§è§£æ±ºããæ¹æ³ãçªç¶æãã€ããŸãã å人çã«ã¯ãããã¯Schemeã®æã䟡å€ã®ãã財ç£ã§ãã ãã®èšèªã¯æ³ååãåŒã³èµ·ãããŸãïŒ
äžè¬çã«ãç§å¯ã¯ç°¡åã§ãã ããã°ã©ã ãäžé£ã®ã³ãã³ããšèŠãªããšïŒã³ãã³ããä»»æã«å¶åŸ¡ãããå¯èœæ§ãããïŒãç¶ç¶ã®å®è£ ãæããã«ãªããŸãã å®éãç¶ç¶ã¯ã³ãã³ãã®ã¢ãã¬ã¹ãšããã¹ãŠã®å€æ°ã®ä¿åãããç¶æ ã«ãããŸããã ããã¯ã ASTåŒã䜿çšãããšãã«å¯ŸåŠããå¿ èŠããããã®ãããã¯ããã«ç°¡åã§ãã
ãããã»ããµãèªäœã«ã€ããŠã¯ãçåã¯çããŸããã§ããã ã¹ã¿ãã¯ããããã·ã³ã¯ããã®æçšæ§ãè€æ°å蚌æããŠããŸããããã«ãç§ã¯ãããã«å¯ŸåŠããªããã°ãªããŸããã§ããã å¯äžã®æ¬ ç¹ã¯ãã¹ã¿ãã¯äžã®ãªãã©ã³ãã®æ£ããé åºãåžžã«ç£èŠããããã«ãããã°ã©ããŒã®éåžžã«é«ãè³æ Œãå¿ èŠãªããšã§ãã ç§ã«ãšã£ãŠã¯ãDSLã¬ãã«ã§ã³ãã³ããžã®ã¢ã¯ã»ã¹ãéãã€ããã¯ãªãã®ã§ãããã¯åé¡ã§ã¯ãããŸããã ã¹ã¿ãã¯ãã·ã³ã³ãã³ãã¯ã å éšè¡šç€ºã®ã¿ã«äœ¿çšãããŸãã
å¥ã®çŽ æŽãããæ©äŒ
ã¹ã¿ãã¯ãã·ã³ã³ãã³ãã䜿çšãããšãå¥ã®è峿·±ãæ©äŒãéãããŸãã ZRFïŒZillions of GamesïŒããã³GDLïŒ Ludi Project ïŒåœ¢åŒã®ã²ãŒã ã®èª¬æãšã®äºææ§ã確ä¿ããããšæ¢ã«æžããŠããŸãã ãããã®èšèªã¯äž¡æ¹ãšãLispã«äŒŒãŠããã XSLTã䜿çšããŠãããã®èª¬æããã®å Žã§èªåã®åœ¢åŒã«å€æããäºå®ã§ãã é£ããã§ãããããªãå¯èœã§ãã
æ®å¿µãªããããã®æ¹æ³ã¯Axiomã«ã¯é©ããŠããŸããã ForthScriptãã·ã³ãXSLTã¹ã¯ãªããã«çµã¿èŸŒãŸããããšã¯ã»ãšãã©ãããŸããã ããããã¹ã¿ãã¯ãã·ã³ã䜿çšããŠãããããDSLããã€ãã¹ããŠãïŒååã«ææžåãããïŒAxiomã³ãã³ãã·ã¹ãã ãè€è£œããŠå éšè¡šçŸã«çŽæ¥ããŒãããããšã劚ãããã®ã¯äœã§ããïŒ èè ã¯æ°ã«ããªããšæããŸãïŒããããç§ã¯åœŒã«å°ããŸãïŒã
æ®å¿µãªããããã®æ¹æ³ã¯Axiomã«ã¯é©ããŠããŸããã ForthScriptãã·ã³ãXSLTã¹ã¯ãªããã«çµã¿èŸŒãŸããããšã¯ã»ãšãã©ãããŸããã ããããã¹ã¿ãã¯ãã·ã³ã䜿çšããŠãããããDSLããã€ãã¹ããŠãïŒååã«ææžåãããïŒAxiomã³ãã³ãã·ã¹ãã ãè€è£œããŠå éšè¡šçŸã«çŽæ¥ããŒãããããšã劚ãããã®ã¯äœã§ããïŒ èè ã¯æ°ã«ããªããšæããŸãïŒããããç§ã¯åœŒã«å°ããŸãïŒã
ãã®åŸããã¹ãŠãç°¡åã§ãã ã³ãã³ããã§ãŒã³ã®å®è¡ã¯ãã»ãšãã©ã®å Žåã AbstractPorocessorã§ã®äžé£ã®ã³ãã³ãã®å®è¡ã§ãã Ifããã³Jumpã³ãã³ãã¯ãå岿©èœãšã«ãŒãæ©èœãæäŸããŸãã Anyã¯éæ³ã«æºã¡ãŠããŸããã Checkã®å®è£ ã¯éåžžã«ç°¡åã§ãã CommandFactoryã¯ãååã§ã³ãã³ããäœæããããã®äŸ¿å©ãªã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã 1ã€ã ããæ°åãæãããããšãã§ããŸãã ãéæ±ºå®æ§ã®ãã€ã³ãããžã®ããŒã«ããã¯ãå®è£ ããã«ã¯ãããã°ã©ã ã®å®è¡äžã«å€åãããã¹ãŠã®å€æ°ã®ç¶æ ãèŠããŠåŸ©å ããããšãåŠã¶å¿ èŠããããŸãã ãããŸãããïŒ
ACIDã§ã¯ãªã
å ã«é²ãåã«ãäœã«çæããããæ±ºå®ããŸãã ãªã¹ãã¯é·ãã§ãããæ¬åœã«ããããã¹ãŠå¿ èŠã§ãïŒ æ¬åŒ§å ã«ã¯ãããŒã¿ã¹ãã¬ãŒãžã®ç¬Šå·ã瀺ãããŠããããã®å€ã¯åŸã§è§£èªããŸãã
- æ°åã®é 眮ïŒå·ã®äžéšïŒ
- å³ã®å±æ§å€ïŒç¶æ ã®äžéšïŒ
- äœçœ®å±æ§å€ïŒç¶æ ã®äžéšïŒ
- äœçœ®å€ïŒäžæïŒ
- ããŒã«ã«å€æ°ã®å€ïŒäžæçïŒ
圢ç¶é 眮æ å ±ã¯å€ã§ã¯ãããŸããïŒè€æ°ã®é¢é£ããã¹ã«ã©ãŒå€ã§æ§æãããŠããŸãïŒã ä»ã®å€ã¯å ¥åãããŸããããããã®ååã¯ç¹å®ã®ã¿ã€ãã«æ°žç¶çã«é¢é£ä»ããããŸããã ããã«ãå¯èœãªå Žåã¯æé»çãªå倿ãé©çšãããŸãã çŸåšã3çš®é¡ã®å€ããµããŒããããŠããŸãã
- ã²ã
- æŽæ°
- ããŒã«å€
å®éããªã³ã¯ããããŸã
ããã§ã anyã¯ãããã²ãŒã·ã§ã³ã³ãã³ããå®è¡ããããã«åŸã§äœ¿çšãããæååãè¿ããŸãïŒããã²ãŒã·ã§ã³ã®å®è¡æ¹æ³ã«ã€ããŠã¯åŸè¿°ããŸãïŒã dirã«æ ŒçŽãããŠããå€ããªã³ã¯ãšããŠããŒã¯ãããŠããªãå Žåã checkã¯ãããããŒã«å€ãšããŠè§£éããŸãïŒè¡ã空ã§ã¯ãªããã0ãã«çãããªããããããã¯ãtrueãã«ãªããŸãïŒã
(while true (let dir (any ...)) (check dir) ... )
ããã§ã anyã¯ãããã²ãŒã·ã§ã³ã³ãã³ããå®è¡ããããã«åŸã§äœ¿çšãããæååãè¿ããŸãïŒããã²ãŒã·ã§ã³ã®å®è¡æ¹æ³ã«ã€ããŠã¯åŸè¿°ããŸãïŒã dirã«æ ŒçŽãããŠããå€ããªã³ã¯ãšããŠããŒã¯ãããŠããªãå Žåã checkã¯ãããããŒã«å€ãšããŠè§£éããŸãïŒè¡ã空ã§ã¯ãªããã0ãã«çãããªããããããã¯ãtrueãã«ãªããŸãïŒã
ã»ãšãã©ã®å Žåããªã¹ãã¿ã€ãã®ãµããŒãã远å ããŸãïŒããã㯠OrdoãGoãªã©ã®ã²ãŒã ãå®è£ ããããã«å¿ èŠã«ãªããŸã ïŒã ããã«ãçŸæç¹ã§ã¯ãããã©ãŒãã³ã¹ã®æé©åãšRAMã®äœ¿çšã«é¢é£ããåé¡ãæ€èšããŠããŸããã ãããã¿ã€ããèšç»ã©ããã«æ©èœããå Žåãããšãã°ãããããã¹ã¯ã䜿çšããŠå€æ°ã®ããŒã«å€ãæ ŒçŽããããšãèããããšãå¯èœã«ãªããŸãã
æ¬åŒ§ã®æå³ã¯äœã§ããïŒ
ãç¶æ
ããšã¯ãããŒãäžã®å¯Ÿå¿ããäœçœ®ãæ£ç¢ºã«åŸ©å
ããããã«å¿
èŠãªæ
å ±ãæå³ããããšãçè§£ããããšãéèŠã§ãã ããšãã°ãããŒãäžã«ããŒã¹ãé
眮ããããšã¯ã確ãã«å·ã®äžéšã§ãã ããè€éãªäŸã¯ã圢ç¶ã®å±æ§ã§ãã ãã£ã¹ãã£ã³ã°ãå®è¡ããããã®æ¡ä»¶ã®1ã€ã¯ã以åã®ãã¹ãŠã®ç§»åäžã«ãã£ã¹ãã£ã³ã°ã«é¢ä¿ãã人ç©ãäžåã§ããããšã§ãã ããŒã«å€ãå«ãFigureã®å±æ§ã«ãã®ãããªèšå·ãä¿åãããšäŸ¿å©ã§ãã ããŒã¹ã䜿çšããŠç§»åãå®è¡ããå Žåããã®å€ã倿Žãããã®åŸã®ãã£ã¹ããäžå¯èœã«ããŸãã ãã®æ
å ±ã¯ç°ãªãäœçœ®éã§è»¢éããããããç¶æ
ã®äžéšã§ãã åæ§ã«ãç¹å®ã®å³ã§ã¯ãªããäœçœ®å
šäœã«é¢é£ä»ãããã屿§ãå®çŸ©ã§ããŸãã çŸåšã®å埩ã§ã¯å±æ§ã䜿çšããŸããããããã¯ã¢ãŒããã¯ãã£ã®éåžžã«éèŠãªèŠçŽ ã§ãããããå®è£
ããŸãã
äžæçãªå€ã¯ç¶æ ã®äžéšã§ã¯ãªããããç°ãªãåãã«å¯Ÿå¿ããäœçœ®éã§è»¢éãããŸããã æãåçŽãªäŸã¯ããŒã«ã«å€æ°ã§ãã åŸã§äœ¿çšããããã«ãååã«å€ãé¢é£ä»ããããšãã§ããŸãã ããŒã«ã«å€æ°ã®ã¹ã³ãŒãã¯ã letã³ãã³ãã«ããå®çŸ©ã®å Žæããã³ãã³ããã§ãŒã³ã®çµãããŸã§ã§ãã ããã¯ã letã³ãã³ãæ§æãšSchemeã§äœ¿çšãããæ§æã®éãã説æããŠããŸãã
ããã¯éåžžã«éèŠãªãã€ã³ãã§ãã ã ãŒããã¬ãŒãºã§ã ãŒããèšç®ãããšãã«ãäºåã¢ã¯ã·ã§ã³ãã¬ãŒãºã®1ã€ïŒ ãã¬ãã¬ãŒãºïŒã§å®£èšããã倿°ã䜿çšã§ããå¿ èŠãããããã§ãã ãŸãã宣èšããã倿°ã¯ãæçµã¢ã¯ã·ã§ã³ïŒ ãã¹ããã¬ãŒãºïŒãå®è¡ãããšãã«äœ¿çšå¯èœãªãŸãŸã§ãªããã°ãªããŸããã 倿°ã¯ãç¹°ãè¿ãããlet宣èšãšéè€ããå ŽåããããŸãã ããã«ãããŒã«ã«å€æ°ã®å€ã¯setã䜿çšããŠå€æŽã§ããŸãïŒ ã 倿°ãåé€ããæ©èœïŒã¹ã³ãŒããéããïŒã¯ãã¹ã¿ãã¯ãã·ã³ã®ã³ãã³ãã¬ãã«ïŒãè¡ççãªã倿°ã決å®ããããïŒã§å®è£ ãããŠããŸãããDSLã¬ãã«ã§ã¯ãŸã ãµããŒããããŠããŸããã
æéããŒã¿ã®ããè€éãªäŸã¯ããäœçœ®å€ãã§ãã å Žåã«ãã£ãŠã¯ãå€ãååã ãã§ãªããããŒãäžã®ç¹å®ã®å Žæã«é¢é£ä»ããå¿ èŠããããŸãã ããšãã°ã Halmaãã¡ããªãŒã®ã²ãŒã ã§ã¯ãã³ãŒã¹ãèšç®ãããšãã«ãã«ãŒããåé¿ããããã«ã蚪åããããŒããã£ãŒã«ããããŒã¯ããå¿ èŠããããŸãã ã³ãŒã¹èšç®ãå®äºãããšããã®æ å ±ã¯äžèŠã«ãªããŸãïŒç¶æ ã®äžéšãšããŠä¿åããã«ã¯è²»çšãããããããŸãïŒã 屿§ã ãã§ãªããçŸåšã®å埩ã§ã¯äœçœ®å€ã䜿çšããŸããïŒç§ã®ç掻ãè€éã«ããªãããã§ãïŒã 圌ãã®å©ããããã°ãããã«ã³ã®ã¹ãã©ã€ããã®ã«ãŒã«ã宿œããããšã¯å¯èœã§ãããããé·è·é¢ãã ããªããã°ãããã¯é¢ä¿ãããŸããã
äžæçãªå€ã¯ç¶æ ã®äžéšã§ã¯ãªããããç°ãªãåãã«å¯Ÿå¿ããäœçœ®éã§è»¢éãããŸããã æãåçŽãªäŸã¯ããŒã«ã«å€æ°ã§ãã åŸã§äœ¿çšããããã«ãååã«å€ãé¢é£ä»ããããšãã§ããŸãã ããŒã«ã«å€æ°ã®ã¹ã³ãŒãã¯ã 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 . , , , ( ). , , « », :
, is-empty? , . , ( , , ), , , ?
ç¹å¥ãªåœ¢åŒã¯ããªãã©ã³ããåŠçããç¹å¥ãªé åºãå®è£ ããŸãã 圌ãã®å žåçãªä»£è¡šè ã¯ã 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 , , (, ). ( ), « » ( , , .).
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- , ( , ). .