SlideShare a Scribd company logo
1 of 9
Download to read offline
Agdaで仕様からコーディング


     西村俊二


      KPF 2009/05/30   1
私は…
●   37才
●   半導体の設計
●   形式手法、定理証明
●   Agda, Haskell



          KPF 2009/05/30   2
data List : Set where
  OK : List -> List                         全てOKである
  NG : List -> List            OK/NGのリスト
                                            一つでもNGがある
  nil : List

data AllOK : List -> Set where
  justOK : AllOK (OK nil)
  hereOK : (ls : List) -> AllOK ls -> AllOK (OK ls)
data ExistNG : List -> Set where
  headNG : (ls : List) -> ExistNG (NG ls)
  tailNG : (ls : List) -> ExistNG ls -> ExistNG (OK ls)

data Result : List ->   Set where
  itsOK : (ls : List)   -> AllOK ls -> Result ls
  itsNG : (ls : List)   -> ExistNG ls -> Result ls
  noContents : Result   nil

check : (ls : List) -> Result ls
check = ?                                    求める結果
                 この型の関数は?

                          KPF 2009/05/30              3
型
f : int -> char

f 0 = '0'
f 1 = '1'
f 2 = '2'
    :


g : int -> int -> int

g x y = x + y


     KPF 2009/05/30     4
依存型
f : (i : int) -> g i

f 0 = '0'
f 1 = '1'
f 2 = 2.0
    :


g   :   int -> 「型の型」
g   0   = char
g   1   = char
g   2   = float
        :

         KPF 2009/05/30   5
自前の型を定義
        data List : Set where
          OK : List -> List
          NG : List -> List
          nil : List

                    List
                    nil
              OK           NG

         OK nil                 NG nil
      OK       NG                 :

OK (OK nil) NG (OK nil)
     :           :



               KPF 2009/05/30            6
data AllOK : List -> Set where
  justOK : AllOK (OK nil)
  hereOK : (ls : List) -> AllOK ls -> AllOK (OK ls)

            AllOK (OK nil)
               justOK


  List
OK nil      AllOK (OK nil)

               justOK

                                          AllOK (OK (OK nil))
                           hereOK
                                         hereOK (OK nil) justOK


                        KPF 2009/05/30                          7
・リストがOK1個だけ
                                         ・先頭がOKで残りもOK
data AllOK : List -> Set where
  justOK : AllOK (OK nil)
  hereOK : (ls : List) -> AllOK ls -> AllOK (OK ls)

                                                ・先頭がNG
                                                ・残りがNG
data ExistNG : List -> Set where
  headNG : (ls : List) -> ExistNG (NG ls)
  tailNG : (ls : List) -> ExistNG ls -> ExistNG (OK ls)


data Result : List -> Set where
  itsOK : (ls : List) -> AllOK ls -> Result ls
  itsNG : (ls : List) -> ExistNG ls -> Result ls
  noContents : Result nil
                                          ・全てOKか
                                          ・NGがあるか
check : (ls : List) -> Result ls          ・リストが空か
check = ?

                        KPF 2009/05/30                  8
check   : (ls : List) -> Result ls
check   nil = noContents
check   (NG ls) = itsNG (NG ls) (headNG ls)
check   (OK ls) with check ls
check   (OK ls) | itsOK .ls prf = itsOK (OK ls) (hereOK ls prf)
check   (OK ls) | itsNG .ls prf = itsNG (OK ls) (tailNG ls prf)
check   (OK nil) | noContents      = itsOK (OK nil) justOK




                            KPF 2009/05/30                   9

More Related Content

More from Shunji Nishimura

Theorem-proving Verification of Multi-clock Synchronous Circuits on Multimoda...
Theorem-proving Verification of Multi-clock Synchronous Circuits on Multimoda...Theorem-proving Verification of Multi-clock Synchronous Circuits on Multimoda...
Theorem-proving Verification of Multi-clock Synchronous Circuits on Multimoda...Shunji Nishimura
 
多重様相論理による遅延依存非同期回路の形式検証体系
多重様相論理による遅延依存非同期回路の形式検証体系多重様相論理による遅延依存非同期回路の形式検証体系
多重様相論理による遅延依存非同期回路の形式検証体系Shunji Nishimura
 
Generalized Isomorphism between Synchronous Circuits and State Machines
Generalized Isomorphism between Synchronous Circuits and State MachinesGeneralized Isomorphism between Synchronous Circuits and State Machines
Generalized Isomorphism between Synchronous Circuits and State MachinesShunji Nishimura
 
定理証明言語によるハードウェア検証
定理証明言語によるハードウェア検証定理証明言語によるハードウェア検証
定理証明言語によるハードウェア検証Shunji Nishimura
 
タイミング制約を含んだ回路記述方式とその意味論
タイミング制約を含んだ回路記述方式とその意味論タイミング制約を含んだ回路記述方式とその意味論
タイミング制約を含んだ回路記述方式とその意味論Shunji Nishimura
 
様相論理によるマルチクロック同期回路の形式検証体系
様相論理によるマルチクロック同期回路の形式検証体系様相論理によるマルチクロック同期回路の形式検証体系
様相論理によるマルチクロック同期回路の形式検証体系Shunji Nishimura
 
同期回路-ステート・マシン対応の一般化
同期回路-ステート・マシン対応の一般化同期回路-ステート・マシン対応の一般化
同期回路-ステート・マシン対応の一般化Shunji Nishimura
 
