You selected pdist1.pl
/* Simulatior for Probability Distribution */
% 19 Nov 2002.
% 21 Dec 2011. minor bugfix (last/2 was worngly used in gen_histogram/4. why?)
:-write('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'),nl,
write(' A Simulatior for Probabilities'),nl,
write('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%'),nl,
write('type ``gen_dist(uniform,[0,1],100,P)." or ``menu."'),nl.
wn(Z):-write(Z),nl.
nw(Z):-nl,write(Z).
menu:-
nl,
tab(2),wn('1. model a distribution.'),
tab(2),wn('2. calculate the frequency (i.e., build the histogram).'),
tab(2),wn('3. draw a graph of the histogram.'),
tab(2),wn('4. exit this menu.'),
tab(1),write('input number>'),
read(Y),
(
(
member([Y,A],[[1,dist],[2,freq],[3,draw],[4,exit]]),
write('You selected '),write((Y,(A))),write('. OK? (y/n)'),
read(y)
)
->
(
(Y=1->set_gen_dist(D,[L,U],_N,_P);true),
((\+var(L),\+var(U))->(G=..[D,L,U],write(G));true),
(Y=2->set_gen_histogram(G,_Class,_M,cum);true),
(Y=3->draw_histogram;true),
(Y=4->!, fail; true) % to exit the menu (modified: Dec 2011)
)
; menu
),
menu.
select_dist:-select_dist(_).
select_dist(N):-
nl,
tab(2),wn('1. uniform distribution.'),
tab(2),wn('2. trianglar distribution.'),
tab(2),wn('3. binominal distribution.'),
tab(2),wn('4. normal distribution.'),
tab(1),write('input number>'),
read(Y),
(
(
member([Y,A],[[1,uniform],[2,triangle],[3,binominal],[4,normal]]),
write('Will you generate a '),write(A),write(' distribution?(y/n)'),
read(y)
)
->set_gen_dist(A,_,_,_)
; select_dist(N)
),
menu.
p(dummy,nul,0,0).
p_init:- abolish(p,4), assert(p(dummy,nul,0,0)).
sampling_limit(1000).
set_gen_dist(X,no,no,abend):-
\+ member(X,[uniform]),
wn('Not yet.').
set_gen_dist(A,B,N,D):-
var(N),
write('Type the sample size. '),
read(N),
set_gen_dist(A,B,N,D).
set_gen_dist(_,_,N,abend):-
sampling_limit(T),
N > T,
wn('Too large sample size. Please try a smaller.').
set_gen_dist(A,[L,U],N,D):-
%(var(L);var(U)),
var(L),
write('Type the lower bound. '),
read(Y),
L is integer(Y),
set_gen_dist(A,[L,U],N,D).
set_gen_dist(A,[L,U],N,D):-
%(var(L);var(U)),
var(U),
write('Type the upper bound. '),
read(Y),
U is integer(Y),wn(gen_dist(A,[L,U],N,D)),
gen_dist(A,[L,U],N,D).
gen_dist(uniform,[L,U],_,abend):-
\+ (integer(L),integer(U)),write([L,U]),
wn('Each of the lower and upper bounds must be an integer.').
gen_dist(uniform,[L,U],N,ok):-
sampling_limit(T),
N =< T,
integer(U),
integer(L),
length(X,N),
p_init,
forall(
nth1(K,X,A),
(
G=..[p,uniform,[L,U],K,A],
B is integer(U - L + 1),
A is random(B) + L, %wn(A),
assert(G)
)
),
trim_stacks,
listing(p).
set_gen_histogram(_G,_Class,_M,_cum):-
\+ (clause(p(X,_,_,_),_),X \= dummy),
wn('You have need to create a distribution before do this.').
set_gen_histogram(G,Class,M,cum):-
G=..[uniform,L,_U],
var(L),
write('Type the lower bound. '),
read(Y),
L is integer(Y),
set_gen_histogram(G,Class,M,cum).
set_gen_histogram(G,Class,M,cum):-
G=..[uniform,_L,U],
var(U),
write('Type the upper bound. '),
read(Y),
U is integer(Y),
set_gen_histogram(G,Class,M,cum).
set_gen_histogram(G,Class,M,cum):-
var(Class),
write('Input the boundaries as a list.'),
read(Y),
(length(Y,_)->(Class=Y,gen_histogram(G,Class,M,cum)); fail).
gen_histogram(G,Class,M,cum):-
abolish(histogram,4),
(G=uniform(L,U)->true;(wn('illegal goal format.'),fail)),
((Class=[Lc|_], Lc >= L)->true;(wn('illegal for the lower bound.'),fail)),
((last(Class, Uc), Uc =< U)->true;(wn('illegal for the upper boud.'),fail)),
(length(Class,M)->true;(wn('illegal partitioning.'),fail)),
bagof(K,A^p(uniform,[L,U],K,A),All),
length(All,N),wn(num_of_samples(N)),
forall(
(
nth1(J,Class,Ub)%,wn(ub(Ub))
),
(
bagof(K1,B^(p(uniform,[L,U],K1,B),B =< Ub),Ks),
length(Ks,Freq),%wn(lev(Ks,Freq)),
Perc is integer(Freq * 100 / N),
assert(histogram(J,Ub,Freq,Perc))
)
),
trim_stacks,
listing(histogram).
draw_histogram:-
\+clause(histogram(_J,_B,_F,_P),_),
wn('Before do this, you have need to create a histogram.').
draw_histogram:-
wn([class,frequency,percentile]),
write_ruler(10),
findall(J,histogram(J,_B,_F,_P),Js),
sort(Js,N),%wn(N),
forall(
(
member(J,N)%,write(J)
),
(
histogram(J,B,F,P),
iteratively_draw(P,'*'),
wn((B,F,P))
)
),trim_stacks.
iteratively_draw(M,X):-
length(L,50),
forall(nth1(K,L,_),(M >= 2*K->write(X);true)),
write('|').
write_ruler(N):-
length(L,N),
forall(member(_A,L),iteratively_draw(8,'-')),
nl.
counter(N,M,L):-
length(L,_),
findall(M,member(M,L),Mx),
length(Mx,N).
% end
return to front page.