Inspired by Mikawa’s work on a German translation of Dialog’s standard library, I’ve tried parsing Japanese in Dialog (so far only one verb). Here is the payoff (please excuse anything that is ungrammatical, I am not fully proficient with the language):
> ポット から 花 を 持つ
花 を 持ちました。> 花 を 持つ
もう 花 を 持っています が。
Translation:
> take flower from pot
You took the flower.> take flower
But you are already holding the flower.
Note that there are spaces between words, which is not typical of Japanese writing; this is necessary because Dialog can’t (yet?) split text into characters.
Here is the code:
(understand $文 as [$親 から $物 を 持つ])
(reverse $文 $逆文)
(split $逆文 by [を] into $動詞 and $逆名詞句)
{
($動詞 = [持つ])
(or)
($動詞 = [持って])
(or)
($動詞 = [持て])
(or)
($動詞 = [持ちます])
}
(reverse $逆名詞句 $名詞句)
(split $名詞句 by [から] into $親言葉 and $物言葉)
*(understand $親言葉 as single object $親)
*(understand $物言葉 as object $物 preferably child of $親)
(understand $文 as [$親 から $物 を 持つ])
(reverse $文 $逆文)
(split $逆文 by [から] into $動詞 and $逆名詞句)
{
($動詞 = [持つ])
(or)
($動詞 = [持っ])
(or)
($動詞 = [持て])
(or)
($動詞 = [持ち])
}
(reverse $逆名詞句 $名詞句)
(split $名詞句 by [を] into $物言葉 and $親言葉)
*(understand $親言葉 as single object $親)
*(understand $物言葉 as object $物 preferably child of $親)
(understand $文 as [$物 を 持つ])
(reverse $文 $逆文)
(split $逆文 by [を] into $動詞 and $逆名詞句)
{
($動詞 = [持つ])
(or)
($動詞 = [持って])
(or)
($動詞 = [持て])
(or)
($動詞 = [持ちます])
}
(reverse $逆名詞句 $名詞句)
*(understand $名詞句 as object $物 preferably takable)
(unlikely [$物 を 持つ])
~(item $物) (or) ($物 has relation $関係) ($関係 is one of [#partof #heldby #wornby])
(unlikely [$親 から $物 を 持つ])
~($物 has ancestor $親)
(prevent [$親 から $物 を 持つ])
~($物 has ancestor $親)
(if) (animate $親) (then)
(name $親) は (name $物) を 持ちません。
(elseif) (container $親) (then)
(name $物) は (name $親) の 中 に
(if) (animate $物) (then) ありません。 (else) いません。 (endif)
(elseif) (supporter $親) (then)
(name $物) は (name $親) の 上 に
(if) (animate $物) (then) ありません。 (else) いません。 (endif)
(else)
(name $物) は そこ に
(if) (animate $物) (then) ありません。 (else) いません。 (endif)
(endif)
(perform [$親 から $物 を 持つ])
(current player $プレイヤー)
($物 is recursively worn by $プレイヤー)
{
($親 = $プレイヤー)
(or)
($親 has ancestor $プレイヤー)
}
(try [remove $物])
(perform [$ から $物 を 持つ])
(try [$物 を 持つ])
(prevent [$物 を 持つ])
($物 を 持っている 時)
(or) ($物 の 場所 が いい 時)
(or) ($物 は 何か の 一部 だ 時)
(or) ($物 は 誰か で 持つ 時)
(or) ($物 は 誰か で 着る 時)
(or) ($物 は 持てない 時)
($物 を 持つ 話)
(name $物) を 持ちました。
(perform [$物 を 持つ])
($物 を 持つ 話)
(current player $プレイヤー)
(now) ($物 is #heldby $プレイヤー)
(now) ($物 is handled)
($物 を 持っている 時)
(current player $プレイヤー)
{
($物 is #heldby $プレイヤー)
もう (name $物) を 持っています が。
(or)
($物 is recursively worn by $プレイヤー)
もう (name $物) を 着ています が。
}
($物 の 場所 が いい 時)
(fine where it is $物)
(name $物) の 場所 が いい です が。
($物 は 何か の 一部 だ 時)
($物 is #partof $親)
(name $物) は (name $親) の 一部 です が。
($物 は 誰か で 持つ 時)
($物 is #heldby $親)
(name $物) は (name $親) で 持っています が。
($物 は 誰か で 着る 時)
($物 is #heldby $親)
(name $物) は (name $親) で 着ています が。
($物 は 持てない 時)
~(item $物)
(name $物) は 持てない です が。
Right now I haven’t figured out how to handle multi-objects delimited by と; I need to look more into how that is done with “and” in the standard library. Still, I think it’s very cool that Dialog can handle a language as different in syntax from English as Japanese with relatively minor changes.