実践scalaでペアノの公理

13
実践Scalaでペアノの公理 第6回 プログラマのための数学勉強会 Yasuki Okumura

Upload: yasuki-okumura

Post on 16-Apr-2017

1.692 views

Category:

Software


0 download

TRANSCRIPT

Page 1: 実践Scalaでペアノの公理

実践Scalaでペアノの公理第6回 プログラマのための数学勉強会

Yasuki Okumura

Page 2: 実践Scalaでペアノの公理

Who?

● 教育学部数学科 出身

● @busterdayo● https://jp.linkedin.com/in/yasuki-okumura-8561b32a● サーバーサイドエンジニア at Tamecco

Page 3: 実践Scalaでペアノの公理

Agenda

● ペアノの公理

● 自然数 - オブジェクト

● 自然数 + 加法 - オブジェクト

● 自然数 + 加法 - 型● 応用例 - N次元ベクトル

Page 4: 実践Scalaでペアノの公理

ペアノの公理 - 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/ペアノの公理

Page 5: 実践Scalaでペアノの公理

自然数 - オブジェクト

sealed trait 自然数

object 零 extends 自然数

case class 後者(a: 自然数) extends 自然数

Page 6: 実践Scalaでペアノの公理

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

Page 7: 実践Scalaでペアノの公理

自然数 + 加法 - オブジェクト

自然数の加法は再帰的に、以下のように定義できる。

● すべての自然数 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)

Page 8: 実践Scalaでペアノの公理

自然数 + 加法 - オブジェクト

sealed trait 自然数 { def +( n: 自然数 ) : 自然数

}object 零 extends 自然数 { def +( a: 自然数 ): 自然数 = a // 零 + a = a}case class 後者(b: 自然数) extends 自然数 { def +( a: 自然数 ): 自然数 = 後者( a + b ) // 後者(b) + a = 後者(a + b)

}

Page 9: 実践Scalaでペアノの公理

scala> val 壱 = 後者(零)scala> val 弐 = 後者(壱)scala> val 参 = 後者(弐)scala> val 肆 = 後者(参)

scala> 壱 + 壱 == 弐res0: Boolean = true

scala> 壱 + 壱 + 壱 == 参res1: Boolean = true

scala> 弐 + 弐 == 肆res2: Boolean = true

Page 10: 実践Scalaでペアノの公理

自然数 + 加法 - 型

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]]}

Page 11: 実践Scalaでペアノの公理

応用例 - 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

Page 12: 実践Scalaでペアノの公理

デモ

Page 13: 実践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_Barnes_Typelevel_Prog.pdf

https://ja.wikipedia.org/wiki/自然数