52
53:- style_check(-discontiguous). 56
58cache(locWumpus).
59cache(locRobot).
62cache(_):-fail.
63
67:- dynamic gridsize/1. 68
69gridsize(8).
70gridindex(V) :-
71 gridsize(S),
72 between(1,S,V).
73 76direction(V) :- member(V,[up,down,left,right]).
77location(loc(I,J)) :- gridindex(I), gridindex(J).
78
82prim_action(smell).
83poss(smell, true).
84senses(smell). 85
86prim_action(senseBreeze).
87poss(senseBreeze, true).
88senses(senseBreeze). 89
90prim_action(senseGold).
91poss(senseGold, true).
92senses(senseGold). 93
94prim_action(shootFwd).
95poss(shootFwd, hasArrow=true).
96
97prim_action(pickGold).
98poss(pickGold, isGold(locRobot)=true).
99
100prim_action(setTemp(_)). 101poss(setTemp(_), true).
102
103prim_action(moveFwd).
104poss(moveFwd, neg(inTheEdge(locRobot,dirRobot))).
105
106inTheEdge(loc(1,_),left).
107inTheEdge(loc(X,_),right) :- gridsize(X).
108inTheEdge(loc(_,1),down).
109inTheEdge(loc(_,X),up) :- gridsize(X).
110
111prim_action(turn).
112poss(turn, true).
113
114prim_action(climb).
115poss(climb, true).
116
117prim_action(enter).
118poss(enter, true).
119
120prim_action(reset).
121poss(reset, true).
122
124exog_action(scream).
125
126
130
132fun_fluent(inDungeon).
133causes(climb, inDungeon, false, locRobot=loc(1,1)).
134causes(enter, inDungeon, true, true).
135
137fun_fluent(locWumpus).
138rejects(smell, 1, locWumpus, Y, neg(adj(locRobot,Y))).
139rejects(smell, 0, locWumpus, Y, adj(locRobot,Y)).
140
142fun_fluent(locRobot).
143causes(moveFwd, locRobot, Y, apply(dirRobot,[locRobot,Y])).
144
146fun_fluent(dirRobot).
147causes(turn, dirRobot, Y, rotateRight(dirRobot,Y)).
148
150fun_fluent(isGold(L)):- location(L).
151settles(senseGold, 1, isGold(L), true, L=locRobot).
152settles(senseGold, 0, isGold(L), false, L=locRobot).
153causes(pickGold, isGold(L), false, locRobot=L).
154causes(pickGold, isGold(L), V, and(neg(locRobot=L),V=isGold(L))).
155
157fun_fluent(noGold).
158causes(pickGold, noGold, V, V is noGold+1).
159
160
162fun_fluent(isPit(L)):- location(L).
163settles(senseBreeze, 0, isPit(L), false, adj(locRobot,L)).
164rejects(senseBreeze, 1, isPit(L), false,
165 and(adj(locRobot,L),
166 all(y,location, impl(and(adj(locRobot,y),neg(L=y)),isPit(y)=false))
167 )
168).
169
171fun_fluent(hasArrow).
172causes(shoot(_), hasArrow, false, true).
173
175fun_fluent(aliveWumpus).
176causes(scream, aliveWumpus, false, true).
181
183fun_fluent(visited(L)) :- location(L).
184causes(moveFwd, visited(L), true, apply(dirRobot,[locRobot,L])).
186causes(moveFwd, visited(L), V, and(neg(apply(dirRobot,[locRobot,L])),V=visited(L))).
187causes(reset, visited(L), false,neg(locRobot=L)).
188causes(reset, visited(L), true, locRobot=L).
189
191
192fun_fluent(tries).
193causes(reset, tries, V, V is tries+1).
194
198
202 203initially(locRobot,loc(1,1)).
204initially(dirRobot, right).
205initially(hasArrow,true).
206initially(noGold,0).
207initially(inDungeon,true).
208 209initially(locWumpus,R):- location(R), \+ R=loc(1,1).
210initially(aliveWumpus,true).
211 212initially(isPit(R),true) :- location(R), \+ R=loc(1,1).
213initially(isPit(R),false) :- location(R).
214initially(isGold(R),true) :- location(R), \+ R=loc(1,1).
215initially(isGold(R),false) :- location(R).
216 217initially(tries,1).
218initially(visited(R),true) :- R=loc(1,1).
219initially(visited(R),false):- location(R), \+ R=loc(1,1).
220
221
225
227proc(main, mainControl(N)) :- controller(N), !.
228proc(main, mainControl(4)). 229
230
236proc(mainControl(3),
237 prioritized_interrupts(
238 [interrupt([dir], and(aliveWumpus=true,
239 in_line(locRobot,dir,locWumpus)), [shoot(dir)] ),
240 interrupt(isGold(locRobot)=true, [pickGold]),
241 interrupt(inDungeon=true, [smell,senseBreeze,senseGold,
242 wndet(newRandomWalk, [goto(loc(1,1)),climb])])
243 ]) 244).
245
246
253proc(mainControl(4),
254 prioritized_interrupts(
255 [interrupt([dir], and(aliveWumpus=true,
256 in_line(locRobot,dir,locWumpus)), [shoot(dir)] ),
257 interrupt(isGold(locRobot)=true, [pickGold]),
258 interrupt(inDungeon=true,
259 if(noGold>0,[goto(loc(1,1)),climb],
260 [smell,senseBreeze,senseGold,
261 wndet(explore_grid, [goto(loc(1,1)),climb])
262 ]))
263 ]) 264).
265
267proc(mainControl(5),
268 [mainControl(4),
269 if(noGold>0, ?(true), [reset,enter,mainControl(4)])]
270).
271
272
273proc(mainControl(6),
274 prioritized_interrupts(
275 [interrupt([dir,r],and(locWumpus=r,
276 and(aliveWumpus=true,
277 in_line(locRobot,dir,locWumpus))), [shoot(dir)] ),
278 interrupt(isGold(locRobot)=true, [pickGold]),
279 interrupt(inDungeon=true,
280 if(noGold>0,[goto(loc(1,1)),climb],
281 [smell,senseBreeze,senseGold,
282 wndet(explore_grid2, [goto(loc(1,1)),climb])
283 ]))
284 ]) 285).
286
288
292
293proc(move(D), [search([star(turn,4),?(dirRobot=D),moveFwd])]).
294proc(shoot(D), [search([star(turn,4),?(dirRobot=D),shootFwd])]).
295
296
297
299proc(newRandomWalk,
300 search([
301 rpi(y,location,[
302 ?(visited(y)=true),
303 rpi(z,location,[
304 ?(adj(y,z)),
305 ?(visited(z)=false),
306 ?(or(aliveWumpus=false,neg(locWumpus=z))),
307 ?(isPit(z)=false),
308 ?(pathfind(locRobot,y,L)),
309 L,
310 rpi(w,direction,[move(w),?(locRobot=z)])
311 ])
312 ])
313 ],
314 "SEARCH FOR A (NEW) RANDOM WALK......")
315).
316
317
318proc(goto(Loc),
319 search([?(pathfind(locRobot,Loc,L)), L
320 ], ["PLANNING TO GO TO LOCATION: ",Loc])
321).
322
323
324proc(goto1step(Loc),
325 pi(x,direction,[move(x),?(locRobot=Loc)])
326).
327
328
329proc(goodBorderPair(VLoc, NLoc),
330 [?(visited(VLoc)=true),
331 ?(adj(VLoc,NLoc)),
332 ?(visited(NLoc)=false),
333 ?(or(aliveWumpus=false,neg(locWumpus=NLoc))),
334 ?(isPit(NLoc)=false)]
335).
336
337
338proc(explore_grid,
339 search(pi([s,q],[?(gridsize(s)), ?(q is 2*s-2), explore_limit(0,q)]))
340).
341
342proc(explore_limit(N,MAX),
343 wndet(search([
344 pi(y,[
345 ?(neighbor(locRobot,y,N)),
346 ?(visited(y)=true),
347 348 pi(z,[
349 ?(radj(y,z)),
350 ?(visited(z)=false),
351 ?(or(aliveWumpus=false,neg(locWumpus=z))),
352 ?(isPit(z)=false),
353 354 ?(pathfind(locRobot,y,L)),
355 L,
356 357 rpi(w,direction,[move(w),
358 359 ?(locRobot=z)])
360 ])
361 ])
362 ],['SEARCH FOR A LOCATION ', N, ' STEPS AWAY......']),
363 search([?(and(M is N+1,M=<MAX)),explore_limit(M,MAX)])
364 )
365 ).
366
367
368proc(explore_grid2,
369 search(pi([s,q],[?(gridsize(s)), ?(q is 2*s-2), explore_limit2(0,q)]))
370).
371proc(explore_limit2(N,MAX),
372 wndet(search([
373 pi(y,[
374 ?(neighbor(locRobot,y,N)),
375 ?(visited(y)=true),
376 pi(z,[
377 ?(adj(y,z)),
378 ?(visited(z)=false),
379 ?(or(aliveWumpus=false,neg(locWumpus=z))),
380 ?(isPit(z)=false),
381 ?(pathfind(locRobot,y,L)),
382 L,
383 pi(w,direction,[move(w),?(locRobot=z)])
384 ])
385 ])
386 ],['SEARCH FOR A LOCATION ', N, ' STEPS AWAY......']),
387 search([?(and(M is N+1,M=<MAX)),explore_limit2(M,MAX)])
388 )
389 ).
390
391
392
393
397
399up(loc(X,Y),loc(X,YN)) :- YN is Y+1, location(loc(X,YN)).
400down(loc(X,Y),loc(X,YN)) :- YN is Y-1, location(loc(X,YN)).
401right(loc(X,Y),loc(XN,Y)) :- XN is X+1, location(loc(XN,Y)).
402left(loc(X,Y),loc(XN,Y)) :- XN is X-1, location(loc(XN,Y)).
403
405rotateRight(up,right).
406rotateRight(right,down).
407rotateRight(down,left).
408rotateRight(left,up).
409
410valid_loc(loc(I,J)) :- domain(I,gridindex), domain(J,gridindex).
411
412adj(R1,R2) :- (up(R1,R2) ; down(R1,R2) ; left(R1,R2) ; right(R1,R2)).
413
415adj(R1,R2,up) :- up(R1,R2).
416adj(R1,R2,down) :- down(R1,R2).
417adj(R1,R2,left) :- left(R1,R2).
418adj(R1,R2,right) :- right(R1,R2).
419
421radj(L1,L2):-bagof(P,adj(L1,P),L),shuffle(L,RL),member(L2,RL).
422
423neighbor(L,L,0):-!.
425neighbor(loc(I1,J1),loc(I2,J2),N):-
426 location(loc(I2,J2)),
427 DiffI is I1-I2, DiffJ is J1-J2,
428 abs(DiffI,AbsDiffI), abs(DiffJ,AbsDiffJ),
429 N is AbsDiffI+AbsDiffJ.
430
432in_line(R1,_,R1).
433in_line(R1,D,R2) :- adj(R1,R3,D), in_line(R3,D,R2).
434
437pathfind_move(Start, End, move(D)):-
438 direction(D),
439 apply(D,[Start,End]),
440 now(H),
441 holds(visited(End)=true,H).
442
444pathfind_heuristic(loc(I,J), loc(I2,J2), H):-
445 DiffI is I-I2,
446 DiffJ is J-J2,
447 abs(DiffI,AbsDiffI),
448 abs(DiffJ,AbsDiffJ),
449 H is AbsDiffI+AbsDiffJ.
450
451
455
456proc(mainControl(1), L) :-
457reverse([climb, shootFwd, turn, moveFwd, moveFwd, moveFwd, turn, turn, senseGold, senseBreeze, smell, moveFwd, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, moveFwd, turn, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, moveFwd, turn, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, moveFwd, turn, turn, senseGold, senseBreeze, smell, moveFwd, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, senseGold, senseBreeze, smell],L).
458
459proc(mainControl(2), L) :-
460reverse([climb, moveFwd, turn, moveFwd, moveFwd, moveFwd, moveFwd, moveFwd, turn, turn, moveFwd, turn, moveFwd, turn, turn, turn, moveFwd, turn, pickGold, senseGold, senseBreeze, smell, moveFwd, turn, senseGold, senseBreeze, smell, moveFwd, senseGold, senseBreeze, smell, moveFwd, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, moveFwd, turn, turn, senseGold, senseBreeze, smell, moveFwd, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, senseGold, senseBreeze, smell, moveFwd, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, moveFwd, turn, turn, senseGold, senseBreeze, smell, moveFwd, senseGold, senseBreeze, smell, moveFwd, senseGold, senseBreeze, shootFwd, smell, moveFwd, turn, senseGold, senseBreeze, smell, moveFwd, turn, moveFwd, turn, turn, senseGold, senseBreeze, smell, moveFwd, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, senseGold, senseBreeze, smell, moveFwd, turn, turn, turn, senseGold, senseBreeze, smell, moveFwd, senseGold, senseBreeze, smell, moveFwd, senseGold, senseBreeze, smell], L).
461
463fun_fluent(temp).
464causes(setTemp(V), temp, V, true).
465
467proc(lessRandomWalk,
468 search([
469 setTemp([]),
470 star(
471 [?(directions(D)),
472 rpi(y,D,[
473 474 pi(z,[
475 ?(apply(y,[locRobot,z])),
476 ?(valid_loc(z)),
477 ?(visited(z)=true),
478 479 480 ?(\+(member(z,temp))),
481 482 setTemp([z|temp])
483 484 485 ]),
486 move(y)])
487 ]
488 ),
489 moveSafely],
490 "SEARCH FOR A (LESS) RANDOM WALK......")
491 ).
492
493
498actionNum(X,X).
499
500
504
505
506
507
508now(5,H):- reverse([e(smell,0),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,turn,turn,turn,moveFwd,e(smell,0),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,moveFwd,e(smell,0),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,moveFwd,e(smell,0),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,turn,moveFwd,e(smell,1),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,turn,moveFwd,e(smell,0),smell],H).
509
510
511
512
513
514
515
516now(1,[climb, moveFwd, turn, turn, turn, moveFwd, turn, moveFwd, moveFwd, moveFwd, moveFwd, turn, turn, turn, scream, shootFwd, turn, moveFwd, moveFwd, turn, turn, moveFwd, turn, pickGold, e(senseGold, 1), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze,turn, turn, turn, moveFwd, turn, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 1), smell, moveFwd, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, turn, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, e(senseGold, 0), senseGold, e(smell, 0), smell, moveFwd, turn, turn, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, turn, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, turn, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, turn, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, turn, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell, moveFwd, turn, turn, turn, e(senseGold, 0), senseGold, e(senseBreeze, 0), senseBreeze, e(smell, 0), smell]).
517
518
519
520now(2,
521[e(smell,0),smell,
522e(senseBreeze,0),senseBreeze,
523e(senseGold,0),senseGold,
524turn,
525turn,
526turn,
527moveFwd,
528e(smell,0),smell,
529e(senseBreeze,0),senseBreeze,
530e(senseGold,0),senseGold,
531turn,
532moveFwd,
533e(smell,0),smell,
534e(senseBreeze,0),senseBreeze,
535e(senseGold,0),senseGold,
536turn,
537turn,
538turn,
539moveFwd,
540e(smell,0),smell,
541e(senseBreeze,0),senseBreeze,
542e(senseGold,0),senseGold,
543turn,
544turn,
545turn,
546moveFwd,
547e(smell,0),smell,
548e(senseBreeze,0),senseBreeze,
549e(senseGold,0),senseGold,
550turn,
551moveFwd,
552e(smell,0),smell,
553e(senseBreeze,0),senseBreeze,
554e(senseGold,0),senseGold,
555turn,
556moveFwd,
557e(smell,0),smell,
558e(senseBreeze,0),senseBreeze,
559e(senseGold,0),senseGold,
560turn,
561turn,
562turn,
563moveFwd,
564e(smell,0),smell,
565e(senseBreeze,0),senseBreeze,
566e(senseGold,0),senseGold,
567moveFwd,
568e(smell,1),smell,
569e(senseBreeze,0),senseBreeze,
570e(senseGold,0),senseGold,
571turn,
572turn,
573moveFwd,
574turn,
575turn,
576turn,
577moveFwd,
578e(smell,0),smell,
579e(senseBreeze,0),senseBreeze,
580e(senseGold,0),senseGold,
581turn,
582turn,
583turn,
584moveFwd,
585e(smell,0),smell,
586e(senseBreeze,0),senseBreeze,
587e(senseGold,0),senseGold,
588turn,
589moveFwd,
590e(smell,0),smell,
591e(senseBreeze,0),senseBreeze,
592e(senseGold,0),senseGold,
593turn,
594turn,
595turn,
596moveFwd,
597e(smell,0),smell,
598e(senseBreeze,0),senseBreeze,
599e(senseGold,0),senseGold,
600turn,
601turn,
602turn,
603moveFwd,
604e(smell,0),smell,
605e(senseBreeze,0),senseBreeze,
606e(senseGold,0),senseGold,
607moveFwd,
608e(smell,0),smell,
609e(senseBreeze,0),senseBreeze,
610e(senseGold,1),senseGold,
611pickGold,
612turn,
613moveFwd,
614turn,
615turn,
616moveFwd,
617moveFwd,
618turn,
619shootFwd,
620scream,
621turn,
622turn,
623turn,
624moveFwd,
625moveFwd,
626moveFwd,
627moveFwd,
628turn,
629moveFwd,
630turn,
631turn,
632turn,
633moveFwd,
634climb]).
635
637
638
639now(6,H) :-
640reverse([e(smell,0),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,moveFwd,
641e(smell,0),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,moveFwd,e(smell,0),smell,
642e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,turn,turn,turn,moveFwd,e(smell,0),
643smell,
644e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,moveFwd,e(smell,0),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold,turn,turn,turn,moveFwd,e(smell,0),smell,e(senseBreeze,0),senseBreeze,e(senseGold,0),senseGold],H)