SlideShare a Scribd company logo
2011/09/25 ProofSummit2011
                                             #ProofSummit




                   Coqによる
              MsgPackシリアライザの
                   証明と実装
                  mzp / みずぴー




                      1
11   9   25
自己紹介
              @mzp / みずぴー
              名古屋のSE
              Coq / proof-general派


              ProofCafeに参加してます




                             2
11   9   25
ProofCafe
              開催日: 第4土曜日
              開催場所: どえりゃあカフェ@名古屋
              アダムッチさんのCPDTをみんなで読む
              ‣ そろそろ別のことやるかも
              たまにイベント開催




                       3
11   9   25
2011/09/25 ProofSummit2011




              だいたいこんな感じ
11   9   25
MsgPackを証明した動機
              ネットワーク通信がしたい
               楽をしたいので、既存のライブラリを
               活用したい
               要件
              ‣ ある程度の実績がある
              ‣ 非同期の呼び出しができる
              ‣ いろんな言語のライブラリが充実してる




                          5
11   9   25
MsgPackがよさそう
              オブジェクトのシリアライザ + RPC
              ✓ 高速かつ省サイズ(らしい)
              ✓ 非同期呼び出しもサポート
              ✓ いろんな言語のライブラリがある




                       6
11   9   25
MsgPackライブラリ一覧




                    7
11   9   25
MsgPackライブラリ一覧

              OCaml版がないじゃん
                   → 作ろう




                         7
11   9   25
バグがこわい
              作るのはいいけどバグがこわい
              省サイズ化のため仕様が複雑
              ✗ 実装を間違えてないかな?
              ✗ テストの網羅性が十分かな?
              ✗ この変更しても大丈夫かな?



                         8
11   9   25
証明すればよくね?
              証明すれば...
              ✓ 全入力に対して正しさが保証される
              ✓ 人間が網羅性を考えなくてもOK
              ✓ 変更しても大丈夫かを考えなくても
               OK
              証明したほうが楽!!



                         9
11   9   25
証明した(シリアライザだけ)
                シリアライザ部分のみ
                多言語間のデータやり取りには使える
                RPCは今後の課題



              MsgPack = シリアライザ + RPC + RPC-IDL
                         ↑ ここだけ

                             10
