CP - Cálculo de Programas

Logo

Índice

Apresentação
Página institucional
Material
Sumários | Calendário
Regime de Avaliação
Alunos
Atendimento
Equipa docente | Horário
Bibliografia
Anos anteriores

Atendimento

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

Atendimento electrónico (FAQs)

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.