comparison bachelor_middle_draft.tex @ 4:0805d4984b1f

Update v2.1
author Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp>
date Wed, 29 Oct 2014 15:05:38 +0900
parents 331d9984930f
children 156ae5d5750b
comparison
equal deleted inserted replaced
3:331d9984930f 4:0805d4984b1f
40 40
41 % {{{ 限定されたプログラムの変更を表す Delta Monad 41 % {{{ 限定されたプログラムの変更を表す Delta Monad
42 42
43 \section{限定されたプログラムの変更を表す Delta Monad} 43 \section{限定されたプログラムの変更を表す Delta Monad}
44 Monad を用いたプログラムの変更の例として、プログラミング言語HaskellにおけるMonadを利用する。 44 Monad を用いたプログラムの変更の例として、プログラミング言語HaskellにおけるMonadを利用する。
45 Haskell におけるMonadとはメタ計算と対応されたデータ型である。 45 Haskell におけるMonadとはメタ計算を内包したデータ型である。
46 Monadであるデータ型は任意の型を内包することができ、内包した型に対する計算を行なった際にメタ計算も同時に行なう。 46 Monadであるデータ型は任意の型の値を内包することができ、内包した型に対する計算を行なった際にメタ計算も同時に行なう。
47 47
48 Haskell において限定されたプログラムの変更を表すことができる Delta Monad を定義した。 48 Haskell において限定されたプログラムの変更を表すことができる Delta Monad を定義した。
49 Delta Monad におけるプログラムの変更は、変更前と変更後の実行結果を両方持つことによって表現する。 49 Delta Monad におけるプログラムの変更は、変更前と変更後の実行結果を両方持つことによって表現する。
50 また、実行結果に対する変更履歴を持ち、2つ変更履歴の比較によってプログラムがどのように変更したか判断する。 50 また、実行結果に対する変更履歴を持ち、2つ変更履歴の比較によってプログラムがどのように変更したか判断する。
51 51
116 116
117 117
118 % {{{ Delta Monad におけるプログラムの変更例 118 % {{{ Delta Monad におけるプログラムの変更例
119 119
120 \section{Delta Monad におけるプログラムの変更例} 120 \section{Delta Monad におけるプログラムの変更例}
121 Delta Monad を用いたHaskellのプログラムを示す(図\ref{delta-program})。 121 変更例となるHaskellのプログラムを示す(図\ref{raw-program-before})。
122 122
123 % {{{ delta.hs 123 % {{{ raw-program-before
124
125 \begin{breakbox}
126 {\scriptsize
127 \begin{verbatim}
128 generator :: Int -> [Int]
129 generator x = [1..x]
130
131 primeFilter :: [Int] -> [Int]
132 primeFilter xs = filter isPrime xs
133
134 count :: [Int] -> Int
135 count xs = length xs
136
137 primeCount :: Int -> Int
138 primeCount x = count . primeFilter . generator $ x
139 \end{verbatim}
140 }
141 \caption{変更前のHaskellプログラム}
142 \label{raw-program-before}
143 \end{breakbox}
144
145 % }}}
146
147
148 このプログラムは整数nを取り、1からnまでの整数の中から素数の個数を調べるプログラムである。
149 1からnまでの整数の個数を調べる primeCount 関数は3つの関数からなる。
150
151 \begin{itemize}
152 \item 1 から n までの整数を返す関数 generator
153 \item 整数のリストから素数である整数のみを残したリストを返す関数 primeFilter
154 \item リストの中に存在する要素の個数を返す関数 count
155 \end{itemize}
156
157 ここで、 primeFilter 関数を変更する。
158 素数である整数を残すのではなく、偶数を残すようにする。
159 Delta Monad を使わずに primeFilter 関数を変更すると図\ref{raw-program-after}のプログラムとなる。
160
161 % {{{ raw-program-after
162
163 \begin{breakbox}
164 {\tt
165 primeFilter :: [Int] -> [Int]
166
167 primeFilter xs = filter \underline{even} xs
168 }
169 \caption{変更後の primeFilter 関数(変更点は下線)}
170 \label{raw-program-after}
171 \end{breakbox}
172
173 % }}}
174
175 プログラム(図\ref{raw-program-before})に対する図\ref{raw-program-after}の変更を Delta Monad で記述したものが図\ref{delta-program}のプログラムである。
176
177 % {{{ delta-program
124 178
125 \begin{breakbox} 179 \begin{breakbox}
126 {\scriptsize 180 {\scriptsize
127 \begin{verbatim} 181 \begin{verbatim}
128 generator :: Int -> Delta [Int] 182 generator :: Int -> Delta [Int]
140 194
141 primeCount :: Int -> Delta Int 195 primeCount :: Int -> Delta Int
142 primeCount x = generator x >>= primeFilter >>= count 196 primeCount x = generator x >>= primeFilter >>= count
143 \end{verbatim} 197 \end{verbatim}
144 } 198 }
145 \caption{Delta Monadを用いたプログラムの例} 199 \cprotect\caption{図\ref{raw-program-before}のプログラムに対する図\ref{raw-program-after}の変更を Delta Monad で記述した例}
146 \label{delta-program} 200 \label{delta-program}
147 \end{breakbox} 201 \end{breakbox}
148 202
149 % }}} 203 % }}}
150 204
151 このプログラムは整数nを取り、1からnまでの整数の中から素数の個数を調べるプログラムである。 205 Delta Monad を用いたプログラムでは全ての関数はDelta Monadを返す関数として記述される。
152 1からnまでの整数の個数を調べるprimeCount 関数は3つの関数からなる 206 変更される primeFilter 関数は、素数によるフィルタと偶数によるフィルタの両方の結果を持ったDelta Monad を返すよう変更する。
153
154 \begin{itemize}
155 \item 1 から n までの整数を返す関数 generator
156 \item 整数のリストから素数であるもののみを残したリストを返す関数 primeFilter
157 \item リストの中に存在する要素の個数を返す関数 count
158 \end{itemize}
159
160 このプログラムの primeFilter 関数が返す Delta Monad を変更する。
161 本来ならば素数である整数のみを返す計算だったが、変更により偶数である整数のみを返すようにした。
162 図\ref{delta-program}のプログラムを実行した例が図\ref{delta-result}である。 207 図\ref{delta-program}のプログラムを実行した例が図\ref{delta-result}である。
163 208
164 % {{{ results 209 % {{{ results
165 210
166 \begin{breakbox} 211 \begin{breakbox}
176 \label{delta-result} 221 \label{delta-result}
177 \end{breakbox} 222 \end{breakbox}
178 223
179 % }}} 224 % }}}
180 225
226 Delta Monad による実行結果は2つの実行結果が存在する。
181 変更前のプログラムの実行順序が上側の実行結果である。 227 変更前のプログラムの実行順序が上側の実行結果である。
182 \begin{itemize} 228 \begin{itemize}
183 \item 1 から 10 までのリストを作成し 229 \item 1 から 10 までのリストを作成し
184 \item 素数のみを残すために 2,3,5,7 が残り 230 \item 素数のみを残すために 2,3,5,7 が残り
185 \item その個数を数えるために4となる 231 \item その個数を数えるために4となる
216 262
217 \begin{thebibliography}{9} 263 \begin{thebibliography}{9}
218 264
219 \bibitem{moggi} Eugenio Moggi, Notion of Computation and Monads(1991) 265 \bibitem{moggi} Eugenio Moggi, Notion of Computation and Monads(1991)
220 \bibitem{proofs-and-types} Jean-Yves Girard, Paulr Taylor, Yves Lafont, Proofs and Types(1990) 266 \bibitem{proofs-and-types} Jean-Yves Girard, Paulr Taylor, Yves Lafont, Proofs and Types(1990)
267 \bibitem{category} Michael Barr and Chariles Wells, Category Theory for Computing Science
221 \bibitem{agda} The Agda Wiki - Agda \url{http://wiki.portal.chalmers.se/agda/pmwiki.php} 268 \bibitem{agda} The Agda Wiki - Agda \url{http://wiki.portal.chalmers.se/agda/pmwiki.php}
222 269
223 \end{thebibliography} 270 \end{thebibliography}
224 \end{document} 271 \end{document}