% % XMLBIF support for CLP(BN) % :- module(xbif, [clpbn2xbif/3]). :- use_module(library('clpbn/dists'), [get_dist_domain/2]). clpbn2xbif(Stream, Name, Network) :- format(Stream, ' ]> ~w ',[Name]), output_vars(Stream, Network), output_dists(Stream, Network), format(Stream, ' ',[]). output_vars(_, []). output_vars(Stream, [V|Vs]) :- output_var(Stream, V), output_vars(Stream, Vs). output_var(Stream, V) :- clpbn:get_atts(V,[key(Key),dist(Id,_)]), get_dist_domain(Id, Domain), format(Stream, ' ',[]), output_key(Stream,Key), format('~n',[]), output_domain(Stream, Domain), format(Stream, '~n~n',[]). output_domain(_, []). output_domain(Stream, [El|Domain]) :- format(Stream, ' ~q~n',[El]), output_domain(Stream, Domain). output_dists(_, []). output_dists(Stream, [V|Network]) :- output_dist(Stream, V), output_dists(Stream, Network). output_dist(Stream, V) :- clpbn:get_atts(V,[key(Key),dist(_,CPT,Parents)]), format(Stream, ' ',[]), output_key(Stream, Key), format('~n',[]), output_parents(Stream,Parents), output_cpt(Stream,CPT), format(Stream, '~n~n',[]). output_parents(_,[]). output_parents(Stream,[P1|Ps]) :- clpbn:get_atts(P1,[key(Key)]), format(Stream, '',[]), output_key(Stream,Key), format('~n',[]), output_parents(Stream,Ps). output_cpt(Stream,CPT) :- format(Stream, ' ', []), output_els(Stream, CPT), format(Stream, '
~n', []). output_els(_, []). output_els(Stream, [El|Els]) :- format(Stream,'~f ',[El]), output_els(Stream, Els). output_key(Stream, Key) :- output_key(Stream, 0, Key). output_key(Stream, _, Key) :- primitive(Key), !, write(Stream, Key). output_key(Stream, I0, Key) :- Key =.. [Name|Args], write(Stream, Name), I is I0+1, output_key_args(Stream, I, Args). output_key_args(_, _, []). output_key_args(Stream, I, [Arg|Args]) :- format(Stream, '~*c', [I,0'_]), output_key(Stream, I, Arg), output_key_args(Stream, I, Args).