1:-use_module(alpprolog).
6:-use_module(wumpus_world_big). 7
13
14main :-
15 init,
16 holds([at(agent,Cell)]),
17 sense,
18 !,
19 main_loop([Cell],[Cell]).
20
21main_loop(Visited,Wayback) :-
22 ( holds([at(agent,Cell),at(gold,Cell)]) ->
23 execute(grab),
24 writeln(grab),
25 go_home(Wayback)
26 ;
27 ( execute(shoot) ->
28 writeln(shoot),
29 main_loop(Visited,Wayback)
30 ;
31 ( explore(Visited,Cell2) ->
32 holds([at(agent,Cell1)]),
33 execute(go(Cell1,Cell2)),
34 writeln(step(Cell1-Cell2)),
35 sense,
36 main_loop([Cell2|Visited],[Cell2|Wayback])
37 ;
38 go_back(Wayback,NewWayback),
39 writeln(backtracking),
40 main_loop(Visited,NewWayback) ) ) ).
45go_back(Wayback,NewWayback) :-
46 Wayback = [Cell1,Cell2|Rest],
47 execute(go(Cell1,Cell2)),
48 NewWayback = [Cell2|Rest].
52go_home(Wayback) :-
53 ( fromto(Wayback,In,Out,[_InitialCell]) do
54 In = [Cell1,Cell2|Rest],
55 execute(go(Cell1,Cell2)),
56 Out = [Cell2|Rest] ).
60explore(Visited,Cell2) :-
65 holds([
66 at(agent,Cell1),
67 connected(Cell1,Cell2),
68 neg(pit(Cell2)),
69 [ neg(at(wumpus,Cell2)), neg(alive(wumpus))]
70 ]),
71
72
73 \+ member(Cell2,Visited)
73.
74
77sense :-
78 holds([breeze(_)]),
79 holds([glitter(_)]),
80 holds([stench(_)])