wikipedia「芸人」の定義とprolog(3)リスト処理追加

先の記事の段階で無視した、prolog化した文書の中にあるリストを処理可能にした。

%%%%%%%%%%%%%%%%
% geinin3.swi
% 2019年1月26日
% リストの場合の処理を付加した
%%%%%%%%%%%%%%%%

%%% 元の文章:
% 芸人とは、なんらかの技芸や芸能の道に通じている人、
% または身に備わった技芸や芸能をもって職業とする人
% のことを指す日本特有の概念である
%%%

%%% 節(1)
search(S,node(A,B,S),A,B).
search(S,node(A,B,L),A,B) :- member(S,L). %% リストの場合の処理
search(S,node(A,B,S),A,B).
search(S, node(_, Y, _), A, B) :- search(S, Y, A, B).
search(S, node(_, _, Z), A, B) :- search(S, Z, A, B).

%%% 受動語を検索、表示(2)
passive(X) :- sentence(T),search(X, T, A, B),printnode(B),write(A),printnode(X),nl.

%%% ノードの表示(3)
printnode(N) :- atom(N),write(N).
printnode(N) :- [X|Y] = N,write(N). %% リストの場合の表示
printnode(N) :- node(X,Y,Z) = N,printnode(Y),write(X),printnode(Z).

%%% 文章データ(4)
sentence(
    node(とは,
        芸人,
        node(ところの,
            node(を,
                node(の,
                    node(または,
                        node(いる,
                            node(に,
                                node(の,
                                    node(や,
                                        node(の,
                                            なんらか,
                                            技芸
                                        ),
                                        芸能
                                    ),
                                    道
                                ),
                               [通じて,通じる]
                            ),
                            人
                        ),
                        node(とする,
                            node(て,
                                node(を,
                                    node(や,
                                        node(た,
                                            node(に,
                                                身,
                                                [備わっ,備わる]
                                            ),
                                            技芸
                                        ),
                                        芸能
                                    ),
                                    [もっ,もつ]
                                ),
                                職業
                            ),
                            人
                        ) %%%カンマいらない
                    ),
                    こと
                ),
                指す
            ),
            node(の,
                日本特有,
                概念
            )
        )
    )
).

追加したことは、(1)の二行目に、目的とする従属語がリストの場合でもtrueになるようにしたこと。swi-prologの組み込みルールのmemberを使っている。さらに、(2)の表示ルールで、項目がリストの場合も表示するように二行目を加えた。

実行例は次のようになる。

1 ?- passive(人).
なんらかの技芸や芸能の道に[通じて,通じる]いる人
true .

2 ?- passive(通じて).
なんらかの技芸や芸能の道に通じて
true .

3 ?- passive(技芸).
なんらかの技芸
true .

4 ?- passive(職業).
身に[備わっ,備わる]た技芸や芸能を[もっ,もつ]て職業
true .

5 ?- passive(もつ).
身に[備わっ,備わる]た技芸や芸能をもつ
true .

1.は、出力時のリスト処理で、リストをそのまま出力している例だ。2.は、リストの中の文字を検索し、出力している。リストの中にはもともと[通じて,通じる]という、表現型と原型が含まれていたのだが、その表現型の方を検索し、出力している。この場合は、表現型が指定されているので、リストの出力はない。3.は、末端の語を出力させただけである。4.は、二つのリストを出力した例。5.は、「または」の二つ目の山の中にある語を出力させてみた例である。

全て、問題なく、狙った通りに出力している。パチパチ!!