アドベントカレンダーです。
前年まで違う会社にいたので、こういうのに参加するのは初めてで、勉強会で発表しようと準備していた記事の中からSchemeの実装の解説を引き出そうとしていたのですが、編集が間に合いそうにないので、以前社内の勉強会で発表しようとして作った別の記事から、新しいプログラム言語と処理系を紹介させていただきましょう。
ロジバンの紹介
今回発表する言語はロジバンという言語です。
聞いたことがないかもしれないので、まずはその紹介からです。
ロジバンというのは、元々、基本的に人間が話すために作られた人工の言語です。
最初はサピア=ウォーフの仮説という言語学上の問題を検証するために作られた言語ですが、元々言語学者が作った下敷きからスタートしているので、色々と面白い性質があります。
例えば下の様な感じです。
- 音中心で設計されていて、同音異義語が原理上存在しない
- 文法が厳格に決められていて、構造に曖昧さが表れない
- 一階述語論理をベースに組み立てられている
- 文化非依存
この様な性質を持っていることから、ロジバンで話しかけたり、書かれたりした文は、命題としてプログラムが実行可能という性質を持っています。
特に日本語や英語では根本に持っている構造的な曖昧さが発生しないというのが大きくて、日本語では解析不可能な長文でもプログラムとして扱えるため、コンピューターと人間がプログラムを口述で伝達出来る可能性を持っています。
ロジバンで話したものをテキストに変換するところはまだ研究中で、完成品は見かけませんが
ロジバンの文章をプログラムとして実行してくれる処理系は既に存在していますので、その一つ、簡単な方という意味で
cakyrespaサイトを紹介させて頂きます。
実装の紹介
cakyrespaは、ロジバンの文章をプログラミング言語のLOGOと同じ様に処理してくれる実装です。
実際cakyrespaもロジバンで「亀」を表す言葉で、LOGOのアイコンである亀に倣って命名されています。
作者はshinjuku.hsの主催の重城良国さん。
これ自体も、Haskellで実装されています。
動かし方は、ページにある「cakyrespa-0.0.29.exe」、「glut32.dll」の2つのファイルをダウンロードして同じディレクトリに置いてから「cakyrespa-0.0.29.exe」を実行してください。
- ロジバンを入力するためのウインドウ
- 画面中央にカメのアイコンが表示されているウィンドウ
この2つが表示されます。
このソフト自体は実際に動かしてみるのが簡単です。
ロジバンを入力するウィンドウに、命令を順番に打ち込んでいくだけですので
上のページにあるRun1から解説をしていきましょう。
Run1解説
以下のロジバン文を順番に打ち込んで見ます。
「ko」という単語が命令文を作っていると、最初は解釈するといいでしょう。
.i ko crakla
.i ko carna
.i ko crakla
.i ko carna
.i ko crakla
.i ko carna
.i ko crakla
.i ko carna
.i co'o
これを実行してみた結果を、下に動画で表示しましょう。
途中で入力ミスとかもしていますが、ロジバン文を打ち込むたびに画面に反映されている様子が分かると思います。
意味が分からないという人のために訳を付けるとこんな感じ
.i ko crakla
進め
.i ko carna
回れ
.i ko crakla
進め
.i ko carna
回れ
.i ko crakla
進め
.i ko carna
回れ
.i ko crakla
進め
.i ko carna
回れ
.i co'o
さようなら
.i: 句読点の意味。文章の最初に付ける、ko: 命令、crakla: 進む、carna: 回る
Run1.5解説
Run1でこの処理系の意味自体は分かったと思いますが、正直Run1の様にイチイチ簡単な命令を打ち込んでいるとかなり面倒くさいだけというのは、すぐに分かりますね。
Run1.5ではその省略記法を紹介されています。
.i lo nu ko ba gi crakla gi carna cu rapli li vo
実行結果は下の動画を見てください。
訳は下の様になっています。
.i lo nu ko ba gi crakla gi carna cu rapli li vo
[進んで回る]を4回繰り返す
単語帳:
lo: 前置詞、nu ~kei: 命題を囲う括弧、ko: 命令、ba: 未来時制(be going toに近い)、gi: 論接続詞、cu: ここまでが主語であるのを示すマーク、rapli: 繰り返す、li: 数字開始の符号、 vo: 4
Run1に比べると大分自然言語の様な自然な短さになってきたのが分かるでしょうか?
これを見ると、ロジバンでこの実装をした意味が大分分かってくるのではないでしょうか?
実際、ベースになったLOGOは、英語以外の各言語で教育向けに実装がなされていたりします。
作者さんもそれを分かって実装されたのでしょう。
他にも、LOGOから色々な機能を移植されているので、以下の様な長文を作ることでもっと複雑なこともできます。いきなり長文をぶちまけられて「こんなの読めね~よ。ウ”ァーカ!!(#^ω^)」とか感じるかもしれませんが、すぐ訳を出すので進めてください。
.i tu'a ko galfi lo foldi lo blanu
.i ko cisni li pa
.i ko cisnygau lo foldi li jo'i vonono boi civono
.i ko na pilno lo penbi
.i ko rixykla la'u li renono
.i ko carna fi lo pritu
.i ko crakla la'u li pavono
.i ko pilno lo penbi
.i ko co'a clugau
.i lo nu ko ba gi crakla la'u li vonono gi carna cu rapli li vo
.i ko co'u clugau
.i ko bagi carna gi crakla la'u li cimuno
.i ko carna
.i ko pilno lo burcu poi blabi
.i ba gi ko co'a clugau gi ba gi lo nu ko ba gi crakla la'u li muno gi carna cu rapli li mu gi ko co'u clugau
.i ko bagi rixykla la'u li pamu gi carna la'u li xano fi lo pritu
.i ko pilno lo burcu poi xunre
.i bagi ko co'a clugau gibagi lonu ko bagi crakla la'u li bino gi carna la'u li pareno cu rapli li ci gi ko co'u clugau
.i ko napilno lo penbi
.i ko klama li jo'i panono boi panono
.i ko pilno lo penbi poi pelxu
.i ko morji star.bu goi lonu bagi ko pilno lo penbi gibagi lonu ko bagi crakla la'u li pamu gi carna la'u li pavovo cu rapli li mu gi ko napilno lo penbi
.i ko gasnu star.bu
.i ko klama li jo'i ni'u muno boi muno
.i ko pilno lo burcu poi pelxu
.i bagi ko co'a clugau gibagi lonu ko bagi crakla la'u li papa gi carna la'u li pano cu rapli li cixa gi ko co'u clugau
.i na viska ko
.i ko rejgau me'e zoi py. night.svg .py. setai la syvygyd.
.i ko rejgau me'e zoi py. tarci.ckr .py. setai la cakyrespa.
.i co'o
出来るだけサンプルコードにある機能をたくさん組み込もうと思って作ったので
少し複雑ですが、訳は以下の通りになります。
.i tu'a ko galfi lo foldi lo blanu
(全体)領域を青で塗りつぶせ
.i ko cisni li pa
(カメの)サイズは1
.i ko cisnygau lo foldi li jo'i vonono boi civono
[400,340]の領域(サイズ)にしろ
.i ko na pilno lo penbi
ペンを使うな
.i ko rixykla la'u li renono
200バックしろ
.i ko carna fi lo pritu
右に(90度)回れ
.i ko crakla la'u li pavono
140進め
.i ko pilno lo penbi
ペンを使え
.i ko co'a clugau
塗り始めろ
.i lo nu ko ba gi crakla la'u li vonono gi carna cu rapli li vo
[400進んで回転する]を4回繰り返せ
.i ko co'u clugau
塗り終われ
.i ko bagi carna gi crakla la'u li cimuno
(90度)回って350進め
.i ko carna
(90度)回れ
.i ko pilno lo burcu poi blabi
白のブラシを使え
.i ba gi ko co'a clugau gi ba gi lo nu ko ba gi crakla la'u li muno gi carna cu rapli li mu gi ko co'u clugau
塗りはじめて、[50進んで(90度)回るを5回繰り返して]、塗り終われ
.i ko bagi rixykla la'u li pamu gi carna la'u li xano fi lo pritu
15バックして、右に60(度)回れ。
.i ko pilno lo burcu poi xunre
赤のブラシを使え
.i bagi ko co'a clugau gibagi lonu ko bagi crakla la'u li bino gi carna la'u li pareno cu rapli li ci gi ko co'u clugau
塗り始めて、[[80進んで120(度)回る]を3回繰り返して]、塗り終われ
.i ko napilno lo penbi
ペンを使うな
.i ko klama li jo'i panono boi panono
座標[100,100]に移動しろ
.i ko pilno lo penbi poi pelxu
黄色のペンを使え
.i ko morji star.bu goi lonu bagi ko pilno lo penbi gibagi lonu ko bagi crakla la'u li pamu gi carna la'u li pavovo cu rapli li mu gi ko napilno lo penbi
[ペンの使用を開始して、[15進んで144(度)回るを5回繰り返し]、ペンの使用を終了]を'star'として記録しろ
.i ko gasnu star.bu
'star'を実行しろ。
.i ko klama li jo'i ni'u muno boi muno
座標[-50,50]に移動しろ
.i ko pilno lo burcu poi pelxu
黄色のブラシを使え
.i bagi ko co'a clugau gibagi lonu ko bagi crakla la'u li papa gi carna la'u li pano cu rapli li cixa gi ko co'u clugau
塗り始めて、[[11進んで10(度)回る]を37回繰り返して]、塗り終われ
.i na viska ko
(カメを)消せ。
.i ko rejgau me'e zoi py. night.svg .py. setai la syvygyd.
「night.svg」のファイル名でSVG形式で保存しろ。
.i ko rejgau me'e zoi py. tarci.ckr .py. setai la cakyrespa.
「nicte.ckr」のファイル名でcakyrespa形式で保存しろ。
co'o
終了しろ。
単語帳:
no: 0、pa: 1、ri: 2、ci: 3、vo: 4、mu: 5、xa: 6、ze: 7、bi: 8、so: 9、tu'a: 抽出 (~をなんとかすること)、 galfi: 変換する 、foldi: 領域、 blanu: 青、cisni: サイズ、 pilno: 使う、 penbi: ペン、 cisnygau、jo'i: ベクトル開始 boi: 区切り点、 rixykla: バック、 la'u: 冠詞(複数形)、pritu: 右、co'a: 開始、clugau: 満たす(塗る)、co'u: 終わる、burcu: ブラシ、 poi: 左右の語を結びつける単語、blabi: 白、xunre: 赤、na: 否定(not)、pelxu: 黄色、viska : 見る(表示する)、rejgau : 保存する、setai: 形式、syvygyd: SVGのロジバン訛り
実際に入力した結果のnight.svgはこんな感じになります。
先ほどのコードを保存して、再度実行した結果を動画にしました。
何故が表示領域のサイズ調整がうまく反映されないのですが、他は動作しています。おそらくはバグなのでしょう。
打ち込んだロジバン文とその動きが良くわかります。
ここまで書くのでもそれなりに長いですが、様々な事ができるのは理解していただけたかな、と自分で勝手に思いました。
実際に書くときは入力が大変面倒くさいので、失敗をしたときは以下のコマンドで手順を戻したり
ko xruti
(一手順)戻れ
単語帳:
xruti: 戻る
ファイルを保存したり読み出したりして行うと幸せだと思います。
.i ko rejgau me'e zoi py. tarci.ckr .py. setai la cakyrespa.
「nicte.ckr」の名前で、cakyrespa形式で保存しろ。
.i ko tcidu la me zoi py. tarci.ckr .py. setai la cakyrespa.
「nicte.ckr」を、cakyrespa形式で読み込め。
単語帳:
rejgau: 保存、me'e: ~という名前、zoi: 外来語を表す符号、py. 何語で話しているかを示す符号、setai: 形式、tcidu: 読む、me: 名詞を動詞に変える符号
まとめ
とりあえずロジバンが自然言語と違って、長文をプログラムとして実行可能である、というその特性は理解していただけたのではないでしょうか?
今回は1回のみの講座になってしまっているので、超速で紹介のみをしてしまいましたが、正直解読が大変なのでこれだけだと敷居が高いし、何処かで、ワンステップごとにきちんと解説したいなぁ…。
勉強資料
ロジバンを勉強したい場合は、次の資料がオススメです。
- はじめてのロジバン - 初心者はまずここから
- camxes.js - 文法チェッカー
- ロジバン大全: The Complete Lojban Language 日本語抄訳 - 完全な文法の資料、はじめてのロジバンを学習した後がオススメです
- vlasisku - オンラインロジバン辞書。英語ベースですが検索制度も高くわからない単語が出た時はオススメです
個人的に学習した感じでて、まずはじめてのロジバン、を読んで、例文をcamxes.jsに打ち込みながら文法に慣れて、例文がもっと欲しくなった場合、実際にロジバンで書かれた作品を訳してみるのが現状の一番楽な解でしょうか。
いうほど楽ではないですが、注文の多い料理店とかの古典の名作が、対訳が安定して手に入るので、オススメです。te gerna la lojbanにたくさんありますが、どの作品としてどれが一番おすすめかは、私もまだ出せないです。
文章だけでなく、発音を勉強したいときは唯一の日本語ロジバン講座 ko lojbo .iu ロジバン入門がオススメです。
さて、ロジバン教材は、いろんなところに散らかっていますので、個人的には迷わないで学習するには、上のリンク中心が効率的ですが、さらに学習を進めたい時は、下のリンクからさらにある資料をどうぞ
それでは、一人でもロジバンに興味を持ってくれる人が増えましたら幸いです。
co'o(さようなら)