# EYE Components for NBBN -- Jos De Roo

@prefix math: <http://www.w3.org/2000/10/swap/math#>.
@prefix log: <http://www.w3.org/2000/10/swap/log#>.
@prefix list: <http://www.w3.org/2000/10/swap/list#>.
@prefix e: <http://eulersharp.sourceforge.net/2003/03swap/log-rules#>.
@prefix bbn: <http://eulersharp.sourceforge.net/2006/02swap/nbbn-plugin#>.

# unplug the Full Bayes Belief Network builtin
true <= {
	("_P/2" e:biconditional) e:compoundTerm ?U.
	("abolish" ?U) e:derive true.
}.

# plugin the Naive Bayes Belief Network builtin
{?L e:biconditional ?D} <= {
	?SCOPE e:call {
		?L e:firstRest ({?A e:boolean ?B} ?C).
		("if_then_else"
			{("nb_getval" "bnet" "done") e:derive true}
			true
			{	() bbn:bnet true.
				("nb_setval" "bnet" "done") e:derive true.
			}
		) e:derive true.
		(?A) bbn:bvar true.
		(?B) bbn:bval true.
		({?A e:boolean ?B} ?C ?D) bbn:nb true.
	}
}.

{() bbn:bnet true} <= {
	(";"
		{	(";"
				{	?L1 e:firstRest (?I ?J).
					?L1 e:conditional ?O.
					?J e:sort ?K.
					("findall"
						?Y
						{	?L2 e:firstRest (?I ?X).
							?L2 e:conditional ?Y.
							?X e:sort ?K.
						}
						?L
					) e:derive true.
					?L math:sum ?S.
					?L math:memberCount ?N.
					(?S ?N) math:quotient ?Z.
					("call" {?L1 bbn:bcnd ?P}) e:derive false.
					("assertz" {?L1 bbn:bcnd ?Z}) e:derive true.
					?I bbn:inverse ?M.
					?L3 e:firstRest (?M ?J).
					("call" {?L3 bbn:bcnd ?Q}) e:derive false.
					(1 ?Z) math:difference ?E.
					("assertz" {?L3 bbn:bcnd ?E}) e:derive true.
					("fail") e:derive true.
				}
				{	?L4 e:firstRest ({?I e:boolean ?R} ?J).
					?L4 bbn:bcnd ?T.
					(";"
						{	
							("call" {(?I) bbn:bvar true}) e:derive false.
							("assertz" {(?I) bbn:bvar true}) e:derive true.
						}
						true
					) e:derive true.
					{?K e:boolean ?U} list:in ?J.
					("call" {(?K) bbn:bvar true}) e:derive false.
					("assertz" {(?K) bbn:bvar true}) e:derive true.
					("fail") e:derive true.
				}
			) e:derive true.
		}
		true
	) e:derive true.
}.

{{?A e:boolean e:T} bbn:inverse {?A e:boolean e:F}} <= true.
{{?A e:boolean e:F} bbn:inverse {?A e:boolean e:T}} <= true.

(e:T) bbn:bval true.
(e:F) bbn:bval true.

{(?A ?B 1.0) bbn:nb true} <= {
	("memberchk" ?A ?B) e:derive true.
	("!") e:derive true.
}.

{({?A e:boolean e:T} ?B 0.0) bbn:nb true} <= {
	("memberchk" {?A e:boolean e:F} ?B) e:derive true.
	("!") e:derive true.
}.

{({?A e:boolean e:F} ?B ?C) bbn:nb true} <= {
	("if_then_else"
		{	("memberchk" {?A e:boolean e:T} ?B) e:derive true.
			?C log:equalTo 0.0.
		}
		true
		{	({?A e:boolean e:T} ?B ?D) bbn:nb true.
			("1-_D" ?D) e:calculate ?C.
		}
	) e:derive true.
}.

{(?A ?B ?C) bbn:nb true} <= {
	?L e:firstRest (?A ?B).
	?L bbn:bcnd ?C.
	("!") e:derive true.
}.

{(?A ?B ?C) bbn:nb true} <= {
	("if_then_else"
		{	(?A ?D) bbn:bcnd ?E.
			(?D ?B ?F) bbn:nb true.
			?D bbn:inverse ?G.
			(?A ?G) bbn:bcnd ?H.
			("_F*_E+(1-_F)*_H" ?F ?E ?H) e:calculate ?C.
		}
		true
		{	(?A ?B ?I) bbn:nc true.
			?A bbn:inverse ?J.
			(?J ?B ?K) bbn:nc true.
			("1/(1+2**(_K-_I))" ?K ?I) e:calculate ?C.
		}
	) e:derive true.
}.

{(?A () 0.0) bbn:nc true} <= {
	("!") e:derive true.
}.

{(?A ?L ?D) bbn:nc true} <= {
	?L e:firstRest (?B ?C).
	(";"
		{	(";"
				{(?B ?A) bbn:bcnd ?E}
				{	?B bbn:inverse ?F.
					(?F ?A) bbn:bcnd ?G.
					(1 ?G) math:difference ?E.
				}
			) e:derive true.
		}
		{?E log:equalTo 1.0}
	) e:derive true.
	("!") e:derive true.
	("if_then_else"
		{?E math:equalTo 0}
		{("epsilon") e:calculate ?I}
		{?I log:equalTo ?E}
	) e:derive true.
	(?A ?C ?H) bbn:nc true.
	("log(_I)/log(2)+_H" ?I ?H) e:calculate ?D.
}.