SlideShare a Scribd company logo
1 of 31
Download to read offline
SKIコンビネーターによる
処理系の作成
ひげ
2015.9.23
SKIコンビーネーターとは
SKIコンビーネーター
型無しラムダ計算を単純化した計算モデルのひとつ
関数型言語を実行する抽象機械のモデルとして使ってい
る例もある (wikipediaより)
演算を3つの定数記号S, K, Iと変数記号によって表現でき
る
I(Identity combinator)
I x = x
K(Constant (独Konstant) combinator)
K x y = x
S(Substitution combinator)
S x y z = x z (y z)
例:ブール代数
真偽値
真値:T x y = x
偽値:F x y = y
T = K
K x y = x
F = K I
K I x y = I y = y
否定
NOT T = F
NOT F = T
NOT = S (S I (K F)) (K T)
NOT x
= (S I (K F)) x (K T) x
= (I x) (K F x) (K T x)
= x F T
論理和
OR T T = OR T F = OR F T = T
OR F F = F
つまり
OR T x = T
OR F x = x
OR = S I (K T)
OR x y
= (I x) (K T x) y
= x T y
論理積
AND T T = T
AND T F = AND F T = AND F F
つまり
AND T x = x
AND F x = F
AND = S S (K (K F))
AND x y
= (S x) (K (K F) x) y
= (x y) ((K (K F) x) y)
= (x y) (K F y)
= x y F
SKIコンビネーターをHaskellを使って実装する
Tour of Haskell
Haskell is 何?
1990年に関数型言語の「標準語」として設計された言語
純粋関数型プログラミング言語
強い静的型付
全て遅延評価
名前の由来は論理学者のハスケル・カリーから
main = print "Hello World!"
Haskellが設計されるまで
1930s アロンゾ・チャーチが関数の理論を形式化(ラムダ計
算)
1958 初の関数型言語「LISP」の登場
1966 初の純粋関数型言語「ISWIM」が設計される
1970s 初の現代的な関数型言語「ML」の登場
1980s 遅延評価に関数する研究が進む
1990 肥大化した関数型言語の機能をまとめるために
Haskell が設計される
1999 安定化したバージョンHaskell98 が登場し一気に知名
度が増す
関数型プログラミング言語とは
プログラム(問題)を「関数」として記述するプログラミングの
コト
そのため関数型言語(特にHaskell)には
ラムダ式
高階関数
カリー化
遅延評価
代数データ型
等の関数の表現力を増すための機能が実装されている
関数とは何か
関数の指す意味は言語仕様によって異なる
命令型言語:特定の命令・手続きに付けられたラベル
関数型言語:写像の意味での数学的な関数
要するに関数型言語における関数は副作用を持たない
副作用
状態を変化させることにより、次回以降の結果にまで影
響を与える効果のコト
副作用を持たないことを「参照透過性」といい
参照透過性を持つ言語を「純粋」であると言う
実装
SKIコンビネーター
代数的データ構造を使って実装
data CLTerm = Var String
            | I 
            | K 
            | S
            | Cons CLTerm CLTerm
instance Show CLTerm where
    show I          = "I"
    show K          = "K"
    show S          = "S"
    show (Var s)    = s
    show (Cons x y) = concat ["(", show x, " ", show y, ")"]
reductions :: CLTerm ­> CLTerm
reductions term
    | Just term' <­ reduction term = reductions term'
    | otherwise                    = term
構文解析
わりとてきとう
import Data.String.Utils (replace)
str2clt :: String ­> Maybe CLTerm
str2clt s = fst $ str2clt' (Nothing, replaceKeywords $ words $ replacePar s) 
    where
      str2clt' :: (Maybe CLTerm, [String]) ­> (Maybe CLTerm, [String])
      str2clt' (term     , []    ) = (term, [])
      str2clt' (Nothing  , "(":xs) = str2clt' $ str2clt' (Nothing, xs)
      str2clt' (Nothing  , x:xs  ) = str2clt' (Just (convert x), xs)
      str2clt' (Just term, "(":xs) = 
          let (Just term', xs') = str2clt' (Nothing, xs) in
          str2clt' (Just (Cons term term'), xs')
      str2clt' (Just term, ")":xs) = (Just term, xs)
      str2clt' (Just term, x:xs  ) = 
          str2clt' (Just (Cons term (convert x)), xs)
convert :: String ­> CLTerm
ブール代数
置換してやるだけ
replaceKeywords :: [String] ­> [String]
replaceKeywords  = concat . map (words . replacePar . keywords) 
    where
      keywords "T"   = "K"
      keywords "F"   = "(K I)"
      keywords "NOT" = "(S (S I (K (K I))) (K K))"
      keywords "OR"  = "(S I (K K))"
      keywords "AND" = "(S S (K (K (K I))))"
      keywords s     = s
