文章をprologの二分木で作る

ようやく、ここに到達した。まだ事始めではあるが、ぼちぼちとやっていこう。

次のようなprologプログラムを考える。

%% -----------------------
%% 文章(二分木化されたprolog宣言文)を組み立てる
%% 2019年4月22日
%% -----------------------

%% 空のツリーに、Nodeを与えると、それ自身を返す
insert(_,Node,[],Node).
%% 既存ツリーが語の場合
insert(left,node(Value,Left,[]),Word,node(Value,Left,Word)) :- 
        atom(Word).
insert(right,node(Value,[],Right),Word,node(Value,Word,Right)) :- 
        atom(Word).
%% すでにTreeがある場合
insert(left,Node,node(Value, Left, Right), node(Value, New, Right)) :-
        insert(left,Node,Left,New).
insert(right,node(Value0, Left0, []),node(Value, Left, Right), node(Value, Left, node(Value0, Left0, Right))).
insert(right,Node,node(Value, Left, Right), node(Value, Left, New)) :-
        insert(right,Node,Right,New).

特に工夫もない、アドホックなもので、文章のノードを与えて、ツリーを作るところから始めてみようというわけである。実行すると次のようになる。

?- ['create.swi'].
true.

?- insert(_,node(は,ロボット,[]),[],Subs).
Subs = node(は, ロボット, []) .

?- insert(right,node(です,機械,[]),node(は, ロボット, []),Subs).
Subs = node(は, ロボット, node(です, 機械, [])) .

?- insert(left,node(の,産業用,[]),node(は,ロボット,node(です,機械,[])),Subs).
Subs = node(は, node(の, 産業用, ロボット), node(です, 機械, [])) .

?- insert(right,node(の,産業用,[]),node(は,ロボット,node(です,機械,[])),Subs).
Subs = node(は, ロボット, node(の, 産業用, node(です, 機械, []))) ;
Subs = node(は, ロボット, node(です, 機械, node(の, 産業用, []))) .

最初のコマンドで、プログラムを読み込む。なんの条件も考えずに、ただ、ノードを付け加えている。後半の二つは、node(の,産業用,[]) というノードを作成済みツリーの左側と右側に付け加えている。

この結果を出すために、作ったようなプログラムなので、あえて議論しなくても良い。ただ、二分木で表されたprologの文章は、ある種プログラムであって、プログラムがプログラムを作る感じを確認したかっただけである。