Cálculo de Programas

Mestrado Integrado em Engenharia Informática e Licenciatura em Ciências da Computação

Tópicos

Avisos

21 Set - Lançadas em Alunos as notas do exame da tinynew.gif época especial.

7 Set - Alteração de sala: o exame de amanhã será afinal no anfiteatro ED2-B2 e não no A1, como foi antes anunciado.

4 Set - O exame da época especial será exclusivamente presencial e terá lugar 3ª-feira, 8-Set, 14:00–17:00, no anfiteatro ED1-A1. Sendo presencial, cumpre-se o estipulado no Regime de avaliação da disciplina: sem consulta, exceptuando o formulário.

2 Set - No seu interesse, os alunos inscritos para exame da época especial desta disciplina devem consultar com o seu tinynew.gif e-mail institucional.

29 Jul - Publicadas em Alunos as tinynew.gif classificações finais desta disciplina.

27 Jul - Orais: terão lugar na próxima quarta-feira, 29-Jul, das 10h30 às 11h30 da manhã, via BBC. Os respectivos links serão enviados aos alunos por e-mail.

24 Jul - Lançadas em Alunos as notas do exame de recurso de 18-Jul.

13 Jul - O exame de recurso desta disciplina terá lugar no próximo sábado, 18 de Julho, das 10h às 13h. Será feito remotamente via BB, tal como o teste.

13 Jul - Disponibilizada em Material o teste de 13-Jun com algumas questões resolvidas.

10 Jul - As notas à data da época normal estão publicadas em Alunos.

8 Jul - As nota do teste e TP serão publicadas amanhã em Alunos.

3 Jul - Sugestão (hoje às 16h): Haskell, then and now: What is the future for functional programming languages?

24 Jun - Orais dos TP: ver horário e detalhes em Alunos.

22 Jun - As defesas orais dos TP terão lugar nos dias 29 e 30 de Junho. Brevemente será divulgado em Alunos o escalonamento dos grupos (gerado aleatoriamente) e detalhes sobre o processo.

15 Jun - Entrega dos TP: ver instruções em Alunos. Data limite: 17 de Junho.

12 Jun - Informa-se que o teste de amanhã (13-Jun) terá a duração de 3 horas, das 10h00 às 13h00.

10 Jun - Nova data para entrega do trabalho prático: 17-Jun (4ª-feira) às 23h59m.

10 Jun - O teste desta disciplina terá início, via BB, às 10h do dia 13-Jun.

22 Mai - O teste desta disciplina terá lugar a 13 de Junho, em horário a definir. Será feito remotamente via BB pelo que, ao contrário do que estava inicialmente previsto, será um teste de consulta (“open-book”). Antes de mais, todos os alunos deverão de imediato verificar se têm acesso à sua página de CP no BB (LCC ou MiEI). Mais informações serão dadas sobre este assunto aqui e no Slack da disciplina.

18 Mai - Publicada no Material a ficha nr.13 (última), destinada às aulas TP desta semana.

13 Mai - Disponibilizada em Material a gravação em vídeo da aula T13 de amanhã à tarde.

11 Mai - Publicada no Material a ficha nr.12, destinada às aulas TP desta semana.

7 Mai - Disponibilizada em Material a gravação em vídeo da aula T12 de hoje à tarde.

5 Mai - Publicada no Material a ficha nr.11, destinada às aulas TP desta semana.

30 Abr - Disponibilizada em Material a gravação em vídeo da aula T11 de hoje.

29 Abr - Trabalho prático: enunciado e material publicados em Material.

27 Abr - Publicada no Material a ficha nr.10, a preparar para as aulas TP desta semana.

22 Abr - Acaba de ser disponibilizada em Material a gravação em vídeo da aula T10 desta 5ª-feira.

20 Abr - Publicada no Material a ficha nr.9, a preparar para as aulas TP desta semana.

15 Abr - Acaba de ser disponibilizada em Material a gravação em vídeo da aula T9 desta 5ª-feira.

13 Abr - Publicada no Material a ficha nr.8, a preparar para as aulas TP da semana de 14-Abr.

31 Mar - Acaba de ser disponibilizada em Material a gravação em vídeo da aula T8 desta 5ª-feira.

24 Mar - Acaba de ser disponibilizada em Material a gravação em vídeo da aula T7 desta 5ª-feira.

20 Mar - Publicada no Material a ficha nr.6, a preparar para as aulas TP da semana de 23-Mar.

