Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

JoaoSkate

[Dúvida] Exercicio de prolog.

Mensagens Recomendadas

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).

Editado por JoaoSkate

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Editado por JoaoSkate

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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,

Editado por JoaoSkate

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.