Scheme事始め7:ラムダ算法

  • f(x) = a x + bという関数があって、g(y) = \frac{1}{ay}という関数があったとする
  • f(g(y))という関数を考えることができる
  • これはyについて関数g()を処理してそれをf()に渡して、という風に入れ子になっているし、1個ずつの変数処理なので、カリー化してある、と言えるもの
  • f(g(y))=a g(y) +b = a\frac{1}{ay} + b=\frac{1}{y}+bという新たな関数ができるわけだけれど、a\frac{1}{ay}+b\frac{1}{y}+bとの2つの書き方ができてしまう。同じものなのに…。じゃあ、一番良い形、というのを定めてやって、それにしてから考える、というのは普通の発想。それが(ベータ)正規形(このように同じ働きをする関数は同じ表記になるようにするのがイータ変換:これも、『必要だから無駄に難しく聞こえる耳慣れない用語』のひとつ
  • ただし、渡してやるものは、分類して考えておく方が良いかもしれない
    • 変数が与えられるか、関数が与えられるか、値が与えられるか、に分けられる
      • ここで「変数」が与えられる、というのは、f(x)の変数とは違う変数に書き換えたりすることを含む
      • ここで「関数」が与えられる、というのは、f(x)ですでに使っている変数で出来た関数を与えること(らしく)
      • ここで「値」が与えられる、というのは、いわゆる「値」の代入。ただし、数値の関数の変数への値の代入は「自然数そのものがリストで作られているSchema」では、「値」を代入しているわけではなく、「変数」「関数」を与えていることと変わらない
  • とまあ、変数も関数も値もみんなリストで扱っている「この世界」で、うまく回るような関数の取扱いのルールが、ラムダ算法、ただし、基幹部ではラムダ関数を使っているのが前提条件
  • たとえば、g(y)がある特定の値であるとすると、それはf(x)のxに値を代入することと同じことなわけだけれど、その場合も、きっちり簡単にしてもよいでしょう。たとえばf(x)=ax^2 + ax+bx3を代入したら9a + 3a +bでもよいけれど、12a+bでもよいわけで、どちらかにした方がよくて、どちらにするかと言えば、f(g(y))を(ベータ)正規形にした場合と同じルールで一番良い形にするのが自然な発想
  • で、f(x)xに値を代入して「よい形」にすることをベータ簡約と定めた後で、関数を組み合わせたときの正規形作成もそれと同じルールにしたという発展の歴史のため??に「ベータ正規形」と言うらしい