Submit Search
Upload
(Lambdaだけで)純LISPのようなナニかを作る
•
Download as PPTX, PDF
•
0 likes
•
2,687 views
Daichi Teruya
Follow
ラムダ式で純LISPに近いものを組み上げます
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 94
Download now
Recommended
Lisp講義1
Lisp講義1
stibear (stibear1996)
ラムダ計算入門
ラムダ計算入門
Eita Sugimoto
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすく
Hiromi Ishii
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
たのしい高階関数
たのしい高階関数
Shinichi Kozake
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
blackenedgold
Recommended
Lisp講義1
Lisp講義1
stibear (stibear1996)
ラムダ計算入門
ラムダ計算入門
Eita Sugimoto
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
Kimikazu Kato
関数プログラミング入門
関数プログラミング入門
Hideyuki Tanaka
Algebraic DP: 動的計画法を書きやすく
Algebraic DP: 動的計画法を書きやすく
Hiromi Ishii
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
たのしい高階関数
たのしい高階関数
Shinichi Kozake
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
blackenedgold
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
Freer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
Hiromi Ishii
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
Kazuyuki TAKASE
たのしい関数型
たのしい関数型
Shinichi Kozake
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
blackenedgold
Introduction to Categorical Programming
Introduction to Categorical Programming
Masahiro Sakai
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
Masahiro Sakai
Haskell超入門 Part.1
Haskell超入門 Part.1
Yuichi Watanabe
Material
Material
_TUNE_
Haskell勉強会 in ie
Haskell勉強会 in ie
maeken2010
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
Yuto Takei
Ruby 3の型推論やってます
Ruby 3の型推論やってます
mametter
2011年11月11日
2011年11月11日
nukaemon
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
M-expr
M-expr
komiyamb
Extensible Eff Applicative
Extensible Eff Applicative
Sanshiro Yoshida
Java8から始める関数型プログラミング
Java8から始める関数型プログラミング
stylefreeslide
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
Takeshi Okada
IdrisでWebアプリを書く
IdrisでWebアプリを書く
Hideyuki Tanaka
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
tsudaa
有限生成代数とは
有限生成代数とは
HanpenRobot
More Related Content
What's hot
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Kazuyuki TAKASE
Freer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
Hiromi Ishii
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
Kazuyuki TAKASE
たのしい関数型
たのしい関数型
Shinichi Kozake
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
blackenedgold
Introduction to Categorical Programming
Introduction to Categorical Programming
Masahiro Sakai
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
Masahiro Sakai
Haskell超入門 Part.1
Haskell超入門 Part.1
Yuichi Watanabe
Material
Material
_TUNE_
Haskell勉強会 in ie
Haskell勉強会 in ie
maeken2010
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
Yuto Takei
Ruby 3の型推論やってます
Ruby 3の型推論やってます
mametter
2011年11月11日
2011年11月11日
nukaemon
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
M-expr
M-expr
komiyamb
Extensible Eff Applicative
Extensible Eff Applicative
Sanshiro Yoshida
Java8から始める関数型プログラミング
Java8から始める関数型プログラミング
stylefreeslide
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
Takeshi Okada
IdrisでWebアプリを書く
IdrisでWebアプリを書く
Hideyuki Tanaka
What's hot
(20)
Scala 初心者が米田の補題を Scala で考えてみた
Scala 初心者が米田の補題を Scala で考えてみた
Freer Monads, More Extensible Effects
Freer Monads, More Extensible Effects
Scala 初心者が Hom 函手を Scala で考えてみた
Scala 初心者が Hom 函手を Scala で考えてみた
たのしい関数型
たのしい関数型
Real World OCamlを読んでLispと協調してみた
Real World OCamlを読んでLispと協調してみた
Introduction to Categorical Programming
Introduction to Categorical Programming
Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
Haskell超入門 Part.1
Haskell超入門 Part.1
Material
Material
Haskell勉強会 in ie
Haskell勉強会 in ie
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
[Basic 3] 計算量 / 配列, 連結リスト / ハッシュ テーブル / スタック, キュー
Ruby 3の型推論やってます
Ruby 3の型推論やってます
2011年11月11日
2011年11月11日
これから Haskell を書くにあたって
これから Haskell を書くにあたって
M-expr
M-expr
Extensible Eff Applicative
Extensible Eff Applicative
Java8から始める関数型プログラミング
Java8から始める関数型プログラミング
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
XMonad-oid on Emacs & More functional Emacs Lisp | 関数型LT大会
IdrisでWebアプリを書く
IdrisでWebアプリを書く
Similar to (Lambdaだけで)純LISPのようなナニかを作る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
tsudaa
有限生成代数とは
有限生成代数とは
HanpenRobot
超初心者がローマ数字をいろいろパースしてみる
超初心者がローマ数字をいろいろパースしてみる
いずみ よねざわ
Icml yomikai 07_16
Icml yomikai 07_16
Yo Ehara
Tapl 5
Tapl 5
rf0444
PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)
t-sin
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
mametter
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
Shuyo Nakatani
Pythonintro
Pythonintro
Mikio Kubo
代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法
syamino
Thinking in Cats
Thinking in Cats
Eugene Yokota
Church Numerals
Church Numerals
Masato HORINOUCHI
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
AtCoder Inc.
Shape morphing (swfstudy)
Shape morphing (swfstudy)
Fumiya Chiba
Haskell Lecture 1
Haskell Lecture 1
Yusuke Matsushita
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
京大 マイコンクラブ
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
5t111111
20180728 halide-study
20180728 halide-study
Fixstars Corporation
Cartesian Closed Category
Cartesian Closed Category
Sosuke MORIGUCHI
Math tutorial public
Math tutorial public
Kenta Oono
Similar to (Lambdaだけで)純LISPのようなナニかを作る
(20)
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
HiroshimaJUG の「Java8 Lambda ハンズオン with すごい広島」を5分で振り返る
有限生成代数とは
有限生成代数とは
超初心者がローマ数字をいろいろパースしてみる
超初心者がローマ数字をいろいろパースしてみる
Icml yomikai 07_16
Icml yomikai 07_16
Tapl 5
Tapl 5
PythonでLispを実装した (evalつき)
PythonでLispを実装した (evalつき)
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
数式をnumpyに落としこむコツ
数式をnumpyに落としこむコツ
Pythonintro
Pythonintro
代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法
Thinking in Cats
Thinking in Cats
Church Numerals
Church Numerals
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選B 解説
Shape morphing (swfstudy)
Shape morphing (swfstudy)
Haskell Lecture 1
Haskell Lecture 1
つくってあそぼ ラムダ計算インタプリタ
つくってあそぼ ラムダ計算インタプリタ
Rubyの拡張をCrystalで書いてみる
Rubyの拡張をCrystalで書いてみる
20180728 halide-study
20180728 halide-study
Cartesian Closed Category
Cartesian Closed Category
Math tutorial public
Math tutorial public
More from Daichi Teruya
iMulvery -Mulveryの新機能のご紹介-
iMulvery -Mulveryの新機能のご紹介-
Daichi Teruya
Mulvery Detail - English
Mulvery Detail - English
Daichi Teruya
Mulvery技術詳細
Mulvery技術詳細
Daichi Teruya
IoTLT17
IoTLT17
Daichi Teruya
2017年度未踏事業最終成果報告
2017年度未踏事業最終成果報告
Daichi Teruya
Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02
Daichi Teruya
Mado magisystemx hago3
Mado magisystemx hago3
Daichi Teruya
More from Daichi Teruya
(7)
iMulvery -Mulveryの新機能のご紹介-
iMulvery -Mulveryの新機能のご紹介-
Mulvery Detail - English
Mulvery Detail - English
Mulvery技術詳細
Mulvery技術詳細
IoTLT17
IoTLT17
2017年度未踏事業最終成果報告
2017年度未踏事業最終成果報告
Mulvery@沖縄Ruby会議02
Mulvery@沖縄Ruby会議02
Mado magisystemx hago3
Mado magisystemx hago3
(Lambdaだけで)純LISPのようなナニかを作る
1.
(Lambdaだけで) 純LISPのような ナニかを作る
@maruuusa83 Daichi Teruya Okinawa National Collage of Technology
2.
λ 2 自己紹介
• まるさ(@maruuusa83) • 沖縄高専メディア科5年生
3.
λ 3 自己紹介
4.
λ 4 自己紹介
5.
λ 5 自己紹介
6.
アジェンダ • 自己紹介
• 今回やることとか色々 • 特殊形式の定義 • CONS, CAR, CDR • COND • データ構造の定義 • CONDの定義 • EQ • 値の定義 • EQの定義 λ 6
7.
• かなりいい加減な独自研究に満ちています! •
初心者の嘘だと思って聞いてください・・・ λ 7
8.
λ λ 8
9.
휷 λ 9
今回やること
10.
(Lambdaだけで) 純LISPのような ナニかを作る
λ 10
11.
λ 11
12.
予約語4つの言語 でLISPを作る lambda,
., quote, ::= λ 12
13.
どんな言語?? λ 13
14.
どんな言語?? • 今回は、Lambda項を用いたLambda計算を指す
λ 14
15.
どんな言語?? • 今回は、Lambda項を用いたLambda計算を指す
• こういうやつ: λ푧. 푧 λ푥푦. 푥 λ푥푦푧. 푧푥푦 푎 푏 훽 λ푥푦푧. 푧푥푦 푎 푏 λ푥푦. 푥 훽 λ푧. 푧푎푏 λ푥푦. 푥 훽 λ푥푦. 푥 푎 푏 훽 푎 λ 15
16.
どんな言語?? • 今回は、Lambda項を用いたLambda計算を指す
• こういうやつ: λ푧. 푧 λ푥푦. 푥 λ푥푦푧. 푧푥푦 푎 푏 훽 λ푥푦푧. 푧푥푦 푎 푏 λ푥푦. 푥 훽 (λ푧. 푧푎푏) λ푥푦. 푥 훽 (λ푥푦. 푥) 푎 푏 훽 푎 λ 16
17.
どんな言語?? • 今回は、Lambda項を用いたLambda計算を指す
• こういうやつ: λ푧. 푧 λ푥푦. 푥 λ푥푦푧. 푧푥푦 푎 푏 훽 λ푥푦푧. 푧푥푦 푎 푏 λ푥푦. 푥 훽 (λ푧. 푧푎푏) λ푥푦. 푥 훽 (λ푥푦. 푥) 푎 푏 훽 푎 ( ゚Д゚)ハァ? λ 17
18.
どんな言語?? • Lambda項を言語らしく起こした(!)
λ 18
19.
どんな言語?? • Lambda項を言語らしく起こした(!)
( ^ω^) <ここに項があるじゃろ? ⊃ λ푥푦. 푥 푎 푏 ⊂ λ 19
20.
どんな言語?? • Lambda項を言語らしく起こした(!)
( ^ω^) <ここに項があるじゃろ? ⊃ λ푥푦. 푥 푎 푏 ⊂ ( ՞ਊ ՞) <こうじゃ! ⊃ ((lambda x.(lambda y.x)) a) b) ⊂ λ 20
21.
どんな言語?? • Lambda項を言語らしく起こした(!)
( ^ω^) <ここに項があるじゃろ? ⊃ λ푥푦. 푥 푎 푏 ⊂ _人人人人_ > 腕が<  ̄Y^Y^Y ̄ ( ՞ਊ ՞) <こうじゃ! ⊃ ((lambda x.(lambda y.x)) a) b) ⊂ λ 21
22.
処理系書きました!!1 • 対話型の処理系
• ラムダ項を与えるとラムダ計算します λ 22 URL : http://lmd.maruuusa.tk/ Github : maruuusa83/lambda_evaluator
23.
予約語の数 "lambda" {
return (LAMBDA); } "quote " { return (QUOTE); } "::=" { return (DEFUN); } "." { return (PERIOD); } "(" { return (LP); } ")" { return (RP); } "n" { return (CR); } [a-z][0-9]? { lambda.l yylval.identifier = lambda_create_identifier(yytext); return (IDENTIFIER); } [_A-Z][_A-Za-z0-9]* { yylval.name = lambda_create_identifier(yytext); return (NAME); } λ 23
24.
予約語の数 "lambda" {
return (LAMBDA); } "quote " { return (QUOTE); } "::=" { return (DEFUN); } "." { return (PERIOD); } "(" { return (LP); } ")" { return (RP); } "n" { return (CR); } [a-z][0-9]? { lambda.l yylval.identifier = lambda_create_identifier(yytext); return (IDENTIFIER); } [_A-Z][_A-Za-z0-9]* { yylval.name = lambda_create_identifier(yytext); return (NAME); } λ 24
25.
純LISPってなんぞ λ 25
26.
純LISPってなんぞ • 最小限の関数とプリミティブのみのLISP
• これは自身の処理系を記述できる最低限の構 成 λ 26
27.
純LISPってなんぞ • 最小限の関数とプリミティブのみのLISP
• これは自身の処理系を記述できる最低限の構 成 λ 27 5つの基本関数 cons, car, cdr eq, atom 4つの特殊形式 lambda, cond, define, quote
28.
Lambda計算について 휷
29.
Lambda項について • Lambda計算の対象となるのはLambda項のみ
λ 29
30.
Lambda項について • Lambda計算の対象となるのはLambda項のみ
• 変数푥0,푥1,푥2,…は、lambda項 • 푥が変数、푀がlambda項のとき、(λ푥. 푀)はlambda項 • 푀と푁がともにlambda項のとき、(푀 푁)はlambda項 λ 30
31.
Lambda項について • Lambda計算の対象となるのはLambda項のみ
• 変数푥0,푥1,푥2,…は、lambda項 • 푥が変数、푀がlambda項のとき、(λ푥. 푀)はlambda項 • 푀と푁がともにlambda項のとき、(푀 푁)はlambda項 (項を定義するだけではよくわからない・・・) λ 31
32.
Lambda計算規則 λ 32
33.
Lambda計算規則 • β-簡約
項がλ푥. 푀 푁のような形をとるとき、 項푀の内部にある変数푥を푁で置き換える • 代入は次のように定義する • 푥 푥 ≔ 푁 ≡ 푁 • 푦 푥 ≔ 푁 ≡ 푦 • 퐿 푀 푥 ≔ 푁 ≡ 퐿 푥 ≔ 푁 푀 푥 ≔ 푁 • λ푦. 푀 푥 ≔ 푁 ≡ λ푧. ( 푀 푦 ≔ 푧 푥 ≔ 푁 ) λ 33
34.
計算例 ((lambda x.x)
a) -> (a) 単純に代入 λ 34
35.
計算例 ((lambda x.x)
a) -> (a) 単純に代入 何でも代入できる ((lambda x.x) (lambda y.y)) -> (lambda y.(y)) λ 35
36.
計算例 ((lambda x.x)
a) -> (a) 単純に代入 何でも代入できる ((lambda x.x) (lambda y.y)) -> (lambda y.(y)) 変数名が衝突すると その先置換しない ((lambda x.(lambda x.x)) a) -> (lambda x.(x)) λ 36
37.
間違えやすい例 X(x y
z) ○((x y) z) 含めるのは2項のみ。 基本は左側結合 λ 37
38.
間違えやすい例 X(x y
z) ○((x y) z) 含めるのは2項のみ。 基本は左側結合 X(lambda xy.yx) ○(lambda x.(lambda y.(y x))) 省略は認めていない λ 38
39.
間違えやすい例 X(x y
z) ○((x y) z) 含めるのは2項のみ。 基本は左側結合 X(lambda xy.yx) ○(lambda x.(lambda y.(y x))) X(lambda x.(x)) ○(lambda x.x) 省略は認めていない ごめんなさい、 処理系の仕様です; λ 39
40.
LISPの定義:特殊形式 휷 λ
40
41.
必要な特殊形式 • lambda,
quote, define, condが必要
42.
必要な特殊形式 • lambda,
quote, define, condが必要 • quoteは「評価しない」を指示 • (quote ((lambda x.x) a)) -> ((lambda x.(x)) (a))
43.
必要な特殊形式 • lambda,
quote, define, condが必要 • quoteは「評価しない」を指示 • (quote ((lambda x.x) a)) -> ((lambda x.(x)) (a)) • defineは無名関数に名前を与える • FUNC ::= (lambda x.x) • (FUNC a) -> (a)
44.
必要な特殊形式 • lambda,
quote, define, condが必要 • quoteは「評価しない」を指示 • (quote ((lambda x.x) a)) -> ((lambda x.(x)) (a)) • defineは無名関数に名前を与える • FUNC ::= (lambda x.x) • (FUNC a) -> (a) あとはcondだけ!(笑)
45.
condとな • cond:C言語でいうswitch-case文
• かなり複雑になりそうなのでIF文に・・・ λ 45
46.
condとな • cond:C言語でいうswitch-case文
• かなり複雑になりそうなのでIF文に・・・ • λ푥푦푞. 푞푥푦って感じ? q:選択子x:THEN y:ELSE • IF ::= (lambda x.(lambda y.(lambda q.((q x) y)))) λ 46
47.
condとな • cond:C言語でいうswitch-case文
• かなり複雑になりそうなのでIF文に・・・ • λ푥푦푞. 푞푥푦って感じ? q:選択子x:THEN y:ELSE • IF ::= (lambda x.(lambda y.(lambda q.((q x) λ 47 y)))) • TRUE ::= (lambda x.(lambda y.x)) • FALSE ::= (lambda x.(lambda y.y))
48.
condとな • cond:C言語でいうswitch-case文
• かなり複雑になりそうなのでIF文に・・・ TRUEは一つ目の引数、 FALSEは二つ目の引数を返す • λ푥푦푞. 푞푥푦って感じ? q:選択子x:THEN y:ELSE • IF ::= ということに注目!!! (lambda x.(lambda y.(lambda q.((q x) y)))) • TRUE ::= (lambda x.(lambda y.x)) • FALSE ::= (lambda x.(lambda y.y)) λ 48
49.
condとな • ついでに論理演算子も定義する
λ 49
50.
condとな • ついでに論理演算子も定義する
• NOT ::= (lambda q.((q FALSE) TRUE)) λ 50
51.
condとな • ついでに論理演算子も定義する
• NOT ::= (lambda q.((q FALSE) TRUE)) • AND ::= (lambda p.(lambda q.((p q) FALSE))) • OR ::= (lambda p.(lambda q.((p TRUE) q))) λ 51
52.
LISPの定義:標準関数 휷 λ
52
53.
cons, car, cdr
• car, cdrはλ푥푦. 푥とかλ푥푦. 푦という感じ?
54.
cons, car, cdr
• car, cdrはλ푥푦. 푥とかλ푥푦. 푦という感じ? • (CAR ((CONS a) b))という感じにしたい • が、最左(名前呼び)戦略なので CARの評価時点でCONSが未評価になってしまう
55.
cons, car, cdr
• car, cdrはλ푥푦. 푥とかλ푥푦. 푦という感じ? • (CAR ((CONS a) b))という感じにしたい • が、最左(名前呼び)戦略なので CARの評価時点でCONSが未評価になってしまう • λ푧. (푧 λ푥푦. 푥) としてCONSを左へ! • CAR ::= (lambda z.(z (lambda x.(lambda y.x))))
56.
cons, car, cdr
• consに値呼びを名前呼びに戻す力を持たせる • λ푥푦푧. 푧푥푦 として最後に評価項をとる CONS ::= (lambda x.(lambda y.(lambda z.((z x) y)))) λ 56
57.
eqとequalの定義・・・ λ 57
58.
eqとequalの定義・・・ かなりややこしい! (時間がない!!!!)
λ 58
59.
データ構造の定義:LIST • eq,
atomを定義したい • が、(M N)がデータ構造だとかなり扱いにくい • CONSの定義を右側結合でそのまま使う! • ただし、必ず末尾にNIL::=FALSEを含む λ 59
60.
データ構造の定義:LIST • eq,
atomを定義したい • が、(M N)がデータ構造だとかなり扱いにくい • CONSの定義を右側結合でそのまま使う! • ただし、必ず末尾にNIL::=FALSEを含む • < 푀 > ≡ (퐶푂푁푆 푀 푁퐼퐿) = λ푧. ( 푧 푀 푁퐼퐿) • < 푀, 푁 > ≡ (퐶푂푁푆 푀 < 푁 >) 훽 퐶푂푁푆 푀 (λ푧. ( 푧 푁 푁퐼퐿) 훽 λ푧. ( 푧 푀 푧. 푧 푁 푁퐼퐿 ) λ 60
61.
データ構造の定義:LIST • eq,
atomを定義したい • が、(M N)が定デ義ータす構る造LISPだとかでなは り扱いにくい • CONSの定義を右側結合でそのまま使う! 全てのデータはLISTで表現! • ただし、必ず末尾にNIL::=FALSEを含む GEN_ATOM ::= (lambda x.((CONS x) NIL)) ADD_LIST ::= • < 푀 > ≡ (퐶푂푁푆 푀 푁퐼퐿) = λ푧. ( 푧 푀 푁퐼퐿) • < 푀, 푁 > ≡ (퐶푂푁푆 푀 < 푁 >) (lambda l1.(lambda l2.((CONS l2) 훽 퐶푂푁푆 푀 (λ푧. ( 푧 푁 푁퐼퐿) 훽 λ푧. ( 푧 푀 푧. 푧 푁 푁퐼퐿 ) λ 61 l1)))
62.
データ構造の定義:LIST • eq,
atomを定義したい • が、(M N)が定デ義ータす構る造LISPだとかでなは り扱いにくい • CONSの定義を右側結合でそのまま使う! 全てのデータはLISTで表現! • ただし、必ず末尾にNIL::=FALSEを含む GEN_ATOM ::= (lambda x.((CONS x) NIL)) ADD_ATOM ::= • < 푀 > ≡ (퐶푂푁푆 푀 푁퐼퐿) = λ푧. ( 푧 푀 푁퐼퐿) • < 푀, 푁 > ≡ (퐶푂푁푆 푀 < 푁 >) (lambda l1.(lambda l2.((CONS l2) 훽 퐶푂푁푆 푀 (λ푧. ( 푧 푁 푁퐼퐿) 훽 λ푧. ( 푧 푀 푧. 푧 푁 푁퐼퐿 ) λ 62 l1)))
63.
atomの定義 • アトムは、lambdaを一枚はがすとNIL
• リストは、lambdaを1枚はがしてもリスト • リストならFALSEを返す感じの方針 λ 63
64.
atomの定義 • アトムは、lambdaを一枚はがすとNIL
• リストは、lambdaを1枚はがしてもリスト • リストならFALSEを返す感じの方針 • IS_LIST ::= (lambda x. ((IF (lambda xyz.TRUE) FALSE) (CDR x) )) λ 64
65.
atomの定義 • アトムは、lambdaを一枚はがすとNIL
• リストは、lambdaを1枚はがしてもリスト • リストならFALSEを返す感じの方針 • IS_LIST ::= (lambda x. ((IF (lambda xyz.TRUE) FALSE) (CDR x) )) λ 65
66.
atomの定義 • アトムは、lambdaを一枚はがすとNIL
• リストは、lambdaを1枚はがしてもリスト • リストならFALSEを返す感じの方針 • IS_LIST ::= (lambda x. ((IF (lambda xyz.TRUE) FALSE) (CDR x) )) λ 66
67.
atomの定義 • アトムは、lambdaを一枚はがすとNIL
• リストは、lambdaを1枚はがしてもリスト • リストならFALSEを返す感じの方針 • IS_LIST ::= (lambda x. ((IF (lambda xyz.TRUE) FALSE) (CDR x) )) < M, N > ::= (lambda z.((z M) (lambda z.((z n) NIL))) λ 67
68.
atomの定義 • アトムは、lambdaを一枚はがすとNIL
• リストは、lambdaを1枚はがしてもリスト • リストならFALSEを返す感じの方針 • IS_LIST ::= (lambda x. ((IF (lambda xyz.TRUE) FALSE) (CDR x) )) < M, N > ::= (lambda z.((z M) (lambda z.((z n) NIL))) λ 68
69.
• アトムは、lambdaを一枚はがすとNIL •
リストは、lambdaを1枚はがしてもリスト • リストならFALSEを返す感じの方針 • IS_LIST ::= (lambda x. ((IF (lambda xyz.TRUE) FALSE) (CDR x) )) atomの定義 λ 69
70.
atomの定義 • アトムは、lambdaを一枚はがすとNIL
• リストは、lambdaを1枚はがしてもリスト • リストならFALSEを返す感じの方針 • IS_LIST ::= (lambda x. ((IF (lambda xyz.TRUE) FALSE) (CDR x) )) • ATOM ::= (lambda x. (NOT (IS_LIST x)) ) λ 70
71.
データの定義 • eqを定義したい・・・
• 二つの引数が等しいか調べる • 識別子が同じか調べるのは言語仕様レベルの話? λ 71
72.
データの定義 • eqを定義したい・・・
• 二つの引数が等しいか調べる • 識別子が同じか調べるのは言語仕様レベルの話? • 値を定義して、同じか調べられるようにする ⇒チャーチ数 λ 72
73.
チャーチ数とな • 関数適用の回数で数値を表現する
• 0 ≔ λ푠푧. 푧, 1 ≔ λ푠푧. 푠푧, 2 ≔ λ푠푧. 푠 푠 푧 , … λ 73
74.
チャーチ数とな • 関数適用の回数で数値を表現する
• 0 ≔ λ푠푧. 푧, 1 ≔ λ푠푧. 푠푧, 2 ≔ λ푠푧. 푠 푠 푧 , … • 2つ目の引数zに1つ目の引数sをN回適用する • FALSEと0の表現が同じであることに注目 λ 74
75.
チャーチ数の比較 • IS_ZERO
::= ((IF (lambda x.FALSE) TRUE)) • atomとほぼ同じ形(読み捨てが3個→1個に) λ 75
76.
チャーチ数の比較 • MとNの大小比較!
• trueをN個生成して、M回IFに食わせる ⇒大きさの比較ができる! λ 76
77.
チャーチ数の比較 • MとNの大小比較!
• trueをN個生成して、M回IFに食わせる ⇒大きさの比較ができる! • N_TRUE_APP ::= (lambda n.(lambda z. (n (lambda z.((CONS TRUE) z))) ) λ 77
78.
チャーチ数の比較 • MとNの大小比較!
• trueをN個生成して、M回IFに食わせる ⇒大きさの比較ができる! • N_TRUE_APP ::= (lambda n.(lambda z. (n (lambda z.((CONS TRUE) z))) ) (lambda f.(lambda x.(f (f…(f a)))…) λ 78
79.
チャーチ数の比較 • MとNの大小比較!
• trueをN個生成して、M回IFに食わせる ⇒大きさの比較ができる! • N_TRUE_APP ::= (lambda n.(lambda z. (n (lambda z.((CONS TRUE) z))) ) • GREATER ::= (lambda m.(lambda n. ((n (lambda z.(((IF (CDR z)) z) (CAR z))) (N_TRUE_APP m) ((CONS FALSE) FALSE) )) λ 79
80.
チャーチ数の比較 • MとNの大小比較!
• trueをN個生成して、M回IFに食わせる ⇒大きさの比較ができる! • N_TRUE_APP ::= (lambda n.(lambda z. (n (lambda z.((CONS TRUE) z))) ) • GREATER ::= (lambda m.(lambda n. ((n (lambda z.(((IF (CDR z)) z) (CAR z))) (N_TRUE_APP m) ((CONS FALSE) FALSE) )) λ 80
81.
チャーチ数の比較 • MとNの大小比較!
• trueをN個生成して、M回IFに食わせる ⇒大きさの比較ができる! • N_TRUE_APP ::= (lambda n.(lambda z. (n (lambda z.((CONS TRUE) z))) ) • GREATER ::= (lambda m.(lambda n. ((n (lambda z.(((IF (CDR z)) z) (CAR z))) (N_TRUE_APP m) ((CONS FALSE) FALSE) )) λ 81
82.
チャーチ数の比較 • MとNの大小比較!
• trueをN個生成して、M回IFに食わせる ⇒大きさの比較ができる! • N_TRUE_APP ::= (lambda n.(lambda z. (n (lambda z.((CONS TRUE) z))) ) • GREATER ::= (lambda m.(lambda n. ((n (lambda z.(((IF (CDR z)) z) (CAR z))) (N_TRUE_APP m) ((CONS FALSE) FALSE) )) λ 82
83.
比較ができるからeqができる • 等しければTRUEが返る
⇒どちらで比較してもTRUEならば等しい! λ 83
84.
比較ができるからeqができる • 等しければTRUEが返る
⇒どちらで比較してもTRUEならば等しい! • EQ ::= (lambda n.(lambda m. ((AND (NOT ((GREATER n) m))) (NOT ((GREATER m) n))) ) λ 84
85.
比較ができるからeqができる • 等しければTRUEが返る
⇒どちらで比較してもTRUEならば等しい! • EQ ::= (lambda n.(lambda m. ((AND (NOT ((GREATER n) m))) (NOT ((GREATER m) n))) ) SIMPLE!! λ 85
86.
휷 まとめ λ
86
87.
IFとそれに伴う諸々(COND) • IF
::= (lambda x.(lambda y.(lambda q.((q x) y)))) • TRUE ::= (lambda x.(lambda y.x)) • FALSE ::= (lambda x.(lambda y.y)) • NOT ::= (lambda q.((q FALSE) TRUE)) • AND ::= (lambda p.(lambda q.((p q) FALSE))) • OR ::= (lambda p.(lambda q.((p TRUE) q)))
88.
CONS, CAR, CDR
• CONS ::= (lambda x.(lambda y.(lambda z.((z x) y)))) • CAR ::= (lambda z.(z TRUE)) • CDR ::= (lambda z.(z FALSE)) λ 88
89.
LISTとATOM • GEN_ATOM
::= (lambda x.((CONS x) NIL)) • ADD_ATOM ::= (lambda l1.(lambda l2.((CONS l2) l1))) • IS_LIST ::= (lambda x. ((IF (lambda xyz.TRUE) FALSE) (CDR x) )) • ATOM ::= (lambda x.(NOT (IS_LIST x)) ) λ 89
90.
チャーチ数とEQ • N_TRUE_APP
::= (lambda n.(lambda z. (n (lambda z.((CONS TRUE) z))) ) • GREATER ::= (lambda m.(lambda n. ((n (lambda z.(((IF (CDR z)) z) (CAR z))) (N_TRUE_APP m) ((CONS FALSE) FALSE) )) • EQ ::= (lambda n.(lambda m. ((AND (NOT ((GREATER n) m))) (NOT ((GλREATER m) n))) ) 90
91.
予約語4つの言語 でLISPを作る lambda,
., quote, ::= (16行くらい?) λ 91
92.
λ 92
93.
λ 93
94.
Thank you for
listening marusa (@maruuusa83) λ 94
Download now