Jump to content
JoaoSkate

[Dúvida] Exercicio de prolog.

Recommended Posts

JoaoSkate

Boa tarde,

estou a tentar implementar um programa em prolog que tem como objetivo encontrar caminhos num labitinto desde uma posição final até uma posição inicial: sendo que o labirinto é uma grelha com linhas e colunas numeradas, ou seja, esta grelha é representada por uma lista com um comprimento igual ao nr de linhas, e cada elemento desta lista é uma lista com comprimento igual ao nr de colunas.

por exemplo:

[[[P11],[P12]],
[[P21], [P22]]

representa um labirinto 2x2.

as paredes desse labirinto funcionam como se fosse os contornos de cada posição:

ex:

[[[e,d,c],[e,d,c]],
[[e,b],[b,d]]

representa um lab. 2x2 em que e-parede à esquerda, d-direita,c-cima,b-baixo.

as soluções para resolver o lab. serão dadas por uma lista: ex:

[(i,1,1),(b,2,1),(d,2,2)]

ou seja partiu-se da posição i-inicial coordenadas 1,1 depois chegou-se através do movimento para baixo à posição 2,1 e chegou-se ao final que esta na posiçao 2,2 e foi alcançado com um movimento para a direita em relaçao à posiçao anterior, isto é este triplo( letra,linha ,coluna) onde letra é o movimento que fizemos para chegar a uma coordenada linha,coluna.

A minha dificuldade está em definir um predicados de 4 argumentos, que dados um labirinto- Lab ; uma posição atual ; os movimentos já efetuados- Movs, nos devolve no 4º argumento todas os possiveis movimentos nesse labirinto.

possiveis(Lab,Pos_atual,Movs,Poss):-

Estou com alguma dificuldade em sair daqui, o que já tentei foi:

lab([_|[_|[_]]]).
posi_atual(_,_).
movs([e,_,_]|_).
movs([d,_,_]|_).
movs([b,_,_]|_).
movs([c,_,_]|_).
poss([e,_,_]|_).
poss([d,_,_]|_).
poss([b,_,_]|_).
poss([c,_,_]|_).

possiveis(Lab,Pos_atual,Movs,Poss):-lab(Lab),
posi_atual(_,Pos_atual),
movs(Movs),
poss(Poss).

Edited by JoaoSkate

Share this post


Link to post
Share on other sites
HappyHippyHippo

antes de tentar explicar o que quer que seja, até porque como podes testar, o teu código está um pouco "deminuto" ao que é esperado, como é que se codifica a posição final do labirinto ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
JoaoSkate

a posição final é dada no objetivo ao swipl, ou seja se a posição final for na coordena 2x2, é codificada como (movimento_anterior_para_chegar_a_ela , 2,2).

lab(N, Lab, Pos_inicial, Pos_final):

onde N é o numero de um dos labirintos a serem dados , e Lab é a reprensentaçao do mesmo

Edited by JoaoSkate

Share this post


Link to post
Share on other sites
HappyHippyHippo

por outras palavras, existem muitas coisas que não referenciaste aqui no tópico.

pos por favor de apresentar o problema completo ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
JoaoSkate

Okay, vou tentar.

Voltando ao que eu escrevi em cima :

A minha dificuldade está em definir um predicados de 4 argumentos, que dados um labirinto- Lab ; uma posição atual ; os movimentos já efetuados- Movs, nos devolve no 4º argumento todas os possiveis movimentos nesse labirinto.

possiveis(Lab,Pos_atual,Movs,Poss)

Vou dar um exemplo:

eu com o seguinte objetivo:

?-possiveis(Lab1, (2,1),   [ (i,1,1), (b,2,1)]   , Poss).

isto significa que dado um labirinto Lab1 (vou supor que é 2x2 , 2 linhas e duas colunas), estou na posiçao atual dada pelo tuplo (2,1) ou seja estou na 2ªlinha 1ªcoluna, [ (i,1,1), (b,2,1)] ) representa os movimentos que já efetuei ou seja comecei na posicão i-inicial (1,1), andei para biaxo-b e fiquei na posiçao 2,1, com este objetivo eu procuro que me seja devolvido Poss= [lista com os movimentos ainda possiveis tendo em conta a posicao em que estou , e que cada posicao nao pode ser visitada mais que uma vez]. ou seja algo do genero:

Poss= [(d,2,2)]

isto supondo que o labirinto dado é 2x2 a posicao inicial é 1,1 e a final 2,2

Ainda assim nao sei se me faço entender.

nota: o código está diminuto pq estou 'encalhado' logo neste problema, penso que nem a partes do factos que fiz está correta

editado: neste labirinto nao posso andar na diagonal,

Edited by JoaoSkate

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu sei o que queres fazer e o que disseste, o que eu disse foi:

por favor de apresentar o problema completo ?

é apresentar tudo.

tipo:

onde N é o numero de um dos labirintos a serem dados

o que estou a dizer é : coloca todo o problema/enunciado/informação.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok ... respondendo à questão inicial

"realizar o predicado para determinar os movimentos possíveis"

vais ter 4 predicados : um pada direcção que podes tomar

cada um desses predicados terás de verificar se :

- a posição possivel não sai do labirinto

- a posição possivel não se encontra na lista de movimentos já efectuados

- a posição possivel não necessita de um movimento impossibilidato por uma parede


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.