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
emax_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
enth1/3
, para obterem o elemento de uma lista dado o seu índice - comnth0
consideramos que o primeiro índice é 0, comnth1
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 , omember
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.