SlideShare une entreprise Scribd logo
1  sur  13
Télécharger pour lire hors ligne
実践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

Contenu connexe

En vedette

En vedette (15)

Packing
PackingPacking
Packing
 
「ベータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
「ベータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料「ベータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
「ベータ分布の謎に迫る」第6回 プログラマのための数学勉強会 LT資料
 
加法よりも低レベルな演算を考える
加法よりも低レベルな演算を考える加法よりも低レベルな演算を考える
加法よりも低レベルな演算を考える
 
nichiyou vol.4
nichiyou vol.4nichiyou vol.4
nichiyou vol.4
 
【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について【展開用】日曜数学会 Sinc関数の積分について
【展開用】日曜数学会 Sinc関数の積分について
 
Riemann球面に 内接する直方体[第四回日曜数学会]
Riemann球面に内接する直方体[第四回日曜数学会]Riemann球面に内接する直方体[第四回日曜数学会]
Riemann球面に 内接する直方体[第四回日曜数学会]
 
第4回日曜数学会スライド by まこぴ~
第4回日曜数学会スライド by まこぴ~第4回日曜数学会スライド by まこぴ~
第4回日曜数学会スライド by まこぴ~
 
ベルヌーイ数を割る素数 - 第4回 #日曜数学会
ベルヌーイ数を割る素数 - 第4回 #日曜数学会ベルヌーイ数を割る素数 - 第4回 #日曜数学会
ベルヌーイ数を割る素数 - 第4回 #日曜数学会
 
最大公約数に関するささやかな知見
最大公約数に関するささやかな知見最大公約数に関するささやかな知見
最大公約数に関するささやかな知見
 
かんたんベジェ曲線
かんたんベジェ曲線かんたんベジェ曲線
かんたんベジェ曲線
 
営業会社の開発組織を成長させるためにやったこと
営業会社の開発組織を成長させるためにやったこと営業会社の開発組織を成長させるためにやったこと
営業会社の開発組織を成長させるためにやったこと
 
SwiftでRiemann球面を扱う
SwiftでRiemann球面を扱うSwiftでRiemann球面を扱う
SwiftでRiemann球面を扱う
 
圏論とHaskellは仲良し
圏論とHaskellは仲良し圏論とHaskellは仲良し
圏論とHaskellは仲良し
 
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -
 
Poincare embeddings for Learning Hierarchical Representations
Poincare embeddings for Learning Hierarchical RepresentationsPoincare embeddings for Learning Hierarchical Representations
Poincare embeddings for Learning Hierarchical Representations
 

実践Scalaでペアノの公理

  • 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