Visulan、その可能性

この記事は Independent Advent Calendar 2015 の記事です。

Visulan 自体の解説については id:dagezi さんによる「マイナー言語 Advent Calendar 2013」の参加エントリー「Visulanを実装している話」( http://dagezi.hatenablog.com/entry/2013/12/15/040425 )を参照してください。ここでは、私がどのあたりに魅力を感じているか、という点を示してみたいと思います。

まず、コンピュータについての教育の根本的(ファンダメンタル)な部分として、プログラミングの教育があるべきだ、という点について、私はほぼ、Viscuit の原田 康徳さんの「プログラミングを学ぶべきたった一つの理由 - ビスケットのあれこれ」に賛同しています。そして話は少し飛びますが、Viscuit にグリッド的なものがないのは(Viscuit の基本的なコンセプトとしてアナログ的な所があるわけですが)、拡張機能として考えがないわけでもないとのことでしたが、ある程度大規模にシステマティックなものを作ろうとすると壁になるでしょう。

私の想像ですが、Viscuit があえてそのような設計にしているのは、Visulan が既にあるからではないかと思います(名前も似てますね)。というわけで、以下では「Visulanらしい」プログラムを紹介します。

実装としては、前述の id:dagezi さんによるウェブアプリが http://dagezi.github.io/visulan-js/public/index.html にありますので、それを利用させていただくことにします。URLの # 以下で、プログラムを入力することもできます(「Link」というボタンを押せば、URL文字列として出てきます。JavaScriptですので、基本的に手元のブラウザ内で動いていることになります)。なお、Visulan には「3D-Visulan」という実装(名前の通り3次元に拡張されている)もあります( http://www.vector.co.jp/soft/win95/prog/se026552.html )。3D-Visulan は ICC でアートとして展示されたこともあり( http://ascii.jp/elem/000/000/331/331422/ )、プログラミング言語そのもの自体が美術になりうる、ということの実現可能性もまた Visulan にはありますが、ここではそちらにはあまり深く踏み込みません。

セルラーオートマトン

ひとつめのサンプルは、セルラーオートマトンです。頑張ればライフゲームのような2次元のものも作れそうな気もしますが、もしかするとライフゲームライフゲームを実装する(ライフゲームの世界8 http://www.nicovideo.jp/watch/sm19509968 で解説されています)のに近い手の込んだことが必要になるかもしれません。

ここでは1次元のセルラーオートマトンで、(自明なものを除くと)最も単純で簡単だと思われる「ルール90」を実装してみました。

隣のパターンと干渉するため、3段階に分けて次の世代を生成しています。おおざっぱに各段階を説明すると次のような感じになりますが、全く「見たまま」という言葉通りですから、実物をよく見たほうが理解が早いかもしれません。

  • ある世代の白の「生きている」セルから、次の世代の計算のために、左右に水色と赤のパターンを分配する
  • 水色のパターンと赤のパターンから、「そこから前の世代を見ると左右両方が生きている」=黄色、「左右の片方が生きている」=青と紫、というパターンを作る
  • 青と紫のパターンから、次の世代のセルを作る。この時、黄色が存在すると(その場合、ルール的にその場所のセルは生存にならないので)白のセルの生成が防がれる

という感じで、ルール90を実装しています。

リンクはこちらになります(左上の「Play」というボタンの操作で動きます) http://dagezi.github.io/visulan-js/public/index.html#comp/Po1_AxhO38MUi1kkhzXs93_BhRWo-KaAXmFWrXfKlMFdC-fR510-qQBbAATo1Lcx4hIzLgREuRNlJF8lR2WTVmrlIJh1Wg3CmCQfSCeBm9hm0tGiAHg569bb2Dumv3P-7X2-BgEegYGeeNahPlKgVqYiwVHyMaIARqkumUmG4biR2TaJ7AU59EUl2qS6fhWaxqQWmeW1ZTXQAC7tTS1auTj5PcmtgyrNNSPifXlZE9xSXaQLrmOzDOOoNKgrqyHoRN47lXTbhzLDp5xT_TMXaCkgqSKPB7f-6yCbL6_IV9hf34htidXkCAcdzmC7ODIT8ITC1tD4RpEUijHDUcU7hiEW9sbtcXjMbDCUSlMRyRTKVTrliSTBIEAA

「夢の」O(n)ソート

「夢の」とカッコを付けているのは(現状では非常に突破困難なブレークスルーが可能なことを前提としている)夢のSSTO(単段軌道宇宙船)みたいな意味で、ここでは、Visulan 自身の実行のために2次元のパターンマッチが必要なこと(いろいろ高速化手法はありそうですが)を意識しています。スパゲティソート(がO(1)だ、という主張)のようなイメージだと思ってください。

このサンプルは最初に示した id:dagezi さんによる解説からリンクがある原文献に例示があるものですが「Visulanの可能性」のひとつをわかりやすくデモできるもののひとつではないかと思います。これを「ソート」と言っていいのか、いわゆる「比較によるソート」ではない点はともかく途中経過ではデータとして不整合があることなど、微妙な点もありますが、初期状態と最終状態を見る限りではちゃんとソートになっていますし、考え方としては交換ソートを目一杯並列化したものと見ることもできるように思います。

リンクはこちらになります http://dagezi.github.io/visulan-js/public/index.html#comp/Po2jGZdO38MUslxvZYHs93_BhRxGI4AXlsOZpsvQ401LTmcx51ywnd_wMR8YwwWPFV4oiTK7SUMSrIFLm8iIuUJV8HY3XtoerVGObQZizynnTdseUeIdT2HoOT7XkJY6PfVha-7ry2YHqUAQz-zuHB1nDSZi6R3tGuunFwITZGYU4RfhluKYXU5YaJYYE-qapR2cWKqdRNSi2esEnhPlkdDSVRBbVlHR7dQRWtdZPVpjGNFQvl7VPjNRnDIytByeb-e9Ptm0trob21k_XD16s1fcs9B8f1p67rF9OXLzPbU_9XR5WZ7bOpgypdDauG4HHZ_FzNI6aEFfcGRJQfKYLGExGbYnpGdFNXoo3ErcGdERQ45HMlE6EkgEFIEk2Go5nkiFUi4g5m88n4nYRekE-kvdmcynQOg_dG0m60nlw0GPVakvmtSWY2W4554tlqt58hEC6EamFc6WBPXGumKt5GkXWm3suVs7UjXl6oUGlUCpF3G1E-VIqUJHW22Finkc4NRmNByOhj3yyN0_kSsVkpaJpPu85m72J01bXUlstpr1RhYfQtVosh8WV2NZov1y3WOvVl1ZnNu4st3Op_O5Lu6nuNlW5_vD6e89bYuf8oNTofNpfz0KLjc49Wttuzne4hdjuflwuHitHtcn_fT89Ns_r6_UW-Xlf71cD69Pt8_sE9s-QE_q-W7AQ2353v-R6gTY44wVB8HQdBsFVEhG4PvWyH_qhkLYQBa74dht4oYh4FEUGJE4WRNEUZRvB0e-tF0Xq4wkOxHGcVxeC5CYfFMOAQAAAA==