:- dynamic fact/3 . % "create" (this module generates characters and data in SMASS) make_characters(AS,L) :- build_up_characters(AS,L), export_results(AS). build_up_characters(AS,L) :- length(L,E), ( between(1,E,X), make_distribution(X,L,E,AS), fail ; true ), ( between(1,AS,A), collect_characters(L,E,A), fail ; true), retractall(dd_expr(M1,M2,M3)), !. make_distribution(X,L,E,AS) :- nth1(X,L,M), weights(M,EX,LIST), make_discrete_distribution(M,AS,EX,LIST), !. collect_characters(L,E,A) :- asserta(character(A,[])), ( between(1,E,X), nth1(X,L,M), add_character(M,A), fail; true ),!. add_character(M,A) :- dd_expr(M,A,C), character(A,L1), append(L1,[C],L2), retract(character(A,L1)), asserta(character(A,L2)),!. export_results(AS) :- ( between(1,AS,A), export_res(A), fail; true),!. export_res(A) :- character(A,L2), calculate_sum(L2,SUM), append(data), write(fact(0,0,character(A,L2,SUM))), write('.'), nl, told, retract(character(A,L2)),!. % --------------------------------------------------------------------------------- make(wealth_dono) :- actors(AS), domain_of_wealth_dono(L,U), sigma_wealth_dono(SI), normal_distribution(wealth_dono,AS,L,U,SI), ( between(1,AS,A), nd_expr(wealth_dono,A,W), append(data), write(fact(0,0,wealth_dono(A,W))), write('.'), nl, told, retract(nd_expr(wealth_dono,A,W)), fail ; true ),!. make(wealth_take) :- actors(AS), domain_of_wealth_take(L,U), sigma_wealth_take(SI), normal_distribution(wealth_take,AS,L,U,SI), ( between(1,AS,A), nd_expr(wealth_take,A,W), append(data), write(fact(0,0,wealth_take(A,W))), write('.'), nl, told, retract(nd_expr(wealth_take,A,W)), fail ; true ),!. make(strength) :- actors(AS), weights(strength,LIST), expressions(strength,EX), make_discrete_distribution(strength,AS,EX,LIST), ( between(1,AS,A), dd_expr(strength,A,W), append(data), write(fact(0,0,strength(A,W))), write('.'), nl, told, retract(dd_expr(strength,A,W)), fail ; true ),!. make(location) :- actors(AS), gridwidth(G), G1 is G*G, findall(X,between(1,G1,X), L), asserta(cell_list(L)), ( between(1,AS,A), locate(A), fail ; true), retractall(cell_list(L2)),!. locate(A) :- cell_list(L), length(L,E), X is random(E)+1, nth1(X,L,Y), gridwidth(G), decompose(Y,I,J,G), append(data), write(fact(0,0,location(A,I,J))), write('.'), nl, told, asserta(int_loc(A,I,J)), delete(L,Y,L1), retract(cell_list(L)), asserta(cell_list(L1)),!. make(colour) :- actors(AS), ( between(1,AS,A), set_colour(A), fail ; true),!. set_colour(A) :- int_loc(A,I,J), N is I+J, N1 is N mod 2, append(data), ( N1 =:= 0, write(fact(0,0,colour(A,white))), write('.'), nl ; write(fact(0,0,colour(A,black))), write('.'), nl ), told, nl, !.