狠狠撸

狠狠撸Share a Scribd company logo
実践Scalaでペアノの公理
第6回 プログラマのための数学勉強会
Yasuki Okumura
Who?
● 教育学部数学科 出身
● @busterdayo
● https://jp.linkedin.com/in/yasuki-okumura-8561b32a
● サーバーサイドエンジニア at Tamecco
Agenda
● ペアノの公理
● 自然数 - オブジェクト
● 自然数 + 加法 - オブジェクト
● 自然数 + 加法 - 型
● 応用例 - N次元ベクトル
ペアノの公理 - wikipedia調べ
自然数は次の5条件を満たす。
● 自然数 0 が存在する。
● 任意の自然数 a にはその後者 (successor)、suc(a) が存在する(suc(a) は a + 1
の "意味")。
● 0 はいかなる自然数の後者でもない(0 より前の自然数は存在しない)。
● 異なる自然数は異なる後者を持つ:a ≠ b のとき suc(a) ≠ suc(b) となる。
● 0 がある性質を満たし、a がある性質を満たせばその後者 suc(a) もその性質を満
たすとき、すべての自然数はその性質を満たす。
https://ja.wikipedia.org/wiki/ペアノの公理
自然数 - オブジェクト
sealed trait 自然数
object 零 extends 自然数
case class 後者(a: 自然数) extends 自然数
scala> val 壱 = 後者(零)
壱: com.github.buster84.後者 = 後者(com.github.buster84.零$@4161bf5f)
scala> val 弐 = 後者(壱)
弐: com.github.buster84.後者 = 後者(後者(com.github.buster84.零$@4161bf5f))
scala> val 参 = 後者(弐)
参: com.github.buster84.後者 = 後者(後者(後者(com.github.buster84.零$@4161bf5f)))
scala> val 肆 = 後者(参)
肆: com.github.buster84.後者 = 後者(後者(後者(後者(com.github.buster84.零$@4161bf5f))))
scala> 壱 != 弐
res0: Boolean = true
scala> 参 != 肆
res1: Boolean = true
自然数 + 加法 - オブジェクト
自然数の加法は再帰的に、以下のように定義できる。
● すべての自然数 a に対して、a + 0 = a
● すべての自然数 a, b に対して、a + suc(b) = suc(a + b)
https://ja.wikipedia.org/wiki/自然数
● すべての自然数 a に対して、零 + a = a
● すべての自然数 a, b に対して、後者(b) + a = 後者(a + b)
自然数 + 加法 - オブジェクト
sealed trait 自然数 {
def +( n: 自然数 ) : 自然数
}
object 零 extends 自然数 {
def +( a: 自然数 ): 自然数 = a // 零 + a = a
}
case class 後者(b: 自然数) extends 自然数 {
def +( a: 自然数 ): 自然数 = 後者( a + b ) // 後者(b) + a = 後者(a + b)
}
scala> val 壱 = 後者(零)
scala> val 弐 = 後者(壱)
scala> val 参 = 後者(弐)
scala> val 肆 = 後者(参)
scala> 壱 + 壱 == 弐
res0: Boolean = true
scala> 壱 + 壱 + 壱 == 参
res1: Boolean = true
scala> 弐 + 弐 == 肆
res2: Boolean = true
自然数 + 加法 - 型
sealed trait 自然数 {
def +( n: 自然数 ) : 自然数
}
object 零 extends 自然数 {
def +( a: 自然数 ): 自然数 = a
}
case class 後者(b: 自然数) extends
自然数 {
def +( a: 自然数 ): 自然数 =
後者( a + b )
}
sealed trait 自然数 {
type 足す[N <: 自然数] <: 自然数
}
trait 零 extends 自然数{
override type 足す[N <: 自然数] = N
}
trait 後者[N<:自然数] extends 自然数
{
override type 足す[O <: 自然数] =
後者[N#足す[O]]
}
応用例 - N次元ベクトル
sealed trait ベクトル集合[次元 <: 自然数] {
def +( vector: ベクトル集合[次元] ): ベクトル集合[次元]
def append[Size <: 自然数]( vector: ベクトル集合[Size] ): ベク
トル集合[次元#足す[Size]]
}
https://github.
com/buster84/Natural/blob/master/src/main/scala/com/github/buster84/ベクトル.
scala
デモ
References
https://github.com/milessabin/shapeless
https://www.parleys.com/tutorial/type-level-
programming-scala-101
http://downloads.typesafe.
com/website/presentations/ScalaDaysSF2015/T4_B
arnes_Typelevel_Prog.pdf

More Related Content

Viewers also liked (15)

Packing
PackingPacking
Packing
Tatsuki SHIMIZU
?
「ヘ?ータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
「ヘ?ータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料「ヘ?ータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
「ヘ?ータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
Ken'ichi Matsui
?
加法よりも低レベルな演算を考える
加法よりも低レベルな演算を考える加法よりも低レベルな演算を考える
加法よりも低レベルな演算を考える
Yu(u)ki IWABUCHI
?
nichiyou vol.4
nichiyou vol.4nichiyou vol.4
nichiyou vol.4
tsu nuts
?
【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について
和人 桐ケ谷
?
Riemann球面に 内接する直方体[第四回日曜数学会]
Riemann球面に内接する直方体[第四回日曜数学会]Riemann球面に内接する直方体[第四回日曜数学会]
Riemann球面に 内接する直方体[第四回日曜数学会]
Yuto Horikawa
?
第4回日曜数学会スライド 产测 まこぴ~
第4回日曜数学会スライド 产测 まこぴ~第4回日曜数学会スライド 产测 まこぴ~
第4回日曜数学会スライド 产测 まこぴ~
Makoto Kohno
?
ベルヌーイ数を割る素数 - 第4回 #日曜数学会
ベルヌーイ数を割る素数 - 第4回 #日曜数学会ベルヌーイ数を割る素数 - 第4回 #日曜数学会
ベルヌーイ数を割る素数 - 第4回 #日曜数学会
Junpei Tsuji
?
最大公约数に関するささやかな知见
最大公约数に関するささやかな知见最大公约数に関するささやかな知见
最大公约数に関するささやかな知见
ayatsuka
?
かんたんベジェ曲线
かんたんベジェ曲线かんたんベジェ曲线
かんたんベジェ曲线
Yu(u)ki IWABUCHI
?
営业会社の开発组织を成长させるためにやったこと
営业会社の开発组织を成长させるためにやったこと営业会社の开発组织を成长させるためにやったこと
営业会社の开発组织を成长させるためにやったこと
Daisuke Kotaki
?
厂飞颈蹿迟で搁颈别尘补苍苍球面を扱う
厂飞颈蹿迟で搁颈别尘补苍苍球面を扱う厂飞颈蹿迟で搁颈别尘补苍苍球面を扱う
厂飞颈蹿迟で搁颈别尘补苍苍球面を扱う
hayato iida
?
圏论と贬补蝉办别濒濒は仲良し
圏论と贬补蝉办别濒濒は仲良し圏论と贬补蝉办别濒濒は仲良し
圏论と贬补蝉办别濒濒は仲良し
ohmori
?
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -
MITSUNARI Shigeo
?
Poincare embeddings for Learning Hierarchical Representations
Poincare embeddings for Learning Hierarchical RepresentationsPoincare embeddings for Learning Hierarchical Representations
Poincare embeddings for Learning Hierarchical Representations
Tatsuya Shirakawa
?
「ヘ?ータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
「ヘ?ータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料「ヘ?ータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
「ヘ?ータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
Ken'ichi Matsui
?
加法よりも低レベルな演算を考える
加法よりも低レベルな演算を考える加法よりも低レベルな演算を考える
加法よりも低レベルな演算を考える
Yu(u)ki IWABUCHI
?
nichiyou vol.4
nichiyou vol.4nichiyou vol.4
nichiyou vol.4
tsu nuts
?
【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について
和人 桐ケ谷
?
Riemann球面に 内接する直方体[第四回日曜数学会]
Riemann球面に内接する直方体[第四回日曜数学会]Riemann球面に内接する直方体[第四回日曜数学会]
Riemann球面に 内接する直方体[第四回日曜数学会]
Yuto Horikawa
?
第4回日曜数学会スライド 产测 まこぴ~
第4回日曜数学会スライド 产测 まこぴ~第4回日曜数学会スライド 产测 まこぴ~
第4回日曜数学会スライド 产测 まこぴ~
Makoto Kohno
?
ベルヌーイ数を割る素数 - 第4回 #日曜数学会
ベルヌーイ数を割る素数 - 第4回 #日曜数学会ベルヌーイ数を割る素数 - 第4回 #日曜数学会
ベルヌーイ数を割る素数 - 第4回 #日曜数学会
Junpei Tsuji
?
最大公约数に関するささやかな知见
最大公约数に関するささやかな知见最大公约数に関するささやかな知见
最大公约数に関するささやかな知见
ayatsuka
?
営业会社の开発组织を成长させるためにやったこと
営业会社の开発组织を成长させるためにやったこと営业会社の开発组织を成长させるためにやったこと
営业会社の开発组织を成长させるためにやったこと
Daisuke Kotaki
?
厂飞颈蹿迟で搁颈别尘补苍苍球面を扱う
厂飞颈蹿迟で搁颈别尘补苍苍球面を扱う厂飞颈蹿迟で搁颈别尘补苍苍球面を扱う
厂飞颈蹿迟で搁颈别尘补苍苍球面を扱う
hayato iida
?
圏论と贬补蝉办别濒濒は仲良し
圏论と贬补蝉办别濒濒は仲良し圏论と贬补蝉办别濒濒は仲良し
圏论と贬补蝉办别濒濒は仲良し
ohmori
?
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -
MITSUNARI Shigeo
?
Poincare embeddings for Learning Hierarchical Representations
Poincare embeddings for Learning Hierarchical RepresentationsPoincare embeddings for Learning Hierarchical Representations
Poincare embeddings for Learning Hierarchical Representations
Tatsuya Shirakawa
?

実践厂肠补濒补て?ヘ?アノの公理

