swi-prolog から graphviz を利用(その2)
- http://karel.tsuda.ac.jp/lec/prolog/intro3/
> > Prolog入門(3)
のページに "グラフの経路探索" というサンプルを見つけた。
経路結果を graphviz で表示させるようにしてみた。
$ cat maze.pl
% See http://karel.tsuda.ac.jp/lec/prolog/intro3/
/*
a--b--c
| | |
d--e--f--+
| |
g-----h
*/
connected(a,b).
connected(a,e).
connected(b,c).
connected(b,f).
connected(c,f).
connected(d,e).
connected(d,g).
connected(e,f).
connected(f,h).
connected(g,h).can_go(X,Y) :- connected(X,Y).
can_go(X,Y) :- connected(Y,X).go(X,X,Memo,[X|Memo]).
go(X,Y,Memo,Ans) :- can_go(X,Z), not(member(Z,Memo)), go(Z,Y,[X|Memo],Ans), genSVG(Ans).% find solve.
% go(a,h,[],P).% ----------------------
% Draw maze.
% ----------------------
genSVG(P) :- genDot(P), shell('dot -Tsvg temp.dot -o temp.svg', _Status).genDot(P) :-
tell('temp.dot'),
writeln('graph sample {'),
writePath(P),
forall((connected(X,Y), concat_atom([X,Y],' -- ', W)), writeNode(W)),
writeln('}'),
told.writePath([]) :- nl, !.
writePath([H|R]) :- write(H), write(' [color=red];'), nl, writePath(R).writeNode(N) :- write(N), write(';'), nl.
検索を実行すると temp.dot, temp.xvg を生成する。
$ cat temp.dot
graph sample {
h [color=red];
f [color=red];
c [color=red];
b [color=red];
a [color=red];a -- b;
a -- e;
b -- c;
b -- f;
c -- f;
d -- e;
d -- g;
e -- f;
f -- h;
g -- h;
}
最近のコメント