例:自然数演算
自然数(チャーチ数)
0 =  f x . x = K I
1 =  f x . f x = I
2 =  f x . f (f x) = (S (S (K S) K)) I
.
.
.
ZERO = K I
ONE = I
SUCC = S (S (K S) K)
加算
PLUS m n
= (S I (K SUCC)) m n
= m SUCC n
乗算
MULT m n
= (S (S (K S) (S (K (S I)) (S (K K) PLUS))) (K (K ZERO))) m n
= (S (K S) (S (K (S I)) (S (K K) PLUS)) m) (K ZERO) n
= (S (S (K (S I)) (S (K K) PLUS) m) (K ZERO) n)
= (S (S I (S (K K) PLUS m)) (K ZERO)) n
= (S (S I (K (PLUS m))) (K ZERO)) n
= (S I (K (PLUS m)) n) ZERO
= (n (PLUS m)) ZERO
べき乗
POW m n
= (S (S (K S) (S (K (S I)) (S (K K) MULT))) (K (K ONE))) m n
= (n (MULT m)) ONE
おしまい

More Related Content

More from Nobutada Matsubara

Elixir Programming with Type checking
Elixir Programming with Type checkingElixir Programming with Type checking
Elixir Programming with Type checkingNobutada Matsubara
 
Haskell と Elm と JSON の話
Haskell と Elm と JSON の話Haskell と Elm と JSON の話
Haskell と Elm と JSON の話Nobutada Matsubara
 
ADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellNobutada Matsubara
 
GitHub での Haskell の色が変わったんで
GitHub での Haskell の色が変わったんでGitHub での Haskell の色が変わったんで
GitHub での Haskell の色が変わったんでNobutada Matsubara
 
日記って続かないよね...
日記って続かないよね...日記って続かないよね...
日記って続かないよね...Nobutada Matsubara
 
「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読むNobutada Matsubara
 
Lisper はじめました (再)
Lisper はじめました (再)Lisper はじめました (再)
Lisper はじめました (再)Nobutada Matsubara
 
Haskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたHaskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたNobutada Matsubara
 
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !Nobutada Matsubara
 

More from Nobutada Matsubara (20)

Marp Next Theme: Colors
Marp Next Theme: ColorsMarp Next Theme: Colors
Marp Next Theme: Colors
 
Marp Next Tips !
Marp Next Tips !Marp Next Tips !
Marp Next Tips !
 
Haskell で CLI
Haskell で CLIHaskell で CLI
Haskell で CLI
 
貧者のための「cron」
貧者のための「cron」貧者のための「cron」
貧者のための「cron」
 
Build Dockferile with Haskell
Build Dockferile with HaskellBuild Dockferile with Haskell
Build Dockferile with Haskell
 
Elixir Programming with Type checking
Elixir Programming with Type checkingElixir Programming with Type checking
Elixir Programming with Type checking
 
MixML 作ってみる
MixML 作ってみるMixML 作ってみる
MixML 作ってみる
 
Elm でなんかつくる
Elm でなんかつくるElm でなんかつくる
Elm でなんかつくる
 
Haskell と Elm と JSON の話
Haskell と Elm と JSON の話Haskell と Elm と JSON の話
Haskell と Elm と JSON の話
 
ADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with HaskellADVENTAR の Bot を作る with Haskell
ADVENTAR の Bot を作る with Haskell
 
Haskell Backpack 事始め
Haskell Backpack 事始めHaskell Backpack 事始め
Haskell Backpack 事始め
 
GitHub での Haskell の色が変わったんで
GitHub での Haskell の色が変わったんでGitHub での Haskell の色が変わったんで
GitHub での Haskell の色が変わったんで
 
日記って続かないよね...
日記って続かないよね...日記って続かないよね...
日記って続かないよね...
 
「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む「7つの言語、7つの世界」を読む
「7つの言語、7つの世界」を読む
 
Lisper はじめました (再)
Lisper はじめました (再)Lisper はじめました (再)
Lisper はじめました (再)
 
Haskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみたHaskell で LINE Bot を作ってみた
Haskell で LINE Bot を作ってみた
 
Marp colors
Marp colorsMarp colors
Marp colors
 
Marp Tips
Marp TipsMarp Tips
Marp Tips
 
Whitespcae 入門
Whitespcae 入門Whitespcae 入門
Whitespcae 入門
 
入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !入門 超絶技巧プログラミング !
入門 超絶技巧プログラミング !
 

SKIコンビネーターによる処理系の作成