Edit page

FAQ - Projeto

Aqui podem encontrar algumas informações úteis sobre o Projeto de LP.

  • Usem e abusem dos built-ins, eles são vossos amigos; uma série de predicados pré-definidos para manipulação de listas pode ser encontrada aqui, havendo contudo mais documentação para outras aplicações que possam querer implementar.

  • Escrevam o pseudo-código num papel antes de o implementar - este conselho já faz sentido em outras linguagens, mas em Prolog ainda friso mais este ponto, principalmente quando é possível desenhar o processo em "árvore", é mesmo útil.

  • As soluções que teoricamente nem façam sentido podem funcionar - se estiverem presos e tiverem uma ideia que quase de certeza não funciona, experimentem na mesma; na pior das hipóteses ficam na mesma, mas podem fazer progresso valioso a experimentar as coisas mais disparatadas.

  • Os primeiros dias vão ser difíceis, e provavelmente vão ficar presos num ou noutro predicado - não desanimem, é completamente normal, se continuarem a trabalhar vão conseguir sair de lá.

  • Podem (e devem) pensar nos problemas como uma Resolução SLD - facilita bastante, na minha opinião.

  • Se quiserem ver o quão eficientes os vossos processos estão a ser/onde é que os vossos processos estão a demorar mais, têm o predicado profile que vos retorna um conjunto de estatísticas sobre o programa.

Dicas de professores

  • Predicados built-in úteis:

    • last/2, que pode ser útil em situações em que queiram saber exatamente qual é o último elemento de uma lista;

    • subsumes_term /2, que verifica se dois termos são unificáveis sem os unificar;

    • min_list/2 e max_list/2, para descobrir, respetivamente, o mínimo e máximo valores em relação aos elementos de uma lista;

    • between/3, particularmente útil para criar listas não hardcoded para predicados relativos às permutações;

    • sum_list/2 para descobrir a soma de todos os elementos de uma lista;

    • sort, tendo este predicado várias versões (/2, /4, ...), para ordenar os elementos de uma lista - têm aqui este e mais outros predicados de ordenação caso queiram explorar;

    • nth0/3 e nth1/3, para obterem o elemento de uma lista dado o seu índice - com nth0 consideramos que o primeiro índice é 0, com nth1 consideramos que é 1;

    • forall/2, que retorna true se para uma dada condição, uma "ação" puder ser provada.

  • Verifiquem sempre que bibliotecas é que podem importar antes de o fazer.

  • Tenham cuidado com unificações indesejadas de variáveis - há situações em que não se pode usar o findall por causa disto mesmo; para além disso , o member também pode ter este problema; a unificação (ou a tentativa da mesma) pode ser, contudo, bastante útil em alguns casos, não sendo sempre indesejada - longe disso.

  • Vão implementando os predicados pela ordem que são dados: por norma, essa ordem foi escolhida precisamente para nos facilitar o trabalho (e porque há alguns que não funcionam sem os anteriores estarem definidos).

  • Vão correndo os testes respetivos a cada predicado antes de passarem para o próximo, para terem uma maior segurança de quem podem avançar sem descurar erros mais fáceis de apanhar (tentem, claro, certificar-se que não têm nenhum).

  • Para comparar variáveis, evitem usar o =, de unificação; procurem antes usar o == para fazer essa comparação.