# 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.
    true log:callWithCut true.
}.

{({?A e:boolean e:T} ?B 0.0) bbn:nb true} <= {
    ("memberchk" {?A e:boolean e:F} ?B) e:derive true.
    true log:callWithCut 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.
    true log:callWithCut 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} <= {
    true log:callWithCut 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.
    true log:callWithCut 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.
}.
