ロジバンでPrologプログラミングしてみた！

## ロジバンの紹介

今回発表する言語はロジバンという言語です。
聞いたことがないかもしれないので、まずはその紹介からです。

ロジバンというのは、元々、基本的に人間が話すために作られた人工の言語です。

最初は[サピア＝ウォーフの仮説](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%94%E3%82%A2%EF%BC%9D%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%95%E3%81%AE%E4%BB%AE%E8%AA%AC)という言語学上の問題を検証するために作られた言語ですが、元々言語学者が作った下敷きからスタートしているので、色々と面白い性質があります。

例えば下の様な感じです。

* 音中心で設計されていて、同音異義語が原理上存在しない
* 文法が厳格に決められていて、構造に曖昧さが表れない
* 一階述語論理をベースに組み立てられている
* 文化非依存

この様な性質を持っていることから、ロジバンで話しかけたり、書かれたりした文は、命題としてプログラムが実行可能という性質を持っています。

特に日本語や英語では根本に持っている構造的な曖昧さが発生しないというのが大きくて、日本語では解析不可能な長文でもプログラムとして扱えるため、コンピューターと人間がプログラムを口述で伝達出来る可能性を持っています。

ロジバン自体は述語論理を拡張して文法を作っています。

そうであれば、同じく述語論理をベースに設計されたプログラミング言語であるPrologと相性が良いのではないかということはProlog自体を知っていれば当然至るアイデア。

その実装であるlojysambanを触ってみたので紹介させていただきます。
https://hackage.haskell.org/package/lojysamban

lojysambanは、英語で書くとLogic-computer-languageの意味になるロジバン語を名前に持つソフトウェアです。
ロジバン文を解釈してPrologの様な論理解析を実行する処理系で、Haskellで実装されています。

