いものやま。

雑多な知識の寄せ集め

技書博9で配ったフリーペーパーの話。

前回は技書博9にサークル参加した記事を書いた。

そこで配ったフリーペーパーの内容を貼っておこうと思う。

ちなみにここに書いた内容の元ネタはこれ:


「ならば」の話 あと順序とか

真偽値と数理論理学

プログラミングするとき、if文で条件分岐したりwhile文でループを回したりするときに出てくるのが真偽値。 条件が正しいときの値をtrue、間違ってるときの値をfalseとして、値がtrueなのかfalseなのかで処理の流れを制御する。

この真偽値の扱いの背後には数理論理学(意味論)の理論がある。 具体的には、複数の条件を組み合わせたときの真偽値がどうなるかだ。

「かつ」と「または」

分かりやすいのは「かつ」と「または」だ。 これらは2つの条件を組み合わせて新しい条件を作り出す。 多くのプログラミング言語ではこれらを真偽値の2項演算子として用意している(&&や||といった演算子)。

まず(AやBを条件として)「AかつB」という条件はAとBがどちらもtrueの場合にのみtrueとなる。

そして「AまたはB」という条件はAかBの少なくとも一方がtrueのときにtrueとなる。

「かつ」は論理積、「または」は論理和とも呼ばれる。 これはtrueを1、falseを0として、組み合わせを表で書いてみるとイメージがしやすい:

A B AかつB AまたはB
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 1

「かつ」は掛け算、「または」は足し算っぽくなっているのが分かると思う。

「ならば」?

ところで、2つの条件から新しい条件を作るものとして数理論理学には「ならば」もある。 「AならばB」の真偽値は次の表の通り:

A B AならばB
0 0 1
0 1 1
1 0 0
1 1 1

この表を見て即「なるほど」となる人はいないだろう。 「ならば」の理解は数理論理学の鬼門の一つだ。

それに「かつ」や「または」は演算子が用意されているのに、「ならば」の演算子は普通は用意されていない。

この「ならば」は一体何者なのか?

実は「ならば」は真偽値の集合での順序を表している。 すなわち「AならばB」という条件はtrueを1、falseを0として「A≦B」という条件になっている。 前述の表で確認してみてほしい。

これが分かると、Aと「AならばB」からBを推論できるのは、A=1でA≦BならB=1となるからと理解できる。

順序とタスクランナー

「ならば」は真偽値における順序だったわけだけど、実は順序は他にもいろいろあったりする。 数学的には順序の公理を満たす二項関係はどれも順序となる。

そして順序にも全順序と半順序とがある。 任意の要素で大小関係が決まれば全順序、そうでなければ半順序だ。

ここで、タスクの集合で「A→B」という関係を「AはBに依存する」という依存関係として定義すると「→」は(ループがない前提で)順序となる。 依存関係のないタスクもあるので、この順序は半順序となる。

ところで、半順序は全順序に拡張できることが知られている。 そこで、タスクの依存関係の半順序を全順序に拡張し、一番依存される側から実行していくと、依存関係にしたがって正しい順序でタスクを実行できる。 これはタスクランナーのkumadeでやってることでもある。

kumadeについては新刊『タスクランナーkumade - Pythonで作業を自動化しよう』を参照してほしい。


ということで、最近Twitterに書いた論理の話から順序の話へ発展させ、タスクランナーに繋げる内容。 一応、理学系のサークルなので(^^;

技術書典や技書博での数学の本だと圏論とか統計の話が多いけど、数学って構造の科学で、もっと幅の広い学問だったりするんだよなぁ。 だからコンピュータサイエンスの背後にもそういった数学が隠れていたり。 そういうのがもっと知られてもいいと思うから、そういった入門書を書いても面白いと思ったりするんだけど、需要なさそうだよなぁ(^^;

今日はここまで!