言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

コンビネータと生成文法

ちょっと偉そうに書いてますけどコンビネータとは何かについて知ってる事を書きます。コンビネータとは、

女 男 -> 子供 子供 子供

のように二つの物がくっついて何かが生まれるという単純なルールを元に行う算術です。くっつくのは二つと決まってますが、生まれるのは何個でも良いです。これを組み合わせる事で、我々が計算と呼ぶもの全てを表現出来るそうです。くっつく時に見る事が出来るのは隣の人だけなので、先ほど線形論理の挙げた制限が生まれます。一人の人と同時に二人がくっつく事は出来ないし、生まれたら親は死にます。親と同じ子供を生む事はアリです。

これは中学生の時に習う関数の箱の比喩を使うと、左側の記号が一般に関数で、右が引数です。入れた物が変形して外に出てくる事は同じですが、箱ごと壊れてしまう事がちょっと違います。観測したら変化してしまう量子論のイメージに近いです。一度しか履けないカール・ルイスの靴にも似ています(歳を感じる発言)。

一方話は変わって生成文法という物があります。大体プログラミング言語は生成言語で定義するわけですが、大まかに言ってこういうものです。

文 -> 主語 は 目的語 を 述語
主語 -> あなた
主語 -> 私
主語 -> 主語 と 主語
目的語 -> 私
目的語 -> ネコ
目的語 -> 目的語 と 目的語
述語 -> 殺す

これも変数の無い単語の置き換えと考えるとコンビネータに似てるのです。違いは生成文法では何通りかに変換の可能性がある事です。『あなたは私とネコを殺す』。では殺されるのがネコだけなのか私もなのか気になって眠れません。コンビネータでは変換のやり方は一つしか無いです。果たして生成文法コンビネータの間に何か関係があるのかと言う事を書こうとしたのですが、眠いので辞めます。