私が気にする100の事象

気にしなければ始まらない。

ロジバンをプログラミング言語として扱ってみる

ロジバンをプログラミング言語として扱ってみる

coi ro do
(こんにちは、みなさん。)
.i mi'e la .skaitomon.
(私は skytomo です。)
.i .ai mi ciksi la .lojban. ro do ma'i lo samplabau ca lo cabdei
(今日は私はロジバンをみなさんにプログラミング言語的に説明していきます。)

ロジバンって何なのさ

ロジバンという言語を聞いたことがない人に説明すると、 「ロジバンとは、思考・表現における話者の自在性・中立性を目指すための論理的な人工言語のことです。」 といった感じになります。 どういうことかもう少し詳しく説明します。

サピアさんとウォーフさんが、「どんな言語でも、現実世界は正しく把握できるものか?」といった疑問を呈しました。 言い換えると「言語は現実世界における認識を歪めてしまうのか?」という意味でもあります。 これはサピアさんとウォーフさんが出した仮説なので、サピア=ウォーフの仮説と呼ばれています。

もし、このサピア=ウォーフの仮説が正しいとして、 言語の現実世界における認識を歪めてしまう原因を取り払った言語を作ってしまえば、 それによりその言語の話者の心は古来の言語によって妨げられていた考えから解き放たれ、 個人の思考と人間文化の発展ができるのではないか?、と。*1

そこから紆余曲折あって、1990年代後半から2000年代前半にかけて、 「ロジバン」という思考・表現における話者の自在性・中立性を目指すための論理的な言語が作られました。

ロジバンはプログラミング言語なの?

いいえ。ロジバンはプログラミング言語ではありません。 ロジバンは相手とコミュニケーションを取るための言語であるため、人間と会話するための言語でもあります。 逆に言うと、コンピュータとコミュニケーションを取ることも考慮している言語でもあります。 そのため、プログラミング言語のように論理的な人工言語に近く、 プログラマーが学びやすい外国語でもあるのではないかと思い今回こういう記事を作りました。

プログラマーのためのロジバン入門といったところでしょうか。 実はすでに baban さんという方が2014年にスライドを作成し、ネットに公開しています。 こちらにリンクを貼っておきました。
普通のエンジニアが【ロジバン】やってみた

…ということは二番煎じですかね? まあ、いいでしょう。 二番煎じだろうが、n番煎じだろうが、みんなにロジバンを知ってもらえればそれでいいのです。

発音について

一応、ロジバンをする前に発音について軽く触れておきます。 とはいえ、文字だけで正確な発音を理解するのははっきり言って無理ですので、本当に軽いです。

基本的にロジバンはローマ字読みでいけます。 ただ、いくつか日本人にはローマ字読みではいけないところがあります。 なので、ロジバンの発音方法を以下のリストに示します。

  • c は「シャ」の子音、英語だと sh
  • x はドイツ語のうがいの音、「カ」と「ハ」の間くらいの音
  • y はシュワー(曖昧母音)、口を脱力して声を出すと大体それになる
  • 'アポストロフィ)は「ハ」の子音
  • . (ピリオド)は小休止、休符。一拍止めるので日本語の「っ」のようでもある。
  • ts tc dz dj はそれぞれ「ツァ」「チャ」「ヅァ」「ヂャ」と発音する。
  • i + 母音 = ヤ音 + 母音
  • u + 母音 = ワ音 + 母音
  • au ei ai oi は二重母音なので一音節で読む
  • それ以外はローマ字読み

例を示しておきましょう。

coi ro do
(ショイ ロ ド)
.i mi'e la .skaitomon.
(イ ミヘ ラ・スカイトモン)
.i .ai mi ciksi la .lojban. ro do ma'i lo samplabau ca lo cabdei
(イ・アイ・ミ シクシ ラ・ロジバン・ロ ド マヒ ロ サンプラバウ シャ ロ シャブディ)

ロジバンでは文頭にセミコロン

ロジバンには文を区切るためのセミコロンが存在します。 ただし、文の末尾ではなく先頭に置きます。 そして、セミコロンの代わりに「.i」を使います。 また、文章の先頭は省略できます。

.i pa .i re .i ci
(一。二。三。)

例えば上の文は以下のようにできます。

pa .i re .i ci
(一。二。三。)

Hello, world!

というわけで、早速。 どんなプログラミング言語も「Hello, world!」を表示させるところから始まります。 日本語だと、「こんにちは、世界」ですね。 ロジバンだと、「coi munje」になります。

coi が会ったときにする挨拶、つまり「こんにちは」という意味の機能語になります。
munje は「世界」という意味*2の動詞です。

coi は機能語にも特に「COI類」という自然言語でいうところの挨拶に分類されます。 COI類には他にも以下のような単語があります。

lojban 日本語
be'e もしもし?
coi やあ、こんにちは
co'o じゃあね、ばいばい
fi'i ようこそ!
je'e 了解、どういたしまして
ke'o なんて言った?もう一回言って
ki'e ありがとう
mi'e 私は~です。
nu'e (約束の挨拶)
pe'u ~してくれますか?~していただきたいです。

ロジバンで挨拶はすべて2音節で言うことができます。 とても簡単で便利ですね。

COI類は構文上は直前の語に係るので構文解析すると以下のようになります。

f:id:skytomo:20191208222545p:plain
「coi munje」の構文解析結果

ロジバンでは動詞は関数

munje は「世界」という意味の動詞です。

munje は「世界」という意味の動詞って、それ本当に動詞なの? と思った方がいるかもしれません。

いくつかのロジバンの入門では munje を「動詞」としています。 しかし、この説明はロジバンを学んだ人にとっては不正確極まりないでしょう。

