SlideShare a Scribd company logo
1 of 29
Download to read offline
自己紹介 @Pro_ktmr
• 大阪府立大手前高等学校
最近プロコンを主催しました。関西弁がちょくちょく入ってきます。
• SuperCon2018 本選出場
何もしてませんが明日から行ってきます。スケジュールが鬼です。
• PCK2018モバイル部門 本選出場
競プロだけじゃなくて実務っぽいこともやってます。
これから話すこと
• 型無しラムダ計算を
プログラムで動かしたい!
→インタプリタをつくる
レキサー(字句解析器)とパーサ(構文解析器)は既存のものを使用
• 自動メモリ管理やパターンマッチ
があるOCamlを使って書いてみる
※OCaml(オーキャムル、オーキャメル)・・・オブジェクト指向のML系(関数型)言語
• 競プロの問題で
きちんと動くか確認!
発表の流れ
1. 抽象構文木の実装
2. シフトと代入関数の実装
3. 評価器の実装
4. 競プロの問題を解く
抽象構文木
・抽象構文木とは
構文解析によって得られた項は
木構造で扱う
→どんな木構造か定義する
抽象構文木の実装①
type term =
TmVar of info * int * int
| TmAbs of info * string * term
| TmApp of info * term * term
• info型の要素を注記として利用
(エラー表示用)
抽象構文木の実装②
・変数 TmVar
TmVar of info * int * int
1. 数(de Brujinインデックス)で表現
2. 変数が現れる文脈全体の長さも保
持して一貫性検査を行う
抽象構文木の実装③
・ラムダ抽象 TmAbs
TmAbs of info * string * term
1. 束縛変数名(文字列)
2. ラムダ抽象の本体である部分項
を保持
抽象構文木の実装④
・関数適用 TmApp
TmApp of info * term * term
適用される2つの部分項を保持
発表の流れ
1. 抽象構文木の実装
2. シフトと代入関数の実装
3. 評価器の実装
4. 競プロの問題を解く
シフトと代入
・シフトとは
代入操作を行う前に自由変数の
インデックスを付け替える操作
・代入
→変数に項を代入する
シフトの実装
let termShift d t =
let rec walk c t = match t with
TmVar(fi,x,n) -> if x>=n then TmVar(fi,x+d,n+d)
else TmVar(fi,x,n+d)
| TmAbs(fi,x,t1) -> TmAbs(fi,x,walk (c+1) t1)
| TmApp(fi,t1,t2) -> TmApp(fi,walk c t1,walk c t2)
in walk 0 t
項tをd個シフトする
内部のシフトは内部関数walkで表現
代入関数の実装
let termSubst j s t =
let rec walk c t = match t with
TmVar(fi,x,n) -> if x=j+c then termShift c s
else TmVar(fi,x,n)
| TmAbs(fi,x,t1) -> TmAbs(fi,x,walk (c+1) t1)
| TmApp(fi,t1,t2) -> TmApp(fi,walk c t1,walk c t2)
in walk 0 t
項tのj番の変数へ項sを代入する
実際の処理は内部関数walkで表現
発表の流れ
1. 抽象構文木の実装
2. シフトと代入関数の実装
3. 評価器の実装
4. 競プロの問題を解く
補助述語の実装
let rec isval ctx t = match t with
TmAbs(_,_,_) -> true
| _ -> false
項が値であるかを検査する関数
次の評価関数の中で補助的に用いる
評価関数の実装①
let rec eval1 ctx t = match t with
TmApp(fi,TmAbs(_,x,t12),v2) when isval ctx v2 ->
termSubstTop v2 t12
| TmApp(fi,v1,t2) when isval ctx v1 ->
let t2' = eval1 ctx t2 in
TmApp(fi, v1, t2')
| TmApp(fi,t1,t2) ->
let t1' = eval1 ctx t1 in
TmApp(fi, t1', t2)
| _ ->
raise NoRuleApplies
1ステップの評価関数
項tと文脈ctxを渡す
評価関数の実装②
let rec eval ctx t =
try let t' = eval1 ctx t
in eval ctx t'
with NoRuleApplies -> t
多ステップの評価関数
項tと文脈ctxを渡す
1ステップの評価関数を呼び出す
実装したもの
• 抽象構文木
• シフト、代入関数
• 評価器
以下は本のWebページから拝借
• 字句解析器、構文解析器
• 表示周りの処理
これにてインタプリタ完成!
発表の流れ
1. 抽象構文木の実装
2. シフトと代入関数の実装
3. 評価器の実装
4. 競プロの問題を解く
ここで問題発生!
• 標準入力はOCamlにラムダ式を渡
すのに使ってしまっている・・・
• 標準出力もデバッグ情報が表示さ
れるようになっちゃってる・・・
• オンラインジャッジは無理
• 入力サンプルをラムダ式中に手打
ちしよう!(無理やり)
扱う問題
PCK2016予選1より
答えは 32×W
ラムダ式による実装①
c_0 = lambda s. lambda z. z;
scc = lambda n. lambda s. lambda z. s (n s z);
plus = lambda m. lambda n. lambda s. lambda z. m s (n s z);
times = lambda m. lambda n. m (plus n) c_0;
fix = lambda f. (lambda x. f (lambda y. x x y)) (lambda x. f
(lambda y. x x y));
cn = lambda f. lambda m. if iszero m then c_0 else scc (f
(pred m));
churchnut = fix cn;
realnut = lambda m. m (lambda x. succ x) 0;
使う関数等をいろいろ宣言しとく
ラムダ式による実装②
w = 4;
bit = (churchnut 32);
answer = times (churchnut w) bit;
realnut answer;
変数wに手打ちで4を入れとく
32をChurch数に変換してbitに入れとく
答えは4と32をかけたものである
答えをChurch数からプリミティブな数に変換
実行結果
正解!
もう一問!(おまけ)
ラムダ式による実装
c_1 = lambda s. lambda z. s z;
tru = lambda t. lambda f. t;
fls = lambda t. lambda f. f;
pair = lambda f. lambda s. lambda b. b f s;
fst = lambda p. p tru;
snd = lambda p. p fls;
zz = pair c_0 c_0;
ss = lambda p. pair (snd p) (plus c_1 (snd p));
prd = lambda m. fst (m ss zz);
a = 5; b = 7;
answer = times (prd (churchnut a)) (prd (churchnut b));
realnut answer;
実行結果
正解!
まとめ
• 抽象構文木(項を保持する木構造)
を実装した
• シフト(インデックスの書き換え)
と代入関数を実装した
• 評価関数を実装した
• (入力手打ちだけど)競プロの問題
が解けた!
型無しラムダ計算―OCamlによる実装―

More Related Content

What's hot

インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
Yoshitaka Kimisaki
 
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
ke-m kamekoopa
 
第2回nseg slideshare
第2回nseg slideshare第2回nseg slideshare
第2回nseg slideshare
ko ty
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
なおき きしだ
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
 

What's hot (17)

インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
 
素人のための機械学習
素人のための機械学習素人のための機械学習
素人のための機械学習
 
Thymeleafのすすめ
ThymeleafのすすめThymeleafのすすめ
Thymeleafのすすめ
 
Ruby2.0 Getting Started
Ruby2.0 Getting StartedRuby2.0 Getting Started
Ruby2.0 Getting Started
 
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
 
Clojure
ClojureClojure
Clojure
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしよう
 
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返るHiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の 「Java8 Lambda ハンズオン with すごい広島」 を5分で振り返る
 
LaravelとMVCの先へ
LaravelとMVCの先へLaravelとMVCの先へ
LaravelとMVCの先へ
 
20161004 DMM/エウレカ/インテリジェンス合同勉強会
20161004 DMM/エウレカ/インテリジェンス合同勉強会20161004 DMM/エウレカ/インテリジェンス合同勉強会
20161004 DMM/エウレカ/インテリジェンス合同勉強会
 
第2回nseg slideshare
第2回nseg slideshare第2回nseg slideshare
第2回nseg slideshare
 
Excelに書いたテスト、自動化しませんか?~Excel用sshクライアント「beecle」のご紹介~
Excelに書いたテスト、自動化しませんか?~Excel用sshクライアント「beecle」のご紹介~Excelに書いたテスト、自動化しませんか?~Excel用sshクライアント「beecle」のご紹介~
Excelに書いたテスト、自動化しませんか?~Excel用sshクライアント「beecle」のご紹介~
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fallこれからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
はじめてのブラシレスモータ制御
はじめてのブラシレスモータ制御はじめてのブラシレスモータ制御
はじめてのブラシレスモータ制御
 

Similar to 型無しラムダ計算―OCamlによる実装―

Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
shoma h
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
Shuyo Nakatani
 

Similar to 型無しラムダ計算―OCamlによる実装― (20)

とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ  クラウド時代のモデリングを考えるオブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ  クラウド時代のモデリングを考える
オブジェクト・関数型プログラミングからオブジェクト・関数型分析設計へ クラウド時代のモデリングを考える
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
 
Tokyo.R #22 LT
Tokyo.R #22 LTTokyo.R #22 LT
Tokyo.R #22 LT
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化 Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
 
Scrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pubScrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pub
 
『こなへん』ができるまで ☆リリース直前編☆
『こなへん』ができるまで ☆リリース直前編☆『こなへん』ができるまで ☆リリース直前編☆
『こなへん』ができるまで ☆リリース直前編☆
 
.NET Compiler Platform
.NET Compiler Platform.NET Compiler Platform
.NET Compiler Platform
 
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」 佐野正太郎
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」  佐野正太郎明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」  佐野正太郎
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」 佐野正太郎
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行
 
OtaQ
OtaQOtaQ
OtaQ
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
 
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive ProgrammingへのアプローチMonadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
Monadic Programmingのススメ - Functional Reactive Programmingへのアプローチ
 
最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り最近のストリーム処理事情振り返り
最近のストリーム処理事情振り返り
 
ML system design_pattern
ML system design_patternML system design_pattern
ML system design_pattern
 

Recently uploaded

Recently uploaded (12)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 

型無しラムダ計算―OCamlによる実装―