1:-use_module(alpprolog).
    6:-use_module(wumpus_world_big).    7
    8%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    9%%                                                           %%
   10%%  Main Loop                                                %%
   11%%                                                           %%
   12%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   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(_)])