%%%%
%%%%  Bayesian networks for Asia network -- asia.psm
%%%%
%%%%  Copyright (C) 2007,2008
%%%%    Sato Laboratory, Dept. of Computer Science,
%%%%    Tokyo Institute of Technology

%%  This example is known as the Asia network, and was borrowed from:
%%    S. L. Lauritzen and D. J. Spiegelhalter (1988).
%%    Local computations with probabilities on graphical structures
%%    and their application to expert systems.
%%    Journal of Royal Statistical Society, Vol.B50, No.2, pp.157-194. 
%%
%%                                    ((Smoking[S]))   
%%   ((Visit to Asia[A]))                 /   \
%%           |                           /     \
%%           v                          v       \
%%   (Tuberculosis[T])       (Lang cancer[L])    \
%%           \                      /             \
%%            \                    /               v
%%             v                  v           (Bronchinitis[B])
%%          (Tuberculosis or lang cancer[TL])    /
%%             /                      \         /              
%%            /                        \       /
%%           v                          \     /
%%      ((X-ray[X]))                     v   v
%%                                   ((Dyspnea[D]))
%%
%%  We assume that the nodes A, S, X and D are observable.  This
%%  program provides a naive representation of the Asia network, as
%%  shown in ../alarm.psm.  The junction-tree version of the Asia
%%  network program is given in jasia.psm

%%-------------------------------------
%%  Quick start:
%%
%%  ?- prism(asia),go.

go:- chindsight_agg(world(f,_,_,t),world(f,query,_,_,_,_,_,t)).
     % we compute a conditional distribution P(T | A=false, D=true) 

%%-------------------------------------
%%  Declarations:

values(bn(_,_),[t,f]). % each switch takes on true or false

%%-------------------------------------
%%  Modeling part:

world(A,S,X,D):- world(A,_,S,_,_,X,_,D).

world(A,T,S,L,TL,X,B,D) :-
   msw(bn(a,[]),A),msw(bn(t,[A]),T),
   msw(bn(s,[]),S),msw(bn(l,[S]),L),
   incl_or(T,L,TL),
   msw(bn(x,[TL]),X),msw(bn(b,[S]),B),
   msw(bn(d,[TL,B]),D).

% inclusive OR
incl_or(t,t,t).
incl_or(t,f,t).
incl_or(f,t,t).
incl_or(f,f,f).

%%-------------------------------------
%%  Utility part:

:- set_params.

set_params:-
  set_sw(bn(a,[]),[0.01,0.99]),
  set_sw(bn(t,[t]),[0.05,0.95]),
  set_sw(bn(t,[f]),[0.01,0.99]),
  set_sw(bn(s,[]),[0.5,0.5]),
  set_sw(bn(l,[t]),[0.1,0.9]),
  set_sw(bn(l,[f]),[0.01,0.99]),
  set_sw(bn(x,[t]),[0.98,0.02]),
  set_sw(bn(x,[f]),[0.05,0.95]),
  set_sw(bn(b,[t]),[0.60,0.40]),
  set_sw(bn(b,[f]),[0.30,0.70]),
  set_sw(bn(d,[t,t]),[0.90,0.10]),
  set_sw(bn(d,[t,f]),[0.70,0.30]),
  set_sw(bn(d,[f,t]),[0.80,0.20]),
  set_sw(bn(d,[f,f]),[0.10,0.90]).