/* Zweck: Stelle Baumterme einer DCG mit dem Programm /bin/dot graphisch dar.
   Autor: H.Leiss,                   28.7.2002, angepaßt an CL-2: 17.12.2004

   Siehe das Handbuch dazu unter Unix: man dot  ...

   Man bekommt dot von AT&T als Teil des Graphikpakets graphviz unter
      http://www.research.att.com/sw/tools/graphviz/download.html

   Ein Baumterm besteht aus:
   - dem Kategorienamen als Funktionszeichen,
   - der Liste der Art- und der Liste der Formmerkmale als erste 2 Argumente,
   - den Baumtermen der Teilbäume als weiteren Argumenten.

   Die Darstellung des Baums faßt den Kategorienamen und die Argumente der
   Kategorie (Art- und Formmerkmale) zur Knotenmarkierung zusammen, und
   stellt analog die Teilbäume dar.
*/

:- module(display_tree,[displayTrees/1,displayTree/1]).
			
/* Schreibe eine Liste <Terme> von Prolog-Termen als Bäume im .dot-Format auf die
   Datei <Datei>.tmp.dot : */

showTrees(Terme,Datei) :-
	concat(Datei,'.tmp.dot',File),
	tell(File),
	dot(Terme),
	told.

dot([Term|Terme]) :-
	nl,
	(ground(Term) ->
	    write('digraph syntaxbaum {'),
	    write('\n center=true;\n size=\"7.5,14\";\n ratio=compress;\n'),
	    drawTree(Term,0,_),
	    write('}')
	; write(user,'Fehler: der darzustellende Term \"'),
	    writeq(user,Term),
	    write(user, '\" enthält freie Variable!\n')
	),
	dot(Terme).
dot([]).

/* drawTree(+Term,+Wurzelnummer,-naechste nicht verbrauchte Knotennummer)  */

drawTree(Term,N,K) :-
	Term =.. ['.'|Args],
	!,
	write(N),
	write(' [shape = plaintext, fontcolor = blue, label = "'),write('.'),write('"];'),
	write('\n'),
	M is N+1,
	drawTrees(Args,N,M,K).

drawTree(Term,N,K) :-
	Term =.. [F,Arg1,Arg2|Args],
	list(Arg1), list(Arg2),
	!,
	Kategorie =.. [F,Arg1,Arg2],
	write(N),write(' [shape = plaintext, label = \"'),write(Kategorie),write('\"];'),
	write('\n'),
	M is N+1,
	drawTrees(Args,N,M,K).

drawTree(Term,N,K) :-
	atom(Term),
	!,
	write(N),
	write(' [shape = plaintext, fontcolor = blue, label = "'),write(Term),write('"];'),
	write('\n'),
	K is N+1.

list([]).
list([_|L]) :- list(L).

/* Nachfolger von Baum N, ab Nummer M bis Nummer K fuer deren Knoten */

drawTrees([Arg|Args],N,M,K) :-
	write(N), write(' -> '), write(M), write(' [dir = none];\n'),        
	drawTree(Arg,M,K1),
	drawTrees(Args,N,K1,K).

drawTrees([],_,M,M).

/* Anzeigen der Bäume am Bildschirm: */

displayTree(Term) :-
	displayTrees([Term]).

displayTrees(Terme) :-
	showTrees(Terme,testbaum),
	viewgraph(testbaum).

viewgraph(Datei) :-
       concat_atom(['dot -Tps ',Datei,'.tmp.dot ',' -o',Datei,'.tmp.ps '],Command1),
       concat_atom(['gv ',Datei,'.tmp.ps &\n'],Command2),
       shell(Command1),
       shell(Command2).


/* Beispiel:

displayTree(np([def, 3, mask], [sg, nom],
               det([def], [mask, sg, nom], der),
               rn([mask], [sg, nom], 'Planet'),
               np([def, 3, fem], [sg, gen],
                  det([def], [fem, sg, gen], der),
                  en([fem], [sg, nom], 'Venus')))).

displayTree(s([def], [praet, ind, vz],
              np([def, 3, mask], [sg, nom],
                 en([mask], [sg, nom], 'Kepler')),
              v([nom, akk], [3, sg, praet, ind], entdeckte),
              np([indef, 3, mask], [sg, akk],
                 det([indef], [mask, sg, akk], einen),
                 rn([mask], [sg, akk], 'Planeten'),
                 np([def, 3, fem], [sg, gen],
                    det([def], [fem, sg, gen], der),
                    en([fem], [sg, nom], 'Venus'))))).

*/




