このディレクトリの索引
#
#  述語経路/2を定義するための述語 経路定義/1 を定義しなさい。
#  
#  仕様として図.2のような格子状グラフが述語'図2.1'で定義されています。
#  これを図.2.2で表されるグラフに対応する 述語 経路/1として定義します。
#  節の名称は"あ-と"を述語 節の命名順/1 の引数リストから受け取って
#  順に振っていきます。
#  
#   P-+-+-+  あーいーうーえ
#   | | | |  | | | | 
#   +-+-+-+  おーかーきーく
#   |   | |  |   | |
#   +-+-+ +  けーこーさ し
#   | | | |  | | | |
#   +-+ +-+  すーせ そーた
#   | | | |  | | | |
#   +-+-+-Q  ちーつーてーと
#   
#     図.2      図.2.2 
#   
#  この図.2から 図.2.2 に対応する述語 経路/2 を以下のように定義するための
#  述語を定義します。
#  
#  経路(あ,い).
#  経路(あ,お).
#  経路(い,う).
#  経路(い,か).
#  経路(う,え).
#  経路(う,き).
#  経路(え,く).
#  経路(お,か).
#  経路(お,け).
#  経路(か,き).
#  経路(き,く).
#  経路(き,さ).
#  経路(く,し).
#  経路(け,こ).
#  経路(け,す).
#  経路(こ,さ).
#  経路(こ,せ).
#  経路(さ,そ).
#  経路(し,た).
#  経路(す,せ).
#  経路(す,ち).
#  経路(せ,つ).
#  経路(そ,た).
#  経路(ち,つ).
#  経路(つ,て).
#  経路(て,と).
#  

節の命名順([あ,い,う,え,お,か,き,く,け,こ,さ,し,す,せ,そ,た,ち,つ,て,と]).

'図.2.1'([['P',-,+,-,+,-,+],
         ['|',' ','|',' ','|',' ','|'],
         [+,-,+,-,+,-,+],
         ['|',' ',' ',' ','|',' ','|'],
         [+,-,+,-,+,' ',+],
         ['|',' ','|',' ','|',' ','|'],
         [+,-,+,' ',+,-,+],
         ['|',' ','|',' ','|',' ','|'],
         [+,-,+,-,+,-,'Q']]).

%  '図.2.1'([['あ',-,い,-,う,-,え],
%           ['|',' ','|',' ','|',' ','|'],
%           [お,-,か,-,き,-,く],
%           ['|',' ',' ',' ','|',' ','|'],
%           [け,-,こ,-,さ,' ',し],
%           ['|',' ','|',' ','|',' ','|'],
%           [す,-,せ,' ',そ,-,た],
%           ['|',' ','|',' ','|',' ','|'],
%           [ち,-,つ,-,て,-,と]]).

接続定義 :-
        '図.2.1'(_グラフ),
        節に名前を振る(_グラフ,_命名された節をもつグラフ),
        接続定義(_命名された節をもつグラフ).

節に名前を振る(_グラフ,_命名された節をもつグラフ) :-
        節の命名順(_節の命名順),
        節に名前を振る(_グラフ,_節の命名順,_命名された節をもつグラフ).

節に名前を振る([],_,[]).
節に名前を振る([L1|R1],L2,[L1_2|R3]) :-
        節に名前を振る(L1,L2,R,L1_2),
        節に名前を振る(R1,R,R3).

節に名前を振る([],R2,R2,[]).
節に名前を振る(['P'|R1],[A|R2],R,[A|R4]) :-
        assertz(出発点(A)),
        節に名前を振る(R1,R2,R,R4).
節に名前を振る(['Q'|R1],[A|R2],R,[A|R4]) :-
        assertz(終着点(A)),
        節に名前を振る(R1,R2,R,R4).
節に名前を振る(['+'|R1],[A|R2],R,[A|R4]) :-
        節に名前を振る(R1,R2,R,R4),!.
節に名前を振る([' '|R1],L2,R,[' '|R4]) :-
        節に名前を振る(R1,L2,R,R4),!.
節に名前を振る([_記号|R1],L2,R,[_記号|R4]) :-
        節に名前を振る(R1,L2,R,R4).

右と下両方向の接続定義(_命名された節をもつグラフ) :-
        接続定義(_命名された節をもつグラフ),
        転置(_命名された節をもつグラフ,_転置された命名された節をもつグラフ),
        接続を定義する(_転置された命名された節をもつグラフ).

接続定義([]) :- !.
接続定義([L|R]) :-
        一列の接続の定義(L),
        接続定義(R).

一列の接続の定義([]).
一列の接続の定義([A,-,C|R]) :-
        \+(空白か記号(A)),
        \+(空白か記号(C)),
        assertz(接続(A,B)),
        一列の接続の定義([C|R]),!.
一列の接続の定義([A,'|',C|R]) :-
        \+(空白か記号(A)),
        \+(空白か記号(C)),
        assertz(接続(A,B)),
        一列の接続の定義([C|R]),!.
一列の接続定義([A|R]) :-
        接続の定義(R).

空白か記号(' ') :- !.
空白か記号(A) :-
        member(A,[-,'|']).