ラムダ計算、チャーチ数をF#で試したときのURL集

関数型言語fのラムダ計算で引き算ができません の記事を書いたときに多くのラムダ計算の資料にお世話になりました。また試すときに忘れそうなので、URLを残しておきます。

ベン図を書こう

関数型プログラミング言語のF#を勉強していく過程で、関数型言語はプログラミングよりも数学の集合や写像を勉強したほうが良いことが分かってきました。

もう少し具体的に言うと、数学のテストが解けるようになるのではなく、プログラミングで普段使っている、集合、Set、disjoint union、Discriminated Union、直積、直和、関数、function、マップ、タプル、などを、数学の記号、数学の読み方、XY座標、ベン図でも理解できるようにしておかないといけないと感じました。

といっても数学の勉強をしはじめると眠くなるだけなので、Python3のmatplotlibでベン図を作ってみようと思います。本当はF#でやってみたいのですがやりかたが分かりません。

Windows10で手軽なPython3環境構築

Windows10でPython3の環境を簡単に構築するには、以下だけです。

  1. Python3を公式サイトからインストール
  2. Visual Studio Code テキストエディタをインストール

Visual Studio Codeは、hello.pyなどのファイルを作ってpythonを書いていこうとすると、それを検知して、Python拡張機能インストールする?pep8インストールする?といい感じにやってくれます。なので、autopep8,pep8,pylintなどがボタン押しているだけで構築できます。

matplotlibのインストール

依存関係で、numpyなど必要なライブラリーもインストールしてくれます。

またsympyという数式処理ライブラリーもあるようです。これも必要ならpipで簡単にインストールできました。

 

追記

Windows10(64bit)+Python3.5(32bit)だと、pip install scipyでSciPyがインストールできませんでした。以下URLを参考にして、pip uninstall numpyをして、.whlファイルをダウンロードして、numpy+mklとSciPyをインストールしました。ダウンロードするファイルはたくさんありますが、cp35とかcp36と書かれているのは、CPythonつまり普通のPythonの事です。よってPython3.5(32bit)を使っている場合は、cp35-cp35m-win32.whlという末尾のファイルをダウンロードしてインストールします。

http://qiita.com/r-ngtm/items/15caf43648acbccd37d2

 

とりあえず、サインカーブ

matplotlibを使うとWindows10のPython3で簡単にベン図が書けるようなので試してみます。

001
できた!

ベン図を書いてみます

pip install matplotlib-venn

とりあえず動作テストをしてみます。

figure_1
ベン図だ!!!

 

関数型言語F#をやっているときに学んだ数学

関数型プログラミングのF#を学んでいくときに、少しずつラムダ計算と集合・写像・関係などを調べていろんなことが分かってきました。数学の教科書で問題を解こうとすると苦痛で続かないので、mathjaxを書いたり、プログラミングで解いたりして、すこしづつ数学もやっていこうと思います。

集合(set、セット)

集合は、ド・モルガンの法則やベン図で覚えている人も多いはずです。何かしらの集まりを表します。英字で表す場合は、集合を大文字で表し、要素(element、エレメント)は小文字で表します。

数学の記号は、そのままGoogle検索で、「数学 記号 読み方」で見つかります。

集合Aに要素xは属する(belong to)

$$ x \in A $$

集合Bに要素1,2,3,4,5は属する

$$ B = \{1,2,3,4,5\} $$

表記はいろいろあって以下のように条件を書く場合もあります。

$$ C =\{ n | n = 2k, k=1,2,…,10\}$$

$$ C =\{ 2,4,6,8,10,12,14,16,18,20\}$$

上記2つは同じ意味です。

部分集合

集合Aの要素が、集合Aの要素でもある場合、AはBの部分集合である。

記号で書くと、

$$ A \subseteq B $$

べき集合(Power Set)

集合Aのすべての部分集合からなる集合をAのべき集合といい、以下のような表し方をします。

$$ 2^A $$

A={a,b}なら、P(A) = { Φ, {a},{b},{a,b}}

直積集合(direct product)

$$ A \times B = \{ (a,b) \mid a \subseteq A \land b \subseteq B \}$$

Wikipediaの図が分かりやすい。直積は、direct product、デカルト積(Cartesian product)ともいう。

集合X = 1,2,3で集合Y = 5,6,7だったら、総当たりで以下のようになります。

X x Y = {(1,5),(1,6),(1,7), (2,5),(2,6),(2,7), (3,5),(3,6),(3,7)}

プログラミングだと2重のforループです。また(x,y)のような書き方を対(つい)、タプル、ペアと呼びます。

内包表記(comprehension)

数学の集合では、条件を書く方法がいろいろあります。プログラミング言語のリスト内包表記はここからきているのだと思います。

$$ A = \{x^2 | x \in  \{1..5\}\} $$

$$ A = \{1,4,9,16,25\} $$

F#ではリスト内包表記があります。

 

関係(relation)

高知工科大学の高校生向けの資料(関係を図で表現する道具(坂本 明雄))がすごくわかりやすいです。

2つの集合A、Bの直積集合A×Bの部分集合Rを関係と呼びます。それは、XY座標でも表示できるし、関係グラフ、有向グラフ、関係行列でも表示できます。

https://ja.wikipedia.org/wiki/直積集合

 

プログラミングで理解する反射律・対称律・推移律・反対称律

集合Aの直積集合A^2の部分集合をA上の関係と呼びます。A={1,2,3}だった時AxA={(1,1),(1,2),(1,3), (2,1),(2,2),(2,3), (3,1),(3,2),(3,3)}が直積集合となります。部分集合R={(1,2),(2,1),(3,3)}としたら、このRをA上の関係と呼びます。

写像(map)

先ほどのおさらい、2つの集合A、Bの集合AxBの部分集合Rを関係と呼びます。さらに、

集合Aの各要素に、それぞれBの要素がただ1つ対応している関係をAからBへの写像(map)といい微分積分の分野では、関数と呼びます。

 

非交和

https://ja.wikipedia.org/wiki/非交和

 

二項関係

論理(Logic)

論理(Logic)も同様ですが、数学のタイトルや項目を見るとちゃんと、集合と集合演算として分かれています。論理でも論理と論理演算となっていて、あらためて昔はテストの勉強のために問題を解いていただけなんだと思いました。

論理演算の英語はLogic Operation

命題関数

 

代数系

大人になってからの再学習 の★群・環・体 – 大人になってからの再学習 が分かりやすいです。数学の教科書を開く前にこの表をみてみるのが良いですね。

http://hooktail.sub.jp/algebra/FundamentalTheorem/

http://sun.ac.jp/prof/hnagano/houkoku/h26informationmath-13.html#1101

http://qiita.com/taketo1024/contributions

資料

Mathjaxの記号の書き方

http://www.mathsisfun.com/sets/index.html