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

More Related Content

ソフトウェアの自動証明