:- multifile fact/3 . % "sim" (basic programm for SMASS) /* some new lines unite the list of variables */ start:- consult(para), consult(pred), consult(rules), consult(display), check_inconsistent_parameters, ( exists_file(results), delete_file(results) ; true ), ( exists_file(data), delete_file(data) ; true ), modes(L), make_list_of_variables(L,LV), make_reduced_list_of_variables(L,LV,RLV), use_old_data(X), ( X = no, create_data(L,RLV) ; X = yes, consult(data) ), begin. check_inconsistent_parameters :- actors(AS), gridwidth(G), G1 is G*G, ( AS =< G1 ; G1 < AS, write(too_many_actors_for_the_grid), fail ). make_list_of_variables(L,LV) :- asserta(list_of_variables([])), length(L,E), ( between(1,E,NM), build_list_of_variables(NM,L), fail ; true ), list_of_variables(LV), retract(list_of_variables(LV)),!. build_list_of_variables(NM,L) :- nth1(NM,L,M), variables_in_rule(M,LM), list_of_variables(LVdyn), append(LVdyn,LM,Lnew), retract(list_of_variables(LVdyn)), asserta(list_of_variables(Lnew)),!. make_reduced_list_of_variables(L,LV,RLV) :- length(LV,EV), asserta(list_of_variables([])), ( between(1,EV,NV), minimize_list_of_variables(NV,LV), fail ; true),!, list_of_variables(RLV), retract(list_of_variables(RLV)),!. minimize_list_of_variables(NV,LV) :- list_of_variables(LVdyn), nth1(NV,LV,V), ( member(V,LVdyn) ; append(LVdyn,[V],LVnew), retract(list_of_variables(LVdyn)), asserta(list_of_variables(LVnew)) ),!. create_data(L,RLV) :- consult(create), make_global_data(L), length(RLV,EV), ( between(1,EV,NV), nth1(NV,RLV,VAR), make(VAR), fail ; true ), retractall(int_loc(WW1,WW2,WW3)), /* muss verallgemeinert werden */ !. make_global_data(L) :- actors(AS), make_characters(AS,L). % ---------------------------------------------------------------------------------------------------- begin :- runs(RR), periods(TT), ( between(1,RR,R), mainloop(R,TT), fail; true ), !, make_pictures. mainloop(R,TT) :- consult(data), findall(X,fact(0,0,X),L), length(L,E), ( between(1,E,Z), nth1(Z,L,FACT), append(results), write(fact(R,1,FACT)), write('.'), nl, told, asserta(fact(R,1,FACT)), retract(fact(0,0,FACT)), fail ; true ), append(results), nl, told, ( between(1,TT,T), kernel(R,T), fail; true ), retract_facts,!. retract_facts :- ( fact(X,Y,Z), retract(fact(X,Y,Z)), fail; true ). kernel(R,T) :- prepare_indivi(R,T), actors(AS), findall(I,between(1,AS,I),L), asserta(actor_list(L)), ( between(1,AS,N), choose_and_activate_actor(R,T,N), fail ; true ), retract(actor_list(L1)), adjust(R,T),!. prepare_indivi(R,T) :- modes(LM), length(LM,EM), ( between(1,EM,NM), nth1(NM,LM,MOD), prepare(R,T,MOD), fail ; true),!. choose_and_activate_actor(R,T,N) :- actor_list(L), length(L,E), Y is random(E)+1, nth1(Y,L,A), activate(R,T,A), delete(L,A,L1), retract(actor_list(L)), asserta(actor_list(L1)),!. activate(R,T,A) :- check_environment(R,T,A), ( execute_protocols(R,T,A) ; choosemode(R,T,A,M), ( act_in_mode(M,A,R,T) ; true) ),!. check_environment(R,T,A) :- true. execute_protocols(R,T,A) :- protocol(M,A,R,T). adjust(R,T) :- modes(L), length(L,E), actors(AS), ( between(1,E,X), individual_adjust(X,R,T,AS,L), fail; true ), global_adjust(R,T), append(results), nl, told,!. individual_adjust(X,R,T,AS,L) :- nth1(X,L,Z), ( between(1,AS,A), adjust(Z,A,R,T), fail ; true),!, adjust(Z,R,T). /* das muss nach adjust(Z,A,...) kommen */ global_adjust(R,T) :- T1 is T+1, repeat, ( fact(R,T,FACT), retract(fact(R,T,FACT)), asserta(fact(R,T1,FACT)), append(results), write(fact(R,T1,FACT)), write('.'), nl, told, fail ; true ),!. choosemode(R,T,A,M) :- fact(R,T,character(A,C,SUM)), length(C,K), modes(L), Z is random(SUM * 1000)+1, asserta(aux_sum(0)), between(1,K,X), do1(X,Z,C,Y), Z =< Y , nth1(X,L,M), retract(aux_sum(SS)),!. do1(X,Z,C,Y) :- aux_sum(S), nth1(X,C,C_X), Y is S + (C_X * 1000), retract(aux_sum(S)), asserta(aux_sum(Y)),!. % ------------------------------------------------------------------------------------- make_pictures :- modes(LM), length(LM,EM), consult(results), /* this file should be reduced */ ( between(1,EM,NM), nth1(NM,LM,MOD), make_picture(MOD), fail ; true),!.