:- module(xbif, [clpbn2xbif/3]).
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(DInfo)]),
extract_domain(DInfo,Domain),
format(Stream, '
~w~n',[Key]),
output_domain(Stream, Domain),
format(Stream, '~n~n',[]).
extract_domain(tab(D,_),D).
extract_domain(tab(D,_,_),D).
extract_domain((_->D),D).
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((Info))]),
format(Stream, '
~w~n',[Key]),
output_parents(Stream,Info),
extract_cpt(Info,CPT),
output_cpt(Stream,CPT),
format(Stream, '~n~n',[]).
output_parents(_,tab(_,_)).
output_parents(Stream,tab(_,_,Ps)) :-
do_output_parents(Stream,Ps).
output_parents(Stream,([_|_].Ps->_)) :- !,
do_output_parents(Stream,Ps).
output_parents(_,(_->_)).
do_output_parents(_,[]).
do_output_parents(Stream,[P1|Ps]) :-
clpbn:get_atts(P1,[key(Key)]),
format(Stream, '~w~n',[Key]),
do_output_parents(Stream,Ps).
extract_cpt(tab(_,CPT),CPT).
extract_cpt(tab(_,CPT,_),CPT).
extract_cpt(([C1|Cs]._->_),[C1|Cs]) :- !.
extract_cpt((CPT->_),CPT).
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).