% % Load, link, and initialize the external simulator engine % :- load("simulator/sim.so"). :- external(sim_init/15, sim_init). :- external(sim_reset/0, sim_reset). :- external(sim_mobilize/7, sim_mobilize). :- external(sim_wait/1, sim_wait). :- external(sim_noop/1, sim_noop). :- external(sim_sense_exo/1, sim_sense_exo). :- external(sim_ask_position/4, sim_ask_position). :- external(sim_ask_status/3, sim_ask_status). :- external(sim_print_stats/0, sim_print_stats). :- external(sim_print_params/1, sim_print_params). :- external(sim_print_info/0, sim_print_info). :- external(sim_set_request_rate/1, sim_set_request_rate). :- external(sim_set_debug_level/1, sim_set_debug_level). :- external(sim_debug/5, sim_debug). :- hospitalizeRate(HR), requestRate(RR), commFailRate(CR), diagTime(DT), unloadTime(UT), tirednessLagTime(LT), crewRecoveryTime(RT), avgTimePerBlockEmergHome(V1), avgTimePerBlockNormHome(V2), avgTimePerBlockEmergForeign(V3), avgTimePerBlockNormForeign(V4), listOfRegions(RList), listOfBases(BList), listOfHosps(HList), listOfCars(CList), sim_init(HR, RR, CR, DT, UT, LT, RT, V1, V2, V3, V4, RList, BList, HList, CList). % -------------------------------------------------------------------------- % dbg_write(X). % dbg_writeln(X). dbg_write(X) :- write(X). dbg_writeln(X) :- writeln(X). :- lib(random). doReally(wait(T), S):- dbg_write("doReally: "), dbg_writeln(wait(T)), sim_wait(T). doReally(noOp(T), S):- dbg_write("doReally: "), dbg_writeln(noOp(T)), sim_noop(T). doReally(mobilize(Car, loc(X, Y), T), S):- carLocation(Car, loc(X1, Y1), T, S), homeBase(Car, Base), car(Car, CarIdx, _), requestTime(loc(X, Y), ReqTime, S), frandom(RandNum), commFailRate(Rate), dbg_write("doReally: Mobilized "), dbg_write(Car), dbg_write(" from ("), dbg_write(X1), dbg_write(","), dbg_write(Y1), dbg_write(") to ("), dbg_write(X), dbg_write(","), dbg_write(Y), dbg_write(") at "), dbg_write(T), ( (not locOf(Base, loc(X1, Y1)), RandNum < Rate) -> dbg_writeln(", which failed."); ( sim_mobilize(CarIdx, X1, Y1, X, Y, T, ReqTime), dbg_writeln(", which succeeded.") ) ). doReally(askPosition(C, L, T), S):- car(C, CI, _), sim_ask_position(CI, T, X, Y), X > 0 -> L = loc(X, Y); L = unclear, dbg_write("doReally: "), dbg_writeln(askPostion(C, L, T)). doReally(askStatus(Car, Status, T), S):- car(Car, CarIdx, _), sim_ask_status(CarIdx, T, StatusIdx), ( StatusIdx = -1 -> Status = unknown; ( StatusIdx = 1 -> Status = ready; Status = busy ) ), dbg_write("doReally: "), dbg_writeln(askStatus(Car, Status, T)). requestTime(L, T, do(A, S)):- A = request(L, T). requestTime(L, T, do(A, S)):- not A = request(L, _), requestTime(L, T, S). % % Sense any exogenous action from the simulated world % senseExo(S1, S2):- sim_sense_exo(L), convertExoList(L, L1), insertActions(L1, S1, S2), dbg_write("senseExo: "), printExo(L1). convertExoList([], []). convertExoList([H | T], L):- convertExoList(T, L1), interpExoAction(H, A), L = [A | L1]. interpExoAction([0, T, X, Y, _], A):- A = request(loc(X, Y), T). interpExoAction([1, T, X, Y, C], A):- car(Car, C, _), A = reportArrival(Car, loc(X, Y), T). interpExoAction([3, T, X, Y, C], A):- car(Car, C, _), A = reportReady(Car, loc(X, Y), T). insertActions([], S, S). insertActions([H|T], S1, S2):- insertActions(T, S1, S3), S2 = do(H, S3). printExo([]):- dbg_write("nil.\n\n"). printExo([H|T]):- dbg_write(H), dbg_write(", "), printExo(T). % % DBG: Manually enter the exo actions from the keyboard. % % senseExo(S1,S2) :- % readActions(L), % insertActions(L, S1, S2), % dbg_write("senseExo:"), printExo(L). % % readActions(L) :- % read(A), % ( A = end -> L=[] ; (readActions(L2), append(L2, [A], L))).