ソフトウェアの自動証明

4,390 views

Published on

2011年3月8日のShibuya.jsで使用したスライド。詳細は http://d.hatena.ne.jp/yukoba/20110308/p1

Published in: Technology
  • Be the first to comment

ソフトウェアの自動証明

  1. 1. ソフトウェアの自動証明 @ 数学的厳密に yukoba (小林 悠)
  2. 2. 挿入ソート <ul><li>26315|4 </li></ul><ul><li>2631|45 </li></ul><ul><li>263|145 </li></ul><ul><li>26|1345 </li></ul><ul><li>2|13456 </li></ul><ul><li>|123456 </li></ul>
  3. 3. sortInner <ul><li>if (ary.length < 2) { </li></ul><ul><li>return ary; </li></ul><ul><li>} else { </li></ul><ul><li>if (head(ary) < head(tail(ary))) { </li></ul><ul><li>return ary; </li></ul><ul><li>} else { </li></ul><ul><li>return append(head(tail(ary)), </li></ul><ul><li>sortInner(tail(swap(ary))); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  4. 4. ソートの判定条件 <ul><li>左 < 右 : 今回はこれだけ証明 </li></ul><ul><li>「ソート前」「ソート後」1対1対応 </li></ul>
  5. 5. isSorted <ul><li>if (ary.length < 2) { </li></ul><ul><li>return true; </li></ul><ul><li>} else { </li></ul><ul><li>return head(ary) < head(tail(ary)) && </li></ul><ul><li>isSorted(head(ary)); </li></ul><ul><li>} </li></ul>
  6. 6. 証明すること <ul><li>isSorted(sortInner(ARY)) = true </li></ul><ul><li>前提条件 </li></ul><ul><ul><li>isSorted(tail(ARY)) = true </li></ul></ul><ul><li>数学的帰納法 </li></ul><ul><ul><li>isSorted(sortInner(tail(ARY))) </li></ul></ul>
  7. 7. コードの表現方法 <ul><li>純粋関数型言語にした </li></ul><ul><li>副作用なし </li></ul><ul><li>コードは木構造になる </li></ul><ul><li>ひたすら式を変形 </li></ul>
  8. 8. DOM & XPath <ul><li>上手く行った戦略 </li></ul><ul><ul><li>木構造を DOM で表現 </li></ul></ul><ul><ul><li>XPath を使ったら、楽にできるようになった! </li></ul></ul>
  9. 9. デモ
  10. 10. 証明戦略 <ul><li>指数関数的に分岐すると思ったら、一直線だった </li></ul><ul><li>優先順位 </li></ul><ul><li>ノード数が減る変形。if 条件の伝搬。 </li></ul><ul><li>if の親関数の繰り込み </li></ul><ul><li>ノード数が増える変形(定義の代入) </li></ul>
  11. 11. 時間不足により ここからのスライドは未使用
  12. 12. 定義&公理 <ul><li>head(tail(swap(ary))) = head(ary) </li></ul><ul><li>tail(tail(swap(ary))) = tail(tail(ary)) </li></ul><ul><li>tail(append(ary, v)) = ary </li></ul><ul><li>head(append(ary, v)) = v </li></ul><ul><li>if(true, a, b) = a </li></ul><ul><li>if(false, a, b) = b </li></ul><ul><li>if(a, b, b) = b </li></ul><ul><li>a && true = a </li></ul><ul><li>true && a = a </li></ul>
  13. 13. 定義のような定理(ズル) <ul><li>len(append(ary, v)) < 2 = false </li></ul><ul><ul><li>連結すると長さは 2 以上になる </li></ul></ul>
  14. 14. 前提条件 <ul><li>isSorted(tail(ARY)) = true </li></ul><ul><ul><li>お尻はソート済み </li></ul></ul>
  15. 15. 数学的帰納法 <ul><li>isSorted(sortInner(tail(ARY))) </li></ul><ul><ul><li>長さ n – 1 は証明済み </li></ul></ul>
  16. 16. 上手く扱えなかった <ul><li>数学的帰納法より </li></ul><ul><ul><li>head(tail(ARY)) < head(tail(tail(ARY))) </li></ul></ul><ul><ul><ul><li>tail(ARY) はソート済みだから tail(ARY)[0] < tail(ARY)[1] という事。 </li></ul></ul></ul><ul><ul><li>isSorted(sortInner(head(swap(ARY)))) </li></ul></ul><ul><ul><ul><li>head(swap(ARY)) は長さ n – 1 だから、数学的帰納法により証明済み </li></ul></ul></ul>
  17. 17. if 条件の伝搬 <ul><li>if (A, B, C) で </li></ul><ul><ul><li>Bの中でAを使っていたら、A = true </li></ul></ul><ul><ul><li>Cの中でAを使っていたら、A = false </li></ul></ul><ul><li>否定形も必要だった </li></ul><ul><ul><li>Bの中でnot Aを使っていたら、not A = false </li></ul></ul><ul><ul><li>Cの中でnot Aを使っていたら、not A = true </li></ul></ul>
  18. 18. if の繰り込み <ul><li>f(A ? B : C) = A ? f(B) : f(C) </li></ul><ul><li>ノードは複雑化する </li></ul>
  19. 19. 時間があれば 冒頭でしゃべりたかったスライド
  20. 20. 課題 <ul><li>JavaScript </li></ul><ul><li>テスト </li></ul><ul><li>ネタ担当! </li></ul><ul><li>処理系関係 </li></ul>
  21. 21. 全てのテストは サンプリングテストである by @t_wada さん

×