これはプログラミング言語というところの関数のようなものです。*3 例えば以下のC言語ソースコードがあったとします。

#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}

このソースコードについて、 「 printfっていうのは動詞で、目的語に"Hello, world!\n"って入れると、"Hello, world!\n"を表示させることができる動詞なんだ。そして、int main() {...}っていうところでmainっていう動詞を定義してるんだよ。」 なんて説明している入門書があったらどう思いますか。 なんてひどい説明だ、と思うでしょう。 これがロジバンで起こっています。

munje という関数は「(第1引数)は(第2引数:領域・分野)・(第3引数:法則・原理)の世界」という定義ですが、 coi munjeの場合は引数が 0 なのでただの「世界」という意味になります。

例が悪いので、例文を変えてみましょう。

mi klama la .sendais. la .kagocimas. la .tokiios. la .cinkansen.
(私は仙台へ鹿児島から東京を経由して新幹線で行きます。)

この文は構文解析するとこうなります。

f:id:skytomo:20191208230041p:plain
「mi klama la .sendais. la .kagocimas. la .tokiios. la .cinkansen.」の構文解析結果

klama は「(第1引数)は(第2引数:目的地)へ(第3引数:出発地)から(第4引数:経由地)を経由して(第5引数:移動方法)で行く・来る」と定義された関数です。 あとは順番に穴を埋めるように引数を埋めていけば、ほら文の完成です。 簡単でしょ?

ちなみにもうお気づきかもしれませんが、引数は省略することができます。 例えば、

mi klama lo ckule
(私は学校へ行きます。)《出発点などを省略している》

klama lo zdani
(家に行きます。)《主語を省略している》

というふうに、主語や目的語を明示したくなければ、省略できます。

また、「mi klama la .sendais. la .kagocimas. la .tokiios. la .cinkansen.」という文を書きましたが、
mi klama la .sendais. la .kagocimas. la .tokiios. la .cinkansen.
mi la .sendais. klama la .kagocimas. la .tokiios. la .cinkansen.
mi la .sendais. la .kagocimas. klama la .tokiios. la .cinkansen.
mi la .sendais. la .kagocimas. la .tokiios. klama la .cinkansen.
mi la .sendais. la .kagocimas. la .tokiios. la .cinkansen. klama
のように関数の場所はかなり自由に置くことができます。 とくに最後の文は日本語のように SOV型ですね! ただ、一般的にはロジバンはSVO型のように文の2番目に置くような体型が多いです。 そのため、ここでも一番上の書き方を採用しました。

オプション引数

では、「私は車(lo karce)で行く」と言いたいときはどうすればいいでしょう。

「mi klama lo karce」? しかし、これだと「私は車に行きます」となってしまいます。 この場合は zo'e (何か、不特定引数)という単語を使って、

mi klama zo'e zo'e zo'e lo karce
(私は車で行く)

しかし、これはすっきりしない書き方ですね。 プログラマーはもっと綺麗で簡潔な表現を求めているでしょう。

プログラミングで例えてみましょう。 例えば、C#C# 3.0以前ではオプション引数がないため、次のようなコードを書くはめになります。

Workbook workbook = excelApp.Workbooks.Open(
    "sample.xsl", Type.Missing, true, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

しかし、オプション引数があると、

Workbook workbook = excelApp.Workbooks.Open("sample.xsl", ReadOnly: true);

とめちゃくちゃシンプルになります。*4 こういうのがロジバンにあるかというと…

あります。

mi klama zo'e zo'e zo'e lo karce は、 mi klama fu lo karce となります。

fu は次の単語が第5引数になることを明示するための機能語です。 fu は機能語の中でも FA類に分類され、FA類の単語は以下のようにあります。

lojban 日本語
fa 次の単語が第1引数であることを明示する
fe 次の単語が第2引数であることを明示する
fi 次の単語が第3引数であることを明示する
fo 次の単語が第4引数であることを明示する
fu 次の単語が第5引数であることを明示する

これを見ると、aeiou順、つまりアルファベット順になっていることに気づいた人がいると思います。 規則的で覚えやすいですね。

これを乱用すれば

klama fe la .sendais. fa mi fu lo karce
(行くよ、仙台にね、私が、車で。)

というふうにできますが、ややこしいのでやめたほうがいいです(リーダブルコード的に)。

おわりに

これはAdvent Calendar で12月8日に投稿すべきものを、 12月7日21時から書いたので、時間がなくて、めっちゃ急いで書いたので間違いがあるかもしれません。 (ロジバンつよつよのみなさんご指摘お願いします。とはいえ、プログラミング言語として説明しているので、企画からガバガバですが)

本当はもっと書きたかったのですが、時間が…

ロジバンを本当に勉強したいと思っている方は はじめてのロジバンがおすすめです。 リンク貼っておきますね。

cogas.github.io

もう23:50です。それじゃあまた。
co'o
(さようなら)

*1:

Twitterのかそろさんからご指摘がありました。本当のところはサピア=ウォーフの仮説が正しいなら、認識を歪めてしまう原因を取り払った言語を作ってしまえば、人間文化の発展ができるのではないか?と言って作った言語はロジバンではなくログランです。しかし、その後、ログランは仲間割れによって、コミュニティが一回崩壊してしまいました。その後、ログランを元に、さらなる機能性を追求して継承したロジバンが生まれました。つまり、ロジバンは直接的にはサピア=ウォーフの仮説と関係がないといえばそうなのかもしれませんが、もとを辿ればこのような理由があって生まれてきた言語です。

*2:munje は英語だと universe という説明です。

*3:これもまた不正確といえば不正確ですが、動詞の例えよりはいくらかマシのような気がします。

*4:[構造化] オプション引数・名前付き引数より参照