annotate paper/chapter3.tex @ 20:97f508fb5bf2

*** empty log message ***
author atsuki
date Wed, 20 Feb 2008 05:53:14 +0900
parents c2a35ce4546e
children c1ef5abc2bb7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
1 \chapter{線形時相論理によるCbCプログラムの検証手法}
1
e1214989942e *** empty log message ***
atsuki
parents: 0
diff changeset
2 \label{chapter3}
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
3
a67653fda270 Initial revision
atsuki
parents:
diff changeset
4 \section{CbCによる並列プログラミング}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
5 ここでは、例題に用いるサンプルプログラムの概要と、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
6 そのプログラムの状態の分割およびCbCプログラムとの対応について説明する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
7 また、並列プログラムのシミュレーション方法についても述べる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
8
a67653fda270 Initial revision
atsuki
parents:
diff changeset
9 \subsection{Dining Philosophers Problemの概要}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
10 検証用のサンプルプログラムとしてDining Philosophers Problemを用いる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
11 これは資源共有問題の一つで、次のような内容である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
12
a67653fda270 Initial revision
atsuki
parents:
diff changeset
13 5人の哲学者が円卓についている。各々の哲学者にはスパゲッティーを持った皿が出されている。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
14 スパゲッティーはとても絡まっているので、2本のフォークを使わないと食べられない。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
15 お皿の間には1本のフォークが置いてあるので、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
16 5人の哲学者に対して5本のフォークが用意されていることになる(図\ref{fig:dpp_image})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
17 哲学者は思索と食事を交互に繰り返している。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
18 空腹を覚えると、左右のフォークを手に取ろうと試み、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
19 2本のフォークを取ることに成功するとしばし食事をし、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
20 しばらくするとフォークを置いて思索に戻る。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
21 隣の哲学者が食事中でフォークが手に取れない場合は、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
22 そのままフォークが空くのを待つ。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
23
a67653fda270 Initial revision
atsuki
parents:
diff changeset
24 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
25 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
26 \includegraphics[scale=.5]{figure/dpp_image.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
27 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
28 \caption{Dining Philosophers Problemのイメージ}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
29 \label{fig:dpp_image}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
30 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
31
a67653fda270 Initial revision
atsuki
parents:
diff changeset
32 各哲学者を一つのプロセスとすると、この問題では5個のプロセスが並列に動くことになる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
33 プロセスの並列実行はスケジューラによって制御することで実現する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
34
a67653fda270 Initial revision
atsuki
parents:
diff changeset
35 \subsection{状態の定義とコードセグメントとの対応}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
36 Dining Philosophers ProblemをCbCで実装するにあたり、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
37 プロセスを次のような8個の状態に分割した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
38 \begin{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
39 \item 思索
a67653fda270 Initial revision
atsuki
parents:
diff changeset
40 \item フォークを持っていない場合の飢餓
a67653fda270 Initial revision
atsuki
parents:
diff changeset
41 \item 左手にフォークを持つ
a67653fda270 Initial revision
atsuki
parents:
diff changeset
42 \item 左手にフォークを持っている場合の飢餓
a67653fda270 Initial revision
atsuki
parents:
diff changeset
43 \item 右手にフォークを持つ
a67653fda270 Initial revision
atsuki
parents:
diff changeset
44 \item 食事
a67653fda270 Initial revision
atsuki
parents:
diff changeset
45 \item 右手のフォークを置く
a67653fda270 Initial revision
atsuki
parents:
diff changeset
46 \item 左手のフォークを置く
a67653fda270 Initial revision
atsuki
parents:
diff changeset
47 \end{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
48
a67653fda270 Initial revision
atsuki
parents:
diff changeset
49 CbCではconcurrencyがコードセグメント単位であるため、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
50 実装の方法により任意に細分化することができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
51 今回は、状態数を8個とし、各状態に対応したコードセグメントを実装した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
52 以下にコードセグメントの例を示す。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
53
a67653fda270 Initial revision
atsuki
parents:
diff changeset
54 \lstinputlisting[caption=「左手でフォークを持つ」コードセグメント,label=src:pickupL]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
55 {src/pickupL.cbc}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
56
a67653fda270 Initial revision
atsuki
parents:
diff changeset
57 ソースコード\ref{src:pickupL}はDining Philosophers Problemの
a67653fda270 Initial revision
atsuki
parents:
diff changeset
58 プログラムの一部である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
59 このコードセグメントは、「左手にフォークを持つ」状態に対応したものである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
60
a67653fda270 Initial revision
atsuki
parents:
diff changeset
61 処理の具体的な内容は、左手側のフォークがあればそのフォークを取り、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
62 フォークを取ったプロセス(哲学者)のIDとフォークのIDを表示する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
63 その後、次の遷移先として「右手にフォークを持つ」状態である
a67653fda270 Initial revision
atsuki
parents:
diff changeset
64 pickup\_rforkコードセグメントをセットする。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
65 もし、フォークがなければ次の遷移先として「フォークを持っていない場合の飢餓」状態である
a67653fda270 Initial revision
atsuki
parents:
diff changeset
66 hungry1コードセグメントをセットする。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
67
a67653fda270 Initial revision
atsuki
parents:
diff changeset
68 各コードセグメントは、スケジューラに遷移するようにしている。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
69 これは、複数のプロセスをスケジューラを用いて制御するためである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
70 状態遷移に必ずスケジューラを介すことで、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
71 任意のプロセスのコードセグメントを実行することができる(図\ref{fig:scheduler})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
72
a67653fda270 Initial revision
atsuki
parents:
diff changeset
73 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
74 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
75 \includegraphics[scale=.7]{figure/scheduler.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
76 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
77 \caption{スケジューラによる複数プロセスの制御}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
78 \label{fig:scheduler}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
79 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
80
a67653fda270 Initial revision
atsuki
parents:
diff changeset
81 CbCプログラムはオートマトンと似た構造になっており、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
82 コードセグメントと状態、引数付きgotoと状態遷移、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
83 if制御文と遷移条件がそれぞれ対応している(表\ref{tab:automaton-cbc})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
84
a67653fda270 Initial revision
atsuki
parents:
diff changeset
85 \begin{table}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
86 \centering
a67653fda270 Initial revision
atsuki
parents:
diff changeset
87 \begin{tabular}{|c|c|} \hline
a67653fda270 Initial revision
atsuki
parents:
diff changeset
88 オートマトン & CbC \\ \hline
a67653fda270 Initial revision
atsuki
parents:
diff changeset
89 状態 & コードセグメント \\
a67653fda270 Initial revision
atsuki
parents:
diff changeset
90 状態遷移 & 引数付きgoto \\
a67653fda270 Initial revision
atsuki
parents:
diff changeset
91 遷移条件 & if制御文 \\ \hline
a67653fda270 Initial revision
atsuki
parents:
diff changeset
92 \end{tabular}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
93 \caption{オートマトンとCbCの対応}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
94 \label{tab:automaton-cbc}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
95 \end{table}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
96
a67653fda270 Initial revision
atsuki
parents:
diff changeset
97 コードセグメントと状態の対応に関しては、実際にはコードセグメントを抜けるときに状態が
a67653fda270 Initial revision
atsuki
parents:
diff changeset
98 確定する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
99
a67653fda270 Initial revision
atsuki
parents:
diff changeset
100 並列実行をシミュレーションするために必要なスケジューラについて説明する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
101 スケジューラは、最初にプロセスの生成と初期化を行い、それをタスクリストに登録する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
102 その後、各プロセスに対してラウンドロビンやランダムといった任意の方式で実行する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
103 ラウンドロビンとは、各プロセスを一定時間ずつ順番に実行することである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
104
a67653fda270 Initial revision
atsuki
parents:
diff changeset
105 並列実行のシミュレーションに関しては、SPINを参考に各プロセスをランダムに
a67653fda270 Initial revision
atsuki
parents:
diff changeset
106 実行することで実現する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
107
a67653fda270 Initial revision
atsuki
parents:
diff changeset
108 \section{CbCプログラムのタブロー展開}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
109 CbCプログラムのタブロー展開の特徴を以下に示す。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
110 \begin{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
111 \item プログラムの可能な実行の組み合わせすべてを調べる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
112 \item 状態の探索はDepth First Searchで行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
113 \item プログラムの実行によって生成される状態は木構造で記録する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
114 \item 同じ状態はすべて共有される。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
115 \end{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
116
a67653fda270 Initial revision
atsuki
parents:
diff changeset
117 \subsection{状態の展開}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
118 提案する手法では、プログラムの可能な実行の組み合わせをすべて調べることができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
119 CbCプログラムにおける可能な実行の組み合わせとは、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
120 CbCプログラムをオートマトンとみなすと、オートマトンの遷移経路にあたる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
121
a67653fda270 Initial revision
atsuki
parents:
diff changeset
122 例としてDining Philosophers Problemのプロセス(哲学者)を
a67653fda270 Initial revision
atsuki
parents:
diff changeset
123 状態遷移図で示す(図\ref{fig:dpp_automaton})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
124 本研究では、CbCで実装するにあたり状態を8個に分割している。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
125 ここで、それぞれの状態をABCDEFGHと定義する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
126
a67653fda270 Initial revision
atsuki
parents:
diff changeset
127 \begin{description}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
128 \item[A] 思索
a67653fda270 Initial revision
atsuki
parents:
diff changeset
129 \item[B] 飢餓
a67653fda270 Initial revision
atsuki
parents:
diff changeset
130 \item[C] 左手にフォークを持っている
a67653fda270 Initial revision
atsuki
parents:
diff changeset
131 \item[D] 左手にフォークを持つ場合の飢餓
a67653fda270 Initial revision
atsuki
parents:
diff changeset
132 \item[E] 両手にフォークを持っている
a67653fda270 Initial revision
atsuki
parents:
diff changeset
133 \item[F] 食事
a67653fda270 Initial revision
atsuki
parents:
diff changeset
134 \item[G] 右手のフォークを置いた
a67653fda270 Initial revision
atsuki
parents:
diff changeset
135 \item[H] 左手のフォークを置いた
a67653fda270 Initial revision
atsuki
parents:
diff changeset
136 \end{description}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
137
a67653fda270 Initial revision
atsuki
parents:
diff changeset
138 このオートマトンは「プロセスを終了する」という入力がないと、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
139 例えば、$A\to B\to B\to B\to\cdots$というように探索が無限に続いてしまう場合がある。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
140 そうなると、一つの遷移経路が無限に続くことになり、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
141 このオートマトンが取り得るすべての遷移経路を調べることができない。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
142 そこで、「ひとつの遷移経路で同じ状態が表れた場合はその経路の探索を終了する」
a67653fda270 Initial revision
atsuki
parents:
diff changeset
143 という条件を付加する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
144 これにより、先ほどの経路の探索は$A\to B$で終了することができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
145
a67653fda270 Initial revision
atsuki
parents:
diff changeset
146 このようにして、遷移経路を図\ref{fig:dpp_automaton}から求めると、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
147 \begin{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
148 \item $A\to B$
a67653fda270 Initial revision
atsuki
parents:
diff changeset
149 \item $A\to B\to C\to D$
a67653fda270 Initial revision
atsuki
parents:
diff changeset
150 \item $A\to B\to C\to D\to E\to F\to G\to H$
a67653fda270 Initial revision
atsuki
parents:
diff changeset
151 \item $A\to B\to C\to E\to F\to G\to H$
a67653fda270 Initial revision
atsuki
parents:
diff changeset
152 \end{itemize}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
153 という結果が得られる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
154 これが、Dining Philosophers Problemのプロセスの可能な実行の組み合わせとなる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
155
a67653fda270 Initial revision
atsuki
parents:
diff changeset
156
a67653fda270 Initial revision
atsuki
parents:
diff changeset
157 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
158 \begin{center}
3
23fe35aec32b *** empty log message ***
atsuki
parents: 1
diff changeset
159 \includegraphics[scale=.75]{figure/dpp_automaton.pdf}
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
160 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
161 \caption{Dining Philosophers Problemの状態遷移図}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
162 \label{fig:dpp_automaton}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
163 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
164
a67653fda270 Initial revision
atsuki
parents:
diff changeset
165 例では単一のプロセスの場合を述べたが、実際には5個のプロセスを並列に実行することになる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
166 その場合、状態数は指数オーダーで増加する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
167 状態数が多い場合、特に並列プログラムに対する状態の展開を手作業で行うのは不可能に近い。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
168
a67653fda270 Initial revision
atsuki
parents:
diff changeset
169 \newpage
a67653fda270 Initial revision
atsuki
parents:
diff changeset
170 \subsection{タブロー展開器の実装}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
171 CbCプログラムの状態を自動的に展開するためのツールを作成した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
172 これをタブロー展開器と呼ぶ。
6
1bf023e03779 *** empty log message ***
atsuki
parents: 3
diff changeset
173 \\
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
174
a67653fda270 Initial revision
atsuki
parents:
diff changeset
175 タブロー展開器は、スケジューラと同様にCbCプログラムに組み込み、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
176 複数プロセスを制御することで並列実行をシミュレーションすることができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
177 また、タブロー展開器は、コードセグメントを一つずつ実行しながら状態を探索していく。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
178 状態の探索はDFS(Depth First Search)で行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
179 例えば、Dining Philosophers Problemの単一プロセスの状態探索木は
a67653fda270 Initial revision
atsuki
parents:
diff changeset
180 図\ref{fig:dpp_dfs}のようになる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
181
a67653fda270 Initial revision
atsuki
parents:
diff changeset
182 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
183 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
184 \includegraphics[scale=.8]{figure/dpp_dfs.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
185 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
186 \caption{Dining Philosophers Problemの状態遷移図}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
187 \label{fig:dpp_dfs}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
188 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
189
a67653fda270 Initial revision
atsuki
parents:
diff changeset
190 探索が終了すると、すべての状態が展開されたことになる。
6
1bf023e03779 *** empty log message ***
atsuki
parents: 3
diff changeset
191 \\
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
192
a67653fda270 Initial revision
atsuki
parents:
diff changeset
193 タブロー展開器の具体的な実装について説明する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
194
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
195 まず、始めに状態として扱うすべての変数のアドレスとそのレンジを
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
196 Binary Tree構造で記録する(図\ref{fig:memoryBtree})。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
197 このBinary Treeをメモリツリーと呼ぶ。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
198 変数はメモリ領域に格納されており、メモリ領域のアドレスとそのレンジで指定される。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
199 新たに追加される変数がメモリツリーに既に登録されている場合、その変数は登録されない。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
200
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
201 \begin{figure}[htpb]
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
202 \begin{center}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
203 \includegraphics[scale=.8]{figure/memoryBtree.pdf}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
204 \end{center}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
205 \caption{変数のアドレスとそのレンジのBinary Tree}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
206 \label{fig:memoryBtree}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
207 \end{figure}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
208
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
209
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
210 すべての変数が登録されたら、次にそのメモリツリーのコピーを生成し、
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
211 コピーを状態データベースに登録する。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
212 メモリツリーをコピーするとき、そのままコピーするのではなく、
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
213 メモリのパターンに注目して同じパターンは共有されるようにコピーを生成する。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
214 このメモリツリーのコピーによって生成されるBinary Treeをメモリパターンツリーと呼ぶ。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
215
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
216 メモリのパターンとは、例えば変数Aと変数Bがメモリツリーに登録されているとして説明する。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
217 変数Aと変数Bはアドレスが違うのでメモリツリーには別々に登録されている。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
218 ここでもし、変数Aと変数Bの内容が両方とも0だった場合、
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
219 アドレスは違っていてもメモリ領域の内容は同じになる(図\ref{fig:memory_pattern})。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
220 このメモリ領域の内容のことをメモリパターンと呼ぶ。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
221
a67653fda270 Initial revision
atsuki
parents:
diff changeset
222 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
223 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
224 \includegraphics[scale=.8]{figure/memory_pattern.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
225 \end{center}
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
226 \caption{メモリパターン}
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
227 \label{fig:memory_pattern}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
228 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
229
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
230
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
231 メモリパターンツリーの生成について説明する。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
232
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
233 メモリパターンツリーはメモリパターンとそのレンジを要素としたBinary Treeである。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
234 メモリツリーの要素をコピーし、それをメモリパターンツリーに登録していく。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
235 登録する際に、メモリパターンツリーに同じメモリパターンがないか検索する。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
236 もし、同じメモリパターンがあった場合、メモリツリーの要素をコピーせずに
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
237 メモリパターンツリーの同じパターンの要素を指すようにする(図\ref{fig:mem_pat_tree})。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
238 つまり、同じ状態を共有するようにする。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
239
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
240 これにより使用するメモリ量を減らすことができる。
6
1bf023e03779 *** empty log message ***
atsuki
parents: 3
diff changeset
241
1bf023e03779 *** empty log message ***
atsuki
parents: 3
diff changeset
242 \begin{figure}[htpb]
1bf023e03779 *** empty log message ***
atsuki
parents: 3
diff changeset
243 \begin{center}
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
244 \includegraphics[scale=.8]{figure/mem_pat_tree.pdf}
6
1bf023e03779 *** empty log message ***
atsuki
parents: 3
diff changeset
245 \end{center}
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
246 \caption{メモリパターンツリー}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
247 \label{fig:mem_pat_tree}
6
1bf023e03779 *** empty log message ***
atsuki
parents: 3
diff changeset
248 \end{figure}
1bf023e03779 *** empty log message ***
atsuki
parents: 3
diff changeset
249
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
250
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
251 状態データベースとは、メモリパターンツリーとそのハッシュ値を
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
252 要素として持つBinary Treeである(図\ref{fig:stateDB})。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
253
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
254 \begin{figure}[htpb]
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
255 \begin{center}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
256 \includegraphics[scale=.8]{figure/stateDB.pdf}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
257 \end{center}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
258 \caption{状態データベース}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
259 \label{fig:stateDB}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
260 \end{figure}
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
261
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
262
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
263 コードセグメントを実行すると、メモリツリーに登録されている
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
264 変数の内容(メモリパターン)が変化する場合がある(図\ref{fig:change_mem_pat})。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
265
a67653fda270 Initial revision
atsuki
parents:
diff changeset
266 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
267 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
268 \includegraphics[scale=.9]{figure/change_mem_pat.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
269 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
270 \caption{コードセグメントの実行にともなうメモリパターンの変化}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
271 \label{fig:change_mem_pat}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
272 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
273
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
274 メモリパターンが変化したメモリツリーから新たにメモリパターンツリーを生成する。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
275 生成されたメモリパターンツリーを状態データベースに追加する場合、
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
276 メモリパターンツリーのハッシュ値をもとに状態データベースを検索する。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
277 もし、同じハッシュ値のメモリパターンツリーが見つかった場合は
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
278 そのメモリパターンツリーは状態データベースに追加されない。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
279 見つからなかった場合、状態データベースに追加される。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
280 \\
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
281
a67653fda270 Initial revision
atsuki
parents:
diff changeset
282
a67653fda270 Initial revision
atsuki
parents:
diff changeset
283 次にDepth First Search(DFS)による状態の探索の実装について述べる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
284
a67653fda270 Initial revision
atsuki
parents:
diff changeset
285 本研究では、イテレータを用いてDFSを実装した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
286 イテレータとは、配列やリストなどのデータ構造の各要素に対する
a67653fda270 Initial revision
atsuki
parents:
diff changeset
287 繰り返し処理を抽象化する手法のことである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
288
a67653fda270 Initial revision
atsuki
parents:
diff changeset
289 タブロー展開器はスケジューラとしての機能を備えている。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
290 そのため、プロセスを実行する順番をリストとして持ち、制御する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
291 これをタスクリストと呼ぶ(図\ref{fig:task_list})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
292
a67653fda270 Initial revision
atsuki
parents:
diff changeset
293 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
294 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
295 \includegraphics[scale=.9]{figure/task_list.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
296 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
297 \caption{タスクリストの例}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
298 \label{fig:task_list}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
299 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
300
a67653fda270 Initial revision
atsuki
parents:
diff changeset
301 状態を展開する際に、このタスクリストに登録された順番にプロセスを実行していく。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
302 したがって、プログラムの状態を一つ進めるためにタスクリストからタスクを取りだし、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
303 実行するという処理が繰り返し必要になる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
304 その繰り返し処理を抽象化することで、データ構造の要素に対して行いたい処理を
a67653fda270 Initial revision
atsuki
parents:
diff changeset
305 簡潔に記述することができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
306
a67653fda270 Initial revision
atsuki
parents:
diff changeset
307
a67653fda270 Initial revision
atsuki
parents:
diff changeset
308 DFSの実装の具体的な内容について述べる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
309
a67653fda270 Initial revision
atsuki
parents:
diff changeset
310 タスクリストからタスクを取り出す機構としてタスクイテレータを実装した。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
311 タスクイテレータはその時点のタスクリストと状態データベースおよび
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
312 ひとつ前の時点のタスクイテレータを保持している。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
313 また、タスクリストから次のタスクを取り出す機能を持っている(図\ref{fig:task_iterator})。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
314
a67653fda270 Initial revision
atsuki
parents:
diff changeset
315 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
316 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
317 \includegraphics[scale=.9]{figure/task_iterator.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
318 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
319 \caption{タスクイテレータ}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
320 \label{fig:task_iterator}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
321 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
322
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
323 まず、最初のメモリパターンツリーをメモリツリーより生成し、状態データベースに登録する。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
324 タスクイテレータの処理によりタスクを取りだしコードセグメントを実行する。
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
325 その実行によって変化したメモリツリーよりメモリパターンツリーを生成し、
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
326 それを状態データベースから検索する。
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
327 同じメモリパターンツリーがなかった場合、状態データベースに追加する。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
328 その後、1段深く探索するために新たにタスクイテレータを生成し、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
329 その時点の状態データベースを登録する(図\ref{fig:dfs1})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
330
a67653fda270 Initial revision
atsuki
parents:
diff changeset
331 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
332 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
333 \includegraphics[scale=.9]{figure/dfs1.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
334 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
335 \caption{タスクイテレータを用いたDFS 1}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
336 \label{fig:dfs1}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
337 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
338
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
339 同じメモリパターンツリーがあった場合は、その経路の探索を終了し、
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
340 タスクイテレータにより次のタスクを取りだしコードセグメントを実行する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
341
a67653fda270 Initial revision
atsuki
parents:
diff changeset
342 タスクイテレータのタスクリストをすべて実行した場合、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
343 そのタスクイテレータを破棄し、ひとつ前のタスクイテレータに戻る(図\ref{fig:dfs2})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
344 そこで探索可能な経路があればメモリパターンをレストアし探索を行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
345
a67653fda270 Initial revision
atsuki
parents:
diff changeset
346 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
347 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
348 \includegraphics[scale=.8]{figure/dfs2.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
349 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
350 \caption{タスクイテレータを用いたDFS 2}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
351 \label{fig:dfs2}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
352 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
353
a67653fda270 Initial revision
atsuki
parents:
diff changeset
354 これを繰り返していき、タスクイテレータが根に到達した場合、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
355 全状態の探索が完了したことになる(図\ref{fig:dfs3})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
356
a67653fda270 Initial revision
atsuki
parents:
diff changeset
357 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
358 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
359 \includegraphics[scale=.8]{figure/dfs3.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
360 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
361 \caption{状態探索の完了}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
362 \label{fig:dfs3}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
363 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
364
a67653fda270 Initial revision
atsuki
parents:
diff changeset
365
a67653fda270 Initial revision
atsuki
parents:
diff changeset
366 \newpage
a67653fda270 Initial revision
atsuki
parents:
diff changeset
367 ソースコード\ref{src:tableau}に実際にタブロー展開を行っているコードセグメントを示す。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
368
a67653fda270 Initial revision
atsuki
parents:
diff changeset
369 \lstinputlisting[caption=タブローコードセグメント,label=src:tableau]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
370 {src/tableau.cbc}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
371
a67653fda270 Initial revision
atsuki
parents:
diff changeset
372 タブローコードセグメントは、関数呼び出しを使用するためCwCで記述している。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
373
a67653fda270 Initial revision
atsuki
parents:
diff changeset
374 \verb|get_memory_hash()|関数によってメモリパターンのハッシュ値を取得する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
375 そのハッシュ値をもとに\verb|lookup_StateDB()|関数で状態データベースの検索を行っている。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
376 \verb|next_task_iterator()|関数は次に実行するタスクを取り出すものである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
377
a67653fda270 Initial revision
atsuki
parents:
diff changeset
378 \verb|restore_memory()|関数は任意の時点の状態に戻すための関数である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
379
a67653fda270 Initial revision
atsuki
parents:
diff changeset
380 実際にコードセグメントを実行するのは\verb|goto list->phils->next()|である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
381 引数付きgotoで検証対象のプログラムのコードセグメントに遷移する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
382
a67653fda270 Initial revision
atsuki
parents:
diff changeset
383 タスクイテレータが根に達した場合、探索を終了するために
a67653fda270 Initial revision
atsuki
parents:
diff changeset
384 \verb|goto ret(0),env|を実行している。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
385
a67653fda270 Initial revision
atsuki
parents:
diff changeset
386 %\section{LZW法を用いた状態の圧縮}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
387
a67653fda270 Initial revision
atsuki
parents:
diff changeset
388 \section{線形時相論理による仕様の検証手法}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
389 タブロー展開を行う際に、線形時相論理(Linear-time Temporal Logic、LTL)式より
a67653fda270 Initial revision
atsuki
parents:
diff changeset
390 生成されたコードセグメントを実行することで検証を行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
391
a67653fda270 Initial revision
atsuki
parents:
diff changeset
392 \subsection{検証の実装}
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
393 検証対象のプログラムからスケジューラに遷移した後、
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
394 タブローコードセグメントに遷移する前に
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
395 LTL式より生成された検証用コードセグメントを実行する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
396 これにより、すべての状態において特定の性質を満たすことを調べることが可能である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
397
a67653fda270 Initial revision
atsuki
parents:
diff changeset
398 実装したDining Philosophers Problemプログラムに対してデッドロックの検出を行う。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
399 デッドロックとは、複数のプロセスが互いに相手の占有している資源の開放を待ってしまい、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
400 結果としてプログラムが停止してしまうことである。排他制御の欠陥で起こる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
401
a67653fda270 Initial revision
atsuki
parents:
diff changeset
402 Dining Philosophers Problemにおいて、資源とはフォークのことである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
403 つまり、この場合のデッドロックはすべての哲学者(プロセス)が左手でフォークを持ち、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
404 右手のフォークが空くのを待っている状態である(図\ref{fig:dpp_deadlock})。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
405
a67653fda270 Initial revision
atsuki
parents:
diff changeset
406 \begin{figure}[htpb]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
407 \begin{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
408 \includegraphics[scale=.5]{figure/dpp_deadlock.pdf}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
409 \end{center}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
410 \caption{Dining Philosophers Problemのデッドロック状態}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
411 \label{fig:dpp_deadlock}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
412 \end{figure}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
413
a67653fda270 Initial revision
atsuki
parents:
diff changeset
414
a67653fda270 Initial revision
atsuki
parents:
diff changeset
415 デッドロックを検知するために、 命題pを「すべての哲学者が左手にフォークを持っている」
a67653fda270 Initial revision
atsuki
parents:
diff changeset
416 として、 命題pが決して起こらないことを検査する。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
417 これをLTL式で表すと□~pである。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
418 これは、LTLで表現できる重要な特性の一つの安全性特性である。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
419
a67653fda270 Initial revision
atsuki
parents:
diff changeset
420 これを検査するための検証用コードセグメントをソースコード\ref{src:check}に示す。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
421
a67653fda270 Initial revision
atsuki
parents:
diff changeset
422 \lstinputlisting[caption=検証用コードセグメント,label=src:check]
a67653fda270 Initial revision
atsuki
parents:
diff changeset
423 {src/ltl.cbc}
a67653fda270 Initial revision
atsuki
parents:
diff changeset
424
9
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
425 \verb|p()|関数は命題pに相当するもので、すべての哲学者(プロセス)が
c2a35ce4546e *** empty log message ***
atsuki
parents: 6
diff changeset
426 左手にフォークを持っているかどうかを判定するものである。
0
a67653fda270 Initial revision
atsuki
parents:
diff changeset
427 checkコードセグメントがタブロー展開の際に実行されることで、
a67653fda270 Initial revision
atsuki
parents:
diff changeset
428 すべての状態において命題pが決して起こらないかどうかを検査することができる。
a67653fda270 Initial revision
atsuki
parents:
diff changeset
429
a67653fda270 Initial revision
atsuki
parents:
diff changeset
430 %%% end %%%