Skip to content

Instantly share code, notes, and snippets.

@cth
Created August 13, 2009 16:16
Show Gist options
  • Save cth/167278 to your computer and use it in GitHub Desktop.
Save cth/167278 to your computer and use it in GitHub Desktop.
Convert a HMMs in simplistic fact format to a PRISM program
:- use_module(library(chr)).
:- set_prolog_flag(chr_toplevel_show_store,false).
simplehmm2prism(InputFile,OutputFile) :-
read_hmm(InputFile),
write_hmm(OutputFile).
% These rules are only used as template for creating
hmm(L) :- msw(trans(start),S0),hmm(S0,L).
hmm(S,L):- msw(trans(S),NextS),(NextS=end -> L=[] ; msw(out(S),C), L=[C|Cs], hmm(NextS,Cs)).
:- chr_constraint values/2, trans/3, emit/3, write_hmm/1, read_hmm/1, read_stream/1.
values(X, A), values(X, B) <=> append(A,B,C), values(X,C).
trans(From,To,_) ==> values(trans(From), [To]).
emit(State,Symbol,_) ==> values(emit(State), [Symbol]).
read_hmm(File) ==> open(File, read, Stream), read_stream(Stream).
read_stream(S) <=> read(S, Rule), Rule \= end_of_file | Rule, read_stream(S).
read_stream(S) <=> close(S).
write_hmm(File) ==> tell(File).
write_hmm(_) \ values(X,Y) <=> write_canonical(values(X,Y)), write('.'), nl.
write_hmm(File) <=>
nl,
listing(hmm/1),
nl,
listing(hmm/2),
told,
write('Wrote PRISM program for HMM to: '),
write(File),
nl.
% A sample HMM for testing:
inithmm :-
trans(start, s1, unknown),trans(s1, s3, unknown),trans(s3, s5, unknown),trans(s3, s6, unknown),
trans(s5, s3, unknown),trans(s6, s3, unknown),trans(s3, s3, unknown),trans(s5, s1, unknown),
trans(s6, s1, unknown), trans(s1, s1, unknown),trans(s3, end, unknown),
emit(s1, 'a', unknown),emit(s3, '*', unknown),emit(s3, '+', unknown),emit(s5, 'a', unknown),
emit(s6, 'a', unknown),emit(s3, ')', unknown),emit(s5, '(', unknown),emit(s6, '(', unknown),emit(s1, '(', unknown).
test :-
inithmm,
write_hmm('prismhmm.pl').
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment