Skip to content

Instantly share code, notes, and snippets.

@Alynva
Last active November 8, 2018 20:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Alynva/61a24cd1d05bdb34a6c607f9ae6903cf to your computer and use it in GitHub Desktop.
Save Alynva/61a24cd1d05bdb34a6c607f9ae6903cf to your computer and use it in GitHub Desktop.
Trabalho de Inteligência Artificial - Projeto 1 (BCC/UFSCar/2018)
% 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([]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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([]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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([]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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([]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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]]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 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