ようやく、ここに到達した。まだ事始めではあるが、ぼちぼちとやっていこう。
次のような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の文章は、ある種プログラムであって、プログラムがプログラムを作る感じを確認したかっただけである。