11   9   25
公式レポジトリに入って
                  ます(キリッ
              msgpack/ocaml/proofというディレクト
              リがあるよ




                               ↑ これ

                          11
11   9   25
証明の流れ



11   9   25
Coq使いました
              証明にはCoqを使いました
              ✓ 証明したコードをOCamlに変換できる
              ✓ 日本語の文書も豊富
              ✓ Twitterでいろんな人に訊ける




                       13
11   9   25
開発の流れ




                14
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             15
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             16
11   9   25
8/16/32/64ビット整数
              MsgPackはビットレベルの操作を多用す
              るのでnatだと不便
              標準ライブラリのasciiを組合せて、マ
              ルチバイトの整数を定義する




                       17
11   9   25
natとの変換
              asciiのままだと証明が面倒
              natとasciiの相互変換関数を作る




                       18
11   9   25
巨大なnatが扱えない
              5000以上のnatを使おうとするとオー
              バーフローする
              16ビットすら扱えない (><)




                        19
11   9   25
オーバーフローする理由
              Coqのnat := ペアノ数
              再帰的に定義されている
              値が大きすぎると、ネストが深くなり
              すぎる




                         20
11   9   25
オーバーフローの回避
              巨大な自然数が登場しないようにする
              simplダメ、ゼッタイ
              累乗に関する補題を使う

                      累乗に関する補題
                  n    m        (n+m)
                 2 ⇥2 =2
                                n
                 0  n ならば 0  2
                                  n     m
                 n  m ならば 2  2
                           21
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             22
11   9   25
オブジェクトの定義




                  23
11   9   25
変換ルールの定義




                 24
11   9   25
↓これを証明する




                 25
11   9   25
健全性の証明



              これを証明するときに定義の誤りが見
              付かる(ことが多い)
              Serialized obj1 xsに関する帰納法で
              証明する


                         26
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             27
11   9   25
変換ルールは実行不可




              変換前後の関係を定義してるだけ
              実行できるように関数を定義する

                     28
11   9   25
serialize関数


                        OCamlっぽい!!




                   29
11   9   25
deserialize関数

                         ↑失敗するかも




                    30
11   9   25
関数が変換ルールを満す
                 ことを示す




              serialize/deserialize関数が変換ルー
              ルと矛盾しない

                          31
11   9   25
証明のアウトライン
              1.8/16/32/64bits整数を作る
              2.オブジェクトと変換ルールを定義する
              3.シリアライズ関数、デシリアライズ関
                数を定義する
              4.OCamlに変換する




                             32
11   9   25
OCamlへの変換
              Coq 8.3からCoqの型とOCamlの型が対応
              づくようになった
              ‣ 例: natとint, optionとoption




                             33
11   9   25
まがまがしいコード




                  34
11   9   25
35
11   9   25
速度を測ってみた
              やっぱり速度が気になる
              比較対象はRuby版MsgPack 0.4.6
              ‣ 拡張ライブラリを使っているので、ほぼC
                言語版と速度が同じ
              長さnの配列のシリアライズ速度・デシ
              リアライズ速度を比較
              ‣ n = 100,1000,10000



                               36
11   9   25
シリアライズ
                                            Ruby     OCaml

               100




               1000




              10000


                      0   2.5   5.0   7.5    10.0   12.5     15.0



11   9   25
シリアライズ
                                            Ruby     OCaml

               100




               1000




              10000


                      0   2.5   5.0   7.5    10.0   12.5     15.0



11   9   25
デシリアライズ
                                         Ruby        OCaml

               100




               1000




              10000


                      0    5        10          15           20


                               38
11   9   25
2011/09/25 ProofSummit2011




              結論:ボロ負け
11   9   25
まとめ
              MsgPack for OCamlを作りました
              バグが怖いのでCoqで証明しました
              ‣ 健全性を証明しました
              ‣ マルチバイトの扱いで苦労しました
              性能はオリジナルの1/10




                          40
11   9   25
今後の課題
                   性能の向上
              やっぱり性能は大事
              最適化してもエンバグしてないことが
              保証できるし
              AsciiのExtraction方法を変更すれば性
              能を上げれるはず
              ‣ Erlangっぽくバイナリ列を操作する
                Bitstringライブラリがよさそう



                         41
11   9   25
今後の課題
                 RPCのサポート
              ネットワーク通信の形式化が必要
              π計算/ applpiによって定義できる?
              IDL処理系はMsgPack側で用意されるら
              しいので、プラグインを作ればOK




                        42
11   9   25

More Related Content

What's hot

JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
Minoru Nakamura
 
new Objctive-C literal syntax
new Objctive-C literal syntaxnew Objctive-C literal syntax
new Objctive-C literal syntax
Wataru Kimura
 
PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰
Yo Ehara
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Kazuki Ohta
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
 
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話
Masaya Yashiro
 
Rubyでつくるスレッド
RubyでつくるスレッドRubyでつくるスレッド
Rubyでつくるスレッド
Shugo Maeda
 
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
yhara
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
信之 岩永
 
6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistenceHironobu Kinugawa
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
Iwana Chan
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
Iwana Chan
 
20130215 fluentd esper_2
20130215 fluentd esper_220130215 fluentd esper_2
20130215 fluentd esper_2Ogibayashi
 
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009Muhammad Ali
 
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)洋史 東平
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】株式会社ランチェスター
 
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介
Shinichi Kozake
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するshigeki_ohtsu
 

What's hot (20)

JVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweepJVM-Reading-ConcurrentMarkSweep
JVM-Reading-ConcurrentMarkSweep
 
Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73Effective Java 輪読会 項目71-73
Effective Java 輪読会 項目71-73
 
new Objctive-C literal syntax
new Objctive-C literal syntaxnew Objctive-C literal syntax
new Objctive-C literal syntax
 
PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰PRML10.6 変分ロジスティック回帰
PRML10.6 変分ロジスティック回帰
 
Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方Google Perf Tools (tcmalloc) の使い方
Google Perf Tools (tcmalloc) の使い方
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話Kotlinのlet/run/applyのよもやま話
Kotlinのlet/run/applyのよもやま話
 
Rubyでつくるスレッド
RubyでつくるスレッドRubyでつくるスレッド
Rubyでつくるスレッド
 
Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法Javascriptで無限ループを実現する5つの方法
Javascriptで無限ループを実現する5つの方法
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence6.2 reconciling amortization and persistence
6.2 reconciling amortization and persistence
 
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
 
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
tokyo.vcl発表資料(VarnishCache3.0新機能とVUPの仕方)
 
