代数的データ型をラムダ計算の中で表現する方法

syamino
ラムダ計算で代数的データ型を
    表現する方法
代数的データ型のおさらい

data Bool      = True   | False

                    コンストラクタ


data Either a b = Left a | Right b


                    コンストラクタの引数
ラムダ計算でパターンマッチする

   case e of
       Left  l -> (1)
       Right r -> (2)

               ラムダ計算で表現


 e (λl. (1) ) (λr.   (2)   )
値そのものに,パターンマッチの機
     能を組み込む
    e (λl. (1) ) (λr.    (2)   )


Leftのときに実行して欲しい         Rightのときに実行して欲しい



       Left   l = λA B. A l
       Right r = λA B. B r
Boolもラムダ計算で

case b of
      True    ->     (3)
      False ->       (4)




  b     (3)        (4)
ラムダ計算でのBoolのコンストラク
        タ

        b      (3)   (4)

Trueのときに実行して欲しい        Falseのときに実行して欲しい



        True     = λC D. C
        False = λC D. D
パターンマッチとは,コンストラクタを
  他の関数に置き換えること
  Eitherの場合
       case e of
           Left l -> A l
           Right r -> B r
  Boolの場合

       case b of
           True   -> C
           False   -> D
置き換え方は2種類ある
① 最初の1個だけ
      個だけ置換する
      個だけ
 Cons 10 (Cons 20 (Cons 30 Nil)

  c    10 (Cons 20 (Cons 30 Nil)
② 全て
  全て一括で置換する
 Cons 10 (Cons 20 (Cons 30 Nil)

  c    10 ( c   20 ( c   30   n )
2種類のcons
① 最初の1個だけ
      個だけ置換する
      個だけ
 cons = λx xs. λn c. c x xs
              残りのリストをそのまま渡す


② 全て
  全て一括で置換する
 cons = λx xs. λn c. c x (xs n c)
              残りのリストのコンストラクタも置き換える
2種類の方法の特徴

       ① 最初の 個だけ置換する ②全て一括で置換する
         最初の1個だけ置換する

メリット   プログラミングが簡単   型付け可能


デメリット 型付け不可能        プログラミングが難しい
スコットエンコーディング
      (Scott encoding)

① 最初の1つだけ
      つだけ置換する
      つだけ
 Cons 10 (Cons 20 (Cons 30 Nil)

  c    10 (Cons 20 (Cons 30 Nil)
スコットエンコーディングでのパター
       ンマッチ
            スコットエンコーディングでの定義

 tail l = l Nil (λx xs. xs)

        Nilと置換         Consと置換


                 パターンマッチを使った定義
 tail l = case l of
            Nil       -> Nil
            Cons x xs -> xs
スコットエンコーディングでの再帰
                                        Haskell
length l = case l of
             Nil       -> 0
             Cons x xs -> 1 + (length xs)


不動点コンビネータを使えば
  きれいに翻訳できる                   スコットエンコーディング
                                    +
                               不動点コンビネータ
length = Y (λ length. λ list. list
                          0
                λ x xs.   1 + ((Y length) xs))
チャーチエンコーディング
       (Chuch encoding)

② 全て
  全て一括で置換する
 Cons 10 (Cons 20 (Cons 30 Nil)

  c     10 ( c   20 ( c   30   n )
リストのコンストラクタを全部置換す
     る関数foldr
                    foldrの型
foldr :: X -> (a -> X -> X) -> List a -> X



 Nilと置換する関数   Consと置換する関数



                   foldrの定義
foldr n c Nil         = n
foldr n c (Cons x xs) = c x (foldr n c xs)
foldrで再帰関数を定義できる
                                    再帰的定義
length l = case l of
             Nil       -> 0
             Cons x xs -> 1 + (length xs)




                                 foldrを使った定義
length = foldr 0 (λx n. 1 + n)
foldrで再帰関数を定義できる
                                 再帰的定義
sum l = case l of
          Nil       -> 0
          Cons x xs -> x + (sum xs)




                              foldrを使った定義
sum = foldr (+) 0
foldrで再帰関数を定義できる
                                      再帰的定義
map f l = case l of
            Nil       -> Nil
            Cons x xs -> Cons (f x) (map f xs)




                                  foldrを使った定義
map f = foldr Nil (λx xs. Cons (f x) xs)
チャーチエンコーディングでの
    foldrの定義


 foldr = λ n c l. l n c
リストの値そのものにfoldrの機能
    が組み込まれている
   foldrの定義とnil,consの定義は,よく似ている

         foldr   n c Nil = n


         nil  = λn c.      n


foldr n c (Cons x xs) = c x (foldr n c xs)

cons = λx xs. λn c.     c x (xs   n c)
チャーチ数 = チャーチエンコーディ
    ングされた自然数
  data Nat = Zero | Succ Nat
     0 = Zero
     1 = Succ Zero
     2 = Succ (Succ Zero)
     3 = Succ (Succ (Succ Zero))


 zero   = λs z. z
 succ n = λs z. s (n s z)
チャーチ数での再帰関数
自然数の加算も,本来は再帰関数
add Zero     b = b
add (Succ a) b = Succ (add a b)

                     再帰呼び出し

チャーチ数なら,不動点コンビネータを使わずに
再帰関数を定義できる
 add a b = λs z. a s (b s z)
2種類の方法の特徴(再掲)

       スコットエンコーディング   チャーチエンコーディング

メリット   プログラミングが簡単     型付け可能


デメリット 型付け不可能          プログラミングが難しい
おしまい


 syamino
    高専5年
1 de 24

Recomendados

ラムダ計算入門 por
ラムダ計算入門ラムダ計算入門
ラムダ計算入門Eita Sugimoto
33.7K vistas39 diapositivas
関数型プログラミング入門 with OCaml por
関数型プログラミング入門 with OCaml関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCamlHaruka Oikawa
12.4K vistas105 diapositivas
F#入門 ~関数プログラミングとは何か~ por
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
3.6K vistas79 diapositivas
PFIセミナー 2013/02/28 「プログラミング言語の今」 por
PFIセミナー 2013/02/28 「プログラミング言語の今」PFIセミナー 2013/02/28 「プログラミング言語の今」
PFIセミナー 2013/02/28 「プログラミング言語の今」Preferred Networks
11.4K vistas65 diapositivas
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜 por
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜Ryoma Sin'ya
7.5K vistas115 diapositivas
指数時間アルゴリズム入門 por
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門Yoichi Iwata
44.7K vistas98 diapositivas

Más contenido relacionado

La actualidad más candente

様々な全域木問題 por
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
37.7K vistas71 diapositivas
研究動向から考えるx86/x64最適化手法 por
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法Takeshi Yamamuro
6K vistas57 diapositivas
ユークリッド最小全域木 por
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木理玖 川崎
4.7K vistas30 diapositivas
x86とコンテキストスイッチ por
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチMasami Ichikawa
8.6K vistas76 diapositivas
ウェーブレット木の世界 por
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
55.4K vistas67 diapositivas
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~ por
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
57.7K vistas51 diapositivas

La actualidad más candente(20)

様々な全域木問題 por tmaehara
様々な全域木問題様々な全域木問題
様々な全域木問題
tmaehara37.7K vistas
研究動向から考えるx86/x64最適化手法 por Takeshi Yamamuro
研究動向から考えるx86/x64最適化手法研究動向から考えるx86/x64最適化手法
研究動向から考えるx86/x64最適化手法
Takeshi Yamamuro6K vistas
ユークリッド最小全域木 por 理玖 川崎
ユークリッド最小全域木ユークリッド最小全域木
ユークリッド最小全域木
理玖 川崎4.7K vistas
x86とコンテキストスイッチ por Masami Ichikawa
x86とコンテキストスイッチx86とコンテキストスイッチ
x86とコンテキストスイッチ
Masami Ichikawa8.6K vistas
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~ por Takuya Akiba
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
Takuya Akiba57.7K vistas
プログラミングコンテストでの乱択アルゴリズム por Takuya Akiba
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
Takuya Akiba26.8K vistas
SAT/SMTソルバの仕組み por Masahiro Sakai
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
Masahiro Sakai36.6K vistas
最小カットを使って「燃やす埋める問題」を解く por shindannin
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
shindannin31.9K vistas
Rolling Hashを殺す話 por Nagisa Eto
Rolling Hashを殺す話Rolling Hashを殺す話
Rolling Hashを殺す話
Nagisa Eto4K vistas
双曲平面のモデルと初等幾何 por matsumoring
双曲平面のモデルと初等幾何双曲平面のモデルと初等幾何
双曲平面のモデルと初等幾何
matsumoring31.7K vistas
「型の理論」と証明支援システム -- COQの世界 por maruyama097
「型の理論」と証明支援システム -- COQの世界「型の理論」と証明支援システム -- COQの世界
「型の理論」と証明支援システム -- COQの世界
maruyama0977.5K vistas
RSA暗号運用でやってはいけない n のこと #ssmjp por sonickun
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
sonickun58.4K vistas
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜 por Preferred Networks
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks14.6K vistas
C++コミュニティーの中心でC++をDISる por Hideyuki Tanaka
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka12.4K vistas

Destacado

シャミノ計算 por
シャミノ計算シャミノ計算
シャミノ計算syamino
1K vistas28 diapositivas
20120519 inverse fizzbuzz を解いてみよう por
20120519 inverse fizzbuzz を解いてみよう20120519 inverse fizzbuzz を解いてみよう
20120519 inverse fizzbuzz を解いてみようHiroSuga
3.3K vistas27 diapositivas
圏論とプログラミング読書会#2 資料 por
圏論とプログラミング読書会#2 資料圏論とプログラミング読書会#2 資料
圏論とプログラミング読書会#2 資料53ningen
3K vistas48 diapositivas
圏論のおはなし por
圏論のおはなし圏論のおはなし
圏論のおはなしTakeo Imai
1.9K vistas24 diapositivas
OCamlの多相Variant紹介 #fpstudy por
OCamlの多相Variant紹介 #fpstudyOCamlの多相Variant紹介 #fpstudy
OCamlの多相Variant紹介 #fpstudykyon mm
3.7K vistas68 diapositivas
今日から始めるClojure por
今日から始めるClojure今日から始めるClojure
今日から始めるClojureKiyotaka Kunihira
3.2K vistas17 diapositivas

Destacado(16)

シャミノ計算 por syamino
シャミノ計算シャミノ計算
シャミノ計算
syamino1K vistas
20120519 inverse fizzbuzz を解いてみよう por HiroSuga
20120519 inverse fizzbuzz を解いてみよう20120519 inverse fizzbuzz を解いてみよう
20120519 inverse fizzbuzz を解いてみよう
HiroSuga3.3K vistas
圏論とプログラミング読書会#2 資料 por 53ningen
圏論とプログラミング読書会#2 資料圏論とプログラミング読書会#2 資料
圏論とプログラミング読書会#2 資料
53ningen3K vistas
圏論のおはなし por Takeo Imai
圏論のおはなし圏論のおはなし
圏論のおはなし
Takeo Imai1.9K vistas
OCamlの多相Variant紹介 #fpstudy por kyon mm
OCamlの多相Variant紹介 #fpstudyOCamlの多相Variant紹介 #fpstudy
OCamlの多相Variant紹介 #fpstudy
kyon mm3.7K vistas
Material por _TUNE_
MaterialMaterial
Material
_TUNE_3.5K vistas
圏論 3分(?) クッキング por aiya000
圏論 3分(?) クッキング圏論 3分(?) クッキング
圏論 3分(?) クッキング
aiya0004.3K vistas
20160702_圏論の基礎 por matsumoring
20160702_圏論の基礎20160702_圏論の基礎
20160702_圏論の基礎
matsumoring2.4K vistas
C#erがF#に這い寄ってみた por Hiroshi Maekawa
C#erがF#に這い寄ってみたC#erがF#に這い寄ってみた
C#erがF#に這い寄ってみた
Hiroshi Maekawa4.3K vistas
恊働ロボットCOROの開発における形式的仕様の適用事例 por Life Robotics
恊働ロボットCOROの開発における形式的仕様の適用事例恊働ロボットCOROの開発における形式的仕様の適用事例
恊働ロボットCOROの開発における形式的仕様の適用事例
Life Robotics2.3K vistas
圏論とHaskellは仲良し por ohmori
圏論とHaskellは仲良し圏論とHaskellは仲良し
圏論とHaskellは仲良し
ohmori7.5K vistas
第一回関数型言語勉強会 大阪 por Naoki Kitora
第一回関数型言語勉強会 大阪第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪
Naoki Kitora3.2K vistas
筑波大編入のおはなし por Takahiro Yano
筑波大編入のおはなし筑波大編入のおはなし
筑波大編入のおはなし
Takahiro Yano7.4K vistas

Similar a 代数的データ型をラムダ計算の中で表現する方法

Introduction to Categorical Programming (Revised) por
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)Masahiro Sakai
6.4K vistas53 diapositivas
Tapl 5 por
Tapl 5Tapl 5
Tapl 5rf0444
1.9K vistas66 diapositivas
Introduction to Categorical Programming por
Introduction to Categorical ProgrammingIntroduction to Categorical Programming
Introduction to Categorical ProgrammingMasahiro Sakai
1.7K vistas33 diapositivas
パターン認識と機械学習 §6.2 カーネル関数の構成 por
パターン認識と機械学習 §6.2 カーネル関数の構成パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成Prunus 1350
14.2K vistas26 diapositivas
パターン認識と機械学習6章(カーネル法) por
パターン認識と機械学習6章(カーネル法)パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)Yukara Ikemiya
29.4K vistas30 diapositivas
introductino to persistent homology and topological data analysis por
introductino to persistent homology and topological data analysisintroductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysisTatsuki SHIMIZU
961 vistas70 diapositivas

Similar a 代数的データ型をラムダ計算の中で表現する方法(20)

Introduction to Categorical Programming (Revised) por Masahiro Sakai
Introduction to Categorical Programming (Revised)Introduction to Categorical Programming (Revised)
Introduction to Categorical Programming (Revised)
Masahiro Sakai6.4K vistas
Tapl 5 por rf0444
Tapl 5Tapl 5
Tapl 5
rf04441.9K vistas
Introduction to Categorical Programming por Masahiro Sakai
Introduction to Categorical ProgrammingIntroduction to Categorical Programming
Introduction to Categorical Programming
Masahiro Sakai1.7K vistas
パターン認識と機械学習 §6.2 カーネル関数の構成 por Prunus 1350
パターン認識と機械学習 §6.2 カーネル関数の構成パターン認識と機械学習 §6.2 カーネル関数の構成
パターン認識と機械学習 §6.2 カーネル関数の構成
Prunus 135014.2K vistas
パターン認識と機械学習6章(カーネル法) por Yukara Ikemiya
パターン認識と機械学習6章(カーネル法)パターン認識と機械学習6章(カーネル法)
パターン認識と機械学習6章(カーネル法)
Yukara Ikemiya29.4K vistas
introductino to persistent homology and topological data analysis por Tatsuki SHIMIZU
introductino to persistent homology and topological data analysisintroductino to persistent homology and topological data analysis
introductino to persistent homology and topological data analysis
Tatsuki SHIMIZU961 vistas
Tpp2012 mwpl on_coq por SUDA Keishi
Tpp2012 mwpl on_coqTpp2012 mwpl on_coq
Tpp2012 mwpl on_coq
SUDA Keishi667 vistas
Pythonintro por Mikio Kubo
PythonintroPythonintro
Pythonintro
Mikio Kubo548 vistas
Rのoptim関数でロバスト回帰(LMSとLAV) por wada, kazumi
Rのoptim関数でロバスト回帰(LMSとLAV)Rのoptim関数でロバスト回帰(LMSとLAV)
Rのoptim関数でロバスト回帰(LMSとLAV)
wada, kazumi1.4K vistas
SICP por S W
SICPSICP
SICP
S W470 vistas
さくっと線形代数 por Kota Mori
さくっと線形代数さくっと線形代数
さくっと線形代数
Kota Mori1.8K vistas
(Lambdaだけで) 純LISPのような ナニかを作る por Daichi Teruya
(Lambdaだけで)純LISPのようなナニかを作る(Lambdaだけで)純LISPのようなナニかを作る
(Lambdaだけで) 純LISPのような ナニかを作る
Daichi Teruya2.7K vistas
2013.12.26 prml勉強会 線形回帰モデル3.2~3.4 por Takeshi Sakaki
2013.12.26 prml勉強会 線形回帰モデル3.2~3.42013.12.26 prml勉強会 線形回帰モデル3.2~3.4
2013.12.26 prml勉強会 線形回帰モデル3.2~3.4
Takeshi Sakaki5.8K vistas

Último

JJUG CCC.pptx por
JJUG CCC.pptxJJUG CCC.pptx
JJUG CCC.pptxKanta Sasaki
6 vistas14 diapositivas
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... por
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...NTT DATA Technology & Innovation
101 vistas42 diapositivas
定例会スライド_キャチs 公開用.pdf por
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
73 vistas64 diapositivas
SNMPセキュリティ超入門 por
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門mkoda
188 vistas15 diapositivas
The Things Stack説明資料 by The Things Industries por
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
50 vistas29 diapositivas
SSH応用編_20231129.pdf por
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdficebreaker4
184 vistas13 diapositivas

Último(11)

今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... por NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
SNMPセキュリティ超入門 por mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda188 vistas
The Things Stack説明資料 by The Things Industries por CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.50 vistas
SSH応用編_20231129.pdf por icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4184 vistas
さくらのひやおろし2023 por 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之94 vistas
Web3 Career_クレデン資料 .pdf por nanamatsuo
Web3 Career_クレデン資料 .pdfWeb3 Career_クレデン資料 .pdf
Web3 Career_クレデン資料 .pdf
nanamatsuo14 vistas
Windows 11 information that can be used at the development site por Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka76 vistas
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) por NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)

代数的データ型をラムダ計算の中で表現する方法