% ------------------------ Baumdarstellung ----------------------------------

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

   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 des Baums mit Hilfe des Programms /bin/dot : */

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(['gv -center ',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).

% ------------------------------------ Ende ---------------------------------
