/* Stelle einen Term als Baum dar, mit dem Programm /bin/dot.

   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

   Benutze  displayTree(+Term),  um einen Term am Bildschirm anzuzeigen.
   Bem. Im Verzeichnis, in dem Prolog aufgerufen wurde, werden Dateien  
                     testbaum.tmp.dot  und  testbaum.tmp.ps
        geschrieben. 
*/


/* Schreibe den Prolog-Term <Term> als Baum auf die Datei <Datei>.tmp.dot : */

dot(Term,Datei) :-
	ground(Term),
	!,
	concat(Datei,'.tmp.dot',File),
	tell(File),
	write('digraph syntaxbaum {'),
        write('\n center=true;\n size=\"7.5,14\";\n ratio=compress;\n'),
	drawTree(Term,0,_),
	write('}'),
	told.
dot(Term,File) :-
	write(user,'Your term contains free variables! Error'),
	nl.

/* drawTree(+Term,+Wurzelnummer,-erste unverbrauchte Knotennummer) */

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

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

/* Teilbaeume von Baum mit Wurzel N, ab Nummer M bis Nummer K fuer deren Knoten */

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

drawTrees([],N,M,M).   % falls keine Teilbaeume mehr darzustellen sind, ist K := M.


/* Anzeigen: */

displayTree(Term) :-
	(ground(Term) 
	 -> showTree(Term,testbaum)
	 ; write(user,'Your term contains free variables! Error\n')
	 ).

showTree(Term,Datei) :-
	dot(Term,Datei),
	viewgraph(Datei).
viewgraph(Datei) :-
       concatAtoms(['dot -Tps ',Datei,'.tmp.dot ',' -o',Datei,'.tmp.ps '],Command1),
       concatAtoms(['ghostview -magstep -2 ',Datei,'.tmp.ps &\n'],Command2),
       shell(Command1),
       shell(Command2).

concatAtoms([At],At) :- 
    !, atom(At).    
concatAtoms([A1,A2],Atom) :-
    !, concat(A1,A2,Atom).
concatAtoms([At1,At2|Ats],Atom) :-
    concatAtoms([At2|Ats],Atom2),
    concat(At1,Atom2,Atom).

/* Beispiel:

displayTree(s(np(det('Der'),a(junge),n('Hund')),
                 vp(v(jagt),
                    adv(manchmal),
                    np(np(det(die),a(schnelle),n('Katze')),
                       conj(und),
                       np(det(den),a(flinken),n('Hasen')))))).

*/