  • 2. Who? ● 教育学部数学科 出身 ● @busterdayo ● https://jp.linkedin.com/in/yasuki-okumura-8561b32a ● サーバーサイドエンジニア at Tamecco
  • 3. Agenda ● ペアノの公理 ● 自然数 - オブジェクト ● 自然数 + 加法 - オブジェクト ● 自然数 + 加法 - 型 ● 応用例 - N次元ベクトル
  • 4. ペアノの公理 - wikipedia調べ 自然数は次の5条件を満たす。 ● 自然数 0 が存在する。 ● 任意の自然数 a にはその後者 (successor)、suc(a) が存在する(suc(a) は a + 1 の "意味")。 ● 0 はいかなる自然数の後者でもない(0 より前の自然数は存在しない)。 ● 異なる自然数は異なる後者を持つ:a ≠ b のとき suc(a) ≠ suc(b) となる。 ● 0 がある性質を満たし、a がある性質を満たせばその後者 suc(a) もその性質を満 たすとき、すべての自然数はその性質を満たす。 https://ja.wikipedia.org/wiki/ペアノの公理
  • 5. 自然数 - オブジェクト sealed trait 自然数 object 零 extends 自然数 case class 後者(a: 自然数) extends 自然数
  • 6. scala> val 壱 = 後者(零) 壱: com.github.buster84.後者 = 後者(com.github.buster84.零$@4161bf5f) scala> val 弐 = 後者(壱) 弐: com.github.buster84.後者 = 後者(後者(com.github.buster84.零$@4161bf5f)) scala> val 参 = 後者(弐) 参: com.github.buster84.後者 = 後者(後者(後者(com.github.buster84.零$@4161bf5f))) scala> val 肆 = 後者(参) 肆: com.github.buster84.後者 = 後者(後者(後者(後者(com.github.buster84.零$@4161bf5f)))) scala> 壱 != 弐 res0: Boolean = true scala> 参 != 肆 res1: Boolean = true
  • 7. 自然数 + 加法 - オブジェクト 自然数の加法は再帰的に、以下のように定義できる。 ● すべての自然数 a に対して、a + 0 = a ● すべての自然数 a, b に対して、a + suc(b) = suc(a + b) https://ja.wikipedia.org/wiki/自然数 ● すべての自然数 a に対して、零 + a = a ● すべての自然数 a, b に対して、後者(b) + a = 後者(a + b)
  • 8. 自然数 + 加法 - オブジェクト sealed trait 自然数 { def +( n: 自然数 ) : 自然数 } object 零 extends 自然数 { def +( a: 自然数 ): 自然数 = a // 零 + a = a } case class 後者(b: 自然数) extends 自然数 { def +( a: 自然数 ): 自然数 = 後者( a + b ) // 後者(b) + a = 後者(a + b) }
  • 9. scala> val 壱 = 後者(零) scala> val 弐 = 後者(壱) scala> val 参 = 後者(弐) scala> val 肆 = 後者(参) scala> 壱 + 壱 == 弐 res0: Boolean = true scala> 壱 + 壱 + 壱 == 参 res1: Boolean = true scala> 弐 + 弐 == 肆 res2: Boolean = true
  • 10. 自然数 + 加法 - 型 sealed trait 自然数 { def +( n: 自然数 ) : 自然数 } object 零 extends 自然数 { def +( a: 自然数 ): 自然数 = a } case class 後者(b: 自然数) extends 自然数 { def +( a: 自然数 ): 自然数 = 後者( a + b ) } sealed trait 自然数 { type 足す[N <: 自然数] <: 自然数 } trait 零 extends 自然数{ override type 足す[N <: 自然数] = N } trait 後者[N<:自然数] extends 自然数 { override type 足す[O <: 自然数] = 後者[N#足す[O]] }
  • 11. 応用例 - N次元ベクトル sealed trait ベクトル集合[次元 <: 自然数] { def +( vector: ベクトル集合[次元] ): ベクトル集合[次元] def append[Size <: 自然数]( vector: ベクトル集合[Size] ): ベク トル集合[次元#足す[Size]] } https://github. com/buster84/Natural/blob/master/src/main/scala/com/github/buster84/ベクトル. scala