関数型言語と定理証明
関数型言語と定理証明関数型言語と定理証明
関数型言語と定理証明Shunji Nishimura
 
Agdaで回路設計(をしたい)
Agdaで回路設計(をしたい)Agdaで回路設計(をしたい)
Agdaで回路設計(をしたい)Shunji Nishimura
 

More from Shunji Nishimura (9)

Theorem-proving Verification of Multi-clock Synchronous Circuits on Multimoda...
Theorem-proving Verification of Multi-clock Synchronous Circuits on Multimoda...Theorem-proving Verification of Multi-clock Synchronous Circuits on Multimoda...
Theorem-proving Verification of Multi-clock Synchronous Circuits on Multimoda...
 
多重様相論理による遅延依存非同期回路の形式検証体系
多重様相論理による遅延依存非同期回路の形式検証体系多重様相論理による遅延依存非同期回路の形式検証体系
多重様相論理による遅延依存非同期回路の形式検証体系
 
Generalized Isomorphism between Synchronous Circuits and State Machines
Generalized Isomorphism between Synchronous Circuits and State MachinesGeneralized Isomorphism between Synchronous Circuits and State Machines
Generalized Isomorphism between Synchronous Circuits and State Machines
 
定理証明言語によるハードウェア検証
定理証明言語によるハードウェア検証定理証明言語によるハードウェア検証
定理証明言語によるハードウェア検証
 
タイミング制約を含んだ回路記述方式とその意味論
タイミング制約を含んだ回路記述方式とその意味論タイミング制約を含んだ回路記述方式とその意味論
タイミング制約を含んだ回路記述方式とその意味論
 
様相論理によるマルチクロック同期回路の形式検証体系
様相論理によるマルチクロック同期回路の形式検証体系様相論理によるマルチクロック同期回路の形式検証体系
様相論理によるマルチクロック同期回路の形式検証体系
 
同期回路-ステート・マシン対応の一般化
同期回路-ステート・マシン対応の一般化同期回路-ステート・マシン対応の一般化
同期回路-ステート・マシン対応の一般化
 
関数型言語と定理証明
関数型言語と定理証明関数型言語と定理証明
関数型言語と定理証明
 
Agdaで回路設計(をしたい)
Agdaで回路設計(をしたい)Agdaで回路設計(をしたい)
Agdaで回路設計(をしたい)
 

Agdaで仕様からコーディング

  • 1. Agdaで仕様からコーディング 西村俊二 KPF 2009/05/30 1
  • 2. 私は… ● 37才 ● 半導体の設計 ● 形式手法、定理証明 ● Agda, Haskell KPF 2009/05/30 2
  • 3. data List : Set where OK : List -> List 全てOKである NG : List -> List OK/NGのリスト 一つでもNGがある nil : List data AllOK : List -> Set where justOK : AllOK (OK nil) hereOK : (ls : List) -> AllOK ls -> AllOK (OK ls) data ExistNG : List -> Set where headNG : (ls : List) -> ExistNG (NG ls) tailNG : (ls : List) -> ExistNG ls -> ExistNG (OK ls) data Result : List -> Set where itsOK : (ls : List) -> AllOK ls -> Result ls itsNG : (ls : List) -> ExistNG ls -> Result ls noContents : Result nil check : (ls : List) -> Result ls check = ? 求める結果 この型の関数は? KPF 2009/05/30 3
  • 4. 型 f : int -> char f 0 = '0' f 1 = '1' f 2 = '2' : g : int -> int -> int g x y = x + y KPF 2009/05/30 4
  • 5. 依存型 f : (i : int) -> g i f 0 = '0' f 1 = '1' f 2 = 2.0 : g : int -> 「型の型」 g 0 = char g 1 = char g 2 = float : KPF 2009/05/30 5
  • 6. 自前の型を定義 data List : Set where OK : List -> List NG : List -> List nil : List List nil OK NG OK nil NG nil OK NG : OK (OK nil) NG (OK nil) : : KPF 2009/05/30 6
  • 7. data AllOK : List -> Set where justOK : AllOK (OK nil) hereOK : (ls : List) -> AllOK ls -> AllOK (OK ls) AllOK (OK nil) justOK List OK nil AllOK (OK nil) justOK AllOK (OK (OK nil)) hereOK hereOK (OK nil) justOK KPF 2009/05/30 7
  • 8. ・リストがOK1個だけ ・先頭がOKで残りもOK data AllOK : List -> Set where justOK : AllOK (OK nil) hereOK : (ls : List) -> AllOK ls -> AllOK (OK ls) ・先頭がNG ・残りがNG data ExistNG : List -> Set where headNG : (ls : List) -> ExistNG (NG ls) tailNG : (ls : List) -> ExistNG ls -> ExistNG (OK ls) data Result : List -> Set where itsOK : (ls : List) -> AllOK ls -> Result ls itsNG : (ls : List) -> ExistNG ls -> Result ls noContents : Result nil ・全てOKか ・NGがあるか check : (ls : List) -> Result ls ・リストが空か check = ? KPF 2009/05/30 8
  • 9. check : (ls : List) -> Result ls check nil = noContents check (NG ls) = itsNG (NG ls) (headNG ls) check (OK ls) with check ls check (OK ls) | itsOK .ls prf = itsOK (OK ls) (hereOK ls prf) check (OK ls) | itsNG .ls prf = itsNG (OK ls) (tailNG ls prf) check (OK nil) | noContents = itsOK (OK nil) justOK KPF 2009/05/30 9