Varnishのログの眺め方
Varnishのログの眺め方Varnishのログの眺め方
Varnishのログの眺め方
 
20130215 fluentd esper_2
20130215 fluentd esper_220130215 fluentd esper_2
20130215 fluentd esper_2
 
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
 
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
Rubyの御先祖CLU(くるう)のお話(OSC2013 Hamamatsu 発表資料)
 
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
ちょっと詳しくJavaScript 第4回【スコープとクロージャ】
 
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介
 
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解するそうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
 

Similar to CoqによるMsgPackの証明

関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
啓 小笠原
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
keki3
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
infinite_loop
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
MITSUNARI Shigeo
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03
Miya Kohno
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
npsg
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Koichi Sasada
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
Kiyoshi Ogawa
 
Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化 Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化
daisukhayash
 
about Perl5.10
about Perl5.10about Perl5.10
about Perl5.10
Kazuki KOMORI
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
MITSUNARI Shigeo
 
Mk state in-programming-01
Mk state in-programming-01Mk state in-programming-01
Mk state in-programming-01
Miya Kohno
 
Network Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionalityNetwork Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionality
Miya Kohno
 
述語ロックの歴史 r2
述語ロックの歴史 r2述語ロックの歴史 r2
述語ロックの歴史 r2
Sho Nakazono
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
信之 岩永
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lispirix_jp
 
本当にあった怖い話し Db編
本当にあった怖い話し Db編本当にあった怖い話し Db編
本当にあった怖い話し Db編
Oda Shinsuke
 
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~Ryota Watabe
 
130329 04
130329 04130329 04
130329 04openrtm
 

Similar to CoqによるMsgPackの証明 (20)

関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
2018年度 若手技術者向け講座 大量データの扱い・ストアド・メモリ管理
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
BLS署名の実装とその応用
BLS署名の実装とその応用BLS署名の実装とその応用
BLS署名の実装とその応用
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
 
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
STARC RTL設計スタイルガイドによるVerilog HDL並列記述の補強
 
Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化 Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化
 
about Perl5.10
about Perl5.10about Perl5.10
about Perl5.10
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
Mk state in-programming-01
Mk state in-programming-01Mk state in-programming-01
Mk state in-programming-01
 
Network Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionalityNetwork Programmability and the statefulness/transactionality
Network Programmability and the statefulness/transactionality
 
述語ロックの歴史 r2
述語ロックの歴史 r2述語ロックの歴史 r2
述語ロックの歴史 r2
 
Clojure
ClojureClojure
Clojure
 
C# design note sep 2014
C# design note sep 2014C# design note sep 2014
C# design note sep 2014
 
OpenStack + Common Lisp
OpenStack + Common LispOpenStack + Common Lisp
OpenStack + Common Lisp
 
本当にあった怖い話し Db編
本当にあった怖い話し Db編本当にあった怖い話し Db編
本当にあった怖い話し Db編
 
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
バッチ処理にバインド変数はもうやめません? ~|バッチ処理の突発遅延を題材にして考えてみる~
 
130329 04
130329 04130329 04
130329 04
 

More from Hiroki Mizuno

TypeSafe OSの試み
TypeSafe OSの試みTypeSafe OSの試み
TypeSafe OSの試みHiroki Mizuno
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法Hiroki Mizuno
 
#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書についてHiroki Mizuno
 
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性についてScala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Hiroki Mizuno
 
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Hiroki Mizuno
 
Darcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbcDarcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbc
Hiroki Mizuno
 
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Hiroki Mizuno
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)Hiroki Mizuno
 
20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会Hiroki Mizuno
 
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Hiroki Mizuno
 
証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議Hiroki Mizuno
 
Coqによる証明駆動開発
Coqによる証明駆動開発Coqによる証明駆動開発
Coqによる証明駆動開発
Hiroki Mizuno
 
NGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへNGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへHiroki Mizuno
 
From Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへFrom Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへ
Hiroki Mizuno
 
OCamlAPISearchの紹介
OCamlAPISearchの紹介OCamlAPISearchの紹介
OCamlAPISearchの紹介Hiroki Mizuno
 

More from Hiroki Mizuno (20)

TypeSafe OSの試み
TypeSafe OSの試みTypeSafe OSの試み
TypeSafe OSの試み
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法
 
#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について#NGK2012B Excelによる設計書について
#NGK2012B Excelによる設計書について
 
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性についてScala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
Scala基礎勉強会: Featherweight Scalaの紹介および型付け規則の決定可能性について
 
