System F の体系の上で、いくつかの事例を提示する。
肩慣らし
id = λX. λx:X. x
=> id : ∀X. X -> X
id [Nat]
=> <fun> : Nat -> Nat
id [Nat] 0
=> 0 : Nat
double = λX. λf:X->X. λa:X. f (f a)
=> double : ∀X. (X -> X) -> X -> X
単純型付きラムダ計算では、多相的な自己適用 λx. x x という型無し項を型付けできなかった。(演習 9.3.2)
System F では x に多相型を与えて、適切に具体化することで、この項の型付けが可能になる。
selfApp = λx:∀X.X->X. x [∀X.X->X] x
=> selfApp : (∀X. X -> X) -> (∀X. X -> X)
自己適用の例として、double を使った四倍関数を作ってみる。
quardruple = λX. double [X->X] (double [X])
=> quardruple : ∀X. (X -> X) -> X -> X
演習 23.4.1 図23-1の型付け規則によって、上記の項の型を確認せよ。
証明)
省略
多相リスト
型構築子 List と以下のプリミティブを言語に持たせることを考えよう。
- nil : ∀X. List X
- cons : ∀X. X -> List X -> List X
- isnil : ∀X. List X -> Bool
- head : ∀X. List X -> X
- tail : ∀X. List X -> List X
このとき、多相的な map 関数は以下のように定義できる。
map | = | λX. λY. λf:X->Y. |
| | (fix (λm: List X -> List Y. |
| | λl: List X. |
| | if isnil [X] l then nil [Y] |
| | else cons [Y] (f (head [X] l)) (m (tail [X] l)))) |
演習 23.4.2 map が上記の型を持つか確認せよ。
証明)
省略
演習 23.4.3 多相的なリスト反転関数をかけ。
reverse : ∀X. List X -> List X
証明)
addLast | = | λX. λa:X. |
| | (fix (λm: List X -> List X. |
| | λl: List X. |
| | if isnil [X] l then cons [X] a (nil [X]) |
| | else cons [X] (head [X] l) (m (tail [X] l)))) |
reverse | = | λX. |
| | (fix (λm: List X -> List X. |
| | λl: List X. |
| | if isnil [X] l then nil [X] |
| | else addLast [X] (m head [X] l) (m (tail [X] l)))) |
演習 23.4.4 単純な多相ソート関数をかけ。
sort : ∀X. (X -> X -> Bool) -> List X -> List X
証明)
insert | = | λX. λf:X->X->Bool. λa:X. |
| | (fix (λm: List X -> List X. |
| | λl: List X. |
| | if isnil [X] l then cons [X] a (nil [X]) |
| | else if f a (head [X] l) then cons [X] a l |
| | else cons [X] (head [X] l) (m (tail [X] l)))) |
sort | = | λX. λf:X->X->Bool |
| | (fix (λm: List X -> List X. |
| | λl: List X. |
| | if isnil [X] l then nil [X] |
| | else insert [X] f (head [X] l) (m (tail [X] l)))) |
Church 表現
型無しラムダ計算では、Church 表現を用いてブール値・自然数を表現することができた。これと同じことを System F でもやってみる。
| | | | | | λ-> | | | System F | | |
ーーーーー | + | ーーー | + | ーーーーーーーーーー | + | ーーーーーーーーーーーーーーーーーーーー | + |
ブール値 | | | 型 | | | - | | | CBool = ∀X. X -> X -> X | | |
| | | tru | | | λt: λf: t | | | λX. λt:X. λf:X. t | | |
| | | fls | | | λt: λf: f | | | λX. λt:X. λf:X. f | | |
| | | not | | | - | | | λb:CBool. λX. λt:X. λf.X. b [X] f t | | |
| | | | | | - | | | | | |
自然数 | | | 型 | | | - | | | CNat = ∀X. (X -> X) X -> X | | |
| | | c0 | | | λs. λz. z | | | λX. λs:X->X. λz:X. z | | |
| | | c1 | | | λs. λz. s z | | | λX. λs:X->X. λz:X. s z | | |
| | | c2 | | | λs. λz. s (s z) | | | λX. λs:X->X. λz:X. s (s z) | | |
| | | c3 | | | λs. λz. s (s (s z)) | | | λX. λs:X->X. λz:X. s (s (s z)) | | |
| | | csucc | | | - | | | λn:CNat. λX. λs:X->X. λz:X. s (n [X] s z) | | |
| | | cplus1 | | | - | | | λm:CNat. λn:CNat. m [CNat] csucc n | | |
演習 23.4.5 型 CBool の引数を2つ受け取り、論理積を返す and をかけ。
証明)
and = λb1:CBool. λb2:CBool. λX. λt:X. λf.X. b1 b2 f
演習 23.4.6 Church 数 c0 に適用されたときは tru、さもなくば fls を返す 関数 iszero をかけ。
証明)
iszero = λn:CNat. n [CBool] (λx:CBool. fls) tru
演習 23.4.7 以下が正しく型付けされていて、乗算と冪乗算になっていることを確認せよ。
times = λm:CNat. λn:CNat. λX. λs:X->X. n [X] (m [X] s)
=> times : CNat -> CNat -> CNat
cexp = λm:CNat. λn:CNat. λX. n [X->X] (m [X])
=> cexp : CNat -> CNat -> CNat
証明)
省略
...