17 Mar - Acaba de ser disponibilizada em Material a gravação em vídeo da aula T6 desta 5ª-feira.

16 Mar - Aulas Teóricas T6: a gravação de vídeo das aulas de quinta-feira, 19-Março, irá ficar disponível amanhã em Material. Recomenda-se aos alunos que o vejam antes da sua aula. No horário das aulas T o docente estará on-line para responder a questões e dúvidas. O que for mais relevante será afixado na FAQs de Atendimento.

15 Mar - Foi enviada uma mensagem via BB a todos os alunos sobre o re-início das aulas - por favor vejam as vossas caixas de correio.

13 Mar - De acordo com a circular CPEEUM-01/2020, as aulas re-iniciam-se na próxima segunda-feira, 16-Mar, em modo de e-learning (on-line). Brevemente serão dadas aqui (e enviadas por email via BB) informações sobre esse novo formato das aulas da disciplina.

10 Mar - Trabalho prático: está aberta a inscrição dos grupos de trabalho, que deverá ser feita em https://form.di.uminho.pt/grupo_cp até dia 1 de Abril. NB: os grupos com alunos externos devem contactar a equipa docente antes de se inscreverem.

9 Mar - Por determinação superior, esta semana não haverá aulas, cf. despachos RT-23/24 da Reitoria. A equipa docente está disponível para acompanhar o estudo à distância dos alunos. Pf. estejam atentos às FAQs em Atendimento. Nas mensagens coloquem sempre "CP/1920" no assunto.

6 Mar - Publicada no Material a ficha nr.5, a preparar para as aulas TP da semana de 9-Mar.

28 Fev - Publicada no Material a ficha nr.4, a preparar para as aulas TP da semana de 2-Mar.

26 Fev - A aula de reposição do turno MiEI/TP1 do dia 28 de Fevereiro, 6.a-feira, 11h-13h, terá lugar na sala E2-1.03.

20 Fev - Não haverá aula do turno TP1 amanhã (6ª-feira, 14:00, MiEI, E3-2.03). Será dada uma aula de substituição no dia 28 de Fevereiro, 6.a-feira, das 11h-13h, em sala a divulgar posteriormente.

20 Fev - Publicada no Material a ficha nr.3, a preparar para as aulas TP da semana de 24-Fev.

13 Fev - Publicada no Material a ficha nr.2, a preparar para as aulas TP da semana de 17-Fev.

12 Fev - Alteração de sala do turno LCC/TP1 para a E1-1.20.

6 Fev - Publicada no Material a ficha nr.1, a preparar para as aulas TP da semana de 10-Fev.

28 Jan - Início das aulas: 5ª-feira, dia 6-Fev. Ver Sumários.

28 Jan - Criada esta página de avisos.

Atendimento

  • 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 será feiro de acordo com o horário que se segue, sujeito a marcação verbal ou por email, com um mínimo de uma semana de antecedência, junto do respectivo docente:

Dia Hora Curso(s) Docente
2ª-feira 17h-18h LCC+MiEI J.N. Oliveira
4ª-feira 10h-12h MiEI N. Macedo
4ª-feira 14h-15h MiEI R.J. Neves
5ª-feira 18h-20h LCC+MiEI J.N. Oliveira
5ª-feira 9h-12h MiEI J. Cunha
6ª-feira 10h-13h. LCC+MiEI O.M. Pacheco

 

Atendimento electrónico (FAQs)

Q1 - No trabalho pratico, a função splay tem o tipo [Bool] -> (BTree a -> BTree a), enquanto que o ghci diz que o tipo da função deveria ser [Bool] -> BTree a -> BTree a. É alguma gralha ou representam os mesmos tipo? Além disso, nessa mesma função, como podemos fazer para um catamorfismo consumir duas estruturas, no caso a lista e a árvore, em simultâneo?

R: Em Haskell, [Bool] -> BTree a -> BTree a é o mesmo tipo que [Bool] -> (BTree a -> BTree a). A segunda versão tem a vantagem de mostrar que deverá tratar-se de um catamorfismo de listas ([Bool]) cujo tipo de saída é (BTree a -> BTree a), ou seja, (BTree a)^(BTree a). Logo, deverá ser estudada a exponenciação de funções antes de prosseguir. Ver, por exemplo, Exponenciais.


