%%%
%%%  Three Inverters Circuit Program
%%%
%%% Copyright (C) 1997
%%%   SATO Taisuke and KAMEYA Yoshitaka,
%%%     Dept. of Computer Science, Tokyo Institute of Technology

% Statistical model:
circuit(In,Out) :- val(g1,In,V1),val(g2,V1,V2),val(g3,V2,Out).

val(G,on,off) :- state(G,ok).
val(G,off,on) :- state(G,ok).
val(G,V,V)    :- state(G,shorted).
val(G,_,off)  :- state(G,blown).

state(G,ok)      :- bsw(1,G,1).
state(G,shorted) :- bsw(1,G,0),bsw(2,G,1).
state(G,blown)   :- bsw(1,G,0),bsw(2,G,0).

% Control declarations:
target(circuit,2).
data(user). 
% teacher data must be generated by using sampling utility, etc.

% Utility program:
mylearn(N) :- generate_data(N,Goals),learn(Goals).

% generate_data(N,L) :- generate teacher data L with size N
generate_data(N,[circuit(In,Out)|Goals]) :-
    N > 0,
    gen_circuit(In,Out),
    N1 is N-1,
    generate_data(N1,Goals).
generate_data(0,[]).

gen_circuit(In,Out) :-
    dice_uniform([on,off],In),
	gen_val(In,V1),gen_val(V1,V2),gen_val(V2,Out).

gen_val(In,Out) :-
	dice_multi([ok,shorted,blown],[0.85,0.05,0.1],State),!,
	( State = ok,
	  ( In = on, Out = off ; In = off, Out = on )
    ; State = shorted, In = Out
    ; State = blown,  Out = off ).
