120 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			120 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% XMLBIF support for CLP(BN)
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- module(xbif, [clpbn2xbif/3]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								:- use_module(library('clpbn/dists'), [
							 | 
						||
| 
								 | 
							
									get_dist_domain/2]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								clpbn2xbif(Stream, Name, Network) :-
							 | 
						||
| 
								 | 
							
									format(Stream, '<?xml version="1.0" encoding="US-ASCII"?>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<!--
							 | 
						||
| 
								 | 
							
									Bayesian network in XMLBIF v0.3 (BayesNet Interchange Format)
							 | 
						||
| 
								 | 
							
									Produced by CLP(BN)
							 | 
						||
| 
								 | 
							
								-->
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<!-- DTD for the XMLBIF 0.3 format -->
							 | 
						||
| 
								 | 
							
								<!DOCTYPE BIF [
							 | 
						||
| 
								 | 
							
									<!ELEMENT BIF ( NETWORK )*>
							 | 
						||
| 
								 | 
							
									      <!ATTLIST BIF VERSION CDATA #REQUIRED>
							 | 
						||
| 
								 | 
							
									<!ELEMENT NETWORK ( NAME, ( PROPERTY | VARIABLE | DEFINITION )* )>
							 | 
						||
| 
								 | 
							
									<!ELEMENT NAME (#PCDATA)>
							 | 
						||
| 
								 | 
							
									<!ELEMENT VARIABLE ( NAME, ( OUTCOME |  PROPERTY )* ) >
							 | 
						||
| 
								 | 
							
									      <!ATTLIST VARIABLE TYPE (nature|decision|utility) "nature">
							 | 
						||
| 
								 | 
							
									<!ELEMENT OUTCOME (#PCDATA)>
							 | 
						||
| 
								 | 
							
									<!ELEMENT DEFINITION ( FOR | GIVEN | TABLE | PROPERTY )* >
							 | 
						||
| 
								 | 
							
									<!ELEMENT FOR (#PCDATA)>
							 | 
						||
| 
								 | 
							
									<!ELEMENT GIVEN (#PCDATA)>
							 | 
						||
| 
								 | 
							
									<!ELEMENT TABLE (#PCDATA)>
							 | 
						||
| 
								 | 
							
									<!ELEMENT PROPERTY (#PCDATA)>
							 | 
						||
| 
								 | 
							
								]>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<BIF VERSION="0.3">
							 | 
						||
| 
								 | 
							
								<NETWORK>
							 | 
						||
| 
								 | 
							
								<NAME>~w</NAME>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<!-- Variables -->',[Name]),
							 | 
						||
| 
								 | 
							
									output_vars(Stream, Network),
							 | 
						||
| 
								 | 
							
									output_dists(Stream, Network),
							 | 
						||
| 
								 | 
							
									format(Stream, '</NETWORK>
							 | 
						||
| 
								 | 
							
								</BIF>
							 | 
						||
| 
								 | 
							
								',[]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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, '<VARIABLE TYPE="nature">
							 | 
						||
| 
								 | 
							
									<NAME>',[]),
							 | 
						||
| 
								 | 
							
									output_key(Stream,Key),
							 | 
						||
| 
								 | 
							
									format('</NAME>~n',[]),
							 | 
						||
| 
								 | 
							
									output_domain(Stream, Domain),
							 | 
						||
| 
								 | 
							
									format(Stream, '</VARIABLE>~n~n',[]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								output_domain(_, []).
							 | 
						||
| 
								 | 
							
								output_domain(Stream, [El|Domain]) :-
							 | 
						||
| 
								 | 
							
									format(Stream, '	<OUTCOME>~q</OUTCOME>~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, '<DEFINITION>
							 | 
						||
| 
								 | 
							
									<FOR>',[]),
							 | 
						||
| 
								 | 
							
									output_key(Stream, Key),
							 | 
						||
| 
								 | 
							
									format('</FOR>~n',[]),
							 | 
						||
| 
								 | 
							
									output_parents(Stream,Parents),
							 | 
						||
| 
								 | 
							
									output_cpt(Stream,CPT),
							 | 
						||
| 
								 | 
							
									format(Stream, '</DEFINITION>~n~n',[]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								output_parents(_,[]).
							 | 
						||
| 
								 | 
							
								output_parents(Stream,[P1|Ps]) :-
							 | 
						||
| 
								 | 
							
									clpbn:get_atts(P1,[key(Key)]),
							 | 
						||
| 
								 | 
							
									format(Stream, '<GIVEN>',[]),
							 | 
						||
| 
								 | 
							
									output_key(Stream,Key),
							 | 
						||
| 
								 | 
							
									format('</GIVEN>~n',[]),
							 | 
						||
| 
								 | 
							
									output_parents(Stream,Ps).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								output_cpt(Stream,CPT) :-
							 | 
						||
| 
								 | 
							
									format(Stream, '	<TABLE> ', []),
							 | 
						||
| 
								 | 
							
									output_els(Stream, CPT),
							 | 
						||
| 
								 | 
							
									format(Stream, '</TABLE>~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).
							 | 
						||
| 
								 | 
							
								
							 |