Q2 - Ainda em relação a 'splay', estamos com dificuldade em construir o gene do catamorfismo que é pedido. Podem dar alguma ajuda?

R: Pensem assim (e aqui verão a vantagem de se pensar a programação com funções de ordem superior): a) o tipo de saída BTree a -> BTree a sugere que o resultado do cata deve ser uma transformação de árvores; b) Se a lista de entrada for vazia não há transformação nenhuma a fazer; c) Se o gene for [g1,g2], em g2(b,f) devem considerar que f é a acumulação de todas as transformações que foram feitas tendo a cauda a lista em consideração. g2 deverá acrescentar a essa transformação já efectuada algo mais, de acordo com b.


Q3 - Quando nos cálculos passamos 'in' (resp. 'out') de um tipo para 'out' (resp. 'in') a mesma posição do outro lado de uma igualdade, que lei(s) estamos a aplicar? Vêm no formulário?

R: Estamos a aplicar as leis (2.18, 2.19) dos apontamentos. Essas leis são válidas para qualquer isomorfismo f/fº, não apenas para in/out. Não, estas leis não estão no formulário.


Q4 - É possível existirem estruturas que possuem functores com mais de 2 parâmetros? Se por exemplo eu estiver a trabalhar com uma estrutura paramétrica nos tipos A e B, faz sentido um functor triplo? E se sim, como o representaríamos na forma B(f,g,h) em que eg. A --f--> C e B --g-->D ?

R: Sim - veja-se por exemplo baseExp no módulo Exp.hs do trabalho prático.


Q5 - Estamos a sentir bastantes dificuldades na função de inserção no problema do dicionário e ainda não conseguimos ter nem o princípio de uma solução. Não será possível darem-nos uma orientação sobre por onde começar?

R: Para definir a função dic_in de uma palavra e seu significado no dicionário, o melhor é pensarem que vai ser preciso fazer recursividade "horizontal" - à procura da primeira letra - e "vertical" - descida para inserir o resto da palavra e seu sinónimo. O mais natural será assim pensar num hilomorfismo auxiliar que aceite a palavra e a lista de expressões onde está a ser feita a procura / inserção. Recomenda-se que pensem na solução com base num diagrama com os tipos em jogo antes de passarem à programação. Como é habitual em problemas deste género, a parte "ana" do "hilo" vai fazer a maior parte do trabalho.


Q6 - Estamos com dificuldades em fazer a função 'splay' como catamorfismo de listas. Isto porque não conseguimos ver como o fazer sem navegar pela árvore. Será que nos podem dar alguma pista?

R: Têm toda a razão! A função splay deveria ter tipo BTree a -> [Bool] -> BTree a e ser um catamorfismo de BTree e não de listas. Se não conseguirem escrevê-lo directamente, escrevam primeiro a versão uncurried - que, com tipo (BTree a, [Bool]) -> BTree, não é um catamorfismo - e depois tentem derivar daí a solução final.


Q7 - O que deve ser apresentado no trabalho prático além das funções, claro, e dos diagramas explicitamente requisitados? Todos os diagramas? Todos os cálculos para a obtenção das funções e funtores? Comentários explicando funcionalidades do código?

R: Isso é deixado ao vosso critério, pois podem ter ou não tempo para escrever explicações sobre as vossas soluções. Se tiverem tempo, isso é bom e será valorizado. Mas esses textos devem ser objectivos e não devem distrair o avaliador do essencial, ok? Podem também ajudar quando tiverem mais do que uma solução e queiram compará-las. Podem usar \begin{spec}...\end{spec} para código que que querem formatar como em \begin{code}...\end{code} mas não querem que seja executado.


Q8 - Tenho uma dúvida depois do que li na Q6 acima: os professores irão atualizar o enunciado e o trabalho com o quickCheck/splay corrigido ou terão de ser os grupos a mudar?

R: A nossa regra é evitar mudar o enunciado enquanto o trabaho está a correr. O que devem fazer é (a) não mexer no tipo de splay, por forma a estar compatível com o QuickCheck, etc; (b) definirem splay = flip ⦇ g ⦈, em que ⦇ g ⦈ é o catamorfismo de BTree de acordo com o que se escreveu na Q6.


Q9 - Estamos com dificuldade em abordar a primeira questão. Será que nos podem dar mais informação sobre este tipo de dicionários em árvore?

R: Sim. Sugerimos que consultem, por exemplo, esta página na wikipédia: https://en.wikipedia.org/wiki/Trie.


