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