ãæ½è±¡ã«ããã½ããã¦ã§ã¢è¨è¨ -- Alloyã§ã¯ãããå½¢å¼ææ³ãã®ç®æ¬ãããã ãã¾ãã*1ãæ¸åºã«ä¸¦ã¶åã7æ9æ¥ã«å±ãã¾ããã訳è ã®ã¿ãªããããããã¨ããããã¾ãã

æ½è±¡ã«ããã½ããã¦ã§ã¢è¨è¨âAlloyã§ã¯ãããå½¢å¼ææ³â
- ä½è : Daniel Jackson,ä¸å³¶é,ä»äºå¥ç·,é äºæ¿è£,é è¤ä¾ä»,ç岡欣夫
- åºç社/ã¡ã¼ã«ã¼: ãªã¼ã 社
- çºå£²æ¥: 2011/07/15
- ã¡ãã£ã¢: åè¡æ¬ï¼ã½ããã«ãã¼ï¼
- è³¼å ¥: 8人 ã¯ãªãã¯: 274å
- ãã®ååãå«ãããã° (35件) ãè¦ã
ãåºæãããç£è¨³è åºæããã訳è ãã¨ããããããã¦ç¬¬1ç« ãã¯ããã«ãããããèªãã§æå¿ãã¦ããã¾ããã第1ç« ã¯ããã4ãã¼ã¸ã§ãããç´ æ´ããããå®ã«ãããã¨ãæ¸ãã¦ããã¾ããããã§åã¯ã¹ãã«ãªæºè¶³ãã¦ï¼æ®ãã¯èªã¾ãªãã¾ã¾ã§ ^^;ï¼ãã¾ããã
éææ¥ï¼7æ15æ¥ï¼ã«id:bonotakããã«ããã¢ã³ã¿ãããããªãã§ã2ç« ãããã¯èªãã§ãã½ãã¨ã¡ã¼ã«ã§è¨ããã¾ãã¦ã第2ç« ããã£ã¨ä¸å·¡ãããèªã¿å§ãããã§ãããããããã¯ã¤ãã¯ãã¢ã¼ã¿ãããªã®ã¯ãåãè¦æãªãã§ããã
第2ç« ã®åé ã«ãææ³ã®é°å²æ°ãä¼ãããã¨ãç®çãªã®ã§ãç´°é¨ã¾ã§ç解ãããã¨ã¯ããªãã§ã»ããããã¨ãç´°é¨ã«å ¥ãåã«ãå ¨ä½åãæ¦æ¬çã«æãã¦ãããã¨ã¯ææ義ã ããåããã¾ã«ãããªç®çã®è¨äºãæ¸ãããããããã§ããããµã³ãã«ã³ã¼ãæçã®æ§æã¨ããæ°ã«ãªã£ã¦ãæ¦è¦ãææ¡ãããããã©ã¹ãã¬ã¼ã·ã§ã³ããã¾ã£ã¦ãã¾ã£ããâ¦ãããã§ã©ãããããã£ã¦è©±ã¯å¾åãã«ãã¦ãæ¸ç±ã®å°è±¡ãæ¸ãã¦ããã¾ããä»ã§ãèªãã§ãªãæã®ã»ããå¤ãã®ã§ãè©ä¾¡ãããªãã¦ããã¾ã§å°è±¡ã
- ç´ã®æ¬ã¯ãã¢ãã¨ãã¦ã®å½¢æ ããããæ°ã«ãªãã®ã§ããï¼e.g. ããã¼ãã«ãã¼æ¬ãªãã¦å¤§å«ãã ãããæ¸ æ°´æèãéåè«ã®åºç¤ãã¯ããæ¬ã ãï¼ããã®ç¹ã§ã¯ä½¿ãåæãããã§ãã
- ä»é²ã便å©ã§ã¨ã¦ãå©ããã¾ãï¼ã¤ã¼ãã主ã«ä»é²ãèªãã§ããã§ããï¼ã
- 訳èªä¸è¦§ãããã®ã好æãæã¦ã¾ãã欲ãããã°ãããå°ãèªæ°ãå¤ãã¨è¯ãã£ãããªãä¾ãã°ããåºæ¬åãã¯è¨³èªä¸è¦§ã«ã¯è¼ã£ã¦ã¾ããï¼ ãåºæ¬ãã¨è¨³ãè¨èã« base, basic, primitive, atomic, ground, fundamental ã¨ãããã¾ãããããã¢ããç¥ãããã
- ä¸åºåãä»ããã¨ã«ãè°è«ãã®é ãã¯ããã§ããã¾ãããè°è«ãã¯è¨è¨è æ¬äººã§ãªãã¨èªããªãå 容ãã¨ã¦ãé¢ç½ãææ義ã§ãã
åããããã¨
ã¨ããããAlloyã®è¨èªä»æ§ãææ¡ãããã¨ãä»é²BãAlloyè¨èªãªãã¡ã¬ã³ã¹ããèªããã¨ã«ããã®ã§ããããã£ããé·ããã§ãä»é²Cãä¸æ ¸ã®æå³è«ããªãçãï¼2.5ãã¼ã¸ï¼ã®ã§ããã£ã¡ãèªç ´ï¼2.5ãã¼ã¸ã ã£ã¦ï¼ãæå³è«ãããã£ãæ°åãããã®ã§ãhttp://alloy.mit.edu/alloy4/ ãã alloy4.jar ããã¦ã³ãã¼ããã¾ããã
[追è¨]åã¯ãæåãã¼ã¸ã§ã³4.1.10ããã¦ã³ãã¼ãããã®ã§ãããbonotakeããã«ããã¨ã4.2 Release Candidateã®ã»ãããªã¹ã¹ã¡ã ããã§ãã[/追è¨]
java -jar alloy4.jar ã¨ããã¨ãã¡ãã¥ã¼ãä»ããã¦ã£ã³ãã¦ãåºã¦ãã¦ãããã§å°ãã²ã³ããªãåãGUIã¯è¦æãã³ãã³ãã©ã¤ã³ã¤ã³ã¿ã¼ãã§ã¤ã¹ããªãã¨ä½¿ãæ°ãããªããã¨ãããã18æ¥ã®æ¼ããããããbonotakeãããGUIã®æä½æ³ããã³ããããã¡ã¼ã«ã§æãã¦ãããã®ã§ããã³ãã«ããã¨ãAlloyã¢ãã©ã¤ã¶ã¼ã使ããï¼ï¼ï¼ããã«ãªãã¾ããã
bonotakeããã«æãã£ããã¨ãã¾ã¨ãã¦ããã¨ï¼
- å¤é¨ã¨ãã£ã¿ã§ã½ã¼ã¹ã³ã¼ããç·¨éããå ´åã¯ãCTRL-Rã§ãªãã¼ãã
- ãã¸ã¥ã¢ã©ã¤ã¶ã¼ã®Evaluatorãã¿ã³ã§ã¤ã³ã¿ããªã¿ãåºã¦ããã®ã§ãããã使ã£ã¦ã¢ãã«ã¤ã³ã¹ã¿ã³ã¹ãã¤ã³ã¹ãã¯ãã§ããã
- ãã¸ã¥ã¢ã©ã¤ã¶ã¼ã®Nextãã¿ã³ãæ¼ãã¨ãå¥è§£ã次ã ã«è¡¨ç¤ºã§ããã
ãã¨ãOptionsã¡ãã¥ã¼ã®Message Verbosityãhighã«ãVisualize AutomaticallyãYesã«è¨å®ãã¦ããã¨è¯ãããã§ãã
Alloyå¦çç³»èªä½ã®ã½ã¼ã¹ã³ã¼ãã¯alloy4.jarã«å«ã¾ããã®ã§ã次ã®ããã«ãã¦ããã¨ã½ã¼ã¹ãåç §ã§ãã¾ãã
$ mkdir src
$ cd src
$ jar xvf ../alloy4.jar
$ find . -name '*.class' | xargs rm
./src/edu/mit/csail/sdg/ ã®ä¸ã«Alloy4é¢ä¿ã®ã½ã¼ã¹ãå±éããã¾ããJavadocã¯ãhttp://alloy.mit.edu/alloy4/public/ ã§é²è¦§ã§ãã¾ãï¼ãããbonotakeããã«æããã¾ããï¼ã
ãã¨ã¯ããæ½è±¡ã«ããã½ããã¦ã§ã¢è¨è¨ãï¼Alloyæ¬ï¼ã®ä»é²Bã¨ä»é²Fãé©å®åç §ããã°ãAlloyã§ã¢ããªã³ã°ãã¯ãããããã§ãããã
Alloyè¨èªã§ãªããæ¸ãã¦ã¿ã
次ã¯ãåãã¯ããã¦æ¸ããAlloyè¨èªã«ããä»æ§è¨è¿°ã§ãã
-- ã¢ãã¤ã module monoid1 /* ã¢ãã¤ãã®ææ¨ */ sig Mon { -- ä¹æ³ mult : Mon->one Mon } one sig pt { -- åä½ unit : Mon } /* ã¢ãã¤ãã®å ¬ç */ -- çµåå¾ fact assoc { all x, y, z : Mon | (x.mult[y]).mult[z] = x.mult[y.mult[z]] } -- åä½å¾ fact unit { all x : Mon | pt.unit.mult[x] = x and x.mult[pt.unit] = x }
ã¨ããããæãã¤ããä¾ãã¢ãã¤ãã ã£ãã®ã§ãã¢ãã¤ãã®å®ç¾©ããã®ã¾ã¾Alloyã«ç´è¨³ãã§ããsig Mon {...} ã®ããã«ä½ä»£æ°å½¢å¼ã§æ¸ããªãã¦ã¯ãªããªãã®ã§ãã¢ãã¤ãã®ä¹æ³ MonÃMonâMon ããthis |â(MonâMon) ã®ãããªå½¢ã§æ¸ãå¿ è¦ãããã¾ãã
æ®éã®ï¼ææ¸ãã®ï¼æ¸ãæ¹ã«è¿ã¥ããããªããã¢ãã¤ãã®ä¹æ³ãåä½ãã°ãã¼ãã«ã«å®ç¾©ããæ¸ãæ¹ãã§ãã¾ããããã§ãã°ãã¼ãã«ã¨è¨ã£ã¦ããã®ã¯ãä¸ç¹éåptï¼pointã®ã¤ããï¼ã®ãã¨ã§ãä¹æ³ã¨åä½ãptã®ã·ã°ããã£ã¨ãã¦æ¸ãããã§ããâä¸é¨âã®äººã大好ããªã大åé¢æ°ã«ç¸å½ããã¹ã¿ãã£ãã¯ã¡ã½ããã¨å¹¾åä¼¼ã¦ãªãããªãã§ãã
-- ã¢ãã¤ã ãã®2: åä½ãä¹æ³ãã°ãã¼ãã«ã«å®ç¾©ãã¦ã¿ã module monoid2 /* ã¢ãã¤ãã®ææ¨ */ -- åãªãéå sig Mon {} -- åä½ã¨ä¹æ³ã¯ã°ãã¼ãã«ã« one sig pt { -- åä½ unit : Mon, -- ä¹æ³ mult : Mon-> (Mon-> one Mon) } /*ã¢ãã¤ãã®å ¬ç */ -- çµåå¾ fact assoc { all x, y, z : Mon | pt.mult[pt.mult[x, y], z] = pt.mult[x, pt.mult[y, z]] } -- åä½å¾ fact unit { all x : Mon | pt.mult[pt.unit, x] = x and pt.mult[x, pt.unit] = x }
以ä¸ã®ãããªä»æ§ããAlloyãã¸ã¥ã¢ã©ã¤ã¶ã¼ã§çºãã¦ã¿ãã¨ãããããæ¸ãæ¹ã¯ã©ããAlloyã«æ £ãã¦ãªã人ããããã¨ã¿ããã§ãããã°ãã¼ãã«ã表ç¾ããä¸ç¹éåãå°å ¥ãããããã¢ãã¤ãã®å°éåMonã®é¨åéå*2ã¨ãã¦åä½å ãå°å ¥ããã»ããè¯ãããã§ãã
-- ã¢ãã¤ã ãã®3: åä½ã«ãµãã¿ã¤ãã使ã module monoid3 /* ã¢ãã¤ãã®ææ¨ */ sig Mon { -- ä¹æ³ mult : Mon->one Mon } -- åä½å ï¼åå ã®é¨åéåï¼ one sig unit extends Mon {} /* ã¢ãã¤ãã®å ¬ç */ -- çµåå¾ fact assoc { all x, y, z : Mon | (x.mult[y]).mult[z] = x.mult[y.mult[z]] } -- åä½å¾ fact unit { all x : Mon | unit.mult[x] = x and x.mult[unit] = x }
ãã¸ã¥ã¢ã©ã¤ãºãã¦ã¿ã
Alloyã¢ãã©ã¤ã¶ã¼ãæ¢ãã ããä»æ§ã®ã¢ãã«ã¤ã³ã¹ã¿ã³ã¹ã¯ãAlloyãã¸ã¥ã¢ã©ã¤ã¶ã¼ã§èªåçã«çµµã«æããã¨ãã§ãã¾ãããã®çµµã¯ä¸è½ã¨ããããã§ã¯ãªãã¦ãåç¯ã®ã¢ãã¤ãã®ãã¨ã代æ°æ§é ã ã¨ãããã¯ã«ã³ãã¤çµµã«ãªããã¡ã§ããã§ãããç¶æ é·ç§»ã®è¨è¿°ã¯ãAlloyãã¸ã¥ã¢ã©ã¤ã¶ã¼ã¨ã®ç¸æ§ãããããªã§ãèªç¶ã§åãããããçµµãæãã¦ããã¾ãã
次ã¯ã¹ã¿ãã¯ã®è¨è¿°ã§ãã
-- ã¹ã¿ã㯠ãã®2: 空ç¶æ ããã«ç¶æ ããµãã¿ã¤ãã« module stack2 -- ã¹ã¿ãã¯ã«ç©ãå¤ sig Val {} -- ã¹ã¿ãã¯ã®ç¶æ ã¨æä½ sig State { push: Val ->lone State, pop: lone State, top: lone Val } -- ã¹ã¿ãã¯ã空ã®ç¶æ one sig empty extends State {} -- ã¹ã¿ãã¯ããã«ã®ç¶æ one sig full extends State {} /* ã¹ã¿ãã¯ã«é¢ããå ¬ç */ -- ã¹ã¿ãã¯ãããå¤ã®åå¾ fact top { all s: State | (s != empty => one s.top) and (s = empty => no s.top) } -- ãããããå¾ã®ç¶æ fact pop { all s: State | (s != empty => (one s.pop) and s.pop != s) and (s = empty => no s.pop) } -- ããã·ã¥ããå¾ã®ç¶æ fact push { all s: State, v: Val | (s != full => one s.push[v] and s.push[v] != s) and (s = full => no s.push[v]) } -- ããã·ã¥ããå¾ã®ãããã®å¤ fact push_top { all s: State, v: Val | s != full => s.push[v].top = v } -- ããã·ã¥ã®å¾ã«ããããã㨠fact push_pop { all s: State, v: Val | s != full => (s.push[v]).pop = s } -- ããããç¹°ãè¿ãã¨ç©ºã«ãªã -- ããããªãã¨çµµã«ä¸é£çµã°ã©ããåºã¦ãã fact pop_reachable { all x: State | x != full => x in full.^pop }
ãã¸ã¥ã¢ã©ã¤ã¶ã¼ã«ãã表示ï¼ã®ä¸ä¾ï¼ã¯æ¬¡ã®ããã«ãªãã¾ãã
Stateã¨æ¸ãã¦ããç®±ã¯ãç¶æ 空éå ¨ä½ã®ãã¨ã§ã¯ãªãã¦ãemptyã§ãfullã§ããªã第ä¸ã®ç¶æ ã®ãã¨ã§ã*3ãè¦ããã«ãã¹ã¿ãã¯ä¸ã«å¤ã0åï¼emptyï¼ã1åï¼Stateï¼ã2åï¼fullï¼ã¨ããç¶æ ããããã£ã¦ãã¨ã§ãã
赤ãç¢å°ãpopï¼ã¹ã¿ãã¯ã®ãããï¼ã«ããç¶æ é·ç§»ã§ããfullç¶æ âå¤ã1åã®ç¶æ âemptyç¶æ ãã¨é·ç§»ãã¦ãã¾ããèè¶è²ã®ç¢å°ã¯pushï¼ã¹ã¿ãã¯ã®ããã·ã¥ï¼ã«ããç¶æ é·ç§»ã§ãpopã¨éã®çµè·¯ã«ãªã£ã¦ãã¾ãããªã¬ã³ã¸ã¯ãã¹ã¿ãã¯ãããå¤ãè¿ãé¢æ°ã§ãç¶æ 空éã®åç¶æ ï¼åè¨ã§3ã¤ã®ç¶æ ï¼ããå¤ã®éåValã¸ã®ç¢å°ã§ãããç¢å°ãç¶æ é·ç§»ãé¢æ°ããªãã¦ãã¨ã¯Alloyå¦çç³»ã¯ç¥ãã¾ããããæã ããããã解éãä¸ããã®ã§ãã
[追è¨] ã¹ã¿ãã¯ã®å¶ç´ï¼factï¼ã§ã(s != empty => one s.top) and (s = empty => no s.top) ã£ã¦æ¸ãã¦ããã¾ãããããã¯ãs != empty implies one s.top else no s.top ã¾ãã¯ãs = empty implies no s.top else one s.top ã¨ããç°¡æ½ã«æ¸ããããã§ããä¸è¬ã«ï¼
- (A => X) and (!A => Y) â¡ A implies X else Y â¡ A => X else Y
fact pop_reachable ã¯ãã³ã¡ã³ãã¨å 容ãããã¦ã¾ãããã³ã¡ã³ãã®ã¨ããã«å¶ç´ãæ¸ããªã x != empty => empty in x.^pop ã§ããã[/追è¨]
[ããã«è¿½è¨]æ¨ç§»çéå æ¼ç®åã^ãã ããããªãã¦ãåå°çæ¨ç§»çéå æ¼ç®åã*ãããããã§ãããã*ãã使ãã°ãfact pop_reachableã® x != empty ã¨ããåæããã§ãã¯ããå¿ è¦ã¯ãªãã¦ãä¸å¾ã« empty in x.*pop ã¨æ¸ãã¾ããã*ãã«ã¯åå°çéå ãå ¥ãã®ã§ãempty in empty ã¯èªæã«æç«ãã¾ããçµã¿è¾¼ã¿æ¼ç®åã使ããã¨ãçãæ¸ãã³ãã¿ããã[/ããã«è¿½è¨]
ããã¯é¢ç½ãï¼
åæ¥ã»ã©ã§ãããåã¯ãµã«ã«ãªã£ã¦Alloyã¢ãã©ã¤ã¶ã¼ããºã¼ãã¨ããã£ã¦ã¾ãããã¨ã«ããé¢ç½ãããã®ææ³ãæ¸ãã¦bonotakeããã«éã£ãã¡ã¼ã«ã®ä¸é¨ããã®ã¾ã¾å¼ç¨ãã¾ãã
2011å¹´7æ18æ¥16:58 Masayuki Hiyama :
>> å¤ãªç¶æ é·ç§»å³ãæ¢ãã¦ããã®ã§é¢ç½ãã
>
> ããã¼ããããããªã¼ãã³ã¬ã¼ã
>
> æè¿ãåä¾ã®ç¸æããªããããä¼æ¥ã®éã³ãAlloyã«ãªã£ã¦ãã¾ã£ãã
>
> ã©ããé¢ç½ããï¼ã¨ããã¨ã人éãä¸äººï¼èªåã ãï¼ã§ãã³ã³ãã¥ã¼ã¿ç¸æã«
> âã¨ã¯ã½ã·ã¹ãã²ã¼ã âãã§ããã
>
> - http://d.hatena.ne.jp/m-hiyama/20060407/1144378577
> - http://d.hatena.ne.jp/m-hiyama/20060408/1144479281
>
> å¾åã«æªéã®å½¹ããã£ã¦ããã人éãªãã¦ããªããã©ãAlloyã¢ãã©ã¤ã¶ã¼ãæª
> éã®ã¿ã¼ã³ãå®è¡ãã¦ãããã®ã§ã俺ã®ã¿ã¼ã³ã§ã¯ä»æ§ã詳細åãã¦ã ãã ã
> 追ãè©°ãããã¤ã³ã¹ã¿ã³ã¹ãä¸æã«ãªãã»ã©è¿½ãè¾¼ãå¿ è¦ã¯ãªããã©ãå¥å¦ãª
> äºä¾ãåºãªãç¨åº¦ã¾ã§ã¯ã¿ã¼ã³ãç¶ããªãã¨ãã
>
> åã«ã¨ã£ã¦ã¯ãããã¯å®å ¨ã«å¨¯æ¥½ã½ããã¦ã§ã¢ã ãªã
>
å®ãè¨ãã¨ãã²ã¨ã¨ããåºæ¥ä¸ãã£ãAlloyã³ã¼ãã示ãã¦ã楽ããã¯ä¼ãããªãã¨æãã¾ããã²ã¼ã ã®ããã«æ¥½ãããã®ã¯ãæªå®æãªã³ã¼ããAlloyã¢ãã©ã¤ã¶ã¼ã«è§£æï¼ã¢ãã«ã¤ã³ã¹ã¿ã³ã¹ã®æ¤ç´¢ï¼ããã¦ããã¨ãã§ããæãããããªãå¥å¦ãªä¾ãæ¢ãåºãã¦ãã¾ããè¦ç¬ããããããã¯ãªããããã²ã©ã²ã©ç¬ã£ããããã®ããã»ã¹ãé¢ç½ãã®ã§ããã¾ãã«ãã俺ã®ã¿ã¼ã³ãããã¾ãã®ã¿ã¼ã³ããç¹°ãè¿ãã»ãã·ã§ã³ã§ãã
èªåã§å®ç¾©ãã¦åµé ããã¯ãã®æ½è±¡çæ§é ç©ãã¡ã®ç©ºéå ã«ãèªåã®äºæ³ãè£åãå¤ãªã¤ããçæ¯ãã¦ãããã¨ãå®æã§ãã¾ãããã®æè¦ãå³ããã ãã§ãAlloyã¢ãã©ã¤ã¶ã¼ã使ã£ã¦ã¿ã価å¤ã¯ããã¨æãã¾ããããã¦ãæ¸ç±ãæ½è±¡ã«ããã½ããã¦ã§ã¢è¨è¨ -- Alloyã§ã¯ãããå½¢å¼ææ³ãã¯ããã®æ¢æ¤ã¸ã®æè¯ã®ã¬ã¤ãããã¯ã§ãããã¾ããã以ä¸ã®ãã®ã§ãã
*1:åã¯ä½ã®è²¢ç®ããã¦ã¾ãããæ縮ã§ãã
*2:æ£ç¢ºã«è¨ãã¨ãã·ã°ããã£Monã®æå³ã§ããéåã®ï¼åå ãªï¼é¨åéåã§ãã
*3:ç®±ã«State$0ã®ãããªã©ãã«ãä»ããã»ããããã¨æãã¾ããã