Q10 - Nós definimos a função maisDir = ⦇ [nothing, π2.π2] ⦈ que tipa bem mas dá sempre Nothing. Não estamos a ver como não perder o "último elemento" da árvore, mais à direita...

R: A vossa solução tem, no caso recursivo, g2 = π2.π2, que é a mesma coisa que g2(a,(x,y)) = y. Têm de pensar num g2 que não seja "tão rápido" a deitar o 'a' fora. Ora vejam lá...


Q11 - Quando fazemos testes das propriedades 9, 10 e 11, estes nunca terminam. Sendo assim, gostaríamos de saber se há algo que se possa alterar nos testes de maneira a ser possível testar as referidas propriedades.

R: O QuickCheck (que opera sobre um mónade) pode gastar bastantes recursos quando as estruturas são árvores etc, pois começa a tomar a iniciativa de criar casos de teste arbitrariamente complexos. No fim da secção 3 do enunciado tem como controlar o número de casos de teste e a sua complexidade. Façam experiência usando maxSuccess e maxSize, começando por valores baixos e aumentando.


Q12 - Podemos resolver o exercício 5 puramente em código Haskell "normal", ou seja, sem catamorfismos, eithers, etc que aprendemos na disciplina?

R: O objectivo principal desse exercício é praticarem com mónades num problema concreto. O formato de resolução é “livre”.


Q13 - No problema 1, a propriedade 1 tem a pré-condição de ser testada apenas para dicionários normalizados. Sendo assim, não deveria a propriedade 3, que é também aplicada a dicionários exportados, ter a mesma pré-condição? Pergunto isto porque nos testes da 3ªa propriedade aparecem dicionários não normalizados.

R: Tem razão e obrigado pela pergunta, pois o problema é interessante (irão seguramente reencontrá-lo mais tarde na vossa vida profissional...): (a) é feita um representação em memória para obter eficência; mas (b) "teoricamente" a memória só será "habitada" por árvores de dicionários normalizados, após importação.

Contudo, o Quickcheck não sabe disso e começa a gerar representações em memória "absurdas", pois não há nenhum dicionário normalizado que as origine. A gente olha para elas e pensa: "não vou ligar porque isto nunca iria acontecer na realidade". Mas há contra-exemplos e a gente não gosta disso...

A alternativa é fazer com que os testes filtrem situações absurdas. Mas, como não podem mudar o enunciado a não ser no anexo onde estão a escrever as vossas soluções, a solução é adicionarem estes novos testes à vossa resolução e mostrarem na oral que as vossas funções os satisfazem:

\begin{code}
valid t = t == (dic_imp . dic_norm . dic_exp) t
\end{code}
\begin{propriedade}
Se um significado |s| de uma palavra |p| já existe num dicionário normalizado então adicioná-lo
em memória não altera nada:
\begin{code}
prop_dic_red1 p s d
   | d /= dic_norm d = True  
   | dic_red p s d = dic_imp d == dic_in p s (dic_imp d)
   | otherwise = True
\end{code}
\end{propriedade}
\begin{propriedade}
A operação |dic_rd| implementa a procura na correspondente exportação de um dicionário normalizado:
\begin{code}
prop_dic_rd1 (p,t)
   | valid t     = dic_rd  p t == lookup p (dic_exp t)
   | otherwise = True
\end{code}
\end{propriedade}

Já agora ficam a saber mais alguma coisa: em "teoria de desenvolvimento de software" (normalmente chamada "métodos formais"), dic_norm diz-se ser um invariante e valid diz-se ser um invariante de representação.


Q14 - Que grau de confiança na correcção do nosso código podemos ter usando o QuickCheck?

R: É sempre relativa. Os testes validam determinadas propriedades desejáveis de um programa, não todas... e portanto nunca provam que um programa está absolutamente correcto. Podem é provar que está incorrecto! Leiam a célebre frase de Dijkstra:

Program testing can be used to show the presence of bugs, but never to show their absence!

É por isso que uma disciplina como CP se justifica - conseguimos provar propriedades desejáveis dos programas sem fazer testes, usando as leis do cálculo da programação funcional.


Q15 - Conseguimos implementar as funções di_rd e dic_in em Haskell "standard", mas não conseguimos até agora convertê-las em hilomorfismos, como se refere na FAQ5. Vale alguma coisa apresentarmos o que temos, se não tivermos tempo de fazer essa conversão?

