Successfully reported this slideshow.
Your SlideShare is downloading. ×

仕様記述言語の中の関数

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
PRML chapter5
PRML chapter5
Loading in …3
×

Check these out next

1 of 19 Ad
Advertisement

More Related Content

Viewers also liked (20)

Similar to 仕様記述言語の中の関数 (15)

Advertisement

仕様記述言語の中の関数

  1. 1. (C)  2011,  Designers'  Den  Corp.   11/09/30   仕様記述言語の中の   関数 酒匂寛   Designers’  Den  Corp.   sakoh@d2co.jp 1  
  2. 2. 簡単な自己紹介 •  1980  年代   •  COBOL  とワークステーションの時代   •  汎用機・オフコンを用いた  COBOL  開発   11/08/31 •  ワークステーション上での(PL風)開発環境の開発   •  1990  年代   •  大規模プロジェクトとオブジェクト指向の時代   Meyer:オブジェクト指 向入門 •  2000人月超の大規模プロジェクトをOOで   •  組込み機器のソフトウェアをOOフレームワーク化   •  2000  年代   Jackson:ソフトウェア要 求と仕様 •  モデリングと形式手法の時代   Meyer:オブジェクト指 •  証券業務、組込み機器に形式手法を適用   向入門  2nd •  領域・課題・仕様・設計・検証のフレームワーク化 VDM++によるオブジェクト指向システム2 の高品質設計と検証
  3. 3. 話題 •  関数型言語としての  VDM++   •  形式仕様記述言語  VDM++  は、基本となった   (C)  2011,  Designers'  Den  Corp.   11/09/30   VDM-­‐SL  の特徴を受け継ぎ関数型言語としての 特性を併せ持っている   •  VDM++  は集合、列、写像に対する豊富な演算 子を持っていて、「仕様」をコンパクトかつ 見通しよく記述することを可能にしている   •  仕様と設計の責任分担 3  
  4. 4. VDM++の沿革 •  VDM   •  ウィーン開発手法(Vienna  Development  Method)   (C)  2011,  Designers'  Den  Corp.   11/09/30 •  IBMのウィーン研究所で最初に開発   •  VDM-­‐SLはISO標準(1996年)   •  VDM++   •  欧州連合ESPRIT計画のAFRODITEプロジェクト産   •  VDMTools   •  CSKのVDM-­‐SL,VDM++開発ツール群   •  hXp://www.vdmtools.jp/   •  Overture   •  Openな  VDM言語群の処理系(元VDMToolsの設計者たちが関 与)   4 •  hXp://www.overturetool.org/    
  5. 5. VDM++の特徴 言語 •  様々な表明手段による仕様記述支援 •  事前条件、事後条件、不変条件 (C)  2011,  Designers'  Den  Corp.   11/09/30 •  集合(列、写像)と関数による基本的な記述 •  関数型言語の特徴(VDM-SLの特徴) •  パターンマッチ、カリー化、無名関数、高階関数、多相 関数 … •  オブジェクト指向モデルの記述 •  並列性の記述(同期制約など) 環境 •  支援ツール(構文検査、型検査、仕様アニメーショ ン) •  仕様カバレージ測定 5 •  実行コード生成(Java, C++ など)
  6. 6. VDM++クラスの構造 class  クラス名  is  subclass  of  スーパークラス名[,  スーパークラス名,  …]      values              -­‐-­‐  定数の定義   型は単純なデータ    types   の表現等に用いら (C)  2011,  Designers'  Den  Corp.   11/09/30            -­‐-­‐  このクラスが責任を持つ型の定義   れる   VDM-­‐SLではクラスがなかったので    instance  variables   中心的な役割を果たしていた            -­‐-­‐  インスタンス変数 à  これが属性を表す:状態はこの属性の値で決まる      opera`ons              -­‐-­‐  インスタンス変数にアクセスできる              -­‐-­‐  すなわちオブジェクトの状態を変える可能性のある操作   今日はこの辺を中心に    func`ons              -­‐-­‐  インスタンス変数にアクセスできない              -­‐-­‐  すなわちオブジェクトの状態を変えない操作      thread              -­‐-­‐  スレッドを割り当てられた際の振る舞い      sync   関数型言語的な側面            -­‐-­‐  並列動作時のさまざまな同期制約条件   6 end  クラス名  
  7. 7. VDMが提供する   ものの集まりを表す概念 •  集合   •  重複のない要素の集まりを表す。要素の間に順序 (C)  2011,  Designers'  Den  Corp.   11/09/30   関係は存在しない   •  列   •  要素の間に順序関係のある集まりを表す。要素が 重複しても構わない   •  写像   •  ある集合(定義域:  domain)の要素から他の集合 (値域:  range)の要素への対応関係を表したもの 実はこの三種があれば様々な概念を表現することができる 7  
  8. 8. 準備:「日付」型の定義 types   (C)  2011,  Designers'  Den  Corp.   11/09/30        public  日付 ::                    年 :  nat                    月 :  nat                    日 :  nat;   「日付」は3つのフィール ドで構成されるレコード型 である。 8  
  9. 9. 小手調べ:基本的な関数 types        public  日付 ::   (C)  2011,  Designers'  Den  Corp.   11/09/30                    年 :  nat                    月 :  nat   is  not  yet  specified                      日 :  nat;   要するに  TBD       func`ons   まだ中身は定義されてい ないが、インターフェイ   スの型は決まっていると    sta`c  public  前日 :  日付 -­‐>  日付 きに便利 前日(d)  ==  is  not  yet  specified;        sta`c  public  翌日 :  日付 -­‐>  日付 9   翌日(d)  ==  is  not  yet  specified;  
  10. 10. 「前日」の定義 sta`c  public  前日 :  日付 -­‐>  日付 前日(d)  ==          cases  d  :     casesではパターンマッチ            mk_日付(y,1,1)  -­‐>  mk_日付(y-­‐1,12,31),   が行われている。最初に (C)  2011,  Designers'  Den  Corp.   11/09/30              mk_日付(y,3,1)  -­‐>  if  閏年(y)  then   マッチしたパターンに対                                                                                    mk_日付(y,  2,  29)   応した -­‐>  の右側の式が値                                                                                else   となる                                                      mk_日付(y,  2,  28),              mk_日付(y,m,1)  -­‐>  if  (m-­‐1)  in  set  {4,6,9,11}  then                                  mk_日付(y,  m-­‐1,  30)                                                                                      else                                                          mk_日付(y,  m-­‐1,  31),              mk_日付(y,m,d)  -­‐>  mk_日付(y,m,d-­‐1)      end; sta`c  public  閏年 :  nat  -­‐>  bool   10   閏年(y)  ==                    y  mod  400  =  0  or  (y  mod  100  <>  0  and  y  mod  4  =  0);
  11. 11. VDM++  の関数の構造 入出力の型の規定 関数名  :  型  -­‐>  型 (C)  2011,  Designers'  Den  Corp.   11/09/30   成り立って欲しい性質を 具体的に計算する手段 関数本体 この2つを独立し て書くことができ pre  事前条件 ることが大切 post  事後条件 成り立って欲しい性質 11  
  12. 12. 「全日付」の定義 与えられた2つの日付を含む全部の日付の列を返す関数 sta`c  public  全日付 :  日付 * 日付 -­‐>  seq  of  日付 全日付(開始日,  終了日)  ==   (C)  2011,  Designers'  Den  Corp.   11/09/30          if  開始日 =  終了日 then              [開始日]   陽仕様        else              [開始日]  ^  全日付(翌日(開始日),  終了日)   pre          日付≦(開始日,  終了日)   post          len  RESULT  -­‐  1  =  差日数(開始日,  終了日)   陰仕様        and  forall  i  in  set  inds  RESULT  &   12                  (i  <>  len  RESULT)  =>  翌日(RESULT(i))  =  RESULT(i+1);
  13. 13. ここまでに「日付」領域の下準備を進めて来た •  前日、翌日   •  指定した日付の前日、翌日の「日付」を返す   (C)  2011,  Designers'  Den  Corp.   11/09/30   •  全日数   •  2つの日付間の「日付」を列で返す   •  差日数   •  2つの日付間の日数を返す ではこの問題領域を参照する形で「曜日」を定義してみ まよう(強引) 13  
  14. 14. 「曜日」問題領域  …  「日付」問題領域を利用 class  DowSpec  is  subclass  of  DateSpec      types          public  曜日 =  <日>|<月>|<火>|<水>|<木>|<金>|<土>;      values          基準日 =  mk_日付(1970,  1,  1);  -­‐-­‐  曜日のための基準日 基準曜日 =  <木>;   (C)  2011,  Designers'  Den  Corp.   11/09/30          曜日列 =  [<木>,  <金>,  <土>,  <日>,  <月>,  <火>,  <水>];      func`ons          sta`c  public  曜日取得 :  日付 -­‐>  曜日 曜日取得(d)  ==  曜日列((差日数(基準日,  d)  mod  7)+1);            sta`c  public  指定年月の曜日列 :  nat  *  nat  *  曜日 -­‐>  seq  of  日付 指定年月の曜日列(y,  m,  dow)  ==                    let  days  =  全日付(mk_日付(y,m,1),  mk_日付(y,m,(各月日数(y))(m)))                            in  [  days(i)  |  i  in  set  inds  days  &  曜日取得(days(i))  =  dow];            sta`c  public  第N曜日 :  nat  *  nat  *  nat  *  曜日 -­‐>  日付 14   第N曜日(y,m,n,dow)  ==  (指定年月の曜日列(y,m,dow))(n)          pre  len  指定年月の曜日列(y,m,dow)  >=  n;  
  15. 15. 「N営業日後」の仕様を考える これは指定した日付(平日)から休日を除いた N  日後の日付を返す関数である sta`c  public  N営業日後 :  日付 * nat  -­‐>  日付 (C)  2011,  Designers'  Den  Corp.   11/09/30   N営業日後(起算日,  日数)  ==            is  not  yet  specified  –  設計は未定   pre          not  休日(起算日)   post          let  days  =  全日付(起算日,  RESULT)  in                  card  {  d  |  d  in  set  elems  days  &  not  休日?(d)  }    -­‐  1  =  日数; 事後条件をよく見て欲しい。RESULT(関数の戻り値)そのものが、式の一部 に使われている。RESULT  の求め方はここには示されていないが、RESULT  が どのような性質を満たすべきかはきちんと示されている。 15  
  16. 16. 「N営業日後」の陽仕様 sta`c  public  N営業日後 :  日付 * nat  -­‐>  日付 N営業日後(起算日,  日数)  ==          N営業日後_impl  (起算日,  日数)   pre   業務上 (C)  2011,  Designers'  Den  Corp.   11/09/30          not  休日(起算日)   の仕様 post          let  days  =  全日付(起算日,  RESULT)  in                  card  {  d  |  d  in  set  elems  days  &  not  休日?(d)  }  -­‐  1  =  日数; sta`c  public  N営業日後_impl  :  日付 * nat  -­‐>  日付 N営業日後_impl  (起算日,  日数)  ==          if  日数 =  0  then                起算日        else   陽仕様                if  休日?(起算日)  then   の中身                        N営業日後_impl(翌日(起算日),  日数)                  else   16                          N営業日後_impl(翌日(起算日),  日数 –  1)  
  17. 17. 参考:VDM  の国内事例 •  組み込み系   •  Mobile  FeliCa  チップ外部仕様   (C)  2011,  Designers'  Den  Corp.   11/09/30   •  ビジネス系   •  証券バックオフィスシステム仕様記述   •  言語処理系   •  某制御言語処理系の意味記述(AST  の最適 化、対象言語生成) これまでの経験から関数型の記述に「慣れる」に 17   は仕事で使って2ヶ月位か。読むだけなら1週間 ほど。
  18. 18. まとめ •  集合演算と関数を駆使することによって見通し の良いコンパクトな仕様記述を実現できる   (C)  2011,  Designers'  Den  Corp.   11/09/30   •  ここでは基本的な概念から積み上げて、日付à 曜日à休日àN営業日後という形で発展させる ことができた   •  様々な問題領域の知識を関数として蓄積してお けば、仕様記述の際に大いに役立つ   •  ナイーブな定義では必ずしも実行効率が良いと は限らない(実装ではないので最重要課題では ないが、仕様検証の時間にインパクトを与え 18   る)  
  19. 19. 蛇足 Java  や  C  でプログラムを書かなくてはな らない仕事でも   (C)  2011,  Designers'  Den  Corp.   11/09/30     仕様(事前条件、事後条件、不変条件)     は関数を使って記述できる。     VDM  をうまく使えば仕様記述を厳密に行 うことができるだけではなく、将来関数 19   型言語で実装する練習にもなる(我田引水)  

×