作者はshinjuku.hs主催の重城良国 さん。
[教養としてのHakellプログラミング](https://www.amazon.co.jp/Haskell-%E6%95%99%E9%A4%8A%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E9%96%A2%E6%95%B0%E5%9E%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%87%8D%E5%9F%8E%E8%89%AF%E5%9B%BD/dp/4798048062)などの著者です。
今回は、短い紹介ということで、lojysambanのサンプルをひとつ実行して、その解説を行ってからinstall方法の紹介をして終わりです。

実行環境は、正直Haskellに慣れていないとinstallからかなり苦労するし、installをしてもマニュアルが絶望的に不足しているので、ロジバン動かしながらどうやってやったのか記録してあります。

## 言語本体の紹介

まずは、install方法より、触った感じを見てもらうため、ロジバンのコードを作成します

「sample_declaration.jbo」というテキストファイルを作成して、以下の文章をコピーします。

```
.i la .iocikun. patfu la .ituk.
.i la .manam. mamta la .ituk.
.i da rirni de .i ja nai da patfu de
.i da rirni de .i ja nai da mamta de
```

何の意味か分からない人のために、拙いながら翻訳を付けると下の様になります。

```
.i la .iocikun. patfu la .ituk.
「ヨシクニ」は「イツキ」の父親である
.i la .manam. mamta la .ituk.
「マナミ」は「イツキ」の母親である
.i da rirni de .ijanai da patfu de
「x」は「y」の両親である、仮に「x」が「y」の父親であるなら。
.i da rirni de . ijanai da mamta de
「x」は「y」の両親である、仮に「x」が「y」の母親であるなら。
```
単語帳:
.i : 句読点(文の最初に入る)、la: 冠詞、patfu: 父親、manta: 母親、rirni: 両親、.ijanai: (命題)Bが真ならAも真、 da: 自由変数項 「x」、de: 自由変数項 「y」

これは、以下のPrologのコードと同じ意味になっています。

```prolog
father(yoshikuni, ituki).
mother(manami, ituki).
parent(X, Y) :- father(X, Y).
parent(X, Y) :- mother(X, Y).
```

このファイルを作成したらコンソール上で以下のコマンドで
処理系を実行します。

```bash
stack exec lojysamban --allow-different-user ./sample_declaration.jbo
```

暫くすると、画面に以下の様に表示されます

```
.i
```

これで、起動完了です。
ロジバンでは「.i」は文章の開始点を表すので、前提条件を読み込んだ状態のlojysamban に以下の文章で質問を行います。

```
.i ma rirni la .ituk.
```

上のロジバン文は「誰が「イツキ」の両親？」という質問文です。

コンソール上に、ロジバン文を打ち込んだらEnterキーで確定、結果として、下の文章が出力されたら作業完了です。

以下の様に質問(命題)の結果を表示します。

```
.i la iocikun .a la manam
「ヨシクニ」と「マナミ」である
```

Prologだと、下の様な質問形式と回答になります。

```prolog
?- parent(X, ituki).
X = manami ;
X = yoshikuni
```

同じように、以下のロジバン文を打ち込んでもっと簡単な質問をしてみましょう。

```
.i la .manam. mamta ma
.i ma patfu la .ituk.
```

翻訳と回答はこのようになるはずです。

```
.i la .manam. mamta ma
「マナミ」は誰の母親ですか？
.i la ituk
「イツキ」です。
.i ma patfu la .ituk.
「イツキ」の父親は誰ですか？
.i la iocikun
「ヨシクニ」です
```

ちゃんと動いています。

最後に「co'o(さようなら)」と打ち込んで、処理系を終了させます。

```
.i co'o
終了
```

どうでしょうか？
音声入力の方法はまだ誰も開発していませんが、会話をしてプログラミングを行う、というのの現実性とニュアンス、未来は少し感じていただけたのかなと思います。

ロジバンという言語がプログラミング言語として普及するか、と言われると正直何とも言えませんが、背景にある性質の面白さを感じていただくには足りているデモになったかなと思います。

他のサンプルコードに関しては、解読の終わった方から[サンプルコード解説](https://qiita.com/baban/items/57b0d3ede1d3d1847bfa)の記事の方に書いておきます。

出来ることを増やしたくなっらたご覧ください。

### おまけ

この処理系、ロジバンという言語自体の実験のために作られていて、広く使われることは想定していない感じの処理系です。
なので書いたロジバン文の中にバグがあっても、スコーンと処理系が落ちて終了でエラーメッセージも出ません。
なので、何処に原因があったのか教えてくれません。

たたでさえ未知の言語に慣れないPrologの考え方をしなければいけないのに、この状態は辛いです。

そういう感じなので、実際にオリジナルでプログラム書いてみようとして感想としては以下の手順が良かったです。

1. まずは自分が何を処理系にさせたいのか、日本語で書き下す
2. それをPrologで実行したいプログラムとして書いてみる
2. 日本語の文章を、ロジバン文に訳してみて、[camxes](http://masatohagiwara.net/camxes.js/)名簿の文法チェッカーでロジバンとして正しいかチェックしておく
3. 最終的にそこまで出来てから、lojysambanでプログラムを実行していってみる

そもそも一度Prologで書かないとダメという段階で実用性で意味ないですが、あくまで新しい価値観を学ぶという意味では勉強としても最も効果的ですし、我慢かなって思います。

## 実行環境の構築

実行環境のinstall方法です。
今回は自分の趣味でBash on Windows環境でinstallを行いましたが、他にもMac,Linuxでもほぼ共通に使えるはずです。
Macでは動作確認はしました。

Windows環境の人のみ、以下のページでBash on Windowsをinstallしてください。

Bash on Windowsをインストールする
https://qiita.com/Aruneko/items/c79810b0b015bebf30bb

Haskellは、ライブラリのバージョン依存が非常に強い言語です。
ライブラリ同士の依存関係の壊れや、あのバージョンのライブラリが無い、という問題の発生は依存性地獄(cabal hell)と言われて、私も今回久しぶりのHaskellだったので、結構苦しみました。
そして、今回のlojysambanは人気のあるライブラリとは言わないので、古い環境(2014年ごろ)のHaskellの実行環境を再現して動かす必要があります。
HaskellというとHaskell Patformという時代もありますが、最近はやりのstackの方が依存関係の解決には圧倒的に強いので、まずはこちらをinstallして、そこからlojysambanのビルドができる環境を構築していきます。

### stackをinstallする

stack
https://github.com/commercialhaskell/stack

stackというツール自体が何なのかはQiitaの記事に依存しておきたいですが、rubyでいうrbenv+bundlerというと通じが良いツールです、初学者向けに必要なことだけを書き残しておきます。

このツールを本家のinstall手順に従って、以下のコマンドを打ち込んで実行します

```bash
curl -sSL https://get.haskellstack.org/ | sh
```

実行が終わったら、いつでもstackを起動できるように.bashrcにスタックstackのPATHを通しておきます、以下のコマンドの様に実行してください。

```bash
source ~/.bashrc
stack --version
```

これでstackのバージョンが表示されればまずはinstallの確認は出来ました。
lojysambanのinstall

```bash
stack new lojysamban
cd lojysamban
```

./stack.yamlを編集

依存するライブラリやソフトウェアの設定を解決するために、以下の2か所を書き換えてしまいます。

resolverをghc-7.8.4に書き換える

```yaml
resolver: ghc-7.8.4
```

extradepsに「lojbanParser」と「yjtools」を書き足す。

```yaml
extra-deps:
- lojbanParser-0.1.9.2
- yjtools-0.9.18
```

ここまで実行したらlojysamban 本体のinstallを行います。
Haskellの処理系であるGHC自体も適切なバージョンを一緒にinstallしてしまいます。

```bash
 stack install lojysamban --install-ghc --allow-different-user
```

これでinstallは完了です。

### おまけ：対訳表

```
.i la .iocikun. patfu la .ituk.
「ヨシクニ」は「イツキ」の父親である
.i la .manam. mamta la .ituk.
「マナミ」は「イツキ」の母親である
.i da rirni de .ijanai da patfu de
「x」は「y」の両親である、仮に「x」が「y」の父親であるなら。
.i da rirni de . ijanai da mamta de
「x」は「y」の両親である、仮に「x」が「y」の母親であるなら。
fi'o
前提終了
.i ma rirni la .ituka.
「イツキ」の両親は誰
.i la iocikun .a la manam
「ヨシクニ」と「マナミ」である
.i co'o
終了
```
単語帳
.i : 句読点にあたる。文章の最初に入れる
la: 冠詞、patfu: 父親、manta: 母親、rirni: 両親、da: 自由変数項 「x」、de: 自由変数項 「y」、A .ijanai B: (命題)Bが真ならばAも真、ja: または(or)、nai: 否定(右項側)、fi'o: 文章終了、ma: 英語のWhat,Whoにあたる単語、.a: 接続詞(AND)、co'o: 別れの挨拶(さようなら)

## まとめ

実際には、他の記事で[ロジバンでLOGOプログラミングして見た♩](https://qiita.com/baban/items/466b6af33c97a5b3622f)という記事の双子の様に書いていたりしますが、今回のProlog実装はLOGOのクローン以上に、ロジバン自体との相性の良さを感じました。
文法的には、「.iyanai」の様に少し難しい言葉も出てきましたので難易度は上がりましたが一度日本語に訳す事さえできればあとは簡単でしたね。

Githubの[lojysambanのリポジトリ](https://github.com/YoshikuniJujo/lojysamban)では、[examples](https://github.com/YoshikuniJujo/lojysamban/tree/master/examples)が存在していて、他にも数値の計算や配列の扱いなども理解できるようになっていますが、このあたりは機会を見て別の記事で解説します。

## 勉強資料

ロジバンを勉強したい場合は、次の資料がオススメです。

* [はじめてのロジバン](http://seesaawiki.jp/hajiloji/) - 初心者はまずここから
* [camxes.js](http://masatohagiwara.net/camxes.js/) - 文法チェッカー
* [ロジバン大全: The Complete Lojban Language 日本語抄訳](http://ponjbogri.github.io/cll-ja/) - 完全な文法の資料、はじめてのロジバンを学習した後がオススメです
* [vlasisku](http://vlasisku.lojban.org/) - オンラインロジバン辞書。英語ベースですが検索制度も高くわからない単語が出た時はオススメです

個人的に学習した感じでて、まずはじめてのロジバン、を読んで、例文をcamxes.jsに打ち込みながら文法に慣れて、例文がもっと欲しくなった場合、実際にロジバンで書かれた作品を訳してみるのが現状の一番近道でしょうか。
といってもいうほど楽ではないんですが、比較的触りやすいのは[不思議の国のアリス](https://mw.lojban.org/papri/lo_selfri_be_la_.alis._bei_bu%27u_la_selmacygu%27e)とか、[注文の多い料理店](https://mw.lojban.org/papri/le_gusta_co_minde_mutce)とかの古典の名作が、対訳が安定して手に入るので、オススメです。[te gerna la lojban](https://mw.lojban.org/papri/te_gerna_la_lojban)にたくさんありますが、どの作品が一番おすすめかは、私もまだ出せないです。

そのうち分からないところが出ると思うので、そのときロジバン大全を斜め読みしてみましょう。
訳しながら少しづつ慣れていけばいいと思います。

文章だけでなく、発音を勉強したいときは唯一の日本語ロジバン講座 [ko lojbo .iu ロジバン入門](http://guskant.github.io/kolojbo.iu/)がオススメです。


さて、ロジバン教材は、いろんなところに散らかっていますので、個人的には迷わないで学習するには、上のリンク中心が効率的ですが、さらに学習を進めたい時は、下のリンクからさらにある資料をどうぞ

[学習 - La lojban](https://mw.lojban.org/papri/%E5%AD%A6%E7%BF%92)

それでは、一人でもロジバンに興味を持ってくれる人が増えましたら幸いです。

co'o(さようなら)