R: É sempre melhor apresentar o que têm do que não apresentar nada. E pode ser que até à oral possam ter tempo para as converter em hilos e mostrar lá que o acabaram por fazer com sucesso...


Q16 - Onde posso ler mais sobre isso de invariantes, invariantes de abstracção, etc?

R: Se procurarem "what are invariants" ou coisa do género na internet obtêm muita coisa, por exemplo What are invariants, how can they be used, and have you ever used it in your program?

Nos vossos apontamentos nós parámos no capítulo 4; mas se continuarem pelo 5, 6 e em particular o 7, têm lá a teoria de que se falou acima. Aqui na UM, essa matéria é dada no perfil MFES.


Q17 - No decurso do trabalho surgiram-nos estas dúvidas: tendo-se uma função recursiva k que tem uma cláusula k([],a) = a, tem-se curry k [] a = a e logo curry k [] = id, certo? E se o que tivermos for k(a,[]) = a, a função g = curry k a vai ser tal que a = g [], é assim?

R: Sim + sim smile . No primeiro caso reparem na lei (73) do formulário. No segundo caso, a situação descrita quer dizer que, onde tiverem a, podem sempre substituir por g [], se vos der jeito...


Q18 - Professores: para submeter o trabalho é necessário apenas um elemento o fazer ou todos os elementos do grupo tem de submeter?

R: Basta um elemento do grupo submeter.


Q19 - É possível resolver a insOrd das BTrees por recursividade mútua? Não nos está a fazer muito sentido sem ser por anamorfismo...

R: Não queremos dizer que não possa resolver como anamorfismo. Mas o que se pede é que seja um cata. Pensem assim: (a) caso árvore vazia - é imediato; (b) caso recursivo - o gene vai receber um elemento e duas sub-árvores. Imaginem que o valor à entrada já foi inserido algures numa delas, como que "por milagre"... O que é que o gene deve fazer se se assumir isso? Mais não podemos dizer...


Q20 - Estava a tentar submeter o trabalho e recebi o erro de que o meu número não se encontra em nenhum grupo... Mas na página de alunos está lá! Devo escrever o "a" antes dos dígitos ou não?

R: Devem escrever só o número. Nalguns grupos houve trocas. Nesse caso, quem deve submeter o trabalho é um elemento do grupo que não tenha feito trocas, ok?


Q21 - Eu já passei em época normal à UC, mas queria saber se posso efectuar o exame de recurso de amanhã, dia 18, para fazer melhoria. Ou seja, se fico com a melhor nota ou com a nota do exame de recurso.

R: Este ano, excepcionalmente, qualquer aluno pode fazer melhoria. A nota será t = max(normal, recurso). O que a equipa docente pede é que, caso o aluno veja que não vai mesmo dar para subir nota, não submeta o exame. Poupar-se-ão recursos que podem preciosos noutras circunstâncias (atender alunos, etc). Obrigado pela vossa colaboração.


Q22 - Num passo dum teste resolvido aparece B(a,b) . B(c,d) = B(a . c , b . d), onde B é um bifunctor. Isto encontra-se no formulário?

R: Não. Mas essa lei - que é a (3.57) dos apontamentos - é a extensão a bifunctores da lei functorial (41) do formulário. Já agora: B(id,id)=id é a correspondente extensão da lei (42).


Q23 - Alguns colegas estão a dizer que quem teve R na pauta de Julho pode ir a época especial. No nosso grupo tivemos R por não termos nota mínima no trabalho. É possível esclarecerem quais os critérios para ir a época especial?

R: Devido à situação anormal que vivemos, no corrente ano lectivo foi dado acesso generalizado à época especial. Contudo, esse acesso geral não tem - nem pode ter - enm consideração os regimes de avaliação particulares de cada disciplina. Em CP esse regime determina notas mínimas para passar de ano nas componentes T e TP. O exame de recurso permite melhorar a nota T mas não a nota TP. Logo, se um aluno não tiver nota mínima no TP, o exame de recurso não lhe vai permitir passar à disciplina, pois a nota TP permanece a mesma.


-- JoseNunoOliveira - created on 06 Feb 2020

r20 - 26 Aug 2020 - 11:54:29 - JoseNunoOliveira
This site is powered by the TWiki collaboration platform Copyright © by the contributing authors. Ideas, requests, problems? Send feedback.
Syndicate this site RSSATOM