Jump to content
softklin

[Prolog] Dúvida numa função parecida com um filtro

Recommended Posts

softklin

Boas pessoal.

Tenho de fazer uma função na linguagem Prolog que pega numa lista de casas de um tabuleiro e remove algumas que estejam fora das regras definidas (neste caso é apnas verificar se estão dentro dos limites impostos pelo tabuleiro). Tentei fazer a seguinte definição recursiva:

% limites maximos do tabuleiro
limites(5, 5).

filtrarCasas([], Validas).
filtrarCasas([casa(X, Y, E, G, H, F)|Cs], Validas) :- limites(Xm, Ym),
                                                                                   (X =< Xm),
                                                                                   (Y =< Ym),
                                                                                   (X > 0),
                                                                                   (Y > 0),
                                                                                   Validas = ([casa(X, Y, E, G, H, F) | Validas]),
                                                                                   filtrarCasas(Cs, Validas).
filtrarCasas([_|Cs], Validas) :- filtrarCasas(Cs, Validas).

A função até filtra as casas de modo correcto, mas o resultado não é o pretendido. Se chamar assim:

filtrarCasas([casa(9,9,'A',5,1,2), casa(2,3,'A',5,1,2), casa(0,5,'A',5,1,2)], Validas)

o resultado é uma lista infinita com a casa correcta:

Validas = [casa(2,3,'A',5,1,2),casa(2,3,'A',5,1,2),casa(2,3,'A',5,1,2),casa(2,3,'A',5,1,2),casa(2,3,'A',5,1,2),casa(2,3,'A',5,1,2),casa(2,3,'A',5,1,2),casa(2,3,'A',5,1,2),casa(2,3,'A',5,1,2),casa(...)|...]

Alguma ideia do que está mal na função? Tem uma condição de paragem, não estou mesmo a perceber o porquê da lista infinita...

Obrigado desde já.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
Rui Carlos

A filtragem numa lista vazia não devia devolver uma lista vaza?

Parece-me que estavas a querer fazer uma versão com acumuladores, mas nesse caso precisavas de 3 argumentos.

Sem usares acumuladores, o segundo predicado fica semelhante ao último, com a diferença que tens que adicionar a cabeça da lista ao resultado.

Qualquer coisa do género

f([H|T],[H|R]):-..., f(T,R).

Não executei o teu código, mas diria que tens um problema aqui: Validas = ([casa(X, Y, E, G, H, F) | Validas]). Penso que o que querias fazer se obtém usando o append, mas terias sempre de usar dois nomes diferentes, caso contrário o predicado falharia.

Já agora, fazeres trace da execução pode-te ajudar a perceber o problema.

Share this post


Link to post
Share on other sites
softklin

Olá Rui Carlos, obrigado pela resposta.

Tentei dividir a lista em cabeça|cauda, como sugeriste, mas não deu. Também tentei com o append, mas tudo o que consegui foi um endereço de memória do prolog (ex:  _1234).

De qualquer forma, não conseguimos fazer nada com essa função, pelo que seguimos outra estratégia de resolução.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

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.