annotate Paper/tex/dpp_impl.tex @ 7:c821e707a5ee

Add paper dpp
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Sun, 22 Jan 2023 21:20:59 +0900
parents 8c1e9a6d58e2
children 1a8a9fa534a2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
c821e707a5ee Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
1 \section{Gears Agda によるDPPの実装}
1
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 DPP の記述の主要部分を示し,説明する.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 \lstinputlisting[caption= Gears Agdaでの DPP の 哲学者の状態 , label=agda-dpp-state, lastline=7]{src/agda-dpp-impl.agda.replaced}
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 \lstinputlisting[caption= Gears Agdaでの DPP の プロセス , label=agda-dpp-process, firstline=9, lastline=16]{src/agda-dpp-impl.agda.replaced}
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 \lstinputlisting[caption= Gears Agdaでの DPP の Data Gear , label=agda-dpp-dg, firstline=17, lastline=21]{src/agda-dpp-impl.agda.replaced}
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 Code \ref{agda-dpp-state}は
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 前述した哲学者の状態を書き記して,哲学者が今行おうとしている動作を網羅している.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 Code \ref{agda-dpp-process}は
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 哲学者一人ずつの環境を持っている.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 pid はその哲学者がどこに座っているかの識別子で,
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 right / left hand はフォークを手に持っているかを格納している.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 next-code は次に行う動作を格納している.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 Code \ref{agda-dpp-dg} が Data Gear になる.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 phは前もって定義した一人の哲学者のプロセスの List になる.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 List になっている理由は,哲学者が複数人いるためである.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 そのため実行時にListから一人ずつ取り出して実行をしていく.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 tableはテーブルに置いてあるフォークの状態のことで,
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 pid が1の人の右側にあるフォークが List の最初にあり,
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 pid が1の人の左側にあるフォーク,すなわち pid が2の人の右側にあるフォークが
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 その次の List に格納されていくようになっている.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 また,自然数の List になっているが,
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 その場所のフォークがテーブルの上にある場合は自然数の0が,
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 誰かが所持している場合はその人の pid が格納されるようになっている.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 \lstinputlisting[caption= Gears Agdaでの DPP の Data Gear のinit, label=agda-dpp-init, firstline=23, lastline=30]{src/agda-dpp-impl.agda.replaced}
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 Code \ref{agda-dpp-init}が入力から Data Gear を作成する Code Gear になる.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 ここでは哲学者の人数を自然数で受け取り,人数分の List Phi と table を一つづつ作成し env を作成している.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 また,最初の哲学者の状態は思考することであるため,next-code には C\_thinking を格納している.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 \lstinputlisting[caption= Gears Agdaでの DPP の step 実行, label=agda-dpp-step, firstline=31, lastline=37]{src/agda-dpp-impl.agda.replaced}
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 Agda では並列実行を行うことができない.そのため step 単位の実行を一つづつ行うことで
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 並列実行をしていることとする.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 この際に Env にある List Phi の中身を展開しながら一つづつ行動を処理していく.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 \lstinputlisting[caption=Gears Agdaでの DPP の左のフォークを取る記述, label=agda-dpp-lfork, firstline=39]{src/agda-dpp-impl.agda.replaced}
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 Code \ref{agda-dpp-lfork}が step 実行をした際に哲学者が左側のフォークを取る記述になる.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 左側のフォークを取る際には table の index は pid の次の値になっている.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 図 \ref{fig:DPP} を見ると直感的に理解ができる.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 最後の哲学者は一番最初のフォークを参照する必要がある.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 フォークの状態を確認し,値が0である場合はフォークがテーブルの上にあるので
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 それを自分の pid に書き換え left-hand を true に書き換えてフォークを手に持つ
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 フォークの状態が0以外,すなわち他の哲学者がその場所のフォークを取得している場合は
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 状態を変化させずに処理を続ける.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 このように左のフォークを取る記述をした.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 右側のフォークを取る場合は引数の部分を1足さずにそのまま受け取る.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 比較するべき table の List と哲学者のListは一致しているため,put\_lfork のように最後の哲学者が
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 最初のフォークを参照することもない.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 似たような形で哲学者がフォークを置く putdown-l/rfork を実装した.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 思考と食事の実装に関してはそのまま状態を変更することなく進むようにしている.
a72446879486 Init paper
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
7
c821e707a5ee Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
68 \section{Gears Agda によるDPPの検証}
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
69
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
70 これまでの実装は一般的なDPPの実装であったため、
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
71 Code / Data Gear の実装であった。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
72 ここからは、モデル検査を行うため、Meta Data Gear の定義をし、
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
73 それの操作を行う Meta Code Gear の実装を行っていく。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
74
5
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
75 以下\coderef{dpp-mdg}がMeta Code Gear の定義になる
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
76
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
77 % ここにmetadata MetaEnv MetaEnv2のソースコードを貼り付ける
5
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
78 \lstinputlisting[caption=Gears Agdaでの DPP モデル検査を行うための Meta Data Gear の定義, label=code:dpp-mdg]{src/dpp-verif/dpp-metadata.agda.replaced}
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
79
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
80 この Meta Data Gear の説明をすると、
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
81 metadataは状態の分岐数を持っておくnum-brunchがある。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
82 MetaEnv はもとの DataGear を保持するDG(Data Gearの省略)
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
83 meta に 前述したmetadataを持っており、
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
84 他には、deadlockしているかのフラグである deadlock 、
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
85 最後の2つは後述する際に必要になる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
86 そのstate が step 実行済みなのかのフラグであるis-step、
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
87 そのstateがモデル検査済なのかのフラグであるis-doneフラグを持っている。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
88
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
89 MetaEnv2 は1つのstate である MetaEnv の Listを meta で持てる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
90 加えて今まで実行していた Data Gear を DG で持てる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
91
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
92 deadlockの検出方法として、状態の分岐数を保存するnum-brunchをmetadataに持つようにした。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
93
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
94 そしてnum-brunchの値が1であるということは、それ以上の状態に移動することができないとして、この状態をdead lockであると定義した。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
95
5
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
96 以下の\coderef{dpp-judge-mcg}がdead-lockを検知する関数となる
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
97
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
98 複雑なことは何もしておらず、単純にstate毎のnum-brunchの値を見て
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
99 deadlockのフラグを立ち上げている。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
100
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
101 % judge-dead-lock-pのソースコードを貼り付ける
5
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
102 \lstinputlisting[caption=DPP での dead lock を検知する Meta Code Gear, label=code:dpp-judge-mcg]{src/dpp-verif/judge-deadlock.agda.replaced}
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
103 % こいつはmetaEnv2を受け取れるように変えないと行けない
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
104
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
105 ここから前述した通り、State Listを作成する。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
106
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
107 そのまま実行するだけでは無限に実行されるのみで停止しないと思われる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
108 しかし、分岐後に step 実行後の state を保存している State List に同じ State が存在しないかを確かめる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
109 存在していた場合はそれを追加せず、存在しなかった場合にのみ State を追加する。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
110
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
111 Agdaには2つの record が等しい場合の分岐など存在しないため、
5
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
112 \coderef{dpp-exclude-state-mcg} のようにrecordの中身を一つづつ一致しているか確認する。
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
113 こちらはそのまま掲載すると長いので、実際のコードに手を加えて省略している。実際のコードは付録にて参照できる。
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
114
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
115 \lstinputlisting[caption=重複しているstateを除外する Meta Code Gear, label=code:dpp-exclude-state-mcg]{src/dpp-verif/exclude-same-env.agda.replaced}
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
116 % 手を加えているので詳細は付録を参照するように促す
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
117
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
118 MetaEnv2 を受け取ってその中身の state を比較するが、そこまで展開する必要がある。
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
119 loop-metaenv と loop-target-metaenv, eq-env にてそれを行っている。
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
120
5
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
121 更に15行目の loop-metaenv では State List 内に見つからなかった場合に State List に Stateを追加し、次のstateの一致を探索するように記述されている。
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
122
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
123 実際にstateの一致を見ているのは22行目のeq-env関数で、一致している State が見つかった場合には追加せずにこちらも次の State を探索するように記述されている
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
124
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
125 State が保持している値がそれぞれ正しいのかは eq-pid のように一致を見て分岐させている。
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
126 その値が一致している場合には別の値を見て、一致していない場合はeq-envに遷移して State List にある次の State との一致を見るようにしている。
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
127 他の値である、lhandやrhandなども同じように記述している。
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
128
6
8c1e9a6d58e2 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 5
diff changeset
129
5
eaef105dff41 Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
130 これらにて、まだ分岐を見ていない1つのStateの分岐を確かめる。
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
131 発生した分岐を step 実行させる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
132 step実行して作成された state が State Listに存在していないかを確かめる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
133 これを繰り返すことで State Listを作る。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
134 State List に存在している全ての state の分岐を見たということは、
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
135 出現するStateを全て網羅することができたと言える。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
136
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
137 あとは State List を dead lock の検査を行う Meta Code Gear に与えるとどの state が dead lockしているかを検証することができる
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
138
7
c821e707a5ee Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
139 \section{Gears Agda による live lockの検証方法について}
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
140 live lockとは、状態が変動しているが、その状態はループしており、実行が進んでいないことを指す。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
141
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
142 DPPにて例を上げると、(上の哲学者のフローだと) dead lock が発生するため、フローを変更したとする。それは以下のような動作を追加する。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
143 「右手にフォークを持っているが、左手のフォークがすでに取られている場合に右手のフォークを即座に置いて固定時間待つ」
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
144 とする。これで解決すると思われるが、全員が同時に食事をしようとした場合、右手のフォークを取ったり置いたりを永遠に繰り返すことになる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
145 これを live lock という
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
146
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
147 つまり、この状態を検知するなら、そのstateが持っているhistoryまで考慮する必要がある。つまり、今回の場合だとstateのloopができた際にコマンドが一巡しているかを確認すると良い。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
148
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
149 history がloopしていた際に、誰もeathingしていない場合を live lock していると定義する。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
150
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
151 今回のはDPPであるためEatingが挙げられているが、他の実装であれば、どのコマンドが実行されるのが正常な動きなのかを決める。それがloop中に存在いしているかを見れば live lock を検知できる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
152
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
153
7
c821e707a5ee Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 6
diff changeset
154 \section{Gears Agda でのモデル検査の評価}
4
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
155
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
156 SPINで行ったDPPのモデル検査に比べると、Gears Agdaの方が制約が多いため難解に思える。しかし、Gears Agda ではプログラムの実装も含んでいる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
157
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
158 さらに、Gears Agda での実装をしたあとのモデル検査を行う際の Meta Code Gear の流れは変化しないため、比較的容易であると言える。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
159
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
160 加えて、Gears Agda は CbC へコンパイルされ、高速に実行されることを踏まえると、いかに Gears Agda が検証に向いたプログラムであるか理解できる。
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
161
4f5dde4cff0b Add paper dpp
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 1
diff changeset
162 % この評価の話はまとめでしたほうがいいかもね?