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.
-
Erro no enunciado - exemplo do predicado 9 - há uma menção no exemplo a uma "Grelha", quando na verdade devia ser Puzzle (o que faz com que se tentarem copiar e colar o teste vos dê sempre falso).
-
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 (obrigado Afonso
). -
Se estiverem encalhados nalgum exercício, podem experimentar fazer o predicado 11 para não ficarem sem fazer nada - é o único, para além do primeiro, que não precisa de predicados definidos anteriormente.
-
O sentimento geral é que os predicados 3 e 8 são os mais complicados - se ficarem encalhados neles não se preocupem, é completamente normal que demorem várias horas/dias/semanas a passá-los.
Aula de apoio ao projeto - prof. Maria Remédios
-
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áceis 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 os predicados relativos às permutações (não inclui o 3.1.2); -
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.
-
-
Não se pode importar quaisquer bibliotecas. Podemos, contudo, usar todos os predicados built-in a que temos normalmente acesso - situação igual à de FP, onde não podíamos importar bibliotecas mas podíamos usar todas as funções "default".
-
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.
Aula de apoio ao projeto - prof. Pavão Martins
-
Aconselha a que vão implementando os predicados pela ordem que são dados, diz que essa ordem foi escolhida precisamente para nos facilitar o trabalho (e porque há alguns que não funcionam se 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
); -
Uma particularidade interessante do
setof
que o prof. levantou é que osetof
ordena a lista - pode ser útil nopermutacoes_soma
; -
Nos exemplos dos predicados que envolvem espaços em comum, reparem nas variáveis em comum entre espaços - elas vão ser a chave para implementar esses predicados corretamente;
-
Para comparar variáveis, evitem usar o
=
, de unificação; procurem antes usar o==
para fazer essa comparação;
tip
Os professores também falaram em detalhe sobre cada predicado, mas acho que ficava demasiado denso se viesse escrever o que é que cada um disse sobre cada um dos 19 predicados; assim sendo, recomendo que caso tenham uma dúvida sobre algum predicado em concreto vão rever a aula em si, pode ser que tenham abordado a vossa dúvida. Se repararem nalguma coisa útil que os profs tenham dito que não esteja aqui, falem comigo para ser adicionado!
Tip minha - podem usar o predicado da matriz transposta em mais que um sítio, mesmo quando não é explicitamente pedido - pode ser bastante útil 🤠!
(Esta secção vai sendo alterada conforme forem surgindo informações relevantes, se tiverem contribuições que queiram ver aqui façam PR/digam-me no #lp 😃).