%%%
%%%   Hidden Markov Model Program
%%%
%%% Copyright (C) 1997
%%%   SATO Taisuke and KAMEYA Yoshitaka,
%%%     Dept. of Computer Science, Tokyo Institute of Technology

% Set initial state and T=1
hmm(Sentence) :- init(S),hmm(1,S,Sentence).      

% Terminate at T=5
hmm(5,S,[Obs]) :- output(5,S,Obs). 

hmm(T,S,[Obs|L]) :- T<5, 
    % Output Obs in state S at T
    output(T,S,Obs),    
    % Transit from S to Next at T
    trans(T,S,Next),    
    T1 is T+1,                 
    hmm(T1,Next,L).        

% Initial state is s0 with prob. 1
init(s0).

% Transition pamameters:
trans(T,s0,s1) :- bsw(1,T,1).
trans(T,s0,s0) :- bsw(1,T,0). 
trans(T,s1,s2) :- bsw(2,T,1).
trans(T,s1,s1) :- bsw(2,T,0).
trans(_,s2,s2).

% Output  parameters:
output(T,s0,a) :- bsw(3,T,1).
output(T,s0,b) :- bsw(3,T,0).
output(T,s1,a) :- bsw(4,T,1).
output(T,s1,b) :- bsw(4,T,0).
output(T,s2,a) :- bsw(5,T,1).
output(T,s2,b) :- bsw(5,T,0).

% Control declarations:
target(hmm,1).
data('hmm.dat').

mylearn(N) :- write_hmm(N,'hmm.dat'),learn.

write_hmm(N,File) :-
	gen_hmm_main(N,Gs),
	tell(File),write_hmm1(Gs),told.

write_hmm1([hmm(L)|Gs]) :-
	write(hmm(L)),write('.'),nl,
	write_hmm1(Gs).
write_hmm1([]).

gen_hmm_main(N,[hmm(L)|Gs]) :-
	N > 0,
	gen_hmm(L),
	N1 is N-1,
	gen_hmm_main(N1,Gs).
gen_hmm_main(0,[]).

gen_hmm(L) :- gen_hmm(1,s0,L).

gen_hmm(5,S,[Obs]) :- gen_output(S,Obs).

gen_hmm(T,S,[Obs|L]) :- T<5,
	gen_output(S,Obs),
	gen_trans(S,Next),
	T1 is T+1,
	gen_hmm(T1,Next,L).

gen_trans(s0,Next) :- dice_multi([s0,s1],[0.7,0.3],Next).
gen_trans(s1,Next) :- dice_multi([s1,s2],[0.8,0.2],Next).
gen_trans(s2,s2).

gen_output(s0,Out) :- dice_multi([a,b],[0.2,0.8],Out).
gen_output(s1,Out) :- dice_multi([a,b],[0.9,0.1],Out).
gen_output(s2,Out) :- dice_multi([a,b],[0.3,0.7],Out).
