comparison slide/slide.md @ 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
3 profile: 琉球大学 : 並列信頼研究室 3 profile: 琉球大学 : 並列信頼研究室
4 lang: Japanese 4 lang: Japanese
5 5
6 <!-- 発表20分、質疑応答5分 --> 6 <!-- 発表20分、質疑応答5分 -->
7 7
8 ## 研究目的 8 ## 研究背景
9 <!-- 後回しだ!!!!! --> 9 - OS やアプリケーションなどの信頼性は重要な課題
10 - OS やアプリケーションなどの信頼性は重要な課題である。 10 - 信頼性を上げるために仕様を検証する必要
11 - プログラムの信頼性を上げるためには仕様を検証する必要がある。 11 - 仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある
12 - 使用の検証手法として Floyd-Hoare Logic (以下 HoareLogic) があり。 12 - 事前条件(PreCondition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(PostCondition)を満たす
13 - これはプログラムを Pre、Post Condition(事前、事後条件)、Command (関数) 13 - 既存の言語ではあまり利用されていない(python の pyrefine ってコードチェッカーくらい...?)
14 - 当研究室では信頼性の高い OS として GearsOS を開発している。 14
15 - GearsOS では CodeGear、 DataGear という単位を用いてプログラムを記述する手法を提案している。 15 ## 背景
16 - OS やアプリケーションなど、ソフトウェアの信頼性を高めることは重要である。 16 - 当研究室では 処理の単位を **CodeGear**、データの単位を **DataGear** としてプログラムを記述する手法を提案
17 - そのために当研究室では CodeGear 、 DataGear という単位を用いてプログラムを記述する手法を提案している。 17 - CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む
18 - CodeGear は処理の単位で、処理が終わると次の CodeGear へと継続を行う。 18 - Gear 間の接続処理はメタ計算として定義
19 - このとき、 CodeGear は通常の関数呼び出しとは異なり、呼び出し前の環境を持たずに継続をする。 19 - メタ計算部分に検証を埋め込むことで通常処理に手を加えずに検証
20 - DataGear はデータの単位で、 CodeGear の入力、出力変数となる。 20 - 本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する
21 - また、当研究室では Gears の単位を用いて作られる OS である、 GearsOS を開発している。 21
22 - 本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた検証手法を提案する。 22 <p style="text-align:center;"><img src="./pic/cgdg-small.svg" alt="" width="75%" height="75%"/></p>
23
24 * 当研究室では検証しやすい単位として **CodeGear**、**DataGear** という単位を用いてプログラムを記述する手法を提案している
25 * **CodeGear** とはプログラムを記述する際の処理の単位
26 * **DataGear** は CodeGear で扱うデータの単位
27 * これは関数型プログラミングに近い形になる
28 * 本研究では関数型言語であり、 **証明支援系** 言語でもある **Agda** を用いて仕様を検証することにしている
29
30 <!-- * 動作するプログラムは高い信頼性を持っていてほしい -->
31 <!-- * そのために当研究室では CodeGear 、 DataGear を用いて記述する手法を提案している -->
32 <!-- * 処理の単位である CodeGear を継続しプログラムを記述していく -->
33 <!-- * メタ計算部分を切り替えることで CodeGear の処理を変更すること無くプログラムの検証をすることができる -->
34 <!-- * 継続に関数を呼び出すときの前提条件(pre-condition)を追加することができ、Hoare Logic を用いた証明を Agda で記述できると考えている -->
35 <!-- * 本研究では CodeGear, DataGear という単位を用いてプログラムを記述する手法の継続部分で Hoare Logic をベースにした証明手法を検討する -->
36
37
38 23
39 ## Gears について 24 ## Gears について
40 - **Gears** は当研究室で提案しているプログラム記述手法 25 - **Gears** は当研究室で提案しているプログラム記述手法
41 - 計算の単位を **CodeGear** 、データの単位を **DataGear** 26 - 計算の単位を **CodeGear** 、データの単位を **DataGear**
42 - CodeGear は引数として Input の DataGear を受け取り、 Output の DataGear を返す 27 - CodeGear は引数として Input の DataGear を受け取り、 Output の DataGear を返す
43 - Output の DataGear は次の CodeGear の Input として接続される 28 - Output の DataGear は次の CodeGear の Input として接続される
44 <!-- [fig1](file://./fig/cgdg.pdf) --> 29 <!-- [fig1](file://./fig/cgdg.pdf) -->
45 - CodeGear の接続処理は通常の計算とは異なるメタ計算として定義 30 - CodeGear の接続処理は通常の計算とは異なるメタ計算として定義
46 - メタ計算で信頼性の検証を行う 31 - メタ計算で信頼性の検証を行う
47 32
33 <!-- ![cgdg](./pic/codeGear_dataGear.pdf){} -->
34 <p style="text-align:center;"><img src="./pic/cgdg.svg" alt="" width="30%" height="30%"/></p>
35
48 ## CbC について 36 ## CbC について
49 - Gears の単位でプログラミングできる言語として CbC (Continuation based C) が存在 37 - Gears の単位でプログラミングできる言語として当研究室で開発している **CbC** (Continuation based C) が存在
50 - 現在の CbC では assert での検証ができる 38 - これは C からループ制御構造と関数呼び出しを取り除き継続を導入したもの
39 - 環境を継続に含めない
40 - 現在の CbC ではメタ計算での検証
51 - 将来的には証明も扱えるようにしたいが現段階では未実装 41 - 将来的には証明も扱えるようにしたいが現段階では未実装
52 - そのため Gears の単位を定理証明支援系の言語である **Agda** で記述できるようにし、 Agda 上で証明を行う 42 - そのため Gears の単位を定理証明支援系の言語である **Agda** で記述し、 Agda で証明している
53 43
54 ## Agda 44 ## Agda
55 - Agda は定理証明支援系の言語 45 - Agda は定理証明支援系の言語
56 - 依存型を持つ関数型言語 46 - 依存型を持つ関数型言語
57 - 型を明記する必要がある 47 - 型を明記する必要がある
59 49
60 ## Agda のデータ型 50 ## Agda のデータ型
61 - データ型は代数的なデータ構造 51 - データ型は代数的なデータ構造
62 - **data** キーワードの後に、**名前 : 型**、 where 句 52 - **data** キーワードの後に、**名前 : 型**、 where 句
63 - 次の行以降は**コンストラクタ名 : 型** 53 - 次の行以降は**コンストラクタ名 : 型**
64 - 型は**->**または**→**で繋げる事ができる 54 - 型は**->**または**→**で繋げる
65 - **PrimComm −> Comm**は**PrimComm** を受け取り、 **Comm**を返す型 55 - 例えば、型**PrimComm −> Comm**は**PrimComm** を受け取り**Comm**を返す型
66 - 再帰的な定義も可能 56 - 再帰的な定義も可能
67 57 ```AGDA
68 ```AGDA 58 data Comm : Set where
69 data Comm : Set where 59 Skip : Comm
70 Skip : Comm 60 Abort : Comm
71 Abort : Comm 61 PComm : PrimComm −> Comm
72 PComm : PrimComm −> Comm 62 Seq : Comm −> Comm −> Comm
73 Seq : Comm −> Comm −> Comm 63 If : Cond −> Comm −> Comm −> Comm
74 If : Cond −> Comm −> Comm −> Comm 64 While : Cond −> Comm −> Comm
75 While : Cond −> Comm −> Comm
76 ``` 65 ```
77 66
78 <!-- - where は宣言した部分に束縛する --> 67 <!-- - where は宣言した部分に束縛する -->
79 68
80 ## Agda のレコード型 69 ## Agda のレコード型
81 - C 言語での構造体に近い 70 - C 言語での構造体に近い
82 - 複数のデータ型をまとめる 71 - 複数のデータをまとめる
83 - 関数内で構築できる 72 - 関数内で構築できる
84 - 構築時は**レコード名 {フィールド名 = 値}** 73 - 構築時は**レコード名 {フィールド名 = 値}**
85 - 複数ある場合は **{フィールド1 = 1 ; フィールド2 = 2}**のように **;** を使って列挙 74 - 複数ある場合は **{フィールド1 = 1 ; フィールド2 = 2}**のように **;** を使って列挙
86 75 - (varn,vari の型 **ℕ** は Agda 上の 自然数、 データ型で zero : ℕ と succ : ℕ -> ℕ で定義されてる)
87 ```AGDA 76 ```AGDA
88 record Env : Set where 77 record Env : Set where
89 field 78 field
90 varn : ℕ 79 varn : ℕ
91 vari : ℕ 80 vari : ℕ
92 ``` 81 ```
93 82
94 ## Agda の関数 83 ## Agda の関数
95 - 関数にも型が必要 84 - 関数にも型が必要
96 - 関数は **関数名 = 値** 85 - 関数は **関数名 = 値**
97 - 関数ではパターンマッチがかける 86 - 関数ではパターンマッチがかける
98 - **_** は任意の引数 87 - **_** は任意の引数
99 88 ```AGDA
100 ```AGDA 89 _-_ : ℕ → ℕ → ℕ
101 _−_ : ℕ → ℕ → ℕ 90 x - zero = x
102 x − zero = x 91 zero - _ = zero
103 zero − _ = zero 92 (suc x) - (suc y) = x - y
104 (suc x) − (suc y) = x − y
105 ``` 93 ```
106 94
107 ## Agda での証明 95 ## Agda での証明
108 - 関数の型に論理式 96 - 関数の型に論理式
109 - 関数自体にそれを満たす導出 97 - 関数自体にそれを満たす導出
110 - 完成した関数は証明 98 - 完成した関数は証明
111 - **{}** は暗黙的(推論される) 99 - **{}** は暗黙的(推論される)
112 - 下のコードは自然数に 0 を足したとき値が変わらないことの証明 100 - 下のコードは自然数に 0 を足したとき値が変わらないことの証明
113 101 ```AGDA
114 ```AGDA 102 +zero : { y : ℕ } → y + zero ≡ y
115 +zero : {y : ℕ} → y + zero ≡ y 103 +zero {zero} = refl
116 +zero {zero} = refl 104 +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} )
117 +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} )
118 ``` 105 ```
119 106
120 ## Agda 上での HoareLogic 107 ## Agda 上での HoareLogic
121 * 現在 Agda での HoareLogic は初期のAgda の実装である Agda1(現在のものはAgda2)で実装されたものと 108 * 現在 Agda での HoareLogic は初期のAgda の実装である Agda1(現在のものはAgda2)で実装されたものと
122 それを Agda2 に書き写したものが存在している。 109 それを Agda2 に書き写したものが存在している。
123 * 今回はAgda2側の HoareLogic で使うコマンド定義の一部と、コマンドの証明に使うルールを借りて説明を行う。 110 * 今回はAgda2側の HoareLogic で使うコマンド定義の一部と、コマンドの証明に使うルールを借りて説明を行う。
124 111
125 112
126 ## Agda での HoareLogic の理解 113 ## Agda での HoareLogic の理解
127 * HoareLogic を用いて次のようなプログラム(while Program)を検証した。 114 * HoareLogic を用いて次のようなプログラム(while Program)を検証した。
128
129 ```C 115 ```C
130 n = 10; 116 n = 10;
131 i = 0; 117 i = 0;
132 118
133 while (n>0) 119 while (n>0)
134 { 120 {
135 i++; 121 i++;
136 n--; 122 n--;
137 } 123 }
138 ``` 124 ```
139 * このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす 125 * このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす
140 * n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。 126 * n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。
141 127
142 ## HoareLogic 128 ## HoareLogic
148 134
149 ## Agda 上での HoareLogic(コマンド定義) 135 ## Agda 上での HoareLogic(コマンド定義)
150 * Env は while Program の変数である var n, i 136 * Env は while Program の変数である var n, i
151 * **PrimComm** は代入時に使用される 137 * **PrimComm** は代入時に使用される
152 * **Cond** は Condition で Env を受け取って Boolean の値を返す 138 * **Cond** は Condition で Env を受け取って Boolean の値を返す
153 139 ```AGDA
154 ```AGDA 140 record Env : Set where
155 record Env : Set where 141 field
156 field 142 varn : ℕ
157 varn : ℕ 143 vari : ℕ
158 vari : ℕ 144
159 145 PrimComm : Set
160 PrimComm : Set 146 PrimComm = Env → Env
161 PrimComm = Env → Env 147
162 148 Cond : Set
163 Cond : Set 149 Cond = (Env → Bool)
164 Cond = (Env → Bool)
165 ``` 150 ```
166 151
167 ## Agda 上での HoareLogic(コマンド定義) 152 ## Agda 上での HoareLogic(コマンド定義)
168 * **Comm** は Agda のデータ型で定義した HoareLogic の Command 153 * **Comm** は Agda のデータ型で定義した HoareLogic の Command
169 * **Skip** は何も変更しない 154 * **Skip** は何も変更しない
170 * **PComm** は変数を代入する 155 * **PComm** は変数を代入する
171 * **Seq** は Command を次の Command に移す 156 * **Seq** は Command を実行して次の Command に移す
172 * **If** は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える 157 * **If** は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える
173 * **while** は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す 158 * **while** は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す
174 159 ```AGDA
175 ```AGDA 160 data Comm : Set where
176 data Comm : Set where 161 Skip : Comm
177 Skip : Comm 162 Abort : Comm
178 Abort : Comm 163 PComm : PrimComm -> Comm
179 PComm : PrimComm -> Comm 164 Seq : Comm -> Comm -> Comm
180 Seq : Comm -> Comm -> Comm 165 If : Cond -> Comm -> Comm -> Comm
181 If : Cond -> Comm -> Comm -> Comm 166 While : Cond -> Comm -> Comm
182 While : Cond -> Comm -> Comm
183 ``` 167 ```
184 168
185 ## Agda 上での HoareLogic(実際のプログラムの記述) 169 ## Agda 上での HoareLogic(実際のプログラムの記述)
186 * 先程の Comm を使ってwhile Program を記述した。 170 * Command を使って while Program を記述した。
187 171 * **$** は **()** の糖衣で行頭から行末までを ( ) で囲う
188 ```AGDA 172 * 見やすさのため改行しているため 3~7 行はまとまっている
189 program : Comm 173 * Seq は Comm を2つ取って次の Comm に移行する
190 program = 174 ```AGDA
191 Seq ( PComm (λ env → record env {varn = 10})) 175 program : Comm
192 $ Seq ( PComm (λ env → record env {vari = 0})) 176 program =
193 $ While (λ env → lt zero (varn env ) ) 177 Seq ( PComm (λ env → record env {varn = 10}))
194 (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) 178 $ Seq ( PComm (λ env → record env {vari = 0}))
195 $ PComm (λ env → record env {varn = ((varn env) - 1)} )) 179 $ While (λ env → lt zero (varn env ) )
180 (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} ))
181 $ PComm (λ env → record env {varn = ((varn env) - 1)} ))
196 ``` 182 ```
197 183
198 184
199 ## Agda 上での HoareLogicの理解 185 ## Agda 上での HoareLogicの理解
200 * 証明規則は HTProof にまとめられてる 186 * 規則は HTProof にまとめられてる
201 * **PrimRule** は代入を 187 * **PrimRule** は **PComm** で行う代入を保証する
202 188 * 3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述
203 189 * **_⇒_** は pre, post の Condition をとって post の Condition が成り立つときに True を返す関数
204 ```AGDA 190 * SkipRule は PreCondition を変更しないことの保証
205 data HTProof : Cond -> Comm -> Cond -> Set where 191 * AbortRule は プログラムが停止するときのルール
206 PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} -> 192 ```AGDA
207 (pr : Axiom bPre pcm bPost) -> 193 data HTProof : Cond -> Comm -> Cond -> Set where
208 HTProof bPre (PComm pcm) bPost 194 PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} ->
209 SkipRule : (b : Cond) -> HTProof b Skip b 195 (pr : Axiom bPre pcm bPost) ->
210 AbortRule : (bPre : Cond) -> (bPost : Cond) -> 196 HTProof bPre (PComm pcm) bPost
211 HTProof bPre Abort bPost 197 SkipRule : (b : Cond) -> HTProof b Skip b
198 AbortRule : (bPre : Cond) -> (bPost : Cond) ->
199 HTProof bPre Abort bPost
212 -- 次のスライドに続く 200 -- 次のスライドに続く
213 ``` 201 ```
214 202 ```AGDA
203 Axiom : Cond -> PrimComm -> Cond -> Set
204 Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true
205 ```
215 206
216 ## Agda 上での HoareLogicの理解 207 ## Agda 上での HoareLogicの理解
208 * **SeqRule** は Command を推移させる Seq の保証
209 * **IfRule** は If の Command が正しく動くことを保証
210 ```AGDA
211 -- HTProof の続き
212 SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} ->
213 {cm2 : Comm} -> {bPost : Cond} ->
214 HTProof bPre cm1 bMid ->
215 HTProof bMid cm2 bPost ->
216 HTProof bPre (Seq cm1 cm2) bPost
217 IfRule : {cmThen : Comm} -> {cmElse : Comm} ->
218 {bPre : Cond} -> {bPost : Cond} ->
219 {b : Cond} ->
220 HTProof (bPre /\ b) cmThen bPost ->
221 HTProof (bPre /\ neg b) cmElse bPost ->
222 HTProof bPre (If b cmThen cmElse) bPost
223 ```
224
225 ## Agda 上での HoareLogicの理解
226 * **WeakeningRule** は通常の Condition からループ不変条件(Loop Invaliant)に変換
227 * Tautology は Condition と不変条件が等しく成り立つ
228 * **WhileRule** はループ不変条件が成り立つ間 Comm を繰り返す
229 ```AGDA
230 -- HTProof の続き
231 WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} ->
232 {bPost' : Cond} -> {bPost : Cond} ->
233 Tautology bPre bPre' ->
234 HTProof bPre' cm bPost' ->
235 Tautology bPost' bPost ->
236 HTProof bPre cm bPost
237 WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} ->
238 HTProof (bInv /\ b) cm bInv ->
239 HTProof bInv (While b cm) (bInv /\ neg b)
240 ```
241 ```AGDA
242 Tautology : Cond -> Cond -> Set
243 Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true
244 ```
245
246 ## Agda 上での HoareLogic(証明)
247 * **proof1** は while Program の証明
248 * HTProof に 初期状態とコマンドで書かれた **program** と終了状態を渡す
249 * lemma1~5は rule それぞれの証明
217 * 250 *
218 251 ```AGDA
219 ```AGDA 252 proof1 : HTProof initCond program termCond
220 -- HTProof の続き 253 proof1 =
221 WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} -> 254 SeqRule {λ e → true} ( PrimRule empty-case )
222 {bPost' : Cond} -> {bPost : Cond} -> 255 $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 )
223 Tautology bPre bPre' -> 256 $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 (
224 HTProof bPre' cm bPost' -> 257 WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10}
225 Tautology bPost' bPost -> 258 $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 )
226 HTProof bPre cm bPost
227 SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} ->
228 {cm2 : Comm} -> {bPost : Cond} ->
229 HTProof bPre cm1 bMid ->
230 HTProof bMid cm2 bPost ->
231 HTProof bPre (Seq cm1 cm2) bPost
232 IfRule : {cmThen : Comm} -> {cmElse : Comm} ->
233 {bPre : Cond} -> {bPost : Cond} ->
234 {b : Cond} ->
235 HTProof (bPre /\ b) cmThen bPost ->
236 HTProof (bPre /\ neg b) cmElse bPost ->
237 HTProof bPre (If b cmThen cmElse) bPost
238 WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} ->
239 HTProof (bInv /\ b) cm bInv ->
240 HTProof bInv (While b cm) (bInv /\ neg b)
241 ```
242
243 ## Agda 上での HoareLogic(証明)
244
245 ```AGDA
246 proof1 : HTProof initCond program termCond
247 proof1 =
248 SeqRule {λ e → true} ( PrimRule empty-case )
249 $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 )
250 $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 (
251 WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10}
252 $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 )
253 $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 259 $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5
254 ``` 260
255 261 initCond : Cond
262 initCond env = true
263
264 termCond : {c10 : ℕ} → Cond
265 termCond {c10} env = Equal (vari env) c10
266 ```
267
268 <!-- program : Comm -->
269 <!-- program = -->
270 <!-- Seq ( PComm (λ env → record env {varn = 10})) -->
271 <!-- $ Seq ( PComm (λ env → record env {vari = 0})) -->
272 <!-- $ While (λ env → lt zero (varn env ) ) -->
273 <!-- (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) -->
274 <!-- $ PComm (λ env → record env {varn = ((varn env) - 1)} )) -->
275
276 ## 証明の一部
277 - 基本的な証明方法は Condtition を変化させて次の Condition が成り立つように変形する
278 - impl⇒
279 ```AGDA
280 lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10}) (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10})
281 lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
282 begin
283 (Equal (varn env) c10 ) ∧ true
284 ≡⟨ ∧true ⟩
285 Equal (varn env) c10
286 ≡⟨ cond ⟩
287 true
288 ∎ )
289 ```
290
291
292 <!-- lemma2 : {c10 : ℕ} → Tautology stmt2Cond whileInv -->
293
294 <!-- lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' -->
295
296 <!-- lemma4 : {c10 : ℕ} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv -->
297
298 <!-- lemma5 : {c10 : ℕ} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond -->
256 299
257 ## Agda での Gears 300 ## Agda での Gears
258 - Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数 301 - Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数
259 - CPS の関数は引数として継続を受け取って継続に計算結果を渡す 302 - CPS の関数は引数として継続を受け取って継続に計算結果を渡す
260 - **名前 : 引数 -> (Code : fa -> t) -> t** 303 - **名前 : 引数 -> (Code : fa -> t) -> t**
261 - **t** は継続 304 - **t** は継続
262 - **(Code : fa -> t)** は次の継続先 305 - **(Code : fa -> t)** は次の継続先
263 - DataGear は Agda での CodeGear に使われる引数 306 - DataGear は Agda での CodeGear に使われる引数
307 ```AGDA
308 _g-_ : {t : Set} → ℕ → ℕ → (Code : ℕ → t) → t
309 x g- zero next = next x
310 zero g- _ = next zero
311 (suc x) g- (suc y) = next (x g- y)
312 ```
264 313
265 ## Gears をベースにした HoareLogic 314 ## Gears をベースにした HoareLogic
266 * 次に Gears をベースにした while Program をみる。 315 * 次に Gears をベースにした while Program をみる。
267 * このプログラムは c10 316 * このプログラムは自然数と継続先を受け取って t を返す
268 317 ```AGDA
269 ```AGDA 318 {-# TERMINATING #-}
270 whileTest : {l : Level} {t : Set l} -> {c10 : ℕ } → (Code : (env : Env) -> 319 whileLoop : {l : Level} {t : Set l} -> Env -> (Code : Env -> t) -> t
271 ((vari env) ≡ 0) /\ ((varn env) ≡ c10) -> t) -> t 320 whileLoop env next with lt 0 (varn env)
272 whileTest {_} {_} {c10} next = next env proof2 321 whileLoop env next | false = next env
273 where 322 whileLoop env next | true =
274 env : Env 323 whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next
275 env = record {vari = 0 ; varn = c10}
276 proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10)
277 proof2 = record {pi1 = refl ; pi2 = refl}
278 ``` 324 ```
279 325
280 ## Gears と HoareLogic をベースにした証明 326 ## Gears と HoareLogic をベースにした証明
281 * ここでは 327 * ここでは
282 328 ```AGDA
283 ```AGDA 329 proofGears : {c10 : ℕ } → Set
284 proofGears : {c10 : ℕ } → Set 330 proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1
285 proofGears {c10} = whileTest {_} {_} {c10} (λ n p1 → conversion1 n p1 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) 331 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 ))))
286 ``` 332 ```
287 333
288 334
289 <--! 335 ## まとめと今後の課題
290 [論文目次] 336 - HoareLogic の while を使った例題を作成、証明を行った
291 まえがき 337 - Gears を用いた HoareLogic ベースの検証方法を導入した
292 338 - 証明が引数として渡される記述のため証明とプログラムを一体化できた
293 現状 339 - 今後の課題
294 340 - RedBlackTree や SynchronizedQueue などのデータ構造の検証(HoareLogic ベースで)
295 Agda
296
297 GearsOS
298
299 CodeGear DataGear
300
301 Gears と Agda
302
303 Agda での HoareLogic
304
305 Gears ベースの HoareLogic
306
307 まとめと課題
308
309 -->