ロジバンのPrologコード解説するよ！

[ロジバンでPrologプログラミングしてみた！](https://qiita.com/baban/items/2a25669dcfdf7c5f6b51)

の続き。

Githubの[lojysambanのリポジトリ](https://github.com/YoshikuniJujo/lojysamban)では、[examples](https://github.com/YoshikuniJujo/lojysamban/tree/master/examples)にあるサンプルコードを順番に解説して行きますよ。

正直、まだ解読が終わっていないものもあるのですが、その辺り正直に出していきながらゆっくりやっていくのが良さそうに思えたので、公開優先でやってきます。

おいおい訳を増やしていくので、待っててください^^;

### cidja.jbo

コード本体。
https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/cidja.jbo

[cidja](http://vlasisku.lojban.org/cidja)はロジバンで、「食べ物」を表す単語です。
このコードは、食品と味の関連を探索して、味を特定するコードです。

```cidja.jbo
.i la velvIt. cu cmima lo cirla
「velvIt」はチーズの仲間である。
.i la rit. cu cmima lo titnanba
「rit」はクッキーの仲間である。
.i la spam. cu cmima lo rectu
「spam」は肉の仲間である。
.i lo kolbasa cu cmima lo rectu
「kolbasa」は肉の仲間である。
.i la jolt. cu cmima lo sodva
「jolt」は炭酸飲料の仲間である。
.i la tuinkis. cu cmima lo sairfa'o
「tuinkis」は肉料理の仲間である。

.i lo kamtitla cu vrusi lo sairfa'o
肉料理は甘い味がする
.i lo kamcpina cu vrusi lo rectu
肉はスパイシーな味がする
.i lo kamcpina cu vrusi lo cirla
チーズはスパイシーな味がする
.i lo kamtitla cu vrusi lo sodva
炭酸飲料は甘い味がする

.i da djavu'i de .ijanai tu'e da cmima di .i de vrusi di
「x」は「y」の味がする。「x」は「z」の仲間であり、「y」は「z」の味がするのであれば
```
rit:多分ナビスコの[リッツ](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%83%E3%83%84_(%E3%82%AF%E3%83%A9%E3%83%83%E3%82%AB%E3%83%BC))、kolbasa: キルバサ（ロシア風ソーセージ）、jolt:多分[ジョルトコーラ](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%A7%E3%83%AB%E3%83%88%E3%83%BB%E3%82%B3%E3%83%BC%E3%83%A9)
cmima: 仲間、cirla: チーズ、titnanba: クッキーやケーキ、rectu: 肉、sodva: 炭酸飲料、sairfa'o: 肉料理、vrusi: 味、kamtitla: 甘い、kamcpina :スパイシー

訳してみると、意味は分かりやすいです。

文章の意味が分かってしまえば、何を聞くべきか自然に出てくるので、その文章とロジバン訳を書いてみましょう。

```
la jolt. djavu'i ma
「jolt」の味は何？
```
ma: 何(What)

こう書けば結果は「甘い」と返ってきますし、聞くべきものをひっくり返しても質問は出来ます。

```
ma djavu'i lo kamcpina
甘い味の者は何？
```

こう聞けば「jolt」と返って来ます。

### jmina.jbo

解読中。

https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/jmina.jbo

### mlatu.jbo

https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/mlatu.jbo

mlatuはロジバンで「猫」を表す単語です。

```
.i do du do
あなたははあなたである。
.i lo cinfo cu mlatu
「ライオン」はネコ科である。
.i lo tirxu cu mlatu
「トラ」はネコ科である。

.i da drosi de di .ijanai tu'e
	da du lo cinfo .i
	de du lo tirxu .i
	di du lo cribe
tu'u
「x」と「y」が「z」がdrosiの関係であるとは、
「x」がライオンであり、
かつ「y」がトラであり、
かつ「z」がクマであるということである。

.i da relmlatu de .ijanai tu'e
	da mlatu .i
	de mlatu
tu'u
「x」がネコ科で「y」がネコ科であるならば、「x」と「y」はrelmlatuの関係である。
```
do: 話し相手(You)、du: AはBと同じである、cinfo: ライオン、mlatu: 猫(ネコ科)、tirxu: トラ、cribe: クマ

正直、drosiとrelmlatuの２つの単語がどういう意味なのか自分には分かりませんでした。
drosiは辞書を引いても意味が出てこないし、relmlatuはre(2)とmlatu(猫)を合成した言葉なのですが、決まった訳が見つからないので、ここでは問題文から以下のような意味であると解釈しました。

drosi: 今回の問題のために適当に作った新しい単語
relmlatu: ネコ科仲間

他、何かご意見ありましたらよろしくお願いいたします(切実)

単語の解釈をこれで良いとすると、実際には、以下の様なロジバン文を入れると回答を返してくれます。

```
lo cinfo cu drosi lo tirxu lo cribe
ライオンとトラとクマはdrosiの関係か？
go'i
はい
```

```
lo cinfo cu drosi lo tirxu ma
drosiの関係にあるのは、ライオンとトラと、あと何か？
lo cribe
クマです
```

```
lo cinfo cu relmlatu lo tirxu
ライオンとトラはネコ科仲間か？
go'i
はい
```

### nonkanynac.jbo

解読中。

https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/nonkanynac.jbo

### patfu.jbo

https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/patfu.jbo

patfuはロジバンで、「父親」を示す単語です。

```patfu.jbo
.i la zeb. cu patfu la jon.bois.sr.
「ゼブ」は「ジョン・ボイスSr」の父親である。
.i la jon.bois.sr. cu patfu la jon.bois.jr.
「ジョン・ボイスSr」は「ジョン・ボイスJr」の父親である。
.i da dzena de .ijanai tu'e
	da patfu de
tu'u
「x」は「y」の先祖である。「x」は「y」の父親であるなら。

.i da dzena de .ijanai tu'e
	da patfu di .i
	di dzena de
tu'u
「x」は「y」の先祖である。「x」が「z」の父親で「z」が「y」の先祖であるなら。
```
patfu: 父親、dzena: 先祖

これも単純な論理の探索です

以下の様に説明ができます。

```
ma dzena la jon.bois.jr.
「ジョン・ボイスJr」の先祖は誰？
```

```
.i la jon.bois.sr .a la zeb
「ジョン・ボイスSr」と「ゼブ」です。
```

### pendo.jbo

https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/pendo.jbo

pendoはロジバンで「友人」を表す単語です。

```pendo.jbo
.i da du da
「x」は「x」である。
.i la .ualeis. cu nelci lo cirla
「ワレイス」はチーズが好きである。
.i la gromit. cu nelci lo cirla
「グロミット」はチーズが好きである。
.i la .uendolen. cu nelci lo lanme
「ウェンドンレン」は羊が好きである。
.i da pendo de .ijanai tu'e
	da nadu de .i
	da nelci di .i
  de nelci di
「x」は「y」の友達である。「x」は「y」同一人物ではなく、「x」は「z」が好きで、「x」も「z」が好きであるなら。
```

質問は以下のようにします。

```
la .ualeis. pendo ma
「ワレイス」の友人は誰？
```

返事は以下の様になります。

```
la gromit
「グロミット」です。
```

### skari.jbo

解読中。

https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/skari.jbo

これはコードを読む限り、いわゆる[４色問題](https://ja.wikipedia.org/wiki/%E5%9B%9B%E8%89%B2%E5%AE%9A%E7%90%86)のコードのようですね。

```
.i lo kamxu'e cu drata lo kamri'o
赤いは緑と違う
.i lo kamxu'e cu drata lo kambla
赤いは青いと違う
.i lo kamri'o cu drata lo kamxu'e
緑は赤いと違う
.i lo kamri'o cu drata lo kambla
緑は青いと違う
.i lo kambla cu drata lo kamxu'e
青いは赤いと違う
.i lo kambla cu drata lo kamri'o
青いは緑と違う
.i alabam. bu toldu'o misisip. bu boi joji'as. bu boi tenesis. bu boi florid. bu
「アラバマ」は「ミシシッピ」、「ジョージア」、「テネシー」、「フロリダ」と同じものではない。
.ijanai tu'e
	misisip. bu drata tenesis. bu .i
	misisip. bu drata alabam. bu .i
	alabam. bu drata tenesis. bu .i
	alabam. bu drata misisip. bu .i
	alabam. bu drata joji'as. bu .i
	alabam. bu drata florid. bu .i
	joji'as. bu drata florid. bu .i
  joji'as. bu drata tenesis. bu
ミシシッピとテネシーが違っていて、
ミシシッピとアラバマが違っていて、
アラバマとテネシーが違っていて、
アラバマとミシシッピが違っていて、
アラバマとジョージアが違っていて、
アラバマとフロリダが違っていて、
ジョージアとフロリダが違っていて、
ジョージアとテネシーが違っているなら。
```

おそらくは、「隣り合う州が同じ色にならないように色を指定しなさい」というロジバン文を打ち込めば結果を返してくれるのですが、この文章の作成がうまくいっていません。

### zilkancu.jbo

https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/zilkancu.jbo

zilkancuは「足す」という意味のロジバンの単語です。
先ほどまでとは毛色が変わった印象を受けます。

```zilkancu.jbo
.i lo kunti cu zilkancu li no
空配列のカウントはゼロと数える
.i lo selzilvi'u be stedu bu bei rebla bu cu zilkancu da .ijanai tu'e
	rebla bu cu zilkancu de .i
	da binxo lo terziljmina be de bei li pa
tu'u
末尾に「y」を足し合わせて、[「y」に１を加えたもの]を「x」と出来るなら
[先頭から末尾までを取ってきたもの]のカウントは「x」となる

.i li no sumji lo kunti
空配列の合計値は0とする。
.i da sumji lo selzilvi'u be stedu bu bei rebla bu .ijanai tu'e
	de sumji rebla bu .i
	da binxo lo terziljmina be de bei stedu bu
tu'u
末尾の合計を「y」に出来て、「y」から先頭までの合計を「x」と出来るなら
[先頭から末尾までを取ってきたもの]の合計は「x」となる

.i da zilselna'o de .ijanai tu'e
	di sumji de .i
	de zilkancu do .i
	da binxo lo dilcu be di bei do
tu'u
「z」の合計が「y」に出来、
かつ「y」のカウントが「a」で、
かつ「y」を「a」で割ったものを「x」と出来るなら
「y」の平均は「x」となる
```
binxo: 変更する(代入の意味)、kunti: 空白、zilkancu: 足す(+)、li: 数字開始の記号、no: ゼロ、terziljmina: Aを加える、tu'e 〜 tu'u: 初め括弧、終わり括弧 、rebla: 末尾、jmina: 加える、sumji: 合計、stedu: 先頭、zilselna'o: 平均値

どうやら、これは配列と四則演算を扱っているようです。

一つ一つロジバン文を打ち込んでいって、動作を確認してみます。

```
lo kunti cu zilkancu ma
空配列の長さはいくら？
li 0
ゼロ

li no ce li pa ce li ri cu zilkancu ma
空配列の長さはいくら？
li 0
ゼロ

.i li no ce'o li pa ce'o li re ce'o li ci cu zilkancu ma
配列[0,1,2,3]の長さは？
.i li 4
４

.i ma sumji lo kunti
空配列の合計はいくら？
li 0
ゼロ

.i ma sumji li no ce'o li pa ce'o li re ce'o li ci
配列[0,1,2,3]の合計はいくら？
li 6
6

ma zilselna'o li no ce'o li pa ce'o li re ce'o li ci ce'o li vo
配列[0,1,2,3,4]の平均は？
li 2
２
```
co'o: 配列の区切り記号

四則演算、数え上げ、平均の計算が出来ました。

ずいぶん出来ることが増えた印象です

### ziljmina.jbo

解読中。

https://github.com/YoshikuniJujo/lojysamban/blob/master/examples/ziljmina.jbo

ziljminaは「組み合わせる」というロジバンの単語です。

```ziljmina.jbo
.i lo kunti cu ziljmina de de
空配列と「y」の組み合わせを「y」とする
.i lo selzilvi'u be stedu bu bei rebla bu cu ziljmina da
	lo selzilvi'u be stedu bu bei de .ijanai tu'e
  rebla bu ziljmina da de
末尾に「x」を加えて「y」に出来るのなら
[先頭から末尾までを取ってきたもの]を「x」を組み合わせて
[先頭からyまでを取ってきたもの]にする。
```

どうもこれは配列の結合を出来る気配がしたのですが、頑張った結果、まだ動いていません。

どうしてもわからなかったけど、表現力を上げる大事な分に見えたので、作者さんにFacebookで聞いてみたのですが、ずいぶん前に書いたものなので思い出せないという返事をもらってしまって、ちょっと積んでいます。

## まとめ

９つのうち、５つしか解読てきていない体たらくですが、正直分からないので公開しないと全然進まないので他にどれか解けた方いらっしゃったら教えて下さい。
自分も時々思い立って解読を再開しています。