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

  • 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 , 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.

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 o setof ordena a lista - pode ser útil no permutacoes_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 😃).