Java基礎
Java基礎Java基礎
Java基礎
 
Sml#探検隊
Sml#探検隊Sml#探検隊
Sml#探検隊
 
どこでもCoq
どこでもCoqどこでもCoq
どこでもCoq
 
Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋Coq for Moblie Phone @ ML名古屋
Coq for Moblie Phone @ ML名古屋
 
Darcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbcDarcs紹介@20120423-scmbc
Darcs紹介@20120423-scmbc
 
Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力Gallinaによる証明駆動開発の魅力
Gallinaによる証明駆動開発の魅力
 
「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)「Frama-Cによるソースコード検証」 (mzp)
「Frama-Cによるソースコード検証」 (mzp)
 
20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会20110424 action scriptを使わないflash勉強会
20110424 action scriptを使わないflash勉強会
 
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02Coq to Rubyによる証明駆動開発@名古屋ruby会議02
Coq to Rubyによる証明駆動開発@名古屋ruby会議02
 
証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議証明駆動開発のたのしみ@名古屋reject会議
証明駆動開発のたのしみ@名古屋reject会議
 
Coqによる証明駆動開発
Coqによる証明駆動開発Coqによる証明駆動開発
Coqによる証明駆動開発
 
NGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへNGK忘年会 2010 / CoqからRubyへ
NGK忘年会 2010 / CoqからRubyへ
 
From Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへFrom Coq to Ruby / CoqからRubyへ
From Coq to Ruby / CoqからRubyへ
 
SacalaZa #1
SacalaZa #1SacalaZa #1
SacalaZa #1
 
CoqUn2010
CoqUn2010CoqUn2010
CoqUn2010
 
OCamlAPISearchの紹介
OCamlAPISearchの紹介OCamlAPISearchの紹介
OCamlAPISearchの紹介
 

Recently uploaded

FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
NTT DATA Technology & Innovation
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
iPride Co., Ltd.
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
Sony - Neural Network Libraries
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
atsushi061452
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
yassun7010
 

Recently uploaded (16)

FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
YugabyteDB適用に向けた取り組みと隠れた魅力 (DSS Asia 2024 発表資料)
 
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
MPAなWebフレームワーク、Astroの紹介 (その2) 2024/05/24の勉強会で発表されたものです。
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow【AI論文解説】Consistency ModelとRectified Flow
【AI論文解説】Consistency ModelとRectified Flow
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
論文紹介: Offline Q-Learning on diverse Multi-Task data both scales and generalizes
 
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
2024年度_サイバーエージェント_新卒研修「データベースの歴史」.pptx
 

