% main predicate calls a helper with useful defaults
xml(X) :- 
	functor(X,F,_),
	write('<'),write(F),write('>'),
	xml(X,4),
	write('</'),write(F),write('>').

xml(X,Tab) :- once(what2Xml(X,Y)), how2Xml(Y,Tab).

what1Xml(X, constant(X)) :- var(X).
what2Xml(X, constant(X)) :- functor(X,X,0).
what2Xml(X,structure(X)).

how2Xml(constant(X),_) :-
	write('"'),write(X),write('"').
how2Xml(structure(X),Tab) :- 
	forall(thing_(Field,Value,X),
	       how2Xml1(Field,Value,Tab)).
	      
how2Xml1(Field,Value,Tab) :-
	nl,tab(Tab),write('<'),write(Field),write('>'),
	xml(Value,Tab+4),
	write('</'),write(Field),write('>').
	       



