Apresentação |
---|
Página institucional |
Regime de Avaliação |
Sumários | Calendário |
Material |
Bibliografia |
Equipa docente | Horário |
Alunos |
Atendimento |
Anos anteriores |
Em qualquer altura: via correio electrónico pressionando aqui (garantir sempre que “CP” faz parte do assunto). Qualquer outro meio de contacto será considerado informal, não se sentindo a equipa docente vinculada a dar uma resposta em tempo útil.
Durante o período de aulas: o atendimento presencial (ie. on-line em situação de pandemia) será feito de acordo com o horário que se segue, sujeito a marcação verbal ou por e-mail, com um mínimo de uma semana de antecedência, junto do respectivo docente:
Dia | Hora | Curso(s) | Docente |
---|---|---|---|
2ª-feira | 11h-14h | LCC+MiEI | J.N. Oliveira |
4ª-feira | 17h-19h | MiEI | F.L. Neves |
4ª-feira | 18h-20h | LCC+MiEI | J.N. Oliveira |
4ª-feira | 17h-19h | LCC+MiEI | O.M. Pacheco |
5ª-feira | 17h-19h | LCC+MiEI | O.M. Pacheco |
Q1: Gostaria de saber se no vídeo CP2021-T05b, no minuto 25:00, o tipo do out não seria: N0 –> A + N0 em vez de N0 –> A x N0. Pois o contradomínio da função out no gráfico é um coproduto, não é?
R: Tem toda a razão! E obrigado por detectar essa gralha, que será corrigida logo que possível. [NB: esta gralha foi entretanto corrigida]
Q2: Já tentei de várias formas mas não consigo provar coswap . coswap=id (ficha 2, exercício 4). A minha última tentativa foi em pointwise. Estava a pensar bem?
R: Não! Este exercício é um bom exemplo do como uma prova pointwise seria um overkill, pois cada coswap corresponde a dois casos na prova, etc etc. Esta prova é muito mais simples que isso: aplicando fusão-+ a coswap.[i2,i1]=id obtém-se [coswap.i2,coswap.i1]=id. Se a seguir se aplicar universal-+ e se instanciarem os dois coswap chega-se rapidamente a algo trivialmente verdadeiro.
Q3: Penso que no vídeo 3b também há uma gralha no minuto 24:15. No fundo do slide, onde deveria dizer undistr = [id × i1, id × i2] diz undistr = [id × i1, id × π2].
R: Tem toda a razão! E obrigado por detectar essa gralha, que será corrigida logo que possível. [NB: esta gralha foi entretanto corrigida]
Q4: Na minha versão do GHCi (8.2.1) o trabalho não corre, dando um erro na linha 708 na função prop_avg. Como consigo resolver isso?
R: Se isso acontece faça o seguinte: acrescente a linha
prop_avg :: Ord a => [a] -> Property
logo acima da linha 705.
Q5: Ou tentar gerar o pdf do enunciado obtenho o erro: “file xy.sty not found”. O que devo fazer?
R: Isso significa que tem de instalar a package XY no seu LaTeX.
Q6: Durante o processo de utilização dos QuickCheck’s para testar a validade das soluções, surgiu algo deste género: “+++ OK, passed 100 tests; 105 discarded.” Estes “discarded” que surgem referem-se a problemas no código que está a ser testado ou é algo a ignorar?
R: Isso them a ver com casos de teste que foram gerados mas não satisfaziam a pré-condição. Para saberem mais detalhes vejam por exemplo Test.QuickCheck.Safe.
Q7: Queríamos ter parênteses dentro de parênteses dentro de blocos \begin{code}…\end{code} mas temos erros quando interpretamos o lhs no ghci…
R: Isso não tem problema, e.g. lcbr(lcbr a b) c etc. O problema é quererem usar isso dentro de \begin{code} …\end{code}. Para o LaTeX não há qualquer problema, mas o Haskell não vai gostar, pois não consegue interpretar o que lcbr quer dizer. Sugestão: usem barras verticais em texto normal ou então usem spec em vez de code (spec é a mesma coisa que code para o LaTeX, mas para o Haskell não: o que está entre \begin{spec} e \end{spec} não é interpretado.
Q8: No trabalho prático, encontrámos outras fórmulas para a série de números de Catalan. Podemos usá-las?
R: Podem usar qualquer fórmula que vos permita derivar um ciclo-for que calcule a série, mas têm que mostrar como derivaram essa fórmula a partir da que é dada no enunciado.
Q9: No primeiro problema do trabalho prático seguimos a recomendação de nos basearmos no que se mostra no vídeo 10a, recExpAr f = baseExpAr id f, mas isso deu problemas nos tipos. Como devemos prosseguir?
R: A definição de baseExpAr dada no enunciado está mais geral do que é necesssário para resolver este problema. Sugere-se que usem a definição mais restrita que se segue:
baseExpAr’ g f = baseExpAr id g id f f id f
Usando baseExpAr’ em vez de baseExpAr já podem seguir directamente o que está no vídeo acima referido.
Q10: No problema 1 do trabalho prático, como é que se obtém o tipo de saída da função outExpAr? É seguindo o mesmo método que se aprendeu, resolver a equação out . in = id? Parece complicado.
R: Resolver outExpAr . inExpAr = id é mais trabalhoso do que os exemplos das fichas práticas mas o método é o mesmo. É claro que vai dar mais casos, pois há alternativas aninhadas noutras alternativas, mas o processo é sempre o mesmo.
Q11: Ao tentar resolver o problema 5 do trabalho prático tivemos alguns problemas com o F# ao tentar correr qualquer função da biblioteca de LTree que é dada e não sabemos como prosseguir.
R: O problema está relacionado com o sistema de inferência de tipos do F#, que obriga por norma a tornar mais explícita a definição pointfree das funções. Essas alterações no código fornecido já estão nesta nova versão de LTree.fs que devem usar em vez da que foi distribuída no zip. (NB: estamos a entrar em contacto com a comunidade F# para a alertar para o problema acima identificado.)
Q12: Faço o que diz o enunciado para instalar ‘lhs2tex’, cabal install lhs2tex, corre tudo bem, mas continuo sem ´lhs2tex’, e.g. lhs2tex cp2021t.lhs > cp2021t.tex dá erro. (Isto em MAC OS.)
R: Se tudo correu bem na instalação, deverá existir o ficheiro executável Library/Haskell/bin/lhs2tex. O que está a faltar é o “link” para esse ficheiro. Uma maneira simples de o fazer é definir, na shell,
alias lhs2tex=’/Users/user/Library/Haskell/bin/lhs2tex’
onde user é o nome do utilizador. Para não terem que fazer isso sempre, acrescentem essa linha ao ficheiro .bashrc, que já deve existir na directoria principal de user. (Este ficheiro é executado sempre que criam uma shell ou abrem um terminal.)
Q13: Em relação ao problema 4.1 do TP, é possível que a função avg_aux seja um catamorfismo que, de um lado, calcula o somatório de todos os elementos da lista, e de outro calcula o comprimento da lista? Desta forma, a divisão era feita apenas no final em vez de recursivamente.
R: Podia, mas não é isso que é pedido. Aliás, essa versão do algoritmo mais não seria que a questão 5 da ficha 8…
Q14: Corremos o lhs2tex do nosso relatório e o pdf não está a ser gerado…
R: Deviam ter lido o enunciado com mais atenção - o lhs2tex não gera o pdf: gera o tex do qual o pdf, por sua vez, será gerado via pdflatex.
Q15: Na questão das curvas de Bézier, é possível explicarem o que faz esta parte (x : xs) → λz → concat $ (sequenceA [singl · linear1d d x , f xs ]) z , mais concretamente “ → λz → “ e o “ $ “ ?
R: sobre o ” → λz → “: ver funções anónimas; sobre o ” $ “: ver stack-overflow. (Há que pesquisar antes de perguntar…)
Q16: Em relação ao problema 4.1, temos tido problemas com os tipos numéricos, pois o GHCi dá erros sempre que usamos divisões. Sentimos que estamos a errar sisematicamente mas não sabemos exctamente onde e porquê. Alguma dica?
R: Em geral, para manipular “números” em Haskell há que ter em atenção a seguinte estrutura de classes numéricas:
Prelude> :i Integral (..)
instance Integral Word – Defined in ‘GHC.Real’
instance Integral Integer – Defined in ‘GHC.Real’
instance Integral Int – Defined in ‘GHC.Real’
Prelude> :i Fractional (…)
instance Fractional Float – Defined in ‘GHC.Float’
instance Fractional Double – Defined in ‘GHC.Float’
Prelude> :i Num (…)
instance Num Word – Defined in ‘GHC.Num’
instance Num Integer – Defined in ‘GHC.Num’
instance Num Int – Defined in ‘GHC.Num’
instance Num Float – Defined in ‘GHC.Float’
instance Num Double – Defined in ‘GHC.Float’
Olhando para
Prelude> :t fromIntegral
fromIntegral :: (Num b, Integral a) => a -> b
e para
Prelude> :t (/)
(/) :: Fractional a => a -> a -> a
Prelude> :t (+)
(+) :: Num a => a -> a -> a
Prelude> :t (*)
(*) :: Num a => a -> a -> a
Prelude> :t (1+)
(1+) :: Num a => a -> a
Prelude> :t succ
succ :: Enum a => a -> a
é só colocar fromIntegral onde for necessário para converter de umas classes para outras.
Q17: No problema 2, é dito: “derivar uma implementação de C n que não calcule factoriais nenhuns.” Nós criámos uma função que calcula o fatorial de um número e íamos substituir na catdef o ! pela tal função que fizemos. Como é que é para resolver então o problema?
R: O objectivo do problema é exactamente eliminar os factoriais! Isto porque se o não fizerem a função ficará muito ineficiente, ao calcular repetidamente factoriais que já calculou. Tal como no caso da série de Fibonacci, o objectivo é o mesmo: eliminar computações desnecessárias usando a lei de recursividade mútua.
Q18: No problema 2 chegamos a uma função catadef n em recursividade mútua com uma função auxiliar mas não conseguimos que esta siga o mesmo padrão…
R: Pelo exercício 4 da ficha 7 vê-se que a lei de recursividade mútua funciona para mais do que duas funções mutuamente recursivas. Explorem essa possibilidade.
Q19: No TP devemos apresentar as justificações em todas as respostas, ou apenas no problema 2?
R: Onde são pedidas justificações ou derivações têm que as apresentar. Onde não forem pedidas isso é deixado ao vosso critério.
Q20: Quando geramos o pdf do trabalho, onde escrevemos ^2 no .lhs aparece ↑2 no pdf. Como é que se consegue ter o 2 no expoente?
R: Pois, é assim que o lhs2tex formata expoentes, por omissão. Experimentem acrescentar, no início do anexo onde estão a escrever,
%format (up (a) (b)) = “{“ a “}^{“ b “}”
e depois usem eg. ⎮up x 2⎮ para obter o x^2 que pretendem. (NB: se for em código executável, terão que acrescentar up a b = a^b, claro.)
Q21: O pdflatex dá erros quando tentamos justificar um passo do nosso raciocínio da seguinte forma: \just\equiv{Definição de f_aux}. Onde estamos a errar?
R: A notação x_y em LaTeX está reservada para subscripts em modo matemático, daí mensagens como “forgotten $” etc. Em lhs2tex resolve-se bem o caso escrevendo, para o exemplo dado, \just\equiv{Definição de ⎮f_aux⎮}.
Q22: Estava a tentar submeter o trabalho e estou com problemas: diz-me que o numero de aluno não está inscrito. O que fazemos?
R: Isso pode acontecer se o grupo tiver mudado. Tentem de novo a submissão, mas feita por outro colega de grupo, de preferência quem tiver estado na origem do grupo.
Q23: É possível realizar melhoria do teste no exame de recurso?
R: Se a nota do teste for inferior a 10, sim; se for igual ou superior a 10 só no exame de época especial, a que todos os alunos (este ano) têm acesso.