109:- include(env_gen). 110
116
120name_dev(env_simwumpus).
121
123:- set_debug_level(3). 124
136
137initializeInterfaces(L) :-
138 printKbInstructions,
139 ground(L),
140 set_debug_level(3),
141 142 143 144 report_message(system(1), 'Building WUMPUS World Configuration'),
145 member([idrun,SIDRun], L), string_to_term(SIDRun, IDRun),
146 member([idscenario, SIDScenario], L), string_to_term(SIDScenario, IDScenario),
147 148 (member([size,SSize], L) -> string_to_number(SSize, Size) ; true),
149 (member([ppits,SPPits], L) -> string_to_number(SPPits, PPits) ; true),
150 (member([nogolds,SNoGolds], L) -> string_to_number(SNoGolds, NoGolds) ; true),
151 152 (IDScenario=random ->
153 154 ground(PPits), ground(NoGolds),ground(Size), 155 build_random_wumpus_world(1,1,right,1,PPits,NoGolds,Size)
156 ;
157 158 build_fixed_wumpus_world(IDScenario,[Size,PPits,NoGolds])
159 ),
160 report_message(system(1), 'Building WUMPUS World COMPLETED!'),
161 162 member([ipwumpus,SIP], L),
163 string_to_atom(SIP, IP),
164 member([portwumpus, SP], L), 165 string_to_number(SP, Port),
166 167 report_message(system(0), 'INITIALIZING INTERFACES!'),
168 report_message(system(1), 'Initializing WUMPUS APPLET interface'),
169 initializeWumpusWorldApplet(IP, Port),
170 report_message(system(1), 'Initializing STATISTICS interface'),
171 initializeStatistics(IDRun, Size, PPits,NoGolds),
172 report_message(system(0), 'INITIALIZATION COMPLETED!').
173
174
175finalizeInterfaces(_) :-
176 report_message(system(0), 'FINALIZING INTERFACES!'),
177 finalizeWumpusWorldApplet(_,_), 178 finalizeStatistics,
179 report_message(system(0), 'FINALIZATION COMPLETED!').
180
181
182
187initializeWumpusWorldApplet(Host, Port):-
188 report_message(system(3),
189 ['Establishing connection to WUMPUS APPLET:',Host,'/',Port]), !,
190 socket(internet, stream, comm_wumpus),
191 connect(comm_wumpus, Host/Port),
192 assert(listen_to(socket, comm_wumpus, comm_wumpus)),
193 report_message(system(1),
194 'Connection to WUMPUS APPLET port established successfully'),
195 send_command_to_wumpus(reset, _),
196 report_message(system(3), 'WUMPUS WORLD GRID RESETTED'),
197 robot(RX,RY,_,_,_),
198 wumpus(WX,WY,_),
199 send_command_to_wumpus(robot(RX,RY), _),
200 send_command_to_wumpus(wumpus(WX,WY), _),
201 report_message(system(3),'ROBOT and WUMPUS PLACED'),
202 add_all_pits,
203 report_message(system(3),'ALL PITS PLACED'),
204 add_all_golds,
205 report_message(system(3),'ALL GOLDS PLACED').
206
207add_all_pits :-
208 pit(PX,PY),
209 send_command_to_wumpus(pit(PX,PY), _),
210 fail.
211add_all_pits.
212
213add_all_golds :-
214 gold(PX,PY),
215 send_command_to_wumpus(gold(PX,PY), _),
216 fail.
217add_all_golds.
218
219
221finalizeWumpusWorldApplet(_, _) :-
222 listen_to(socket, comm_wumpus, comm_wumpus), !, 223 send_command_to_wumpus(end, _), 224 sleep(1),
225 closeWumpusAppletCom.
226finalizeWumpusWorldApplet(_, _). 227
228closeWumpusAppletCom :-
229 retract(listen_to(socket, comm_wumpus, comm_wumpus)), 230 close(comm_wumpus).
231
238initializeStatistics(IDRun, Size,PPits,NoGolds) :-
239 findall((PX,PY),pit(PX,PY),LPits),
240 robot(RX,RY,RD,NA,RS),
241 wumpus(WX,WY,WS),
242 findall((GX,GY),gold(GX,GY),LGolds),
243 assert(initgrid([robot(RX,RY,RD,NA,RS),wumpus(WX,WY,WS),
244 golds(LGolds),pits(LPits)])),
245 assert(now([])),
246 assert(idconf(IDRun,Size,PPits,NoGolds)),
247 statistics(real_time,_).
248finalizeStatistics :-
249 robot(RX,RY,RD,NA,RS),
250 wumpus(WX,WY,WS),
251 findall((GX,GY),gold(GX,GY),LGolds),
252 assert(finalgrid([robot(RX,RY,RD,NA,RS),wumpus(WX,WY,WS),golds(LGolds)])),
253 save_statistics.
254
255save_statistics :-
256 idconf(IDRun,Size,PPits,NoGolds), 257 initgrid(InitGrid),
258 finalgrid(FinalGrid),
259 now(H),
260 statistics(real_time,[_,Time]),
261 open(logwumpus,append,R),
262 write(R, wumpus_run(IDRun,[Size,PPits,NoGolds],InitGrid,FinalGrid,H,Time)),
263 write(R, '.'),
264 nl(R),
265 flush_output(R),
266 close(R).
267
269printKbInstructions :-
270 writeln('*********************************************************'),
271 writeln('* NOTE: This is the WUMPUS WORLD JAVA-APPLET SIMULATOR environment'),
272 writeln('* It handles the following actions: '),
273 writeln('* move(D), smell, senseGold, senseBreeze'),
274 writeln('*********************************************************'), nl.
275
276
277
284
286handle_stream(comm_wumpus) :-
287 read_response_from_wumpus(Data),
288 string_to_atom(Data, A),
289 (A=end_of_file ->
290 291 closeWumpusAppletCom
292 ;
293 report_exog_event(A, _)
294 ).
295
296
297
305execute(A, T, N, S) :-
306 execute2(A,T,N,S),
307 retract(now(H)),
308 (S=failed -> A2=failed(A) ; A2=A),
309 assert(now([A2|H])).
310
311
312execute2(moveFwd, _, _, 1) :-
313 retract(robot(X,Y,D,NA,alive)), !,
314 (D=up -> up(room(X,Y),room(X2,Y2)) ;
315 D=down -> down(room(X,Y),room(X2,Y2)) ;
316 D=left -> left(room(X,Y),room(X2,Y2)) ;
317 D=right -> right(room(X,Y),room(X2,Y2))
318 ),
319 report_message(action, ['Executing action: *',moveFwd, '*']), nl,
320 send_command_to_wumpus(robot(X2,Y2), _),
321 send_command_to_wumpus(write(moveFwd), _),
322 ( (pit(X2,Y2) ; wumpus(X2,Y2,alive) ; \+ get_loc(X2,Y2) ) ->
323 assert(robot(X2,Y2,D,NA,dead)) 324 ;
325 assert(robot(X2,Y2,D,NA,alive))
326 ).
327execute2(moveFwd, _, _, failed) :- !.
328
329
330execute2(turn, _, _, 1) :-
331 retract(robot(X,Y,D,NA,alive)), !,
332 (D=up -> D2=right ;
333 D=down -> D2=left ;
334 D=left -> D2=up ;
335 D=right -> D2=down
336 ),
337 assert(robot(X,Y,D2,NA,alive)),
338 report_message(action, ['Executing action: *',turn, '*']), nl,
339 send_command_to_wumpus(write(turn), _).
340execute2(turn, _, _, failed) :- !.
341
342execute2(shootFwd, _, _, 1) :-
343 retract(robot(XR,YR,D,NA,alive)), NA>0, !,
344 NA2 is NA-1,
345 assert(robot(XR,YR,D,NA2,alive)),
346 wumpus(XW,YW,_),
347 (in_line(room(XR,YR),D,room(XW,YW)) ->
348 retract(wumpus(XW,YW,_)),
349 assert(wumpus(XW,YW,dead)), 350 send_command_to_wumpus(set(XW,YW,wdead), _),
351 report_exog_event(scream,_) 352 ;
353 true
354 ),
355 report_message(action, ['Executing action: *',shootFwd, '*']), nl,
356 send_command_to_wumpus(write(shootFwd), _).
357execute2(shootFwd, _, _, failed) :- !.
358
360execute2(shoot, _, _, Scream) :-
361 retract(robot(XR,YR,D,NA,alive)), NA>0, !,
362 NA2 is NA-1,
363 assert(robot(XR,YR,D,NA2,alive)),
364 wumpus(XW,YW,_),
365 (in_line(room(XR,YR),D,room(XW,YW)) ->
366 retract(wumpus(XW,YW,_)),
367 assert(wumpus(XW,YW,dead)), 368 send_command_to_wumpus(set(XW,YW,wdead), _),
369 Scream=1 370 ;
371 Scream=0
372 ),
373 report_message(action,
374 ['Executing sensing action: *',shoot,'* with outcome: ', Scream]),
375 send_command_to_wumpus(write(shoot), _).
376execute2(shoot, _, _, failed) :- !.
377
378
379execute2(smell, _, _, Sensing) :-
380 robot(X,Y,_,_,alive), !,
381 wumpus(X2,Y2,_),
382 (adj(room(X,Y),room(X2,Y2)) -> Sensing=1 ; Sensing=0),
383 report_message(action,
384 ['Executing sensing action: *',smell,'* with outcome: ', Sensing]),
385 nl,
386 send_command_to_wumpus(write(smell(Sensing)), _).
387execute2(smell, _, _, failed) :- !.
388
389execute2(senseBreeze, _, _, Sensing) :-
390 robot(X,Y,_,_,alive), !,
391 ( (pit(X2,Y2),adj(room(X,Y),room(X2,Y2))) ->
392 Sensing=1
393 ;
394 Sensing=0
395 ),
396 report_message(action,
397 ['Executing sensing action: *',senseBreeze,'* with outcome: ',
398 Sensing]),
399 nl,
400 send_command_to_wumpus(write(senseBreeze(Sensing)), _).
401execute2(senseBreeze, _, _, failed) :- !.
402
403execute2(senseGold, _, _, Sensing) :-
404 robot(X,Y,_,_,alive), !,
405 (gold(X,Y) -> Sensing=1 ; Sensing=0),
406 report_message(action,
407 ['Executing sensing action: *',senseGold,'* with outcome: ',
408 Sensing]),
409 nl,
410 send_command_to_wumpus(write(senseGold(Sensing)), _).
411execute2(senseGold, _, _, failed) :- !.
412
413execute2(pickGold, _, _, 1) :- !,
414 robot(X,Y,_,_,alive), !,
415 retractall(gold(X,Y)),
416 report_message(action, ['Executing action: *',pickGold,'*']),
417 nl,
418 send_command_to_wumpus(write(pickGold), _).
419execute2(pickGold, _, _, failed) :- !.
420
421execute2(Action, _, _, ok) :-
422 report_message(action, ['Executing action: *',Action,'*']),
423 send_command_to_wumpus(write(Action), _).
424
425
429:- dynamic robot/5, wumpus/3, pit/2, gold/2, gridsize/1. 430
432domain(V, D) :- getdomain(D, L), member(V, L).
434getdomain(D, L) :- is_list(D) -> L=D ; (P =.. [D,L], call(P)).
435
436
438gridsize(8).
439gridindex(L) :-
440 gridsize(S),
441 findall(X,get_integer(1,X,S),L).
442directions([up,down,left,right]).
443
444up(room(X,Y),room(X,YN)) :- YN is Y+1.
445down(room(X,Y),room(X,YN)) :- YN is Y-1.
446right(room(X,Y),room(XN,Y)) :- XN is X+1.
447left(room(X,Y),room(XN,Y)) :- XN is X-1.
448
450get_random_loc(X,Y) :- gridsize(S), random(1,S,X), random(1,S,Y).
451
453get_loc(X,Y) :- gridsize(S), get_integer(1,X,S), get_integer(1,Y,S).
454
455
456valid_room(room(I,J)) :- domain(I,gridindex), domain(J,gridindex).
457adj(R1,R2) :- (up(R1,R2);down(R1,R2);left(R1,R2);right(R1,R2)),valid_room(R2).
458
459adj(R1,R2,D) :- adj2(R1,R2,D), valid_room(R2).
460adj2(R1,R2,up) :- up(R1,R2).
461adj2(R1,R2,down) :- down(R1,R2).
462adj2(R1,R2,left) :- left(R1,R2).
463adj2(R1,R2,right) :- right(R1,R2).
464
466in_line(R1,_,R1).
467in_line(R1,D,R2) :- adj(R1,R3,D), in_line(R3,D,R2).
468
469
473build_random_wumpus_world(X,Y,D,NA,PPits,NGolds,Size) :-
474 clean_grid,
475 assert(gridsize(Size)),
476 assert(robot(X,Y,D,NA,alive)),
477 repeat,
478 get_random_loc(WX,WY), empty(WX,WY), assert(wumpus(WX,WY,alive)),!,
480 add_pits(PPits),
481 add_n_golds(NGolds).
482
484add_pits(Prob) :-
485 get_loc(PX,PY), 486 (empty(PX,PY) ->
487 random(1,100,N), N=<Prob, assert(pit(PX,PY))
488 ;
489 true
490 ),
491 fail.
492add_pits(_).
493
495add_n_golds(0).
496add_n_golds(N) :-
497 repeat,
498 get_random_loc(PX,PY),
499 empty(PX,PY),
500 assert(gold(PX,PY)), !,
501 N2 is N-1,
502 add_n_golds(N2).
503
504clean_grid:-
505 retractall(gridsize(_)),
506 retractall(robot(_,_,_,_,_)),
507 retractall(wumpus(_,_,_)),
509 retractall(gold(_,_)).
510
512empty(PX,PY) :-
513 \+ robot(PX,PY,_,_,_), \+ wumpus(PX,PY,_), \+ pit(PX,PY), \+ gold(PX,PY).
514
515
516
518build_fixed_wumpus_world(IDScenario,[Size,PPits,NoGolds]) :-
519 clean_grid,
520 (IDScenario=none -> true ; consult('wumpus_testbed')),
521 fixed_wumpus_world(IDScenario,[Size,PPits,NoGolds],IGrid),
522 assert(gridsize(Size)),
523 member(robot(IRX,IRY,IRD,INA,IRS), IGrid),
524 member(wumpus(IWX,IWY,IWS), IGrid),
525 member(golds(ILGolds), IGrid),
526 member(pits(LPits), IGrid),
527 assert(robot(IRX,IRY,IRD,INA,IRS)),
528 assert(wumpus(IWX,IWY,IWS)),
529 forall(member((X,Y),ILGolds), assert(gold(X,Y))),
530 forall(member((X,Y),LPits), assert(pit(X,Y))).
531
532
533fixed_wumpus_world(none,[10,10,1],[robot(1, 1, right, 1, alive), wumpus(2, 3, alive), golds([ (4, 6)]), pits([ (1, 2), (2, 7), (4, 4), (5, 2), (7, 4), (8, 3), (10, 1), (10, 10)])]).
534
535fixed_wumpus_world(IDScenario,[Size,PPits,NoGolds],IGrid) :-
536 wumpus_run(IDScenario,[Size,PPits,NoGolds],IGrid,_,_,_).
537
538
539
547
549send_command_to_wumpus(_, ok) :- \+ wumpusAppletOn, !.
550send_command_to_wumpus(Command, Response) :-
551 any_to_string(Command, SCommand),
552 write(comm_wumpus, SCommand),
553 nl(comm_wumpus),
554 flush(comm_wumpus), !, Response=ok.
556send_command_to_wumpus(_, failed).
557
559read_response_from_wumpus(_) :- \+ wumpusAppletOn, !.
560read_response_from_wumpus(Command) :-
561 read_string(comm_wumpus, end_of_line,_, Command).
562
563
565wumpusAppletOn :- listen_to(socket, comm_wumpus, comm_wumpus).
566
567