Mercurial > hg > Papers > 2021 > soto-prosym
comparison slide/slide.md @ 10:60d4617eac84
fix slide intro
author | soto <soto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 06 Jan 2022 13:59:12 +0900 |
parents | e02e29a614c9 |
children | 8a97e69f8615 |
comparison
equal
deleted
inserted
replaced
9:e02e29a614c9 | 10:60d4617eac84 |
---|---|
39 position: absolute; | 39 position: absolute; |
40 left: 50px; | 40 left: 50px; |
41 top: 35px; | 41 top: 35px; |
42 } | 42 } |
43 | 43 |
44 section.fig_cg p { | |
45 top: 300px; | |
46 text-align: center; | |
47 } | |
48 | |
44 --- | 49 --- |
45 <!-- headingDivider: 1 --> | 50 <!-- headingDivider: 1 --> |
46 | 51 |
47 # Gears Agda による <br> Left Learning Red Black Tree の検証 | 52 # Gears Agda による <br> Left Learning Red Black Tree の検証 |
48 <!-- class: title --> | 53 <!-- class: title --> |
85 ``` | 90 ``` |
86 | 91 |
87 | 92 |
88 # Agda の基本 record | 93 # Agda の基本 record |
89 - 2つのものが同時に存在すること | 94 - 2つのものが同時に存在すること |
90 - Record 型とはオブジェクトあるいは構造体のようなもの | 95 - Record 型とはオブジェクトあるいは構造体 |
91 ``` | 96 ``` |
92 record Env : Set where | 97 record Env : Set where |
93 field | 98 field |
94 varn : N | 99 varn : N |
95 vari : N | 100 vari : N |
96 open Env | 101 open Env |
97 ``` | 102 ``` |
98 | 103 |
99 記述する際の基本的な例を以下に挙げる | 104 型に対応する値の導入(intro) |
100 ``` | 105 ``` |
101 record {varx = zero ; vary = suc zero} | 106 record {varx = zero ; vary = suc zero} |
102 ``` | 107 ``` |
103 | 108 record の値のアクセス(elim) |
104 | 109 ``` |
105 # Agda の基本 data | 110 (env : Env) → varx env |
106 - 一つでも存在すること | |
107 - どちらかが成り立つ型を Data 型 で書く | |
108 ``` | |
109 data bt {n : Level} (A : Set n) : Set n where | |
110 leaf : bt A | |
111 node : (key : N) → (value : A) → (left : bt A ) → (right : bt A ) → bt A | |
112 ``` | |
113 | |
114 記述する際の基本的な例を以下に挙げる | |
115 ``` | |
116 datasample : bt → N | |
117 datasample leaf = zero | |
118 datasample (node key value left right) = suc zero | |
119 ``` | |
120 | |
121 | |
122 | |
123 # Agda の基本 短縮記法 | |
124 - with を使用することでその変数のパターンマッチすることもできる | |
125 ``` | |
126 patternmatch-default : Env → N | |
127 patternmatch-default record { varn = zero ; vari = i } = i | |
128 patternmatch-default record { varn = suc n ; vari = i } = patternmatch-default record { varn = n ; vari = suc i } | |
129 ``` | |
130 | |
131 ``` | |
132 patternmatch-extraction : env → N | |
133 patternmatch-extraction env with varn env | |
134 patternmatch-extraction zero = vari env | |
135 patternmatch-extraction suc n = patternmatch-extraction record { varn = n ; vari = suc (vari env) } | |
136 ``` | |
137 - ... | `を使用することで関数の定義部分を省略できる | |
138 ``` | |
139 patternmatch-extraction' : env → N | |
140 patternmatch-extraction' env with varn env | |
141 ... | zero = vari env | |
142 ... | suc n = patternmatch-default' record { varn = n ; vari = suc (vari env) } | |
143 ``` | 111 ``` |
144 | 112 |
145 | 113 |
146 | 114 |
147 # Gears Agda の記法 | 115 # Gears Agda の記法 |
148 - Agda では関数の再帰呼び出しが可能であるが、CbC で再起処理を実装しても値は帰って来ない | 116 Gears Agda では CbC と対応させるためにすべてLoopで記述する |
149 - Agda で実装を行う際には再帰呼び出しを行わないようにする。 | 117 loopは`→ t`の形式で表現する |
150 ``` | 118 再起呼び出しは使わない(構文的には禁止していないので注意が必要) |
151 plus-com : {l : Level} {t : Set l} → Env → (next : Env → t) → (exit : Env → t) → t | |
152 plus-com env next exit with vary env | |
153 ... | zero = exit (record { varx = varx env ; vary = vary env }) | |
154 ... | suc y = next (record { varx = suc (varx env) ; vary = y }) | |
155 ``` | |
156 - `→ t` で Set に遷移させるようにし、この後に関数が続くことと、関数を tail call していることで Continuation を定義している | |
157 | |
158 | |
159 # Gears Agda と Gears CbC の対応 x | |
160 - 証明のしやすいGears Agda で実装を行いながらContext単位で同時に検証も行う | |
161 | |
162 - Gears Agda は検証向きの実装となり、CbCでは高速な実行向きとなる | |
163 - Gears Agda での検証がCbCによる高速な実行の信頼性となる | |
164 | |
165 # Normal level と Meta Level を用いた信頼性の向上 | |
166 CbCのプログラムの実行部分は以下の2つから構成される | |
167 - Normal Level は軽量継続で関数型プログラミングとなる | |
168 - atomicってなんだろう | |
169 - ポインタの操作はここでは行わず Meta Level にて行う | |
170 - Meta Level では信頼性を保証するために必要な計算を行う | |
171 - メモリやCPUなどの資源管理 | |
172 - context | |
173 - 証明 | |
174 - 並列実行(他のプロセスとの干渉) | |
175 - monad | |
176 | |
177 # s | |
178 ![bg right:80%](meta_cg_dg.svg) | |
179 | |
180 # Hoare Logic について | |
181 - Hoare Logic とは C.A.R Hoare, R.W Floyd が考案したプログラムの検証の手法 | |
182 - 「プログラムの事前条件 (P) が成立しているときコマンド (C) 実行して停止すると事後条件 (Q) が成り立つ」というもの | |
183 - CbC の実行を継続するという性質に非常に相性が良い | |
184 | |
185 pre/post condition を Gears Agda では Meta Input Data Gear として | |
186 プログラム中に遷移させていくことで、プログラムが終始仕様に沿った動きをしている | |
187 ことを検証する | |
188 | |
189 | |
190 | |
191 # Gears Agda による検証の例(実装) | |
192 - while program の検証を例に挙げる | |
193 - 以下は実装部分のコードとなる | |
194 ``` | 119 ``` |
195 {-# TERMINATING #-} | 120 {-# TERMINATING #-} |
196 whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t | 121 whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t |
197 whileLoop env next with lt 0 (varn env) | 122 whileLoop env next with lt 0 (varn env) |
198 whileLoop env next | false = next env | 123 whileLoop env next | false = next env |
199 whileLoop env next | true = whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next | 124 whileLoop env next | true = whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next |
200 ``` | 125 ``` |
201 | 126 - t を返すで継続を表す(tは呼び出し時に任意に指定してもよい. testに使える) |
202 | 127 - tail call により light weight continuation を定義している |
203 # Gears Agda による検証の例(検証付き実装) | 128 |
204 - 先ほど実装した while program に対して証明を付ける | 129 |
205 - loop を接続する Meta Gear も用意する | 130 # Gears Agda と Gears CbC の対応 |
131 Gears Agda | |
132 - 証明向きの記述 | |
133 - Hoare Condition を含む | |
134 | |
135 Gears CbC | |
136 - 実行向きの記述 | |
137 - メモリ管理, 並列実行を含む | |
138 | |
139 Context | |
140 - processに相当する | |
141 - Code Gear 単位で並列実行 | |
142 | |
143 | |
144 # Normal level と Meta Level を用いた信頼性の向上 | |
145 Normal Level | |
146 - 軽量継続 | |
147 - Code Gear 単位で関数型プログラミングとなる | |
148 - atomic(Code Gear 自体の実行は割り込まれない) | |
149 - ポインタの操作は含まれない | |
150 | |
151 Meta Level | |
152 - メモリやCPUなどの資源管理, ポインタ操作 | |
153 - Hoare Condition と証明 | |
154 - Contextによる並列実行 | |
155 - monadに相当するData構造 | |
156 | |
157 # | |
158 <!-- class: fig_cg --> | |
159 ![height:700px](meta_cg_dg.svg) | |
160 | |
161 # Gears Agda と Hoare Logic | |
162 <!-- class: slide --> | |
163 C.A.R Hoare, R.W Floyd が考案 | |
164 - Pre Condition → Command → Post Condition | |
165 | |
166 Gears Agda による Command の例 | |
167 ``` | |
168 {-# TERMINATING #-} | |
169 whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t | |
170 whileLoop env next with lt 0 (varn env) | |
171 whileLoop env next | false = next env | |
172 whileLoop env next | true = whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next | |
173 ``` | |
174 - `{-# TERMINATING #-}` | |
175 - with 文 | |
176 - 型と値 | |
177 | |
178 # Gears Agda の Pre Condition Post Condition | |
179 ``` | |
180 whileLoopSeg : {l : Level} {t : Set l} → {c10 : N } → (env : Env) → (varn env + vari env ≡ c10) | |
181 → (next : (e1 : Env )→ varn e1 + vari e1 ≡ c10 → varn e1 < varn env → t) | |
182 → (exit : (e1 : Env )→ vari e1 ≡ c10 → t) → t | |
183 ``` | |
184 - Terminatingを避けるためにloopを分割 | |
185 - `varn env + vari env ≡ c10` が Pre Condition | |
186 - `varn e1 + vari e1 ≡ c10` が Post Condition | |
187 - `varn e1 < varn env → t` が停止を保証する減少列 | |
188 | |
189 これは命題なので証明を与えてPre ConditionからPost Conditionを導出する必要がある | |
190 証明は値として次のCodeGearに渡される | |
191 | |
192 # Loop の接続 | |
193 分割したloopを接続するMeta Code Gearを作成する | |
206 ``` | 194 ``` |
207 TerminatingLoopS : {l : Level} {t : Set l} ( Index : Set ) | 195 TerminatingLoopS : {l : Level} {t : Set l} ( Index : Set ) |
208 → {Invraiant : Index → Set } → ( reduce : Index → N) | 196 → {Invraiant : Index → Set } → ( reduce : Index → N) |
209 → (loop : (r : Index) → Invraiant r | 197 → (loop : (r : Index) → Invraiant r |
210 → (next : (r1 : Index) → Invraiant r1 → reduce r1 < reduce r → t ) → t) | 198 → (next : (r1 : Index) → Invraiant r1 → reduce r1 < reduce r → t ) → t) |
211 → (r : Index) → (p : Invraiant r) → t | 199 → (r : Index) → (p : Invraiant r) → t |
212 ``` | 200 ``` |
213 - 入力として仕様の証明を受け取る | 201 - IndexはLoop変数 |
214 - 出力として次の関数に仕様の証明を渡す | 202 - Invariantはloop変数の不変条件 |
215 - Hoare Conditionがプログラムの開始から停止するまで接続されていれば証明は完成 | 203 - loopに接続するCode Gearを与える |
216 - Meta Gear にて証明を値としてあたえているため | 204 - reduceは停止性を保証する減少列 |
217 | 205 |
218 <!-- | 206 これを一般的に証明することができている |
219 コードの解説 | 207 |
220 あとで… | 208 # 実際のloopの接続 |
221 --> | 209 証明したい性質を以下のように記述する |
210 ``` | |
211 whileTestSpec1 : (c10 : N) → (e1 : Env ) → vari e1 ≡ c10 → ⊤ | |
212 whileTestSpec1 _ _ x = tt | |
213 ``` | |
214 loopをTerminatingLoopSで接続して仕様記述に繋げる | |
215 ``` | |
216 proofGearsTermS : {c10 : N} → ⊤ | |
217 proofGearsTermS {c10} = whileTest' {_} {_} {c10} (λ n p → conversion1 n p (λ n1 p1 → | |
218 TerminatingLoopS Env (λ env → varn env)(λ n2 p2 loop → whileLoopSeg {_} {_} {c10} n2 p2 loop | |
219 (λ ne pe → whileTestSpec1 c10 ne pe)) n1 p1 )) | |
220 ``` | |
221 - conversion1は | |
222 - whileLoopSeg | |
223 - ⊤ | |
222 | 224 |
223 # test との違い | 225 # test との違い |
224 - test では実数を与えた際の出力が仕様に沿ったものであるかを検証する | 226 - test では実数を与えた際の出力が仕様に沿ったものであるかを検証する |
225 - コーナーケースで仕様に沿った動きをしていない場合を考慮できない | 227 - コーナーケースで仕様に沿った動きをしていない場合を考慮できない |
226 - 今回の定理証明を用いた証明では実数を必要としない | 228 - 今回の定理証明を用いた証明では実数を必要としない |