理工学部情報工学科3年
プログラミング言語が
すき
量子プログラミング
やっていくぞ
print("Hello, World!")
cout << "Hello, World!" << endl;
System.out.writeln("Hello, World!");
>>> 3
3
>>> "Hello, World!"
'Hello, World!'
>>> 1 + 2
3
>>> from operator import add
>>> add(1, 2)
3
>>> 1 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
プログラムの性質を知りたい
プログラムの最適化
プログラムを100倍速くしました!答えは全然違います!
意味を変えずにプログラムを高速化したい
表示的意味
\(x \mapsto x + 1\)
\(\mathrm{fun}(x)\{x+1\}\)
\(\mathrm{fun}(x)\{x+1\}(5)\)
\(\mathrm{fun}\, \mathrm{inc}(x)\{x+1\}\)
\(x \mapsto x + 1\)
\(\mathrm{fun}(f)\{f(5)\}(\mathrm{inc})\)
\(\mathrm{fun}(f)\{f(5)\}\)
\(f \mapsto f(5)\)
\(\mathrm{inc}(x)\{x+1\}\)
となる関数abs
\(\mathrm{fun}(x)\{x + 1\}(1/0)\)
プログラムの表示的意味は
のいずれか
複雑なプログラムの意味は
部分の意味から決まる(合成性)
プログラムの表示的意味は
のいずれか
複雑なプログラムの意味は
部分の意味から決まる(合成性)
factの定義にfact自身が出てくる
→factの意味を決めるためにはfactの意味を知らなくてはいけない?
関数を引数に
とっている
自分自身の代わりに
引数の関数を呼び出す
引数の関数で
再帰呼び出しを置き換える
自分自身を呼び出さないので
これまで同様
意味を決めることができる!
引数の関数で
再帰呼び出しを置き換える
fact'のfをabortで置き換える
これだけだと無意味・・・
\( \mathrm{fact}_0 \)が出てきた
fact'の \( f \) を\( \mathrm{fact}_0 \)で置き換える
ちょっと増えた
\( \mathrm{fact}_1 \)が出てきた
fact'の \( f \) を\( \mathrm{fact}_1 \)で置き換える
さらに増えた
\( \mathrm{fact}_2 \)が出てきた
fact'の \( f \) を\( \mathrm{fact}_2 \)で置き換える
もひとつ増えた
\( \mathrm{fact}_{n-1} \)が出てきた
fact'の \( f \) を\( \mathrm{fact}_{n-1} \)で置き換える
階乗関数に近づいてきた!
階乗関数!!!!!!!
階乗関数!!!!!!!
\( \mathrm{fact}'(x, \mathrm{fact}_\infty) \)と\( \mathrm{fact}_\infty \)の意味は等しい
⇓
\( \mathrm{fact}_\infty \)は\( \mathrm{fact}' \)の不動点(fixpoint)
⇓
\( \mathrm{fact}_\infty = \mathrm{fix}(\mathrm{fact}') \)