Last active
November 8, 2018 20:38
-
-
Save Alynva/61a24cd1d05bdb34a6c607f9ae6903cf to your computer and use it in GitHub Desktop.
Trabalho de Inteligência Artificial - Projeto 1 (BCC/UFSCar/2018)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Trabalho de Inteligência Artificial - Projeto 1 (BCC/UFSCar/2018) | |
% Autor: Alisson Nunes (R.A.: 725862) | |
:- write_ln('[MAPA 1 CARREGADO]'). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
ladrao([10, 5]) :- !. | |
policial([10, 1]) :- !. | |
algema(X) :- policial(X). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
% Tamanho do ambiente | |
primeira_coluna(X) :- X is 1, !. | |
ultima_coluna(X) :- X is 10, !. | |
primeira_linha(X) :- X is 1, !. | |
ultima_linha(X) :- X is 5, !. | |
% Escadas | |
temEscada([9, 1], [9, 2]) :- !. | |
temEscada([2, 1], [2, 2]) :- !. | |
temEscada([5, 2], [5, 3]) :- !. | |
temEscada([3, 3], [3, 4]) :- !. | |
temEscada([8, 3], [8, 4]) :- !. | |
temEscada([10, 3], [10, 4]) :- !. | |
temEscada([1, 4], [1, 5]) :- !. | |
temEscada([6, 4], [6, 5]) :- !. | |
% Carrinhos | |
temCarrinho([8, 1]) :- !. | |
temCarrinho([3, 2]) :- !. | |
temCarrinho([4, 3]) :- !. | |
temCarrinho([3, 5]) :- !. | |
temCarrinho([4, 5]) :- !. | |
% Elevadores | |
temElevador([]). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Trabalho de Inteligência Artificial - Projeto 1 (BCC/UFSCar/2018) | |
% Autor: Alisson Nunes (R.A.: 725862) | |
:- write_ln('[MAPA 2 CARREGADO]'). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
ladrao([7, 5]) :- !. | |
policial([5, 1]) :- !. | |
algema(X) :- policial(X). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
% Tamanho do ambiente | |
primeira_coluna(X) :- X is 1, !. | |
ultima_coluna(X) :- X is 10, !. | |
primeira_linha(X) :- X is 1, !. | |
ultima_linha(X) :- X is 5, !. | |
% Escadas | |
temEscada([10, 1], [10, 2]) :- !. | |
temEscada([9, 1], [9, 2]) :- !. | |
temEscada([2, 1], [2, 2]) :- !. | |
temEscada([6, 2], [6, 3]) :- !. | |
temEscada([8, 3], [8, 4]) :- !. | |
temEscada([1, 3], [1, 4]) :- !. | |
temEscada([9, 4], [9, 5]) :- !. | |
temEscada([1, 4], [1, 5]) :- !. | |
% Carrinhos | |
temCarrinho([8, 1]) :- !. | |
temCarrinho([3, 2]) :- !. | |
temCarrinho([7, 3]) :- !. | |
temCarrinho([3, 4]) :- !. | |
temCarrinho([4, 5]) :- !. | |
% Elevadores | |
temElevador([]). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Trabalho de Inteligência Artificial - Projeto 1 (BCC/UFSCar/2018) | |
% Autor: Alisson Nunes (R.A.: 725862) | |
:- write_ln('[MAPA 3 CARREGADO]'). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
ladrao([1, 1]) :- !. | |
policial([3, 1]) :- !. | |
algema(X) :- policial(X). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
% Tamanho do ambiente | |
primeira_coluna(X) :- X is 1, !. | |
ultima_coluna(X) :- X is 10, !. | |
primeira_linha(X) :- X is 1, !. | |
ultima_linha(X) :- X is 5, !. | |
% Escadas | |
temEscada([9, 1], [9, 2]) :- !. | |
temEscada([1, 2], [1, 3]) :- !. | |
temEscada([10, 3], [10, 4]) :- !. | |
temEscada([5, 4], [5, 5]) :- !. | |
% Carrinhos | |
temCarrinho([7, 2]) :- !. | |
temCarrinho([5, 2]) :- !. | |
temCarrinho([3, 2]) :- !. | |
temCarrinho([7, 3]) :- !. | |
temCarrinho([8, 4]) :- !. | |
temCarrinho([7, 5]) :- !. | |
% Elevadores | |
temElevador([]). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Trabalho de Inteligência Artificial - Projeto 1 (BCC/UFSCar/2018) | |
% Autor: Alisson Nunes (R.A.: 725862) | |
:- write_ln('[MAPA 4 CARREGADO]'). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
ladrao([10, 5]) :- !. | |
policial([3, 1]) :- !. | |
algema(X) :- policial(X). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
% Tamanho do ambiente | |
primeira_coluna(X) :- X is 1, !. | |
ultima_coluna(X) :- X is 10, !. | |
primeira_linha(X) :- X is 1, !. | |
ultima_linha(X) :- X is 5, !. | |
% Escadas | |
temEscada([9, 1], [9, 2]) :- !. | |
temEscada([2, 2], [2, 3]) :- !. | |
temEscada([10, 3], [10, 4]) :- !. | |
temEscada([4, 3], [4, 4]) :- !. | |
temEscada([6, 4], [6, 5]) :- !. | |
% Carrinhos | |
temCarrinho([7, 1]) :- !. | |
temCarrinho([7, 2]) :- !. | |
temCarrinho([7, 3]) :- !. | |
temCarrinho([7, 4]) :- !. | |
temCarrinho([7, 5]) :- !. | |
% Elevadores | |
temElevador([]). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Trabalho de Inteligência Artificial - Projeto 1 (BCC/UFSCar/2018) | |
% Autor: Alisson Nunes (R.A.: 725862) | |
:- write_ln('[MAPA 5 CARREGADO]'). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
ladrao([5, 14]) :- !. | |
policial([8, 1]) :- !. | |
algema([3, 7]) :- !. | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
% Tamanho do ambiente | |
primeira_coluna(X) :- X is 1, !. | |
ultima_coluna(X) :- X is 9, !. | |
primeira_linha(X) :- X is 1, !. | |
ultima_linha(X) :- X is 15, !. | |
% Escadas | |
temEscada([5, 1], [5, 2]) :- !. | |
temEscada([5, 3], [5, 4]) :- !. | |
temEscada([6, 4], [6, 5]) :- !. | |
temEscada([2, 5], [2, 6]) :- !. | |
temEscada([5, 6], [5, 7]) :- !. | |
temEscada([4, 7], [4, 8]) :- !. | |
temEscada([8, 8], [8, 9]) :- !. | |
temEscada([2, 9], [2, 10]) :- !. | |
temEscada([5, 10], [5, 11]) :- !. | |
temEscada([4, 11], [4, 12]) :- !. | |
temEscada([8, 12], [8, 13]) :- !. | |
temEscada([4, 13], [4, 14]) :- !. | |
temEscada([8, 14], [8, 15]) :- !. | |
% Carrinhos | |
temCarrinho([3, 2]) :- !. | |
temCarrinho([8, 3]) :- !. | |
temCarrinho([7, 4]) :- !. | |
temCarrinho([2, 4]) :- !. | |
temCarrinho([3, 5]) :- !. | |
temCarrinho([7, 6]) :- !. | |
temCarrinho([8, 7]) :- !. | |
temCarrinho([6, 8]) :- !. | |
temCarrinho([7, 9]) :- !. | |
temCarrinho([3, 9]) :- !. | |
temCarrinho([6, 12]) :- !. | |
temCarrinho([7, 13]) :- !. | |
temCarrinho([3, 13]) :- !. | |
temCarrinho([6, 14]) :- !. | |
temCarrinho([7, 15]) :- !. | |
temCarrinho([3, 15]) :- !. | |
% Elevadores | |
temElevador([[1, 1], [1, 3], [1, 5], [1, 7], [1, 9], [1, 11], [1, 13], [1, 15]]). | |
temElevador([[9, 1], [9, 4], [9, 6], [9, 8], [9, 10], [9, 12], [9, 14]]). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
% Trabalho de Inteligência Artificial - Projeto 1 (BCC/UFSCar/2018) | |
% Autor: Alisson Nunes (R.A.: 725862) | |
% Flag para que o PROLOG exiba todos os elementos de listas grandes, ao invés de exibir apenas alguns "[...]" | |
:- set_prolog_flag(answer_write_options,[max_depth(0)]). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
:- write_ln('Atari 2600 Busy Police (Keystone Kapers)'), | |
prompt(_, 'Qual o numero do mapa? '), | |
read_line_to_string(current_input, Mapa), | |
atom_concat('busy_cop-mapa', Mapa, SemiPath), | |
atom_concat(SemiPath, '.pl', Path), | |
consult(Path). | |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
% Checa se certa coordenada está dentro dos limites horizontais e verticais do mapa | |
% @method dentroLH | |
% @param {Integer} Coordenada_X | |
dentroLH(X) :- primeira_coluna(PC), ultima_coluna(UC), X >= PC, X =< UC. | |
% @method dentroLV | |
% @param {Integer} Coordenada_Y | |
dentroLV(Y) :- primeira_linha(PL), ultima_linha(UL), Y >= PL, Y =< UL. | |
% Dado dois pares de coordenadas, verifica se são adjacentes e se estão dentro dos limites do mapa | |
% @method aoLado | |
% @param {[Integer, Integer]} C1 Par de coordenadas | |
% @param {[Integer, Integer]} C2 Par de coordenadas | |
aoLado([X, Y1], [X, Y2]) :- Y2 is Y1 + 1, dentroLV(Y2). | |
aoLado([X, Y1], [X, Y2]) :- Y2 is Y1 - 1, dentroLV(Y2). | |
aoLado([X1, Y], [X2, Y]) :- X2 is X1 + 1, dentroLH(X2). | |
aoLado([X1, Y], [X2, Y]) :- X2 is X1 - 1, dentroLH(X2). | |
% Dado a posição X do policial e do carrinho, retorna a posição X do outro lado do carrinho | |
% @mathod pulaCarrinho | |
% @param {Integer} X_Policial Posição X do policial | |
% @param {Integer} X_Carro Posição X do carrinho | |
% @param {Integer} X_final Posição do outro lado do carrinho | |
pulaCarrinho(X, X_Carro, X_final) :- X_Carro < X, X_final is X_Carro - 1, dentroLH(X_final). | |
pulaCarrinho(X, X_Carro, X_final) :- X_Carro > X, X_final is X_Carro + 1, dentroLH(X_final). | |
% Checa se não tem item numa determina posição | |
% @method naoTemItem | |
% @param {[Integer, Integer]} Posicao Posicao a ser verificada | |
naoTemItem(Posicao) :- not(temEscada(Posicao, _)), not(temCarrinho(Posicao)), not(ladrao(Posicao)). | |
% Checa se um elemento pertence à uma lista | |
% @method pertence | |
% @param {*} Elemento Elemento a ser buscado, podendo ser um átomo ou uma lista | |
% @param {[|]} Lista Deonde será feita a busca | |
pertence(H, [H|_]). | |
pertence(X, [_|T]) :- pertence(X, T). | |
% Realiza o movimento dentro do ambiente | |
% @method mover | |
% @param {[Integer, Integer]} PosAtual Representa a posição atual do policial | |
% @param {[Integer, Integer]} PosDesejada Representa a posição onde deseja-se que o policial vá | |
% @param {[Integer, Integer]} PosFinal Representa a posição final efetiva para onde o policial foi | |
mover(P1, P2, P2) :- temElevador(W), pertence(P1, W), pertence(P2, W), naoTemItem(P2). % Para elevadores | |
mover([X, Y1], [X, Y2], [X, Y2]) :- aoLado([X, Y1], [X, Y2]), temEscada([X, Y1], [X, Y2]). % Para escadas subindo | |
mover([X, Y1], [X, Y2], [X, Y2]) :- aoLado([X, Y1], [X, Y2]), temEscada([X, Y2], [X, Y1]). % Para escadas descendo | |
mover([X1, Y], [X2, Y], [X3, Y]) :- aoLado([X1, Y], [X2, Y]), temCarrinho([X2, Y]), pulaCarrinho(X1, X2, X3), naoTemItem([X3, Y]). % Para carrinhos SEM obstáculo | |
% mover([X1, Y], [X2, Y], [X1, Y]) :- aoLado([X1, Y], [X2, Y]), temCarrinho([X2, Y]), pulaCarrinho(X1, X2, X3), not(naoTemItem([X3, Y])). % Para carrinhos COM obstáculo | |
mover([X1, Y], [X2, Y], [X2, Y]) :- aoLado([X1, Y], [X2, Y]), not(temCarrinho([X2, Y])). % Para movimentação pelo corredor | |
% Função de busca dos sucessores | |
% @method s | |
% @param {[Integer, Integer]} PosAtual Representa de quem será os sucessores | |
% @param {[Integer, Integer]} Sucessor Um dos sucessores | |
s(PosAtual, Sucessor) :- mover(PosAtual, _, Sucessor). | |
% Faz a extensao do caminho até os nós filhos do estado | |
% @method estende | |
% @param {[[Integer, Integer]|]} FronteiraAtual Lista de estados correspondente à fronteira atual | |
% @param {[[[Integer, Integer]|]|]} NovaFronteira Lista de estados contendo as fronteiras do primeiro estado da FronteiraAtual | |
estende([Estado|Caminho],ListaSucessores) :- bagof([Sucessor, Estado|Caminho], (s(Estado, Sucessor), not(pertence(Sucessor, [Estado|Caminho]))), ListaSucessores), !. | |
estende(_, []). % Se o estado não tiver sucessor, falha e não procura mais (corte) | |
% Solucao por busca em largura | |
% @method bl | |
% @param {[Integer, Integer]} Inicial Posição inicial da busca | |
% @param {[Integer, Integer]} Meta Posição final da busca | |
% @param {[[Integer, Integer]|]} Solucao Caminho entre Inicial e Meta | |
bl(Inicial, Meta, Solucao) :- bl_recur([[Inicial]], Meta, Solucao). | |
% Recusivamente, visita os sucessores até chegar na meta | |
% @method bl_recur | |
% @param {[[[Integer, Integer]|]|]} Fronteira Lista que contém toda a fronteira a partir do local atual | |
% @param {[Integer, Integer]} Meta Posição final da busca | |
% @param {[[Integer, Integer]|]} Caminho Caminho total da busca | |
bl_recur([[Estado|Caminho]|_], Estado, [Estado|Caminho]). % Se o primeiro estado da fronteira for meta, então o retorna com o caminho | |
bl_recur([Primeiro|Outros], Meta, Solucao) :- estende(Primeiro, Sucessores), append(Outros, Sucessores, NovaFronteira), bl_recur(NovaFronteira, Meta, Solucao). % Estende o primeiro estado até seus sucessores e os coloca no final da lista de fronteira | |
% Solucao por busca em profundidade | |
% @method bp | |
% @param {[Integer, Integer]} Inicial Posição inicial da busca | |
% @param {[Integer, Integer]} Meta Posição final da busca | |
% @param {[[Integer, Integer]|]} Solucao Caminho entre Inicial e Meta | |
bp(Inicial, Meta, Solucao) :- bp_recur([], Inicial, Meta, Solucao). | |
% Através de retrocesso, visita todos os locais até chegar na meta | |
% @method bp_recur | |
% @param {[[Integer, Integer]|]} Caminho Caminho já percorrido | |
% @param {[Integer, Integer]} EstadoAtual Estado atual da busca | |
% @param {[Integer, Integer]} Meta Estado onde se deseja chegar | |
% @param {[[Integer, Integer]|]} Solucao Caminho do inicio até a meta | |
bp_recur(Caminho, Meta, Meta, [Meta|Caminho]). % Se o primeiro estado da lista é meta, retorna a meta | |
bp_recur(Caminho, Estado, Meta, Solucao) :- s(Estado, Sucessor), not(pertence(Sucessor, [Estado|Caminho])), bp_recur([Estado|Caminho], Sucessor, Meta, Solucao). % Se falhar, coloca o estado no caminho e continua a busca recursivamente | |
% Realiza a Busca em Largura ou Busca em Profundidade em busca do caminho até o ladrão | |
% @method resultado | |
% @param {[[Integer, Integer]|]} Caminho Caminho padrão | |
resultado(Caminho) :- resultado(Caminho, pl, bl). | |
% @method resultado | |
% @param {[Integer, Integer]} Posição do policial | |
% @param {[[Integer, Integer]|]} Caminho Caminho padrão | |
resultado(PosPolicial, Caminho) :- resultado(PosPolicial, Caminho, pl, bl). | |
% @method resultado | |
% @param {[[Integer, Integer]|]} CaminhoPL Caminho direto até o ladrão | |
% @param {Atom} PoliciaLadrao Define que a busca será no caminho entre polícia e ladrão | |
% @param {Atom} BuscaLargura Define que será utilizado o algoritmo de busca em largura | |
resultado(CaminhoPL, pl, bl) :- policial(PosPolicial), resultado(PosPolicial, CaminhoPL, pl, bl). :- discontiguous resultado/3. | |
% @method resultado | |
% @param {[[Integer, Integer]|]} CaminhoPL Caminho direto até o ladrão | |
% @param {Atom} PoliciaLadrao Define que a busca será no caminho entre polícia e ladrão | |
% @param {Atom} BuscaProfundidade Define que será utilizado o algoritmo de busca em profundidade | |
resultado(CaminhoPL, pl, bp) :- policial(PosPolicial), resultado(PosPolicial, CaminhoPL, pl, bp). :- discontiguous resultado/4. | |
% @method resultado | |
% @param {[[Integer, Integer]|]} CaminhoPAL Caminho passando pela algema | |
% @param {Atom} PoliciaAlgemaLadrao Define que a busca será no caminho entre polícia, algema e ladrão | |
% @param {Atom} BuscaLargura Define que será utilizado o algoritmo de busca em largura | |
resultado(CaminhoPAL, pal, bl) :- policial(PosPolicial), resultado(PosPolicial, CaminhoPAL, pal, bl). | |
% @method resultado | |
% @param {[[Integer, Integer]|]} CaminhoPAL Caminho passando pela algema | |
% @param {Atom} PoliciaAlgemaLadrao Define que a busca será no caminho entre polícia, algema e ladrão | |
% @param {Atom} BuscaProfundidade Define que será utilizado o algoritmo de busca em profundidade | |
resultado(CaminhoPAL, pal, bp) :- policial(PosPolicial), resultado(PosPolicial, CaminhoPAL, pal, bp). | |
% @method resultado | |
% @param {[Integer, Integer]} Posição do policial | |
% @param {[[Integer, Integer]|]} CaminhoPL Caminho direto até o ladrão | |
% @param {Atom} PoliciaLadrao Define que a busca será no caminho entre polícia e ladrão | |
% @param {Atom} BuscaLargura Define que será utilizado o algoritmo de busca em largura | |
resultado(PosPolicial, CaminhoPL, pl, bl) :- ladrao(PosLadrao), bl(PosPolicial, PosLadrao, CaminhoPL). | |
% @method resultado | |
% @param {[Integer, Integer]} Posição do policial | |
% @param {[[Integer, Integer]|]} CaminhoPL Caminho direto até o ladrão | |
% @param {Atom} PoliciaLadrao Define que a busca será no caminho entre polícia e ladrão | |
% @param {Atom} BuscaProfundidade Define que será utilizado o algoritmo de busca em profundidade | |
resultado(PosPolicial, CaminhoPL, pl, bp) :- ladrao(PosLadrao), bp(PosPolicial, PosLadrao, CaminhoPL). | |
% @method resultado | |
% @param {[Integer, Integer]} Posição do policial | |
% @param {[[Integer, Integer]|]} CaminhoPAL Caminho passando pela algema | |
% @param {Atom} PoliciaAlgemaLadrao Define que a busca será no caminho entre polícia, algema e ladrão | |
% @param {Atom} BuscaLargura Define que será utilizado o algoritmo de busca em largura | |
resultado(PosPolicial, CaminhoPAL, pal, bl) :- algema(PosAlgema), bl(PosPolicial, PosAlgema, [_|CaminhoPA]), ladrao(PosLadrao), bl(PosAlgema, PosLadrao, CaminhoAL), append(CaminhoAL, CaminhoPA, CaminhoPAL). | |
% @method resultado | |
% @param {[Integer, Integer]} Posição do policial | |
% @param {[[Integer, Integer]|]} CaminhoPAL Caminho passando pela algema | |
% @param {Atom} PoliciaAlgemaLadrao Define que a busca será no caminho entre polícia, algema e ladrão | |
% @param {Atom} BuscaProfundidade Define que será utilizado o algoritmo de busca em profundidade | |
resultado(PosPolicial, CaminhoPAL, pal, bp) :- algema(PosAlgema), bp(PosPolicial, PosAlgema, [_|CaminhoPA]), ladrao(PosLadrao), bp(PosAlgema, PosLadrao, CaminhoAL), append(CaminhoAL, CaminhoPA, CaminhoPAL). |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment