prolog 二分木作成の改良

wikipedia二分木検索例の出力の冒頭文がおかしい。つまりこんな風になっている。

wiki_1_line_3385_2: ロボットは/いわゆる脳を持た関わらないにもずまるで/生きているかのように行動する//

「持たないにも関わらず」が「持た関わらないにもず」になっている。この原因は、この行の二分木が、

jawiki(wiki_1_line_3385_0,
    node(の,
        node([],
            node(と,
                node([],
                    node(に,
                        これ,
                        [基づいた, 基づく]
                    ),
                    ゲンギス
                ),
                [[呼ば, 呼ぶ], れる]
            ),
            [[[六, 数量], 本], [足, '動物-部位']]
        ),
        node(は,
            [ロボット, '人工物-その他'],
            node(を,
                node(いわゆる,
                    [],
                    [脳, '動物-部位']
                ),
                node('にもず',
                    [[[持た, 持つ], ない], [関わら, 関わる]],
                    node('か|の',
                        node([],
                            まるで,
                            [[生きて, 生きる], いる]
                        ),
                        node(に,
                            よう,
                            node([],
                                [[行動, 抽象物], する],
                                [ ]
                            )
                        )
                    )
                )
            )
        )
    )
).

という感じで、nodeの語が「にもず」になっているからだ。その理由は、knpの出力にまで遡る。その該当箇所のknpの出力は、

* 12D <否定表現><モ><ニ><読点><助詞><〜ない><〜ぬ><用言:動><係:連用><レベル:B><区切:3-5><ID:〜にもかかわらず><連用要素><連用節><動態述語><正規化代表表記:持つ/もつ><主辞代表表記:持つ/もつ>
+ 13D <否定表現><モ><ニ><読点><助詞><〜ない><〜ぬ><用言:動><係:連用><レベル:B><区切:3-5><ID:〜にもかかわらず><連用要素><連用節><動態述語><正規化代表表記:持つ/もつ><用言代表表記:持つ/もつ><時制-未来><格関係8:ヲ:脳><格解析結果:持つ/もつ:動3:ガ/U/-/-/-/-;ヲ/C/脳/8/0/1;ニ/U/-/-/-/-;デ/U/-/-/-/-;ヨリ/U/-/-/-/-;マデ/U/-/-/-/-;時間/U/-/-/-/-;外の関係/U/-/-/-/-;ノ/U/-/-/-/-;修飾/U/-/-/-/-;トスル/U/-/-/-/-;ニオク/U/-/-/-/-;ニツク/U/-/-/-/-;ニカンスル/U/-/-/-/->
持た もた 持つ 動詞 2 * 0 子音動詞タ行 6 未然形 3 "代表表記:持つ/もつ" <代表表記:持つ/もつ><正規化代表表記:持つ/もつ><かな漢字><活用語><自立><内容語><タグ単位始><文節始><文節主辞>
ない ない ない 接尾辞 14 形容詞性述語接尾辞 5 イ形容詞アウオ段 18 基本形 2 "代表表記:ない/ない" <代表表記:ない/ない><正規化代表表記:ない/ない><かな漢字><ひらがな><活用語><否定><付属>
に に に 助詞 9 格助詞 1 * 0 * 0 NIL <かな漢字><ひらがな><付属>
も も も 助詞 9 副助詞 2 * 0 * 0 NIL <かな漢字><ひらがな><付属>
関わら かかわら 関わる 動詞 2 * 0 子音動詞ラ行 10 未然形 3 "代表表記:係わる/かかわる" <代表表記:係わる/かかわる><正規化代表表記:係わる/かかわる><かな漢字><活用語><付属>
ず ず ぬ 助動詞 5 * 0 助動詞ぬ型 27 基本連用形 4 NIL <かな漢字><ひらがな><活用語><付属>

となっている。情報がいっぱい詰まっているが、基本*から始まるのが、一つのフレーズなのだが、ここでは、「持た」という動詞があり、「ないにも」という助詞系の語が続いて、さらに「関わら」という動詞が来て、さらに「ず」という助動詞が来ている。二つのフレーズにして良いものが、一つのフレーズの中に押し込められているのだ。助詞、助動詞はnodeにするというのが、この二分木の原則なので、「ないにも」と「ず」がつなげられてしまうのだ。

「持た」→「ないにも」→「関わら」→「ず」、となっているが、第1と第3の要素はleafになるべきで、第2と第4の要素はnodeになるべき要素なのだが、これらが一つのフレーズなので、leaf要素とnode要素が、それぞれ接合されてしまっているというわけだ。

そこで、面倒だったが、こういう場合には、二つのフレーズに分割するように、二分木を作成するプログラムを改良した。結果、次のように出力するようになった。

jawiki(wiki_1_line_3385_0,
    node(の,
        node([],
            node(と,
                node([],
                    node(に,
                        これ,
                        [基づいた, 基づく]
                    ),
                    ゲンギス
                ),
                [[呼ば, 呼ぶ], れる]
            ),
            [[[六, 数量], 本], [足, '動物-部位']]
        ),
        node(は,
            [ロボット, '人工物-その他'],
            node(を,
                node(いわゆる,
                    [],
                    [脳, '動物-部位']
                ),
                node(にも,
                    [[持た, 持つ], ない],
                    node(かの,
                        node([],
                            node(ず,
                                [関わら, 関わる],
                                まるで
                            ),
                            [[生きて, 生きる], いる]
                        ),
                        node(に,
                            よう,
                            node([],
                                [[行動, 抽象物], する],
                                [ ]
                            )
                        )
                    )
                )
            )
        )
    )
).

少しわかりにくいかもしれないが、「にも」と「ず」が二分木の中で分かれている。これでよし。