/* Labirinto */

labirinto :- caminho(entrada,Solucao),
             reverse(Solucao,Sol_invertida), 
             write('Caminho: '),
             imprima(Sol_invertida),
             write('\n').
labirinto.

todas_saidas :- labirinto, fail.

imprima([]):- !.
imprima([Cabeca|_]):-objetivo(Cabeca), write(Cabeca),!.
imprima([Cabeca|Cauda]):- !,write(Cabeca), write(','), imprima(Cauda).
imprima(Arg):- write(Arg).

caminho(Nodo_inicial, Solucao):-
             busca_largura([[Nodo_inicial]], Solucao).

busca_largura([[Nodo|Caminho]|_],[Nodo|Caminho]):-
          objetivo(Nodo).

busca_largura([Nodo|Caminho],Solucao):-
          expandir(Nodo, Expansao_do_Nodo),
          append(Caminho,Expansao_do_Nodo, Novo_caminho),
          busca_largura(Novo_caminho, Solucao).

expandir([Nodo|Caminho],Expansao_do_Nodo) :-
             findall([Novo_nodo, Nodo|Caminho],
                     (conexao(Nodo, Novo_nodo), not(member(Novo_nodo,[Nodo|Caminho]))),
                      Expansao_do_Nodo), !.
expandir(_,[]).

conexao(A,B) :- liga(A,B).
conexao(A,B) :- liga(B,A).

/***********************************************
 * Representação da conectividade do labirinto *
 ***********************************************/

liga(entrada,7).    liga(7,8).         liga(7,1).          liga(8,14).              
liga(8,9).          liga(14,20).       liga(9,15).         liga(20,19).              
liga(20,21).        liga(15,21).       liga(21,22).        liga(22,16).            
liga(16,10).        liga(10,11).       liga(11,12).        liga(12,18).            
liga(12,6).         liga(18,17).       liga(18,saida2).    liga(17,23).              
liga(23,saida2).    liga(6,5).         liga(5,4).          liga(1,2).            
liga(2,3).          liga(3,saida1).  

objetivo(saida1).
objetivo(saida2).


Hosted by www.Geocities.ws

1