Mercurial > hg > Papers > 2015 > atton-thesis
view presentation/slide.md @ 92:0354d3693324 default tip
Added tag paper_final for changeset 6a12eb22be8c
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 01 Mar 2015 13:08:51 +0900 |
parents | bcd56a757a1a |
children |
line wrap: on
line source
title: プログラムの変更の圏による形式化 author: Yasutaka Higa profile : 琉球大学工学部 <br> 情報工学科 <br> 並列信頼研究室(河野研) lang: Japanese # 研究目的 : プログラムの変更の形式化 * プログラムの信頼性を向上させる * 信頼性とはプログラムが正しく動く保証である * プログラムの信頼性はバグなどの原因で低下する * 信頼性が低下するきっかけにプログラムの変更がある * プログラムの変更を形式化することで信頼性を保証する # 研究目的 : Monad を用いた変更の形式化 * Monad を用いてプログラムの変更を形式化する * プログラムにおける Monad はメタ計算を表現するために用いる * メタ計算とは計算を実現するための計算である * プログラムの変更を表すメタ計算を Delta Monad として提案する * Delta Monad が Monad 則を満たすか Agda により証明する * Delta Monad と他の Monad の合成が可能であることを証明する # プログラムの変更の形式化 * 形式手法とはソフトウェアの検証に数学や論理学を用いる手法 * 論理と対応する lambda 計算を用いたプログラムの形式化などがある * Moggi らによれば圏論のMonad は関数とメタ計算を含む関数との対応 * メタ計算として変更を定義することで形式的な定義を与える * 「過去の変更を全て保存する」メタ計算 Delta Monad を提案する # プログラムの定義 * 型付きの値と関数のみで構成される * プログラムの実行は関数の適用で表現できる * 関数は値としても振る舞う ``` x :: A f :: A -> B f(x) :: B g :: A -> (A -> B) -> B ``` # プログラムの変更を表現する Delta Monad * 全ての変更を保存するメタ計算 * 変更には単位があり、変更単位をバージョンとする * ある型Aの値があった時、過去のバージョン全てを持つ ``` T A = {A1, A2, A3, ... } ``` # Haskell における Delta の定義 * Haskell でデータ構造 Delta を作る * リストのように順序付きの構造を持つ * バージョン1の値は Mono * 変更する時は Delta による値の追加 ``` data Delta a = Mono a | Delta a (Delta a) ``` # Haskell におけるメタ計算の定義 * Haskell においてメタ計算を定義する * Delta Monad により表現されるプログラムでは * 値 : 値のバージョン毎の集合 * 関数 : 値からバージョン毎の値の集合へのマッピング * 関数適用 : バージョンごとに関数適用する # Haskell における Monad の instance 定義 * 関数の適用時にメタ計算を行なう中置関数 ``>>=`` として定義 * return はメタ計算に値を対応させる関数 ``` instance Monad Delta where return x = Mono x (Mono x) >>= f = f x (Delta x d) >>= f = Delta (headDelta (f x)) (d >>= (tailDelta . f)) ``` # numberCount プログラム(バージョン1) ``` generator x = [1..x] numberFilter xs = filter isPrime xs count xs = length xs numberCount x = count (numberFilter (generator x)) ``` # numberCount プログラム(バージョン2) ``` generator x = [1..x] numberFilter xs = filter even xs count xs = length xs numberCount x = count (numberFilter (generator x)) ``` # Delta Monad によって変更を表現する ``` generator x = Mono [1..x] numberFilter xs = Delta (filter even xs) (Mono (filter isPrime xs)) count x = Mono (length x) numberCount x = count =<< numberFilter =<< generator x ``` # 異なるバージョンを同時に実行する * メタ計算としてプログラムの変更を表現できた * 変更を含めて実行できるので、全てのバージョンを同時に実行できる ``` *Main> numberCount 1000 Delta 500 (Mono 168) ``` # 他の Monad との組み合せ * Delta Monad 以外にもメタ計算は Monad として提供されている * 例外機構、ロギング、入出力など * 他の Monad と組み合せることにより変更に対する計算が定義できる * Delta Monad が他の Monad と組み合わせ可能であることは証明した # Writer Monad と組み合せる * ログを取る Writer Monad と組み合せた numberCount の実行結果 ``` *Main> numberCountM 10 DeltaM (Delta (Writer (4, ["[1,2,3,4,5,6,7,8,9,10]", "[2,3,5,7]", "4"])) (Mono (Writer (5, ["[1,2,3,4,5,6,7,8,9,10]", "[2,4,6,8,10]", "5"])))) ``` # Delta による信頼性向上 * 各トレースの比較によるデバッグ * 異なるバージョンの同時実行によるバージョン間互換 * 正常系と開発版を同時に実行できる * 正常版の入出力を開発版に対する入力にできる * Version Control System に対する形式的な定義 # まとめと課題 * メタ計算によってプログラムの変更を定義できた * メタ計算により信頼性の向上手法を提案できた * Delta Monad が Monad 則を満たすことを Agda によって示した * プログラムの変更を全て Delta Monad で記述できるか? * 形式的な視点からプログラムの変更とは? * 同時実行は product, repository は colimit? <!-- vim: set filetype=markdown.slide: -->