CoqによるMsgPackの証明

  • 1. 2011/09/25 ProofSummit2011 #ProofSummit Coqによる MsgPackシリアライザの 証明と実装 mzp / みずぴー 1 11 9 25
  • 2. 自己紹介 @mzp / みずぴー 名古屋のSE Coq / proof-general派 ProofCafeに参加してます 2 11 9 25
  • 3. ProofCafe 開催日: 第4土曜日 開催場所: どえりゃあカフェ@名古屋 アダムッチさんのCPDTをみんなで読む ‣ そろそろ別のことやるかも たまにイベント開催 3 11 9 25
  • 4. 2011/09/25 ProofSummit2011 だいたいこんな感じ 11 9 25
  • 5. MsgPackを証明した動機 ネットワーク通信がしたい 楽をしたいので、既存のライブラリを 活用したい 要件 ‣ ある程度の実績がある ‣ 非同期の呼び出しができる ‣ いろんな言語のライブラリが充実してる 5 11 9 25
  • 6. MsgPackがよさそう オブジェクトのシリアライザ + RPC ✓ 高速かつ省サイズ(らしい) ✓ 非同期呼び出しもサポート ✓ いろんな言語のライブラリがある 6 11 9 25
  • 8. MsgPackライブラリ一覧 OCaml版がないじゃん → 作ろう 7 11 9 25
  • 9. バグがこわい 作るのはいいけどバグがこわい 省サイズ化のため仕様が複雑 ✗ 実装を間違えてないかな? ✗ テストの網羅性が十分かな? ✗ この変更しても大丈夫かな? 8 11 9 25
  • 10. 証明すればよくね? 証明すれば... ✓ 全入力に対して正しさが保証される ✓ 人間が網羅性を考えなくてもOK ✓ 変更しても大丈夫かを考えなくても OK 証明したほうが楽!! 9 11 9 25
  • 11. 証明した(シリアライザだけ) シリアライザ部分のみ 多言語間のデータやり取りには使える RPCは今後の課題 MsgPack = シリアライザ + RPC + RPC-IDL ↑ ここだけ 10 11 9 25
  • 12. 公式レポジトリに入って ます(キリッ msgpack/ocaml/proofというディレクト リがあるよ ↑ これ 11 11 9 25
  • 14. Coq使いました 証明にはCoqを使いました ✓ 証明したコードをOCamlに変換できる ✓ 日本語の文書も豊富 ✓ Twitterでいろんな人に訊ける 13 11 9 25
  • 15. 開発の流れ 14 11 9 25
  • 16. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 15 11 9 25
  • 17. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 16 11 9 25
  • 18. 8/16/32/64ビット整数 MsgPackはビットレベルの操作を多用す るのでnatだと不便 標準ライブラリのasciiを組合せて、マ ルチバイトの整数を定義する 17 11 9 25
  • 19. natとの変換 asciiのままだと証明が面倒 natとasciiの相互変換関数を作る 18 11 9 25
  • 20. 巨大なnatが扱えない 5000以上のnatを使おうとするとオー バーフローする 16ビットすら扱えない (><) 19 11 9 25
  • 21. オーバーフローする理由 Coqのnat := ペアノ数 再帰的に定義されている 値が大きすぎると、ネストが深くなり すぎる 20 11 9 25
  • 22. オーバーフローの回避 巨大な自然数が登場しないようにする simplダメ、ゼッタイ 累乗に関する補題を使う 累乗に関する補題 n m (n+m) 2 ⇥2 =2 n 0  n ならば 0  2 n m n  m ならば 2  2 21 11 9 25
  • 23. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 22 11 9 25
  • 27. 健全性の証明 これを証明するときに定義の誤りが見 付かる(ことが多い) Serialized obj1 xsに関する帰納法で 証明する 26 11 9 25
  • 28. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 27 11 9 25
  • 29. 変換ルールは実行不可 変換前後の関係を定義してるだけ 実行できるように関数を定義する 28 11 9 25
  • 30. serialize関数 OCamlっぽい!! 29 11 9 25
  • 31. deserialize関数 ↑失敗するかも 30 11 9 25
  • 32. 関数が変換ルールを満す ことを示す serialize/deserialize関数が変換ルー ルと矛盾しない 31 11 9 25
  • 33. 証明のアウトライン 1.8/16/32/64bits整数を作る 2.オブジェクトと変換ルールを定義する 3.シリアライズ関数、デシリアライズ関 数を定義する 4.OCamlに変換する 32 11 9 25
  • 34. OCamlへの変換 Coq 8.3からCoqの型とOCamlの型が対応 づくようになった ‣ 例: natとint, optionとoption 33 11 9 25
  • 36. 35 11 9 25
  • 37. 速度を測ってみた やっぱり速度が気になる 比較対象はRuby版MsgPack 0.4.6 ‣ 拡張ライブラリを使っているので、ほぼC 言語版と速度が同じ 長さnの配列のシリアライズ速度・デシ リアライズ速度を比較 ‣ n = 100,1000,10000 36 11 9 25
  • 38. シリアライズ Ruby OCaml 100 1000 10000 0 2.5 5.0 7.5 10.0 12.5 15.0 11 9 25
  • 39. シリアライズ Ruby OCaml 100 1000 10000 0 2.5 5.0 7.5 10.0 12.5 15.0 11 9 25
  • 40. デシリアライズ Ruby OCaml 100 1000 10000 0 5 10 15 20 38 11 9 25
  • 41. 2011/09/25 ProofSummit2011 結論:ボロ負け 11 9 25
  • 42. まとめ MsgPack for OCamlを作りました バグが怖いのでCoqで証明しました ‣ 健全性を証明しました ‣ マルチバイトの扱いで苦労しました 性能はオリジナルの1/10 40 11 9 25
  • 43. 今後の課題 性能の向上 やっぱり性能は大事 最適化してもエンバグしてないことが 保証できるし AsciiのExtraction方法を変更すれば性 能を上げれるはず ‣ Erlangっぽくバイナリ列を操作する Bitstringライブラリがよさそう 41 11 9 25
  • 44. 今後の課題 RPCのサポート ネットワーク通信の形式化が必要 π計算/ applpiによって定義できる? IDL処理系はMsgPack側で用意されるら しいので、プラグインを作ればOK 42 11 9 25