先の記事の段階で無視した、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.は、「または」の二つ目の山の中にある語を出力させてみた例である。
全て、問題なく、狙った通りに出力している。パチパチ!!