%%%
%%%   Blood Type program
%%%
%%% Copyright (C) 1997
%%%   SATO Taisuke and KAMEYA Yoshitaka, 
%%%     Dept. of Computer Science, Tokyo Institute of Technology

% learning process will start by
% | ?- mylearn(100).

% Statistical model:
bloodtype(a) :- genotype(a,a); genotype(a,o); genotype(o,a).
bloodtype(b) :- genotype(b,b); genotype(b,o); genotype(o,b).
bloodtype(o) :- genotype(o,o).
bloodtype(ab):- genotype(a,b); genotype(b,a).

genotype(X,Y) :- gene(dad,X), gene(mum,Y).

gene(P,a) :- bsw(1,P,1).
gene(P,b) :- bsw(1,P,0),bsw(2,P,1).
gene(P,o) :- bsw(1,P,0),bsw(2,P,0).

target(bloodtype,1).
data(user).

%---------------------- meta-programming ------------------------%

print_blood :- 
	prob(bloodtype(a),A),prob(bloodtype(b),B),
	prob(bloodtype(o),O),prob(bloodtype(ab),AB),
	write('Pb(Type=A) ='),write(A),nl,
	write('Pb(Type=B) ='),write(B),nl,
	write('Pb(Type=O) ='),write(O),nl,
	write('Pb(Type=AB)='),write(AB),nl.

print_gene :-
	prob(gene(dad,a),GA),prob(gene(dad,b),GB),prob(gene(dad,o),GO),
	write('Pb(Gene=A))= '),write(GA),nl,
	write('Pb(Gene=B))= '),write(GB),nl,
	write('Pb(Gene=O))= '),write(GO),nl.

mylearn(N) :- generate_japanese(N,Goals),learn(Goals).

generate_japanese(N,[bloodtype(X)|Goals]) :-
	N > 0,
	dice_multi([a,b,o,ab],[0.4,0.2,0.3,0.1],X),
	N1 is N-1,
	generate_japanese(N1,Goals).
generate_japanese(0,[]).

sample_japanese(N,[X|Y]) :-
	N > 0,
	sample(bloodtype(X)),
	N1 is N-1,
	sample_japanese(N1,Y).
sample_japanese(0,[]).
