最近、「裂けてるさけるチーズを裂けて避けるチーズが載ってる裂けてる地図を裂けて避けるチーズ」が話題になりました。
togetter.com
「さけるチーズを避けるチーズ」において、チーズがさけるチーズを避けた結果、残るのはチーズ。
「さけるチーズを避けるチーズを避ける地図」において、さけるチーズとチーズが避けられた結果、残るのは地図。
では「裂けてるさけるチーズを裂けて避けるチーズが載ってる裂けてる地図を裂けて避けるチーズ」の「事の果て」には、何が残るのか?
この記事では、そのような疑問を追うこと、つまりさけるチーズや地図が従う法則を追う行為によって、チューリング完全な純粋関数型言語「さけるチーズ」を構成します。
(具体的には、Lazy Kと呼ばれる言語に束縛変数を導入することでラムダ計算風にし、自然言語的に意味が通るように中置記法に改めたものです。)
例えば以下は、さけるチーズで記述した素数を無限に出力し続けるプログラムです。
「さけるチーズを避ける「「裂けてるチーズ」と「裂けてるチーズ」と「「さけるチーズを避ける「「「さけるチーズを避ける「「裂けてるチーズ」と「裂けてるチーズ」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「チーズとさけるチーズと地図のある地、伊豆」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」のある地、伊豆」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「「さけるチーズ を避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「裂けてるチーズ」と「裂けてるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「裂けてるチーズ」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」 と地図のある地、伊豆」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と地図のある地、伊豆」と「「「裂けてるチーズ」と「裂けてるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と地図のある地、伊豆」のある地、伊豆」「に捧げる「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」のある地、伊豆」」と「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」 」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「「裂けてるチーズ」と「さけるチーズを避ける「「「「「「チーズとさけるチーズと地図のある地、伊豆」と「さけるチーズを避けるチーズ」と「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」のある地、伊豆」と「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」のある地、伊豆」「「に捧げる「「さけるチーズを避ける「「「裂けてるチーズ」と「さけるチーズを避ける「さける チーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」」に捧げる「さけるチーズを避ける「さけるチーズを避けるチーズ」」」」と地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「裂けてるチーズ」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」」と地図のある地、伊豆」と 地図のある地、伊豆」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「裂けてるチーズ」とさけるチーズと地図のある地、伊豆」」と「「チーズとさけるチーズと地図のある地、伊豆」と「「裂けてるチーズ」とさけるチーズと地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」」と地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」」と地図のある地、伊豆」と地図のある地、伊豆」」と地図のある地、伊 豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」のある地、伊豆」」と「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「さけるチーズを避ける「「さけるチーズを避ける「「「裂けてるチーズ」と「さけるチーズを避ける「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と地図のある地、伊豆」」と「「「裂けてるチーズ」と「裂けてるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と地図のある地、伊豆」のある地、伊豆」と地図のある地、伊豆」」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「さけるチーズを避 けるチーズ」と地図のある地、伊豆」」とさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「裂けてるチーズ」と「裂けてるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」のある地、伊豆」「に捧げる「「裂けてるチーズ」と「裂けてるチーズ」と「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」と「さけるチーズを避ける「裂けてるチーズ」」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「チーズとさけるチーズと地図のある地、伊豆」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊 豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「裂けてるチーズ」とさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「さけるチーズを避ける「さけるチーズを避けるチーズ」」とさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「裂けてるチーズ」と「裂けてるチー ズ」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」と「さけるチーズを避ける「裂けてるチーズ」」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「「裂けてるチーズ」と「裂けてるチーズ」と「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「さけるチーズを避ける「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけ るチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「裂けてるチーズ」とさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」」とさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「さけるチーズを避ける「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」」と「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」」と地図のある地、伊豆」と地図のある地、 伊豆」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「「さけるチーズを避ける「さけるチーズを避けるチーズ」」とさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「裂けてるチーズ」と「裂けてるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「さけるチーズを避ける「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」」」と地図のあ る地、伊豆」と地図のある地、伊豆」のある地、伊豆」」と「「さけるチーズを避ける「「裂けてるチーズ」と「裂けてるチーズ」と地図のある地、伊豆」」と「「さけるチーズを避ける「「さけるチーズを避ける「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」」とさけるチーズと地図のある地、伊豆」」と「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける「さけるチーズを避けるチーズ」」と「「裂けてるチーズ」と「さけるチーズを避ける「「さけるチーズを避ける「「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「さけるチーズを避ける「「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避けるチーズ」」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「「さけるチーズを避ける 「さけるチーズを避けるチーズ」」と「「裂けてるチーズ」と「裂けてるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と地図のある地、伊豆」と「さけるチーズを避ける「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」」と地図のある地、伊豆」」と地図のある地、伊豆」と地図のある地、伊豆」のある地、伊豆」「「に捧げる「「「さけるチーズを避ける「チーズとさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」と「裂けてるチーズ」と地図のある地、伊豆」」に捧げる「「裂けてるチーズ」と「裂けてるチーズ」と「「さけるチーズを避ける「「さけるチーズを避ける「「「裂けてるチーズ」と「さけるチーズを避ける「さけるチーズを避ける「裂けてるチーズ」」」と地図のある地、伊豆」とさけるチーズと地図のある地、伊豆」」と「さけるチーズを避けるチーズ」と地図のある地、伊豆」」と「「裂けてるチーズ」と「 裂けてるチーズ」と地図のある地、伊豆」と地図のある地、伊豆」のある地、伊豆」」」」
(The Lazy K Programming LanguageのSample Codeをさけるチーズに変換しました。)
このチーズ達の「せめぎ合い」の果てに何が残るのか、それを探す過程が素数を求める事に対応するのです。
さけるチーズはチューリング完全であるため、これほど単純な文法を持ちながら、素数計算に限らず、計算機上で実行できるいかなる計算も実行することができます。
自然数すら現れないこのコードで、なぜ素数が計算できるのか…?本当にそうなのか?という疑問に答えるため、この記事では上記のコードを実際に実行するために必要なツールを用意しました。「さけるチーズ」は「Lazy K」と呼ばれる言語をベースにしているため、今回はさけるチーズ → Lazy K 翻訳器と Lazy K → さけるチーズ翻訳器を構成しました。上記のコードを実際に実行するには、翻訳器によってさけるチーズをLazy Kに翻訳し、Lazy Kインタプリタ(たとえば http://lazy-k.appspot.com/ など)を使用して下さい。(インタプリタ作成は今回は割愛しました。)翻訳器はGitHub - woodrush/ski2cheese: 純粋関数型言語「さけるチーズ」とLazy Kの相互翻訳器に載せています。
では、さけるチーズとはどのような言語なのでしょうか。
さけるチーズにおける4つの法則
世の中には数多の言語が存在し、それぞれ複雑な構文や規則を持っています。しかし、さけるチーズに存在するのはたった4つの構文です。
それは、
1. 「さけるチーズを避けるチーズ」
2. 「裂けてるチーズ」
3. 「Xに捧げるY」
4. 「チーズとさけるチーズと地図のある地、伊豆」
の4つです。
そしてこの言語の唯一の原則は、以上の語句が現れたタイミングで、自然の摂理に従った置き換えを行うという事です。
第一法則:さけるチーズを避けるチーズ
さけるチーズを避けるチーズ pic.twitter.com/RiBCo7SCNO
— ぽかり氏 (@riricc1998) March 5, 2016
まずは「さけるチーズを避けるチーズ」。
「Yを避けるX」という語句が現れたら、「X」に置き換えます。
なぜならば、YはXに避けられ、結果としてXが残るからです。これが第一の法則です。
例えば
「「Yを避けるX」を避けるZ」を避ける「Aを避ける「Bを避けるC」」
という構造物は、第一の法則に従って
「「Yを避けるX」を避けるZ」を避ける「Aを避ける「Bを避けるC」」 = 「Aを避ける「Bを避けるC」」 = 「Bを避けるC」 = C
のように変形できるため、「「Yを避けるX」を避けるZ」を避ける「Aを避ける「Bを避けるC」」の実行結果(評価結果)はCという事になります。
第二法則:裂けてるチーズ
@riricc1998 さけるチーズを裂けて避けるチーズ pic.twitter.com/MTKD47tnBW
— びすますですぷらとぅーん (@BismuthForever) March 5, 2016
続いて、「裂けてるチーズ」です。
「裂けてるX」という語句が現れたら、「X」に置き換えます。
なぜならば、裂けたXはやがて自らの力で修復され、元に戻るからです。これが第二の法則です。
例えば、
「「Yを避けるX」を避けるZ」を避ける「裂けてる「Aを避ける「「裂けてるB」を避ける「裂けてるC」」」」
は、第一・第二の法則を合わせて
「「Yを避けるX」を避けるZ」を避ける「裂けてる「Aを避ける「「裂けてるB」を避ける「裂けてるC」」」」 = 「裂けてる「Aを避ける「「裂けてるB」を避ける「裂けてるC」」」」 = 「Aを避ける「「裂けてるB」を避ける「裂けてるC」」」 = 「裂けてるB」を避ける「裂けてるC」 = 「裂けてるC」 = C
となり、「「Yを避けるX」を避けるZ」を避ける「裂けてる「Aを避ける「「裂けてるB」を避ける「裂けてるC」」」」の実行結果はCとなります。
第三法則:Xに捧げるY
さて、ここで事態は少し複雑になります。
この構文を説明する前に、この世界(言語)に関する重要な定めについて話す必要があります。それは、この世界には触れてはならぬ禁断の者が3人存在するということです。彼らはすなわち、「さけるチーズ」「チーズ」「地図」です。
そして実は、先ほどの第一、第二の法則、そして続く第四の法則では、これら禁断の者本人が存在する場合、置き換えを行ってはなりません。
例えば、
「Aを避ける「Bを避けるチーズ」」 = 「Bを避けるチーズ」 ≠ チーズ (※禁断の者を含む構造物を変形してはいけない!)
と変形されます。
まず、一行目から二行目の変形は許されています。「Bを避けるチーズ」は禁断の者本人ではないため、「Aを避ける「Bを避けるチーズ」」は変形が可能なのです。
しかし、第二行目において「チーズ」は禁断の者であることから、これ以上変形ができません。
同様に、
裂けてる「「裂けてるチーズ」を避ける「Aを避ける「「裂けてるチーズ」を避けるチーズ」」」 = 「裂けてるチーズ」を避ける「Aを避ける「「裂けてるチーズ」を避けるチーズ」」 = 「Aを避ける「「裂けてるチーズ」を避けるチーズ」」 = 「裂けてるチーズ」を避けるチーズ ≠ チーズ (※禁断の者を含む構造物を変形してはいけない!)
のようになります。最後の一つ手前の行では、構造物が禁断の者チーズを含んでいるためこれ以上変形できません。
さて、ここで「Xを捧げるY」という構文が登場します。
「Xを捧げるY」は、「Xに含まれる最強の禁断の者を、Yで置き換える」という規則です。
禁断の者たちの強さの順番は、禁断の者の強さの順は「チーズ>さけるチーズ>地図」となっています。
例えば、
「さけるチーズを避けるチーズ」に捧げるXに捧げるY = 「さけるチーズを避けるX」に捧げるY = 「Yを避けるX」 = X
となり、この構造物の値はXとなります。
また、
「Aを避ける「Bを避けるチーズ」」に捧げるX = 「Bを避けるチーズ」に捧げるX = 「Bを避けるX」 = X
となります。
1行目から2行目の変形では、第一項(「Aを避ける「Bを避けるチーズ」」)の最上層部には禁断の者は存在しないため、「に捧げるX」は発動しません。
第二項内部の第二項「チーズ」は、1行目の最上層には存在しないため、禁断の者としてカウントされません。
しかし2行目にたどり着くと、第一項(「Bを避けるチーズ」)が変形できない形になっています。
ここで、「に捧げるX」という構文によって、2行目から3行目にかけて禁断の者チーズがXに置き換えられました。
そして第一の法則によって、最終的にこの値はXとなっています。
また、捧げ物同士で捧げあってはいけません。例えば、
「さけるチーズを避けるチーズ」に捧げるXに捧げるY = Yを避けるX (※正しい変形) 「さけるチーズを避けるチーズ」に捧げるXに捧げるY ≠ 「さけるチーズを避けるチーズ」に捧げる「Xに捧げるY」 (※間違い!) = さけるチーズを避ける「Xに捧げるY」 (※結果が正しい変形の場合と異なってしまっている)
ということです。(つまり、「〜に捧げる」は左結合な演算子です。)
(補足)
禁断の者を、以下のように空欄で置き換えると、この法則が明快になります。
「裂けてる「「裂けてるチーズ」を避ける「さけるチーズを避ける「さけるチーズを避けるチーズ」」」」に捧げるXに捧げるY ↓ 「裂けてる「「裂けてる__1」を避ける「__1を避ける「__2を避ける__1」」」」に捧げるXに捧げるY
この構造物は、
「裂けてる「「裂けてる__1」を避ける「__1を避ける「__2を避ける__1」」」」に捧げるXに捧げるY = 「「裂けてる__1」を避ける「__1を避ける「__2を避ける__1」」」に捧げるXに捧げるY = 「__1を避ける「__2を避ける__1」」に捧げるXに捧げるY = 「Xを避ける「__2を避ける__1」」に捧げるY = 「__2を避ける__1」に捧げるY = 「__2を避けるY」
と変形されます。
つまり、禁断の者に関するルールは、最上層に空欄が存在する構造物は変形してはいけないという事になります。
第四法則:「チーズとさけるチーズと地図のある地、伊豆」
さて、この法則がさけるチーズにおいて最も複雑な法則になります。
神聖なる地、伊豆では、古来から物を捧げる文化が発達してきました(要出典)。
そんな伊豆にまつわる第四の法則における変換規則は
「XとYとZのある地、伊豆」 = Xに捧げるZに捧げる「Yに捧げるZ」
です。
例えば、
「「さけるチーズを避けるチーズ」と「さけるチーズを避けるチーズ」と「裂けてるチーズ」のある地、伊豆」 = 「さけるチーズを避けるチーズ」に捧げる「裂けてるチーズ」に捧げる「さけるチーズを避けるチーズ」 = 「さけるチーズを避ける「裂けてるチーズ」」に捧げる「さけるチーズを避けるチーズ」 = 「「さけるチーズを避けるチーズ」を避ける「裂けてるチーズ」」 = 裂けてるチーズ
となり、答えは「裂けてるチーズ」となります。
さけるチーズによるプログラミング
さけるチーズの全ての文法が出揃った所で、さけるチーズによる実際のプログラミング方法を解説しながら、さけるチーズで実際にプログラミングが可能であることを示したいと思います。
具体的には、
- 自然数の表現
- 加算と累乗
- リストの表現
- Hello, World!プログラム
を扱います。
続きは、次の記事で!
woodrush.hatenablog.com
参考文献
裂けてるさけるチーズを裂けて避けるチーズが載ってる裂けてる地図を裂けて避けるチーズ - Togetterまとめ
The Lazy K Programming Language (素数出力プログラムの出典)
究極の関数型言語による至高のHello, world! - Life Goes On
404 Blog Not Found:Math - 言語はどこまで小さくなれるか - (unlambda|iota|jot) のすすめ
Lazy K Playground - iroriの日記
Lazy K Playground
Lazy K - Wikipedia
Combinatory logic - Wikipedia, the free encyclopedia
B,C,K,Wシステム - Wikipedia
Lazy aKari:わぁいLazy K あかりLazyKインタプリタだいすき | ψ(プサイ)の興味関心空間
The SKI Combinator Calculus a universal formal system