Mercurial > hg > Papers > 2019 > ryokka-sigss
comparison slide/slide.html @ 11:17b7605a5deb
add figures, some slides
author | ryokka |
---|---|
date | Sun, 13 Jan 2019 23:42:16 +0900 |
parents | a87fec07fd78 |
children | e8fe28afe61e |
comparison
equal
deleted
inserted
replaced
10:a87fec07fd78 | 11:17b7605a5deb |
---|---|
91 <div class='slide'> | 91 <div class='slide'> |
92 <!-- 発表20分、質疑応答5分 --> | 92 <!-- 発表20分、質疑応答5分 --> |
93 | 93 |
94 | 94 |
95 <!-- _S9SLIDE_ --> | 95 <!-- _S9SLIDE_ --> |
96 <h2 id="研究目的">研究目的</h2> | 96 <h2 id="研究背景">研究背景</h2> |
97 <!-- 後回しだ!!!!! --> | 97 <ul> |
98 <ul> | 98 <li>OS やアプリケーションなどの信頼性は重要な課題</li> |
99 <li>OS やアプリケーションなどの信頼性は重要な課題である。</li> | 99 <li>信頼性を上げるために仕様を検証する必要</li> |
100 <li>プログラムの信頼性を上げるためには仕様を検証する必要がある。</li> | 100 <li>仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある |
101 <li>使用の検証手法として Floyd-Hoare Logic (以下 HoareLogic) があり。 | |
102 <ul> | 101 <ul> |
103 <li>これはプログラムを Pre、Post Condition(事前、事後条件)、Command (関数)</li> | 102 <li>事前条件(PreCondition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(PostCondition)を満たす</li> |
104 </ul> | 103 </ul> |
105 </li> | 104 </li> |
106 <li>当研究室では信頼性の高い OS として GearsOS を開発している。</li> | 105 <li>既存の言語ではあまり利用されていない(python の pyrefine ってコードチェッカーくらい…?)</li> |
107 <li>GearsOS では CodeGear、 DataGear という単位を用いてプログラムを記述する手法を提案している。</li> | 106 </ul> |
108 <li>OS やアプリケーションなど、ソフトウェアの信頼性を高めることは重要である。</li> | 107 |
109 <li>そのために当研究室では CodeGear 、 DataGear という単位を用いてプログラムを記述する手法を提案している。 | 108 |
109 | |
110 </div> | |
111 | |
112 <div class='slide'> | |
113 <!-- _S9SLIDE_ --> | |
114 <h2 id="背景">背景</h2> | |
115 <ul> | |
116 <li>当研究室では 処理の単位を <strong>CodeGear</strong>、データの単位を <strong>DataGear</strong> としてプログラムを記述する手法を提案</li> | |
117 <li>CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む</li> | |
118 <li>Gear 間の接続処理はメタ計算として定義 | |
110 <ul> | 119 <ul> |
111 <li>CodeGear は処理の単位で、処理が終わると次の CodeGear へと継続を行う。</li> | 120 <li>メタ計算部分に検証を埋め込むことで通常処理に手を加えずに検証</li> |
112 <li>このとき、 CodeGear は通常の関数呼び出しとは異なり、呼び出し前の環境を持たずに継続をする。</li> | |
113 <li>DataGear はデータの単位で、 CodeGear の入力、出力変数となる。</li> | |
114 </ul> | 121 </ul> |
115 </li> | 122 </li> |
116 <li>また、当研究室では Gears の単位を用いて作られる OS である、 GearsOS を開発している。</li> | 123 <li>本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する</li> |
117 <li> | 124 </ul> |
118 <p>本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた検証手法を提案する。</p> | 125 |
119 </li> | 126 <p style="text-align:center;"><img src="./pic/cgdg-small.svg" alt="" width="75%" height="75%" /></p> |
120 <li>当研究室では検証しやすい単位として <strong>CodeGear</strong>、<strong>DataGear</strong> という単位を用いてプログラムを記述する手法を提案している | |
121 <ul> | |
122 <li><strong>CodeGear</strong> とはプログラムを記述する際の処理の単位</li> | |
123 <li><strong>DataGear</strong> は CodeGear で扱うデータの単位</li> | |
124 </ul> | |
125 </li> | |
126 <li>これは関数型プログラミングに近い形になる</li> | |
127 <li>本研究では関数型言語であり、 <strong>証明支援系</strong> 言語でもある <strong>Agda</strong> を用いて仕様を検証することにしている</li> | |
128 </ul> | |
129 | |
130 <!-- * 動作するプログラムは高い信頼性を持っていてほしい --> | |
131 <!-- * そのために当研究室では CodeGear 、 DataGear を用いて記述する手法を提案している --> | |
132 <!-- * 処理の単位である CodeGear を継続しプログラムを記述していく --> | |
133 <!-- * メタ計算部分を切り替えることで CodeGear の処理を変更すること無くプログラムの検証をすることができる --> | |
134 <!-- * 継続に関数を呼び出すときの前提条件(pre-condition)を追加することができ、Hoare Logic を用いた証明を Agda で記述できると考えている --> | |
135 <!-- * 本研究では CodeGear, DataGear という単位を用いてプログラムを記述する手法の継続部分で Hoare Logic をベースにした証明手法を検討する --> | |
136 | 127 |
137 | 128 |
138 | 129 |
139 </div> | 130 </div> |
140 | 131 |
152 <li>メタ計算で信頼性の検証を行う</li> | 143 <li>メタ計算で信頼性の検証を行う</li> |
153 </ul> | 144 </ul> |
154 </li> | 145 </li> |
155 </ul> | 146 </ul> |
156 | 147 |
148 <!-- ![cgdg](./pic/codeGear_dataGear.pdf){} --> | |
149 <p style="text-align:center;"><img src="./pic/cgdg.svg" alt="" width="30%" height="30%" /></p> | |
150 | |
157 | 151 |
158 | 152 |
159 </div> | 153 </div> |
160 | 154 |
161 <div class='slide'> | 155 <div class='slide'> |
163 <h2 id="cbc-について">CbC について</h2> | 157 <h2 id="cbc-について">CbC について</h2> |
164 <ul> | 158 <ul> |
165 <li>Gears の単位でプログラミングできる言語として CbC (Continuation based C) が存在</li> | 159 <li>Gears の単位でプログラミングできる言語として CbC (Continuation based C) が存在</li> |
166 <li>現在の CbC では assert での検証ができる</li> | 160 <li>現在の CbC では assert での検証ができる</li> |
167 <li>将来的には証明も扱えるようにしたいが現段階では未実装</li> | 161 <li>将来的には証明も扱えるようにしたいが現段階では未実装</li> |
168 <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述できるようにし、 Agda 上で証明を行う</li> | 162 <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述し、 Agda 上で証明</li> |
169 </ul> | 163 </ul> |
170 | 164 |
171 | 165 |
172 | 166 |
173 </div> | 167 </div> |
191 <h2 id="agda-のデータ型">Agda のデータ型</h2> | 185 <h2 id="agda-のデータ型">Agda のデータ型</h2> |
192 <ul> | 186 <ul> |
193 <li>データ型は代数的なデータ構造</li> | 187 <li>データ型は代数的なデータ構造</li> |
194 <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong>、 where 句</li> | 188 <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong>、 where 句</li> |
195 <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li> | 189 <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li> |
196 <li>型は<strong>-></strong>または<strong>→</strong>で繋げる事ができる</li> | 190 <li>型は<strong>-></strong>または<strong>→</strong>で繋げる</li> |
197 <li><strong>PrimComm -> Comm</strong>は<strong>PrimComm</strong> を受け取り、 <strong>Comm</strong>を返す型</li> | 191 <li>例えば、型<strong>PrimComm -> Comm</strong>は<strong>PrimComm</strong> を受け取り<strong>Comm</strong>を返す型</li> |
198 <li>再帰的な定義も可能</li> | 192 <li>再帰的な定義も可能 |
199 </ul> | 193 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
200 | |
201 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
202 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where | 194 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where |
203 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm | 195 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm |
204 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm | 196 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm |
205 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -> Comm | 197 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -> Comm |
206 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -> Comm -> Comm | 198 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -> Comm -> Comm |
207 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -> Comm -> Comm -> Comm | 199 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -> Comm -> Comm -> Comm |
208 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm | 200 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm |
209 </pre></div> | 201 </pre></div> |
210 </div> | 202 </div> |
211 </div> | 203 </div> |
204 </li> | |
205 </ul> | |
212 | 206 |
213 <!-- - where は宣言した部分に束縛する --> | 207 <!-- - where は宣言した部分に束縛する --> |
214 | 208 |
215 | 209 |
216 | 210 |
219 <div class='slide'> | 213 <div class='slide'> |
220 <!-- _S9SLIDE_ --> | 214 <!-- _S9SLIDE_ --> |
221 <h2 id="agda-のレコード型">Agda のレコード型</h2> | 215 <h2 id="agda-のレコード型">Agda のレコード型</h2> |
222 <ul> | 216 <ul> |
223 <li>C 言語での構造体に近い</li> | 217 <li>C 言語での構造体に近い</li> |
224 <li>複数のデータ型をまとめる</li> | 218 <li>複数のデータをまとめる</li> |
225 <li>関数内で構築できる</li> | 219 <li>関数内で構築できる</li> |
226 <li>構築時は<strong>レコード名 {フィールド名 = 値}</strong></li> | 220 <li>構築時は<strong>レコード名 {フィールド名 = 値}</strong></li> |
227 <li>複数ある場合は <strong>{フィールド1 = 1 ; フィールド2 = 2}</strong>のように <strong>;</strong> を使って列挙</li> | 221 <li>複数ある場合は <strong>{フィールド1 = 1 ; フィールド2 = 2}</strong>のように <strong>;</strong> を使って列挙 |
228 </ul> | 222 <ul> |
229 | 223 <li>(varn,vari の型 <strong>ℕ</strong> は Agda 上の 自然数、 データ型で zero : ℕ と succ : ℕ -> ℕ で定義されてる) |
230 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 224 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
231 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> record Env : Set where | 225 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>record Env : Set where |
232 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field | 226 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field |
233 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : ℕ | 227 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : ℕ |
234 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : ℕ | 228 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : ℕ |
235 </pre></div> | 229 </pre></div> |
236 </div> | 230 </div> |
237 </div> | 231 </div> |
232 </li> | |
233 </ul> | |
234 </li> | |
235 </ul> | |
238 | 236 |
239 | 237 |
240 | 238 |
241 </div> | 239 </div> |
242 | 240 |
245 <h2 id="agda-の関数">Agda の関数</h2> | 243 <h2 id="agda-の関数">Agda の関数</h2> |
246 <ul> | 244 <ul> |
247 <li>関数にも型が必要</li> | 245 <li>関数にも型が必要</li> |
248 <li>関数は <strong>関数名 = 値</strong></li> | 246 <li>関数は <strong>関数名 = 値</strong></li> |
249 <li>関数ではパターンマッチがかける</li> | 247 <li>関数ではパターンマッチがかける</li> |
250 <li><strong>_</strong> は任意の引数</li> | 248 <li><strong>_</strong> は任意の引数 |
251 </ul> | 249 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
252 | 250 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> _-_ : ℕ → ℕ → ℕ |
253 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 251 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x |
254 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> _-_ : ℕ → ℕ → ℕ | 252 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero |
255 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x | 253 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y |
256 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero | 254 </pre></div> |
257 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y | 255 </div> |
258 </pre></div> | 256 </div> |
259 </div> | 257 </li> |
260 </div> | 258 </ul> |
261 | 259 |
262 | 260 |
263 | 261 |
264 </div> | 262 </div> |
265 | 263 |
269 <ul> | 267 <ul> |
270 <li>関数の型に論理式</li> | 268 <li>関数の型に論理式</li> |
271 <li>関数自体にそれを満たす導出</li> | 269 <li>関数自体にそれを満たす導出</li> |
272 <li>完成した関数は証明</li> | 270 <li>完成した関数は証明</li> |
273 <li><strong>{}</strong> は暗黙的(推論される)</li> | 271 <li><strong>{}</strong> は暗黙的(推論される)</li> |
274 <li>下のコードは自然数に 0 を足したとき値が変わらないことの証明</li> | 272 <li>下のコードは自然数に 0 を足したとき値が変わらないことの証明 |
275 </ul> | 273 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
276 | 274 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> +zero : { y : ℕ } → y + zero ≡ y |
277 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 275 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> +zero {zero} = refl |
278 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>+zero : {y : ℕ} → y + zero ≡ y | 276 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} ) |
279 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>+zero {zero} = refl | 277 </pre></div> |
280 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>+zero {suc y} = cong ( λ x → suc x ) ( +zero {y} ) | 278 </div> |
281 </pre></div> | 279 </div> |
282 </div> | 280 </li> |
283 </div> | 281 </ul> |
284 | 282 |
285 | 283 |
286 | 284 |
287 </div> | 285 </div> |
288 | 286 |
301 | 299 |
302 <div class='slide'> | 300 <div class='slide'> |
303 <!-- _S9SLIDE_ --> | 301 <!-- _S9SLIDE_ --> |
304 <h2 id="agda-での-hoarelogic-の理解">Agda での HoareLogic の理解</h2> | 302 <h2 id="agda-での-hoarelogic-の理解">Agda での HoareLogic の理解</h2> |
305 <ul> | 303 <ul> |
306 <li>HoareLogic を用いて次のようなプログラム(while Program)を検証した。</li> | 304 <li>HoareLogic を用いて次のようなプログラム(while Program)を検証した。 |
307 </ul> | 305 <div class="language-C highlighter-coderay"><div class="CodeRay"> |
308 | |
309 <div class="language-C highlighter-coderay"><div class="CodeRay"> | |
310 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> n = <span style="color:#00D">10</span>; | 306 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> n = <span style="color:#00D">10</span>; |
311 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> i = <span style="color:#00D">0</span>; | 307 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> i = <span style="color:#00D">0</span>; |
312 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> | 308 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> |
313 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">while</span> (n><span style="color:#00D">0</span>) | 309 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">while</span> (n><span style="color:#00D">0</span>) |
314 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> { | 310 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> { |
315 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++; | 311 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++; |
316 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--; | 312 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--; |
317 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> } | 313 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> } |
318 </pre></div> | 314 </pre></div> |
319 </div> | 315 </div> |
320 </div> | 316 </div> |
321 <ul> | 317 </li> |
322 <li>このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす</li> | 318 <li>このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす</li> |
323 <li>n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。</li> | 319 <li>n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。</li> |
324 </ul> | 320 </ul> |
325 | 321 |
326 | 322 |
345 <!-- _S9SLIDE_ --> | 341 <!-- _S9SLIDE_ --> |
346 <h2 id="agda-上での-hoarelogicコマンド定義">Agda 上での HoareLogic(コマンド定義)</h2> | 342 <h2 id="agda-上での-hoarelogicコマンド定義">Agda 上での HoareLogic(コマンド定義)</h2> |
347 <ul> | 343 <ul> |
348 <li>Env は while Program の変数である var n, i</li> | 344 <li>Env は while Program の変数である var n, i</li> |
349 <li><strong>PrimComm</strong> は代入時に使用される</li> | 345 <li><strong>PrimComm</strong> は代入時に使用される</li> |
350 <li><strong>Cond</strong> は Condition で Env を受け取って Boolean の値を返す</li> | 346 <li><strong>Cond</strong> は Condition で Env を受け取って Boolean の値を返す |
351 </ul> | 347 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
352 | |
353 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
354 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> record Env : Set where | 348 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> record Env : Set where |
355 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> field | 349 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> field |
356 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> varn : ℕ | 350 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> varn : ℕ |
357 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> vari : ℕ | 351 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> vari : ℕ |
358 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> | 352 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> |
361 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> | 355 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> |
362 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> Cond : Set | 356 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> Cond : Set |
363 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> Cond = (Env → Bool) | 357 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> Cond = (Env → Bool) |
364 </pre></div> | 358 </pre></div> |
365 </div> | 359 </div> |
366 </div> | 360 </div> |
361 </li> | |
362 </ul> | |
367 | 363 |
368 | 364 |
369 | 365 |
370 </div> | 366 </div> |
371 | 367 |
375 <ul> | 371 <ul> |
376 <li><strong>Comm</strong> は Agda のデータ型で定義した HoareLogic の Command | 372 <li><strong>Comm</strong> は Agda のデータ型で定義した HoareLogic の Command |
377 <ul> | 373 <ul> |
378 <li><strong>Skip</strong> は何も変更しない</li> | 374 <li><strong>Skip</strong> は何も変更しない</li> |
379 <li><strong>PComm</strong> は変数を代入する</li> | 375 <li><strong>PComm</strong> は変数を代入する</li> |
380 <li><strong>Seq</strong> は Command を次の Command に移す</li> | 376 <li><strong>Seq</strong> は Command を実行して次の Command に移す</li> |
381 <li><strong>If</strong> は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える</li> | 377 <li><strong>If</strong> は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える</li> |
382 <li><strong>while</strong> は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す</li> | 378 <li><strong>while</strong> は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す |
379 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
380 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>data Comm : Set where | |
381 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm | |
382 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm | |
383 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -> Comm | |
384 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -> Comm -> Comm | |
385 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -> Comm -> Comm -> Comm | |
386 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm | |
387 </pre></div> | |
388 </div> | |
389 </div> | |
390 </li> | |
383 </ul> | 391 </ul> |
384 </li> | 392 </li> |
385 </ul> | 393 </ul> |
386 | 394 |
387 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
388 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where | |
389 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm | |
390 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm | |
391 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -> Comm | |
392 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -> Comm -> Comm | |
393 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -> Comm -> Comm -> Comm | |
394 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm | |
395 </pre></div> | |
396 </div> | |
397 </div> | |
398 | |
399 | 395 |
400 | 396 |
401 </div> | 397 </div> |
402 | 398 |
403 <div class='slide'> | 399 <div class='slide'> |
404 <!-- _S9SLIDE_ --> | 400 <!-- _S9SLIDE_ --> |
405 <h2 id="agda-上での-hoarelogic実際のプログラムの記述">Agda 上での HoareLogic(実際のプログラムの記述)</h2> | 401 <h2 id="agda-上での-hoarelogic実際のプログラムの記述">Agda 上での HoareLogic(実際のプログラムの記述)</h2> |
406 <ul> | 402 <ul> |
407 <li>先程の Comm を使ってwhile Program を記述した。</li> | 403 <li>Command を使って while Program を記述した。</li> |
408 </ul> | 404 <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う |
409 | 405 <ul> |
410 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 406 <li>見やすさのため改行しているため 3~7 行はまとまっている</li> |
407 </ul> | |
408 </li> | |
409 <li>Seq は Comm を2つ取って次の Comm に移行する | |
410 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
411 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> program : Comm | 411 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> program : Comm |
412 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program = | 412 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program = |
413 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = 10})) | 413 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = 10})) |
414 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) | 414 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) |
415 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) | 415 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) |
416 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) | 416 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) |
417 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) | 417 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) |
418 </pre></div> | 418 </pre></div> |
419 </div> | 419 </div> |
420 </div> | 420 </div> |
421 </li> | |
422 </ul> | |
421 | 423 |
422 | 424 |
423 | 425 |
424 </div> | 426 </div> |
425 | 427 |
426 <div class='slide'> | 428 <div class='slide'> |
427 <!-- _S9SLIDE_ --> | 429 <!-- _S9SLIDE_ --> |
428 <h2 id="agda-上での-hoarelogicの理解">Agda 上での HoareLogicの理解</h2> | 430 <h2 id="agda-上での-hoarelogicの理解">Agda 上での HoareLogicの理解</h2> |
429 <ul> | 431 <ul> |
430 <li>証明規則は HTProof にまとめられてる</li> | 432 <li>規則は HTProof にまとめられてる</li> |
431 <li><strong>PrimRule</strong> は代入を</li> | 433 <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li> |
432 </ul> | 434 <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述 |
433 | 435 <ul> |
434 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 436 <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す関数</li> |
437 </ul> | |
438 </li> | |
439 <li>SkipRule は PreCondition を変更しないことの保証</li> | |
440 <li>AbortRule は プログラムが停止するときのルール | |
441 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
435 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data HTProof : Cond -> Comm -> Cond -> Set where | 442 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data HTProof : Cond -> Comm -> Cond -> Set where |
436 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} -> | 443 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} -> |
437 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) -> | 444 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) -> |
438 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost | 445 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost |
439 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> SkipRule : (b : Cond) -> HTProof b Skip b | 446 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> SkipRule : (b : Cond) -> HTProof b Skip b |
440 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> AbortRule : (bPre : Cond) -> (bPost : Cond) -> | 447 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> AbortRule : (bPre : Cond) -> (bPost : Cond) -> |
441 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> HTProof bPre Abort bPost | 448 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> HTProof bPre Abort bPost |
442 <span class="line-numbers"><a href="#n8" name="n8">8</a></span>-- 次のスライドに続く | 449 <span class="line-numbers"><a href="#n8" name="n8">8</a></span>-- 次のスライドに続く |
443 </pre></div> | 450 </pre></div> |
444 </div> | 451 </div> |
445 </div> | 452 </div> |
453 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
454 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Axiom : Cond -> PrimComm -> Cond -> Set | |
455 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true | |
456 </pre></div> | |
457 </div> | |
458 </div> | |
459 </li> | |
460 </ul> | |
446 | 461 |
447 | 462 |
448 | 463 |
449 </div> | 464 </div> |
450 | 465 |
451 <div class='slide'> | 466 <div class='slide'> |
452 <!-- _S9SLIDE_ --> | 467 <!-- _S9SLIDE_ --> |
453 <h2 id="agda-上での-hoarelogicの理解-1">Agda 上での HoareLogicの理解</h2> | 468 <h2 id="agda-上での-hoarelogicの理解-1">Agda 上での HoareLogicの理解</h2> |
454 <ul> | 469 <ul> |
455 <li></li> | 470 <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li> |
456 </ul> | 471 <li><strong>IfRule</strong> は If の Command が正しく動くことを保証 |
457 | 472 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
458 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 473 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き |
474 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} -> | |
475 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {cm2 : Comm} -> {bPost : Cond} -> | |
476 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> HTProof bPre cm1 bMid -> | |
477 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bMid cm2 bPost -> | |
478 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> HTProof bPre (Seq cm1 cm2) bPost | |
479 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> IfRule : {cmThen : Comm} -> {cmElse : Comm} -> | |
480 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {bPre : Cond} -> {bPost : Cond} -> | |
481 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {b : Cond} -> | |
482 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof (bPre /\ b) cmThen bPost -> | |
483 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof (bPre /\ neg b) cmElse bPost -> | |
484 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (If b cmThen cmElse) bPost | |
485 </pre></div> | |
486 </div> | |
487 </div> | |
488 </li> | |
489 </ul> | |
490 | |
491 | |
492 | |
493 </div> | |
494 | |
495 <div class='slide'> | |
496 <!-- _S9SLIDE_ --> | |
497 <h2 id="agda-上での-hoarelogicの理解-2">Agda 上での HoareLogicの理解</h2> | |
498 <ul> | |
499 <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li> | |
500 <li>Tautology は Condition と不変条件が等しく成り立つ</li> | |
501 <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す | |
502 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
459 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き | 503 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き |
460 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} -> | 504 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} -> |
461 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} -> {bPost : Cond} -> | 505 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} -> {bPost : Cond} -> |
462 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> Tautology bPre bPre' -> | 506 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> Tautology bPre bPre' -> |
463 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' -> | 507 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' -> |
464 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost -> | 508 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost -> |
465 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost | 509 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost |
466 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} -> | 510 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> |
467 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {cm2 : Comm} -> {bPost : Cond} -> | 511 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> HTProof (bInv /\ b) cm bInv -> |
468 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bPre cm1 bMid -> | 512 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bInv (While b cm) (bInv /\ neg b) |
469 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof bMid cm2 bPost -> | 513 </pre></div> |
470 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (Seq cm1 cm2) bPost | 514 </div> |
471 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> IfRule : {cmThen : Comm} -> {cmElse : Comm} -> | 515 </div> |
472 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> {bPre : Cond} -> {bPost : Cond} -> | 516 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
473 <span class="line-numbers"><a href="#n15" name="n15">15</a></span> {b : Cond} -> | 517 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Tautology : Cond -> Cond -> Set |
474 <span class="line-numbers"><a href="#n16" name="n16">16</a></span> HTProof (bPre /\ b) cmThen bPost -> | 518 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true |
475 <span class="line-numbers"><a href="#n17" name="n17">17</a></span> HTProof (bPre /\ neg b) cmElse bPost -> | 519 </pre></div> |
476 <span class="line-numbers"><a href="#n18" name="n18">18</a></span> HTProof bPre (If b cmThen cmElse) bPost | 520 </div> |
477 <span class="line-numbers"><a href="#n19" name="n19">19</a></span> WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> | 521 </div> |
478 <span class="line-numbers"><strong><a href="#n20" name="n20">20</a></strong></span> HTProof (bInv /\ b) cm bInv -> | 522 </li> |
479 <span class="line-numbers"><a href="#n21" name="n21">21</a></span> HTProof bInv (While b cm) (bInv /\ neg b) | 523 </ul> |
480 </pre></div> | |
481 </div> | |
482 </div> | |
483 | 524 |
484 | 525 |
485 | 526 |
486 </div> | 527 </div> |
487 | 528 |
488 <div class='slide'> | 529 <div class='slide'> |
489 <!-- _S9SLIDE_ --> | 530 <!-- _S9SLIDE_ --> |
490 <h2 id="agda-上での-hoarelogic証明">Agda 上での HoareLogic(証明)</h2> | 531 <h2 id="agda-上での-hoarelogic証明">Agda 上での HoareLogic(証明)</h2> |
491 | 532 <ul> |
492 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 533 <li><strong>proof1</strong> は while Program の証明</li> |
493 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proof1 : HTProof initCond program termCond | 534 <li>HTProof に 初期状態とコマンドで書かれた <strong>program</strong> と終了状態を渡す</li> |
494 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proof1 = | 535 <li>lemma1~5は rule それぞれの証明</li> |
495 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule empty-case ) | 536 <li> |
496 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 ) | 537 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
497 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 ( | 538 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>proof1 : HTProof initCond program termCond |
498 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10} | 539 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span>proof1 = |
499 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) | 540 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule empty-case ) |
500 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 | 541 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 ) |
501 </pre></div> | 542 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 ( |
502 </div> | 543 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10} |
503 </div> | 544 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) |
545 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 | |
546 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> | |
547 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>initCond : Cond | |
548 <span class="line-numbers"><a href="#n11" name="n11">11</a></span>initCond env = true | |
549 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> | |
550 <span class="line-numbers"><a href="#n13" name="n13">13</a></span>termCond : {c10 : ℕ} → Cond | |
551 <span class="line-numbers"><a href="#n14" name="n14">14</a></span>termCond {c10} env = Equal (vari env) c10 | |
552 </pre></div> | |
553 </div> | |
554 </div> | |
555 </li> | |
556 </ul> | |
557 | |
558 <p><!-- program : Comm --> | |
559 <!-- program = --> | |
560 <!-- Seq ( PComm (λ env → record env {varn = 10})) --> | |
561 <!-- $ Seq ( PComm (λ env → record env {vari = 0})) --> | |
562 <!-- $ While (λ env → lt zero (varn env ) ) --> | |
563 <!-- (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) --> | |
564 <!-- $ PComm (λ env → record env {varn = ((varn env) - 1)} )) --></p> | |
565 | |
566 | |
567 | |
568 </div> | |
569 | |
570 <div class='slide'> | |
571 <!-- _S9SLIDE_ --> | |
572 <h2 id="証明の一部">証明の一部</h2> | |
573 <ul> | |
574 <li>型だけ載せる</li> | |
575 <li>基本的な証明方法は Condtition を変化させて次の Condition が成り立つように変形する</li> | |
576 <li>impl⇒ | |
577 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
578 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10}) (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10}) | |
579 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in | |
580 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> begin | |
581 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> (Equal (varn env) c10 ) ∧ true | |
582 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> ≡⟨ ∧true ⟩ | |
583 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Equal (varn env) c10 | |
584 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> ≡⟨ cond ⟩ | |
585 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> true | |
586 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> ∎ ) | |
587 </pre></div> | |
588 </div> | |
589 </div> | |
590 | |
591 <p><!-- lemma2 : {c10 : ℕ} → Tautology stmt2Cond whileInv --></p> | |
592 | |
593 <p><!-- lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' --></p> | |
594 | |
595 <p><!-- lemma4 : {c10 : ℕ} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv --></p> | |
596 | |
597 <p><!-- lemma5 : {c10 : ℕ} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p> | |
598 </li> | |
599 </ul> | |
504 | 600 |
505 | 601 |
506 | 602 |
507 </div> | 603 </div> |
508 | 604 |
513 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li> | 609 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li> |
514 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li> | 610 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li> |
515 <li><strong>名前 : 引数 -> (Code : fa -> t) -> t</strong></li> | 611 <li><strong>名前 : 引数 -> (Code : fa -> t) -> t</strong></li> |
516 <li><strong>t</strong> は継続</li> | 612 <li><strong>t</strong> は継続</li> |
517 <li><strong>(Code : fa -> t)</strong> は次の継続先</li> | 613 <li><strong>(Code : fa -> t)</strong> は次の継続先</li> |
518 <li>DataGear は Agda での CodeGear に使われる引数</li> | 614 <li>DataGear は Agda での CodeGear に使われる引数 |
615 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
616 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>_g-_ : {t : Set} → ℕ → ℕ → (Code : ℕ → t) → t | |
617 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>x g- zero next = next x | |
618 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>zero g- _ = next zero | |
619 <span class="line-numbers"><a href="#n4" name="n4">4</a></span>(suc x) g- (suc y) = next (x g- y) | |
620 </pre></div> | |
621 </div> | |
622 </div> | |
623 </li> | |
519 </ul> | 624 </ul> |
520 | 625 |
521 | 626 |
522 | 627 |
523 </div> | 628 </div> |
525 <div class='slide'> | 630 <div class='slide'> |
526 <!-- _S9SLIDE_ --> | 631 <!-- _S9SLIDE_ --> |
527 <h2 id="gears-をベースにした-hoarelogic">Gears をベースにした HoareLogic</h2> | 632 <h2 id="gears-をベースにした-hoarelogic">Gears をベースにした HoareLogic</h2> |
528 <ul> | 633 <ul> |
529 <li>次に Gears をベースにした while Program をみる。</li> | 634 <li>次に Gears をベースにした while Program をみる。</li> |
530 <li>このプログラムは c10</li> | 635 <li>このプログラムは自然数と継続先を受け取って t を返す |
531 </ul> | 636 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
532 | 637 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> {-# TERMINATING #-} |
533 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 638 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileLoop : {l : Level} {t : Set l} -> Env -> (Code : Env -> t) -> t |
534 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> whileTest : {l : Level} {t : Set l} -> {c10 : ℕ } → (Code : (env : Env) -> | 639 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileLoop env next with lt 0 (varn env) |
535 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> ((vari env) ≡ 0) /\ ((varn env) ≡ c10) -> t) -> t | 640 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> whileLoop env next | false = next env |
536 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileTest {_} {_} {c10} next = next env proof2 | 641 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> whileLoop env next | true = |
537 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> where | 642 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next |
538 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> env : Env | 643 </pre></div> |
539 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> env = record {vari = 0 ; varn = c10} | 644 </div> |
540 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) | 645 </div> |
541 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> proof2 = record {pi1 = refl ; pi2 = refl} | 646 </li> |
542 </pre></div> | 647 </ul> |
543 </div> | |
544 </div> | |
545 | 648 |
546 | 649 |
547 | 650 |
548 </div> | 651 </div> |
549 | 652 |
550 <div class='slide'> | 653 <div class='slide'> |
551 <!-- _S9SLIDE_ --> | 654 <!-- _S9SLIDE_ --> |
552 <h2 id="gears-と-hoarelogic-をベースにした証明">Gears と HoareLogic をベースにした証明</h2> | 655 <h2 id="gears-と-hoarelogic-をベースにした証明">Gears と HoareLogic をベースにした証明</h2> |
553 <ul> | 656 <ul> |
554 <li>ここでは</li> | 657 <li>ここでは |
555 </ul> | 658 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
556 | 659 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : ℕ } → Set |
557 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 660 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 |
558 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : ℕ } → Set | 661 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) |
559 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest {_} {_} {c10} (λ n p1 → conversion1 n p1 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) | 662 </pre></div> |
560 </pre></div> | 663 </div> |
561 </div> | 664 </div> |
562 </div> | 665 </li> |
666 </ul> | |
563 | 667 |
564 <p><–! | 668 <p><–! |
565 [論文目次] | 669 [論文目次] |
566 まえがき</p> | 670 まえがき</p> |
567 | 671 |