Aula 1 - Introdução a Cálculo de Programas

 8th February 2024 at 7:15pm

Introdução da UC e motivação

Além das minudências sobre o funcionamento da disciplina — e algumas considerações mais impactantes ("A universidade é para ter tudo público!") — tiveram-se algumas considerações sobre a motivação da UC.

Partimos da noção que, em geral, não há base científica para a prática da programação. Existe muita literatura e conhecimento sobre o processo de programar, mas não sobre o produto. E quando existe essa necessidade de segurança sobre um resultado, naturalmente opta-se pela programação funcional (imagino que uma das vantagens seja a ausência de um estado, e a possibilidade de compor funções para tirar conclusões rápidas).

(aparentemente, faz-se muito pouco Cálculo de Programas em Portugal; é uma UC única em Portugal; há uma universidade em Eindhoven que usa este manual; recomendou o livro The Essence of Software: Why Concepts Matter for Great Design, de Daniel Jackson do MIT, que aparentemente tem ligações com o trabalho desenvolvido cá).

Houve ainda um breve contexto histórico sobre as linguagens de programação (e a influência de Von Neumann).


Primeiro caso prático — o Nokia 3310

Foi mostrado um enunciado simples de um problema técnico necessitado de uma solução. Enuncio-o de memória, com a melhor das minhas capacidades:

a) a chamada mais recente fica no topo da lista;

b) o registo de chamadas não contém duplicados;

c) só se guardam dez chamadas.

Este exercício foi dado a alunos, há muitos anos. Entre as várias respostas (maioritariamente Java, C#, C++), apenas uma funcional — incidentemente, a única correcta.

Há uma solução em Haskell muito elegante (possivelmente, errei a copiá-la).

store :: Call -> [Call] -> [Call]
store c L = take 10 (nub (c:l))

Seguiu-se um breve estudo de como se pode considerar cada uma destas funções separadamente, levando a uma aproximação do conceito mais matemático de função. Naturalmente, advém a ideia de composição de funções. Aflorou-se o conceito de combinadores.