annotate slide/slide.md @ 28:423f59b098ac

Add svg
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Wed, 15 Feb 2023 17:18:23 +0900
parents 988528add93f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 ---
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 marp: true
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 title: Gears Agda での形式手法を用いたプログラムの検証
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 paginate: true
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 theme: default
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 size: 16:9
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 style: |
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 section {
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 background-color: #FFFFFF;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 font-size: 28px;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 color: #4b4b4b;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 font-family: "Droid Sans Mono", "Hiragino Maru Gothic ProN";
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 background-image: url("logo.svg");
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 background-position: right 3% bottom 2%;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 background-repeat: no-repeat;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 background-attachment: 5%;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 background-size: 20% auto;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 }
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 section.title h1 {
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 color: #808db5;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 text-align: center;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 }
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 section.title p {
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 bottom: 25%;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 width: 100%;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 position: absolute;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 font-size: 25px;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 color: #4b4b4b;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 background: linear-gradient(transparent 90%, #ffcc00 0%);
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 }
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
34
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 section.slide h1 {
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 width: 95%;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 color: white;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 background-color: #808db5;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 position: absolute;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40 left: 50px;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 top: 35px;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 }
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 section.fig_cg p {
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 top: 300px;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 text-align: center;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 }
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
49 math: mathjax
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 ---
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 <!-- headingDivider: 1 -->
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 # Gears Agda での形式手法を用いたプログラムの検証
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 <!-- class: title -->
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 Uechi Yuto, 琉球大学
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 # 証明を用いてプログラムの信頼性の向上を目指す
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 <!-- class: slide -->
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 <!-- 研究目的 -->
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 - プログラムの信頼性を高めることは重要な課題である
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 - 信頼性を高める手法として「モデル検査」や「定理証明」など
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 - 欠点として、実装コストが高い点が挙げられる
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 - プログラムの検証に適した Gears Agda を用いる
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 - これは Agda に CbC の継続の概念を取り入れたもの
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 <!-- Agda は Curru-Howard 対応に基づく関数型言語 -->
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 - Continuation based C (CbC)という言語を当研究室で開発している
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 - C言語からループ構造とサブルーチンを取り除き、継続を導入したC言語の下位言語となる
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 - 本研究では Gears Agda にて定理証明を用いた検証と、モデル検査による検証をする
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 # Agda の基本
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 - Agdaとは定理証明支援器であり、関数型言語
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 - Agdaでの関数は、最初に型について定義した後に、関数を定義する事で記述する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 - 型の定義部分で、入力と出力の型を定義できる
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 - input → output のようになる
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 - 関数の定義は = を用いて行う
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 - 関数名を定義した行よりも後ろの行で実装する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 - = の前で受け取る引数を記述、= の後ろで実装を記述する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
81 <!--
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 sample : (A : Set ) → (B : Set ) → Set
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 sample a b = b
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 # Agda の基本 record
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 オブジェクトあるいは構造体
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 record Env : Set where
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 field
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 varn : N
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 vari : N
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 open Env
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 型に対応する値の導入(intro)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 record {varn = zero ; vari = suc zero}
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 record の値のアクセス(elim)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 (env : Env) → varn env
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 ```
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
106 -->
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
107
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
108 # Agda の基本 record
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
109 オブジェクトあるいは構造体
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
110 2つのものが同時に存在すること
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
111 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
112 record _∧_ (A B : Set) : Set where
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
113 field
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
114 p1 : A
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
115 p2 : B
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
116 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
117 3段論法を示すこともできる
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
118 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
119 syllogism : {A B C : Set} → ((A → B) ∧ (B → C)) → (A → C)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
120 syllogism x a = _∧_.p2 x (_∧_.p1 x a)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
121 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
122
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
123 # CbC について
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
124 - CbCとは当研究室で開発しているC言語の下位言語
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
125 - 関数呼び出し時にスタックの操作を行わずjmp命令で次の処理に移動する
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
126 - 処理の単位を Code Gear, データの単位を Data Gear として記述するプログラミング言語
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
127 - CbC のプログラミングでは Data Gear を Code Gear で変更し、その変更を次の Code Gear に渡して処理を行う
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
128
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
129 # Normal level と Meta Level を用いた信頼性の向上
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
130 プログラムを記述する際に、メモリ管理、スレッド管理、資源管理などのプログラムの本筋とは別に実装が必要な場合がある。これらの計算をメタ計算と呼ぶ。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
131 CbC では メタ計算を分離して考える。メタ計算以外を Normal levelとしている。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
132 - Normal Level の計算
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
133 - 軽量継続
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
134 - Code Gear 単位で関数型プログラミングとなる
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
135 - atomic(Code Gear 自体の実行は割り込まれない)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
136 - Meta Level の計算
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
137 - メモリやCPUなどの資源管理、ポインタ操作
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
138 - Contextによる並列実行。monadに相当するData構造
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
139 - Hoare Condition と証明
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
140
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
142 # Normal level と Meta Level の対応
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
143 ![height:400px](meta-cg-dg.jpg)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
144 Gears Agdaでは 検証を Meta計算として取り扱う
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
145
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146 # Gears Agda の記法
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 <!-- Gears Agdaの説明が必要かも -->
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
148 Gears Agda では CbC と対応させるためにすべてLoopで記述する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149 loopは`→ t`の形式で表現する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 末尾再帰以外の再帰呼び出しは使わない(構文的には禁止していないので注意が必要)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152 {-# TERMINATING #-}
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
154 whileLoop env next with lt 0 (varn env)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
155 whileLoop env next | false = next env
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
156 whileLoop env next | true = whileLoop
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
157 (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
158 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
159 - tを返すことで継続を表す(tは呼び出し時に任意に指定してもよい. testに使える)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 - tail call により light weight continuation を定義している
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
162
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
163 # Gears Agda と Gears CbC の対応
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
164 Gears Agda
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
165 - 証明向きの記述
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
166 - Hoare Condition を含む
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
167
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
168 Gears CbC
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
169 - 実行向きの記述
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
170 - メモリ管理, 並列実行を含む
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
171
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
172 Context
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
173 - processに相当する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
174 - Code Gear 単位で並列実行
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
175
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
177
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 # Gears Agda と Hoare Logic
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
179 <!-- class: slide -->
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
180 - C.A.R Hoare, R.W Floyd が考案
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
181 - 「プログラムの事前条件(P)が成立しているとき、コマンド(C)を実行して停止すると事後条件(Q)が成り立つ」というもの
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
182 $$ \{P\} C \{Q\} $$
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
183 - 事前条件を Code Gear に入れる前の Meta Gear で検証する。これを Pre Condition とする
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
184 - Command は Code Gear そのもの
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
185 - 事後条件を Code Gear のあとの Meta Gear で検証する。これを Post Condition とした
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
186 - 今回は、例として While loop の Hoare Logic を用いた検証を行う
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
187
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
188 <!--
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
189 Gears Agda による Command の例
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
190
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
191 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
192 {-# TERMINATING #-}
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
193 whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 whileLoop env next with lt 0 (varn env)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 whileLoop env next | false = next env
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
196 whileLoop env next | true = whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
197 ```
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
198 -->
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
199
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
200 # Gears Agda での while loopの実装
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
201 While Loopの実装は主に以下のDataGearとCodeGearで行った
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
202 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
203 record Env : Set where
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
204 field
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
205 varn : ℕ -- これからループする回数
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
206 vari : ℕ -- 今までループした回数
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
207 open Env
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
208 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
209
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
210 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
211 {-# TERMINATING #-}
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
212 whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
213 whileLoop env next with lt 0 (varn env)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
214 whileLoop env next | false = next env
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
215 whileLoop env next | true =
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
216 whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
217 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
218
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
219 # While loopでのInvariantの定義
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
220
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
221 不変条件としてInvariantを定義した。これを実行しながら証明することでHoare Logic での検証ができる
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
222 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
223 -- 初期値として、ループする前はループした回数は0であり
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
224 -- かつループする回数とループする回数は等しい
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
225 ((vari env) ≡ 0) /\ ((varn env) ≡ c10)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
226 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
227 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
228 -- ループする回数とループした回数を足すと入力したループして欲しい回数と等しい
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
229 (varn env) + (vari env) ≡ c10)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
230 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
231 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
232 vari e1 ≡ c10 -- ループした回数は入力したループして欲しい回数と等しい
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
233 ```
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
234
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 # Gears Agda の Pre Condition / Post Condition
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
236 ループ実行中の命題は以下のようになる。
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
237 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 whileLoopSeg : {l : Level} {t : Set l} → {c10 : N } → (env : Env) → (varn env + vari env ≡ c10)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 → (next : (e1 : Env )→ varn e1 + vari e1 ≡ c10 → varn e1 < varn env → t)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
240 → (exit : (e1 : Env )→ vari e1 ≡ c10 → t) → t
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
241 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
242 - `{-# TERMINATING #-}`を避けるためにloopを分割
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
243 - `varn env + vari env ≡ c10` が Pre Condition
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 - `varn e1 + vari e1 ≡ c10` が Post Condition
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 - `varn e1 < varn env` が停止を保証する減少列
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
246
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 これは命題なので証明を与えて Pre Condition から Post Condition を導出する必要がある。証明は値として次の CodeGear に渡される
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
248
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 # Loop の接続
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
250 loop中のMeta Gearを作成する
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
252 TerminatingLoopS : {l : Level} {t : Set l} ( Index : Set )
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 → {Invraiant : Index → Set } → ( reduce : Index → N)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 → (loop : (r : Index) → Invraiant r
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
255 → (next : (r1 : Index) → Invraiant r1 → reduce r1 < reduce r → t ) → t)
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256 → (r : Index) → (p : Invraiant r) → t
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
257 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 - IndexはLoop変数
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
259 - Invariantはloop変数の不変条件
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 - loopに接続するCode Gearを与える
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
261 - つまりloopを抜ける際の Code Gear。ここでは next がそれにあたる
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 - reduceは停止性を保証する減少列
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
263 - この減少列のおかげで`{-# TERMINATING #-}`が外せる
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
264
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
265 これを証明することで検証ができる
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
266
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 # 実際のloopの接続
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
268 証明したい性質を以下のように記述する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
269 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
270 whileTestSpec1 : (c10 : N) → (e1 : Env ) → vari e1 ≡ c10 → ⊤
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 whileTestSpec1 _ _ x = tt
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
273 loopをTerminatingLoopSで接続して仕様記述に繋げる
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
274 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
275 proofGearsTermS : {c10 : N} → ⊤
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
276 proofGearsTermS {c10} = whileTest' {_} {_} {c10} (λ n p → conversion1 n p (λ n1 p1 →
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
277 TerminatingLoopS Env (λ env → varn env)(λ n2 p2 loop → whileLoopSeg {_} {_} {c10} n2 p2 loop
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
278 (λ ne pe → whileTestSpec1 c10 ne pe)) n1 p1 ))
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 - conversion1はPre Condition をPost Conditionに変換する
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
281 - ⊤は正しいことを示す論理記号
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
282
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
283
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
284 # 定理証明とtest との違い
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
285 - test では実値を与えた際の出力が仕様に沿ったものであるかを検証する
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
286 - コーナーケースを人力で完全に考慮するのは難しい
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
287 - 今回の定理証明を用いた証明では実値を必要としない
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 - そのため、入力の型の範囲全てに対して仕様を満たしているか検証できる
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
289
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
290 # モデル検査と定理証明の違い
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 - モデル検査では全ての状態を網羅し、それが仕様を満たしているか検証する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 - 無限にある状態を検証することはできないため、定理証明と比べると完全な検証にならないこともある
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
293 - 定理証明に比べてモデル検査の実装コストは低い
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
294 - 定理証明の証明は難しい
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
295 - その代わりモデル検査は計算コストは高い
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
296 - 定理証明では並列実行の検証をするには、状態を全探索しそれらを定理証明することになる
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
297
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
298 # Gears Agda による モデル検査
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
299 - 定理証明で並列実行の検証をするのは難しいので、モデル検査で検証を行う。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
300 - 今回は Gears Agda にてモデル検査をすることで、並列実行の検証を行う
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
301 - 題材として、 Dining Philosophers Problem のモデル検査にてdead lockを検知する
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 # Dining Philosophers Problem
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 ||哲学者の遷移|
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 |---|---|
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
306 |![height:450px](DPP.jpg)|制約 <br> - 哲学者と同じ数のフォークが存在する <br> - 両手にフォークを持つと食事できる <br> 哲学者のフロー <br> 1. 哲学者は思考をしている <br> 2. 食事をするために右のフォークを取る <br> 3. 次に左のフォークを取る <br> 4. 両方のフォークが取れたら食事をする <br> 5. 思考に戻るために左のフォークを置く <br> 6. 次に右のフォークを置く |
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 # Dining Philosophers Problem の実装
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 - DPPはマルチプロセスの同期問題である
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 - しかし、Agdaでは並列実行をサポートしていないため、step実行毎に一つずつ処理することで並列実行を表現している
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 - 加えて、哲学者が思考を止めて食事をしようとするのか、食事中に思考に戻ろうとするのかで分岐が発生する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 - 今回はその状態に対して網羅することでモデル検査を行っている
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 # Dining Philosophers Problem の実装
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
315 Gears Agdaで使用する Data Gear を以下のように定義した
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
317 record Phi : Set where
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 field
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 pid : ℕ
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320 right-hand : Bool
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 left-hand : Bool
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
322 next-code : Code
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323 open Phi
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 record Env : Set where
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 field
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328 table : List ℕ
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 ph : List Phi
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
330 open Env
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 # Dining Philosophers Problem の実装
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
334 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
335 data Code : Set where
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
336 C_putdown_rfork : Code
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 C_putdown_lfork : Code
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 C_thinking : Code
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 C_pickup_rfork : Code
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
340 C_pickup_lfork : Code
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
341 C_eating : Code
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
342 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
343
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
344 ```
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
345 code_table : {n : Level} {t : Set n} → Code → ℕ → Phi → Env → (Env → t) → t
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
346 code_table C_putdown_rfork = putdown-rfork-c
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
347 code_table C_putdown_lfork = putdown-lfork-c
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
348 code_table C_thinking = thinking-c
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 code_table C_pickup_rfork = pickup-rfork-c
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 code_table C_pickup_lfork = pickup-lfork-c
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
351 code_table C_eating = eating-c
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
354 # Dining Philosophers Problem の実装
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
355 以下が哲学者の動作の実装の一つ
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
356 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
357 pickup-lfork-c : {n : Level} {t : Set n} → ℕ → Phi → Env → (Env → t) → t
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
358 pickup-lfork-c ind p env exit = pickup-lfork-p (suc ind) [] (table env) p env exit where
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
359 pickup-lfork-p : {n : Level} {t : Set n} → ℕ → (f b : List ℕ) → Phi → Env → (Env → t) → t
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
360 pickup-lfork-p zero f [] p env exit with table env
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
361 ... | [] = exit env
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
362 ... | 0 ∷ ts = exit record env{ph = ((ph env) ++ (record p{left-hand = true ;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
363 next-code = C_eating} ∷ [])); table = ((pid p) ∷ ts)}
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
364 ... | (suc x) ∷ ts = exit record env{ph = ((ph env) ++ p ∷ [])}
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
365 pickup-lfork-p zero f (0 ∷ ts) p env exit = exit record env{
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
366 ph = ((ph env) ++ (record p{left-hand = true ;
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
367 next-code = C_eating} ∷ [])); table = (f ++ ((pid p) ∷ ts))}
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
368 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
369
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 # モデル検査でのデッドロック検知
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 - 今回Gears Agdaでのデッドロックの定義として、以下2つを設定した
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
372 - その状態から分岐が作れない
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
373 - ThinkingやEathingのときに乱数が出るので、その際に分岐するようにしている。それがないということ
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
374 - step実行時に状態が一切変化しない
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
375 - Gears Agda にて出現する状態を全て網羅する
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
376 - step 実行を無限に続ける
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
377 - 一度分岐を確認した状態に対しては flag を立てる
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
378 - 全ての状態の分岐を確認したら停止し、これを State List とした
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
379 - これで全ての状態に対して dead Lock しているのか検証する
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
380
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
381 # モデル検査での Meta Data Gear
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
382 以下の Meta Data Gear を定義した
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
383 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
384 record metadata : Set where
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
385 field
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
386 num-branch : ℕ -- その状態から発生する分岐の数
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
387 wait-list : List ℕ -- step実行で変化がなかったプロセス
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
388 open metadata
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
389 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
390 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
391 record MetaEnv : Set where
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
392 field
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
393 DG : List Env -- historyを持つためListにしている
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
394 meta : metadata
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
395 deadlock : Bool
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
396 is-done : Bool
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
397 is-step : Bool
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
398 open MetaEnv
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
399 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
400
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
401 # モデル検査での Meta Data Gear
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
402 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
403 record MetaEnv2 : Set where
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
404 field
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
405 DG : List (List Env) -- HistoryをもったEnv(状態)を配列として複数持っている。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
406 metal : List MetaEnv
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
407 open MetaEnv2
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
408 ```
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 # モデル検査でのデッドロック検知
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
411 網羅には以下の Meta CodeGear を実装した
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
412 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
413 check-deadlock-metaenv : {n : Level} {t : Set n} → MetaEnv2 → (exit : MetaEnv2 → t) → t
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
414 check-deadlock-metaenv meta2 exit = search-brute-force-envll-p [] (metal meta2)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
415 (λ e → exit record meta2{metal = e}) where
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
416 search-brute-force-envll-p : {n : Level} {t : Set n} → (f b : List (MetaEnv))
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
417 → (exit : List (MetaEnv) → t) → t
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
418 search-brute-force-envll-p f [] exit = exit f
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
419 search-brute-force-envll-p f b@(metaenv ∷ bs) exit with DG metaenv
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
420 ... | [] = search-brute-force-envll-p f bs exit
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
421 ... | (env ∷ envs) = brute-force-search env (λ e0 → search-brute-force-envll-p
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
422 (f ++ ( record metaenv{meta = record (meta metaenv)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
423 {num-branch = (length e0)} } ∷ [])) bs exit )
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
424 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
425 step実行しても状態が変更しない Meta Code Gear も同じように実装している。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
426 これで meta データ を定義できるようになった。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
427
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
428
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
429 # モデル検査でのデッドロックの検知
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
430 metaデータから deadlock を検出する Meta Code Gear にて 、モデル検査を Gears Agda にて行えるようになった。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
431
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 ```
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
433 judge-deadlock-metaenv : {n : Level} {t : Set n} → MetaEnv2 → (exit : MetaEnv2 → t) → t
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
434 judge-deadlock-metaenv meta2 exit = judge-deadlock-p [] (metal meta2)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
435 (λ e → exit record meta2{metal = e} ) where
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
436 judge-deadlock-p : {n : Level} {t : Set n} → (f b : List (MetaEnv))
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
437 → (exit : List (MetaEnv) → t) → t
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
438 judge-deadlock-p f [] exit = exit f
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
439 judge-deadlock-p f (metaenv ∷ bs) exit with num-branch (meta metaenv)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
440 ... | suc (suc branchnum) = judge-deadlock-p (f ++ (metaenv ∷ []) ) bs exit
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
441 ... | zero = judge-deadlock-p (f ++ (metaenv ∷ []) ) bs exit
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
442 ... | suc zero with (DG metaenv )
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
443 ... | [] = judge-deadlock-p (f ++ (metaenv ∷ []) ) bs exit
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
444 ... | p ∷ ps with <-cmp (length (wait-list (meta metaenv))) (length (ph p))
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
445 ... | tri< a ¬b ¬c = judge-deadlock-p (f ++ (metaenv ∷ []) ) bs exit
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
446 ... | tri> ¬a ¬b c = judge-deadlock-p (f ++ (metaenv ∷ []) ) bs exit
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
447 ... | tri≈ ¬a b ¬c = judge-deadlock-p (f ++ (record metaenv{deadlock = true} ∷ []) ) bs exit
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 ```
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
449
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
450 # Gears Agda でのモデル検査の実行
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
451 以下の関数にてモデル検査を行うことができる
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
452 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
453 {-# TERMINATING #-}
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
454 test-dead-lock-loop2 : MetaEnv2 → MetaEnv2
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
455 test-dead-lock-loop2 metaenv2 = branch-search-meta2 metaenv2
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
456 (λ me2 → step-meta2 me2
24
988528add93f fix slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
457 (λ me3 → exclude-same-env me3 metaenv2
23
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
458 (λ me4 → test-dead-lock-loop2 me4) ) )
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
459 (λ e → check-and-judge-deadlock e (λ e1 → e1) )
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
460 ```
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
461 <!-- initから投げるまでにした方がいいかもしれないな -->
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
462
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
463 - Code Gear を繋げたものでは、Agdaは停止性を理解できないので、`{-# TERMINATING #-}`を使用してちゃんと止まることを記述している。
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
464 - 今回の DPP の状態は有限であることが予めわかっていたから可能だった
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
465 - 状態爆発が起こったり無限にある場合は、範囲を制限してモデル検査する方法が用いられる (bounded model checking)
016e82a71407 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
466
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 # 今後の研究方針
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
468 - モデル検査
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
469 - 有向グラフからなる有限オートマトンの遷移を全自動探索する
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 - live lock の検出や LTTL も用いたアサーションなどの検証
24
988528add93f fix slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
471 - State List のデータ構造を balanced tree にする
22
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
472 - モデル検査に定理証明を組み込む
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
473 - 定理証明
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
474 - Red Black Tree の検証を行う
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
475 - Gears Agda
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 - Gears Agda を CbC に自動変換できるようにする
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
477
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
478
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 # まとめ
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 - 定理証明について、Invariant によるプログラムの検証を行うことができるようになった
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
481
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 - Gears Agda によるモデル検査により、並列動作の検証を行えるようになった
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
483
b37e4cd69468 Add slide
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
484 <!-- 英語版も欲しい-->