Horários de aula: | 246M56♭ [10h35–12h15] |
Sala: | B203 |
Contato: | thanos@imd.ufrn.br |
Playlists: | ( IntroProof | IDMa | IDMb | IRI ) |
Monitoria/TA: | fmc.imd.ufrn.br |
Turmas anteriores: | .. |
Info
Pré-requisitos
- É necessário que os alunos matriculados têm tempo e vontade para estudar, fazer os trabalhos atribuídos, etc.
(Obs.: estudar ≠ ler.)
Veja minhas dicas para estudantes, que inclui pré-requisitos para esta disciplina.
Alunos que não aprenderam o conteúdo das disciplinas de matemática do primeiro semestre e (obviamente) do ensino médio podem consultar as referências seguintes:
(Obs.: aprender ≠ passar.)
- Lang: Basic Mathematics (de uma olhada nesta playlist no YouTube que tem um curto videozinho para cada secção deste livro)
- Lima et al: A Matemática do Ensino Médio, vol I (para esta disciplina os mais relevantes pré-requisitos são os Cap. 1–4)
Conteúdo
A disciplina FMC1 será dividida em 3 módulos–unidades. Podem considerar cada tal módulo como um componente curricular independente (e sem pré-requisitos entre si). Essa divisão é influenciada pelos módulos correspondentes à FMC1 baseados nos módulos correspondentes desta proposta.
IDMa: Elementos da teoria dos números inteiros
(Lecionado 4h/semana, durante a primeira metade do semestre.)
Axiomas sobre os inteiros (domínio de integridade bem ordenado). Demonstrações de teoremas pelos axiomas, sobre as operações e as relações de ordem nos inteiros. A relação de divisibilidade e a verificação de suas principais propriedades. Teorema de Euclides sobre infinidade de primos e sua demonstração construtiva. Lema de divisão de Euclides. Números, numerais, dígitos: demonstração que qualquer inteiro $b > 1$, serve como base para um sistema posicional de numerais para inteiros. Lema de Euclides e sua generalização. Teorema Fundamental da Aritmética. mdc e mmc e demonstrações das suas propriedades Algoritmo de Euclides: corretude e terminação Algoritmo estendido de Euclides Demonstração do teorema Fundamental de Aritmética Congruência módulo um inteiro e demonstrações das suas propriedades Aritmética modular e propriedades do ℤ/mℤ. Algumas conjecturas da teoria dos números: o teorema pequeno de Fermat; a função totiente de Euler; o teorema de Euler.
IRI: Introdução à Recursão e Indução
(Lecionado 2h/semana, durante o semestre inteiro.)
Os naturais e o tipo Nat
; seus construtores (zero, sucessor) e sua teoria: implementação recursiva das suas principais operações, e verificação indutiva das suas principais propriedades. O tipo dos booleanos, Bool
. Ordens sobre os naturais: especificação e verificação de suas propriedades. Outras funções e relações, e suas propriedades. Indução como princípio e técnica de demonstração em matemática. A unicidade dos naturais (a menos de isomorfismo). List Nat
e List α
: tipos de dados de listas: implementação recursiva e verificação indutiva de suas principais propriedades. Outros tipos de dados recursivos: tipos de árvores; tipos de expressões aritméticas; tipos de fórmulas; termos de cálculo-λ. Numerais binários, definição de semântica e seu uso para verificação de corretude.
IDMb: Elementos da teoria dos números reais
(Lecionado 4h/semana, durante a segunda metade do semestre.)
Axiomas de corpo e suas consequências. Axiomas de corpo ordenado e suas consequências. Representação geométrica. Algumas noções métricas e topológicas da reta real. Subconjuntos notáveis do ℝ: N, Z, Q. Racionais e irracionais. Conjuntos cotados, cota superior, cota inferior. Ínfimo, supremo. Seqüências e seus limites. O axioma da completude. Séries.
Objetivos de aprendizagem
IRI: Introdução à Recursão e Indução
Neste módulo estudamos como definir tipos de dados, funções, e relações recursivamente, e como demonstrar propriedades sobre tais coleções de dados por indução.
Prática com o uso da linguagem matemática e das principais técnicas de demonstração e refutação. Prática com a escrita de definições por recursão e demonstrações por indução. Recursão e indução estrutural sobre tipos de dados recursivos. Apreciação de coleções potencialmente infinitas do ponto de vista implementacional, recursivo, e verificação matemática de suas propriedades de interesse. Casamento de padrões e seu uso em definições, demonstrações, e cálculos. Recursão mútua, indução aninhada. Ganhar familiaridade com inferência de tipos e evitar erros de tipagem. Notação e nomenclatura matemática e computacional. Apreciar a diferença e a conexão entre sintaxe e semântica.
IDM: Introdução à Demonstração Matemática
Nestes módulos usamos elementos da teoria dos números inteiros (IDMa) e da teoria axiomática dos números reais (IDMb) para introduzir o aluno ao pensamento matemático e o processo de definir conceitos, enunciar e demonstrar teoremas. Aproveitamos o desenvolvimento do conteúdo concreto para chegar até os seguintes conceitos fundamentais:
- congruência e aritmética modular (IDMa)
- ínfimo, supremo, sequência, limite (IDMb)
Familiarizar com a linguagem usada em definições e demonstrações matemáticas: aprender ler e escrever (usar e interpretar corretamente a linguagem matemática, sua nomenclatura e notação). Apreciar a diferença entre intensional e extensional (sobre igualdades e equivalências). Uso de (meta)variáveis em matemática; ocorrência de variável ligada vs livre; α-conversão (renomeamento); substituição de variável por termos; linguagem vs metalinguagem. Introduzir o lado computacional de uma demonstração, como sequência de comandos que alteram o estado de Dados/Alvos. Entender dois lados de matemática: intuitivo e formal. Propriedades da igualdade e seu uso no raciocínio equacional. Aprender como usar e escrever cálculos dentro de uma demonstração. Apreciar a demonstração como justificativa da veracidade de proposições matemáticas (incluindo de proposições como $p\to p$, leis de distributividade, de De Morgan, frequentemente chamadas «leis» de lógica). Aprender para cada um dos ¬,⇒,∨,∧,∃,∀: como introduzi-lo e como eliminá-lo no texto de uma demonstração. Apreciar a lógica construtiva e os usos dos princípios da lógica clássica (terceiro excluído, redução ao absurdo, dupla negação, contrapositivo); apreciar a diferença entre redução ao absurdo e demonstração direta de negação. Desenvolver definições e teorias matemáticas a partir de noções primitivas e axiomas. Familiarizar com definições e demonstrações que envolvem conjuntos, sequências, funções, e relações. Ter um primeiro contato com conjuntos estruturados e estruturas algébricas e as propriedades das suas operações. Entender como e por quê os sistemas posicionais de numerais funcionam.
Bibliografia e referências
Conhece o libgen?
Principal
- Eu: Matemática fundacional para computação [fmcbook] (Capítulos 1–6)
IRI: Introdução a Recursão e Indução
- Bird & Wadler (1986): Introduction to Functional Programming (Cap. 1,2,3,5,9)
- Mendelson (1973): Number Systems and the Foundations of Analysis (Cap. 2)
- Christiansen (2023) Functional programming in Lean (Cap: 7,8)
- Steffen, Rüthing, Huth (2018): Mathematical Foundations of Advanced Informatics, vol 1 (Cap: 4, 5)
- Hutton (2016): Programming in Haskell, 2nd ed.
- Pierce et al.: Software Foundations, Vol 1 (Cap: Basics, Induction, Lists)
- Fejer, Simovici (1991): Mathematical Foundations of Computer Science, Vol 1 (Cap. 4)
- Avigad, Leonardo de Moura, and Soonho Kong (2017): Theorem proving in Lean (Cap: 7,8)
- Avigad, Lewis, van Doorn (2017): Logic and Proof (Cap. 17)
IDMa: Introdução à teoria dos números inteiros
- Birkhoff & Mac Lane (1977): A Survey of Modern Algebra, 4th ed. (Cap: 1)
- Mendelson (1973): Number Systems and the Foundations of Analysis (Cap: 3)
- Avigad, Lewis, van Doorn (2017): Logic and Proof (Cap. 19)
- Tao (2016): Analysis I, 3rd ed. (Cap: B1)
- Dasgupta, Papadimitriou, Vazirani: Algorithms [DPV]
IDMb: Introdução à teoria dos números reais
- Abbott (2015): Understanding Analysis, 2nd ed. (Cap: 1, 2, 4)
- Mendelson (1973): Number Systems and the Foundations of Analysis (Cap: 5)
- Rudin (1976): Principles of Mathematical Analysis, 3rd ed. (Cap: 1, 3)
- Tao (2016): Analysis I, 3rd ed. (Cap: 6,7,9,B2)
Comum & Auxiliar
- Avigad, de Moura, Kong (2017): Theorem proving in Lean
- Abbott (2015): Understanding Analysis, 2nd ed. (Cap: 3)
- Daepp, Gorkin (2011): Reading, Writing, and Proving, 2nd ed.
- Devlin (2012): Introduction to Mathematical Thinking (Cap: 4)
- Spivak (2008): Calculus, 4th ed. (Cap: 1)
Para cada um dos assuntos que tratamos, procure também a secção «Leitura complementar» no capítulo correspondente do fmcbook para mais referências.
Dicas
Veja minha página de dicas para estudantes.
Links
- NNG
- Lean
- Haskell
- Minicurso TeX 2018.2
- Detexify
- Overleaf online (La)TeX editor/compilador
- Minicurso Unix 2019.2
- The Missing Semester of your CS Education
Tecnologias & ferramentas
Obs.: As tecnologías/ferramentas seguintes podem mudar durante a disciplina—exceto a primeira. (Instalem e/ou criem uma conta para usar onde necessário.)
- PAPEL (um caderno para dedicar à disciplina) e LAPIS/CANETA.
- Zulip (leia o FAQ).
- O proof assistant Lean para algumas atividades (leia o FAQ).
- A linguagem de programação funcional Lean para algumas atividades.
- A linguagem de programação funcional Haskell para algumas atividades.
- Git (leia o FAQ).
- Muito recomendado mas não necessário: um sistema Unix (veja o minicurso Unix 2019.2).
- Muito recomendado mas não necessário: (neo)vim e Emacs (alternativa popular: VS Code).
- Pouco de (La)TeX (veja o minicurso TeX 2018.2). Online editor/compilador: Overleaf.
O módulo IRI será auxiliado pelo uso da linguagem de programação funcional Lean e Haskell (e talvez Agda), e pelo proof assistant Lean. Usando uma linguagem de programação funcional é imediato implementar todas as suas definições para rodá-las no computador. Usando um proof assistant, formalizamos tanto as definições recursivas, quanto as demonstrações indutivas usando a mesma linguagem. (Mas o foco continua sendo o papel; não o computador!)
O módulo IDMa será auxiliado pelo uso do proof assistant Lean.
O módulo IDMb não será auxiliado por nenhum proof assistant. Ficará só no papel mesmo. (Dependendo do progresso no início do semestre, isso pode mudar.)
Regras
- Nunca escreva ou diga algo que você mesmo não sabe explicar: (i) o que significa; (ii) seu papel na tua resolução. Por exemplo: um aluno escreveu a frase seguinte na sua demonstração: «Como f é cancelável pela esquerda temos que g=h». Ele deve saber o que significa ser cancelável pela esquerda e também explicar como isso foi usado e/ou o que isso tem a ver com essa parte da sua demonstração.
- Qualquer trabalho ou resposta dada poderá ser questionado em forma de prova oral, em modo privado ou aberto. Se um aluno não consegue explicar o que ele mesmo escreveu numa resolução, será considerado plágio (veja abaixo).
- Participando, nunca dê uma resposta que tu não pensou sozinho, exceto dando os devidos créditos correspodentes.
- Não tente “forçar a barra” perguntando ou respondendo coisas aleatórias com objetivo de ganhar pontos. Os pontos de participação não correspondem em apenas perguntas ou dúvidas que mostram interesse. O interesse é implícito pelo fato que tu escolheu matricular nesta turma—não vale pontos.
- Não procurem resoluções em qualquer lugar fora dos indicados em cada homework. O único recurso automaticamente aceitável para procurar ajuda é no nosso Zulip (especificamente seus canáis públicos—não DM) e a monitoria.
- Proibido consultar o apêndice de resoluções do fmcbook durante a disciplina exceto quando for explicitamente permitido por mim. (Os apêndices de dicas são permitidos sim!)
Uns deveres dos alunos
- Visitar este site e o Zulip da disciplina pelo menos uma vez por dia durante o semestre. (Qualquer coisa postada no site ou no Zulip da disciplina será considerada como conhecida por todos os alunos da turma.)
- Estudar o conteúdo lecionado e tentar resolver todos os trabalhos atribuidos.
- Participar no Zulip diariamente, compartilhando tuas resoluções para receber feedback, e checando as resoluções de outros colegas para dar feedback.
- Checar e atender seu email cadastrado no SIGAA pelo menos uma vez por dia durante o semestre.
- Participar nas aulas! Obs.: tendo uma dúvida durante a aula, levante a mão para solicitar “a fala” e assim que a receber, pergunte! Não espere o fim da aula para discutir tua dúvida em “modo particular”! A maioria das vezes eu vou negar isso e pedir ao aluno iniciar a discussão no Zulip ou na próxima aula.
- Participar nas aulas de exercícios de monitoria e utilizar seus horários de atendimento para tirar dúvidas.
(Veja também os FAQs relevantes.)
Sobre plágio
- Plágio detectado implica que o aluno será reprovado na disciplina imediatamente por nota e por faltas.
- Entregar tuas resoluções para um aluno copiar é proibido do mesmo jeito, e também não ajuda mesmo ninguém.
Cadernos vs. celulares
Não faz sentido aparecer na aula sem caderno. E não faz sentido aparecer na aula com celular ligado; bote no modo avião antes de entrar na sala. As aulas são interativas e se não pretende participar e concentrar nesses 100 minutos, sugiro ficar fora e escolher uma outra maneira de passar teu tempo. Não é necessário (e obviamente nem suficiente) aparecer nas minhas aulas para passar.
Avaliação e faltas
Disclaimer. Eu suponho que os alunos desta turma escolheram se matricular por interesse em aprender seu conteúdo. O ideal seria ignorar assuntos irrelevantes de avaliação, presenças, carga horária, etc., e se jogar nos estudos e nas brigas (nas aulas, no Zulip, e na monitoria).
Avaliação
A nota final de cada aluno vai ser principalmente baseada em um ou mais dos: (i) provas escritas; (ii) sua participação; (iii) trabalhos atribuidos; (iv) hw resolvidos (veja o FAQ relevante).
Cada aluno será responsável para manter organizado e bem escrito o seu caderno com todos os teoremas e exercícios que estudou durante a disciplina.
Presenças e faltas
A presença pela regulação da UFRN é obrigatória. Os alunos que não gostam/querem/podem aparecer nas minhas aulas ainda têm chances de ganhar até nota máxima e aprovar na disciplina. Ou seja: alunos que escolhem não participar ou aparecer nas aulas, e mesmo assim aparecem nas provas escritas e conseguem nota final de aprovação vão ter sua porcentagem de faltas ajustada para não reprovar por faltas. Esclarecimento: alunos que não conseguem nota final de aprovação não terão sua porcentagem de presença ajustada de jeito nenhum e por nenhum motivo.
Obviamente, alunos que não aparecem nas aulas não terão como ganhar pontos de participação em aula—duh!—nem pontos de possíveis provas-surpresas.
As presenças/faltas serão cadastradas usando o sistema Plickers (veja o FAQ relevante).
Atrasados
Definição (atrasado). Seja $a$ aluno desta turma. Dizemos que $a$ é atrasado sse $a$ não está já sentado na sua mesa, com seu caderno já aberto, seu celular já desligado e na mochila, no momento que a aula começa.
Tentem estar presentes na sala da aula ANTES do horário do seu começo, e fiquem até o fim da aula.
Caso que alguém chega atrasado: não faz sentido bater na porta da sala de aula; não faz sentido cumprimentar nem o professor (não é mostra educação cumprimentar nesse caso—pelo contrário!) nem os amigos/colegas da aula. Entrando numa sala onde a aula já começou, tentem fazer sua entrada o menos possível notada por os participantes pois atrapalha a concentração de todos.
FAQs
Dynamic content
Pontos de participação
Provas
Provas surpresa. Note que em qualquer aula pode ter prova surpresa, cujos pontos são considerados «pontos extra», assim sendo possível tirar nota máxima (100), mesmo perdendo todas as provas surpresas.
Provas não-surpresa. Tais provas serão avisadas com curtíssima antecedência (de pelo menos 16h). A melhor maneira de lidar com isso é tratar todo dia de aula como possível dia de prova.
U1 (IDMa)
- Prova IDMa.1 / 28pts (2024-10-18) { censored , uncensored , answers , correções }
- Prova IDMa.2 / 72pts (?)
U2 (IRI)
- Prova IRI.1 / 48pts (2024-12-20) { censored , [uncensored][provas/prova21m-u.pdf) , answers , correções }
- Prova IRI.2 / ?
U3 (IDMb)
- Prova IDMb.1 / ?
Homework (HW)
Leia bem o FAQ sobre hw. Note também que:
- Homeworks são atribuidos também durante as aulas e no Zulip.
- Homeworks marcados assim são auxiliares; tente apenas se tu tem resolvido uma parte satisfatória dos outros.
2024-09-18: IntroProof (hw1)
- Capítulo 1
- Para cada um dos ¬,⇒,&,ou,⇔,∀,∃,= pense como que pode ser usado (sendo nos DADOS) ou atacado (sendo no ALVO). Escreva os comandos correspondentes e para cada um deles, esclareça: qual é o efeito no tabuleiro da demonstração (tanto na parte dos DADOS quanto no ALVO), como e quando é que tal comando pode ser executado.
2024-09-22: IntroProof (hw2)
- Capítulo 2: até o primeiro intervalo de problemas
- Para cada uma das proposições seguintes tente demonstrar escrevendo na linguagem de demonstrações que elaboramos nas aulas até agora. Se travar em algum sem conseguir fechar, mostre teu progresso no zulip e peça ajuda; enquanto isso, continua para a próxima!
- Proposições de dupla negaço:
- P ⇒ ¬¬P
- ¬¬P ⇒ P
- Comutatividade dos ∨,∧:
- (P ∨ Q) ⇒ (Q ∨ P)
- (P ∧ Q) ⇒ (Q ∧ P)
- Proposições de interdefinabilidade dos ⇒,∨:
- (P ⇒ Q) ⇒ (¬P ∨ Q)
- (P ⇒ Q) ⇐ (¬P ∨ Q)
- (P ∨ Q) ⇒ (¬P ⇒ Q)
- (P ∨ Q) ⇐ (¬P ⇒ Q)
- Proposições de contraposição:
- (P ⇒ Q) ⇒ (¬Q ⇒ ¬P)
- (¬Q ⇒ ¬P) ⇒ (P ⇒ Q)
- A irrefutabilidade do LEM:
- ¬¬(P∨¬P)
- A lei de Peirce e sua versão “fraca”:
- ((P ⇒ Q) ⇒ P) ⇒ P
- ((P ⇒ Q) ⇒ P) ⇒ ¬¬P
- Proposições de interdefinabilidade dos ∨,∧:
- P∨Q ⇒ ¬(¬P∧¬Q)
- P∨Q ⇐ ¬(¬P∧¬Q)
- P∧Q ⇒ ¬(¬P∨¬Q)
- P∧Q ⇐ ¬(¬P∨¬Q)
- As leis de De Morgan para ∨,∧:
- ¬(P∨Q) ⇒ (¬P ∧ ¬Q)
- ¬(P∨Q) ⇐ (¬P ∧ ¬Q)
- ¬(P∧Q) ⇒ (¬Q ∨ ¬P)
- ¬(P∧Q) ⇐ (¬Q ∨ ¬P)
- Proposições de distributividade dos ∨,∧:
- P∧(Q∨R) ⇒ (P∧Q)∨(P∧R)
- P∧(Q∨R) ⇐ (P∧Q)∨(P∧R)
- P∨(Q∧R) ⇒ (P∨Q)∧(P∨R)
- P∨(Q∧R) ⇐ (P∨Q)∧(P∨R)
- Currificação
- ((P∧Q)⇒R) ⇒ (P⇒(Q⇒R))
- ((P∧Q)⇒R) ⇐ (P⇒(Q⇒R))
- Reflexividade da ⇒:
- P ⇒ P
- Weakening and contraction:
- P ⇒ (P∨Q)
- Q ⇒ (P∨Q)
- (P∧Q) ⇒ P
- (P∧Q) ⇒ Q
- P ⇒ (P∧P)
- (P∨P) ⇒ P
- As leis de De Morgan para ∃,∀:
- ¬(∀x)[φ(x)] ⇒ (∃x)[¬φ(x)]
- ¬(∀x)[φ(x)] ⇐ (∃x)[¬φ(x)]
- ¬(∃x)[φ(x)] ⇒ (∀x)[¬φ(x)]
- ¬(∃x)[φ(x)] ⇐ (∀x)[¬φ(x)]
- Proposições de interdefinabilidade dos ∃,∀:
- (∃x)[φ(x)] ⇒ ¬(∀x)[¬φ(x)]
- (∃x)[φ(x)] ⇐ ¬(∀x)[¬φ(x)]
- (∀x)[φ(x)] ⇒ ¬(∃x)[¬φ(x)]
- (∀x)[φ(x)] ⇐ ¬(∃x)[¬φ(x)]
- Proposições de distributividade de quantificadores:
- (∃x)[φ(x) ∧ ψ(x)] ⇒ (∃x)[φ(x)] ∧ (∃x)[ψ(x)]
- (∃x)[φ(x) ∧ ψ(x)] ⇐ (∃x)[φ(x)] ∧ (∃x)[ψ(x)]
- (∃x)[φ(x) ∨ ψ(x)] ⇒ (∃x)[φ(x)] ∨ (∃x)[ψ(x)]
- (∃x)[φ(x) ∨ ψ(x)] ⇐ (∃x)[φ(x)] ∨ (∃x)[ψ(x)]
- (∀x)[φ(x) ∧ ψ(x)] ⇒ (∀x)[φ(x)] ∧ (∀x)[ψ(x)]
- (∀x)[φ(x) ∧ ψ(x)] ⇐ (∀x)[φ(x)] ∧ (∀x)[ψ(x)]
- (∀x)[φ(x) ∨ ψ(x)] ⇒ (∀x)[φ(x)] ∨ (∀x)[ψ(x)]
- (∀x)[φ(x) ∨ ψ(x)] ⇐ (∀x)[φ(x)] ∨ (∀x)[ψ(x)]
- Proposições de dupla negaço:
2024-09-27: IntroProof (hw3)
- Mostre que, tendo qualquer um dos 3 comandos “mágicos” (LEM, RAA, Contrapositive), consegue inferir os outros dois assim os ganhando como açúcares sintácticos sem precisar tê-los como comandos primitivos no sistema.
- Volte às proposições que não conseguiu demonstrar, mas essa vez use ⛤:
LEM
,RAA
,Contrapositive
. Conseguindo fechar, altere o enunciado para ficar mais honesto (e fraco) mas compilável sem ⛤.
2024-09-30: IDMa (hw1)
- Demonstre (nos
?
precisa enunciar também)(+)-id
:(∀x)[ 0+x = x & x+0 = x ]
(+)-inv
: ?(·)-id
: ?(+)-id-!
: ? (unicidade de (+)-identidade)(·)-id-!
: ?(+)-inv-!
: ?(+)-canR
:(∀c,x,y)[ x + c = y + c ⇒ x = y ]
(+)-canL
: ?(·)-can
: ?(+)-ann-0
:(∀x)[ 0·x = 0 & x·0 = 0 ]
(+),(·)-distR
:(∀x,y,d)[ (x+y)d = xd + yd ]
neg-1
:(∀x)[x·(-1) = ?]
neg-0
: ?neg-neg
:(∀x)[-(-x) = ?]
neg-(+)
: ?neg-(·)
: ?
2024-10-03: IRI (hw1)
- Defina (sem consulta) a adição, a multiplicação, e a exponenciação (nos Nats).
- Calcule os:
- 2 + 3
- 3 + 2
- um dos: 4 · 1; 1 · 4
- Defina uma função
double
que retorna o dobro da sua entrada. - Calcule os:
double (double (S O))
double ((S O) + (S (S O)))
- Demonstre uma das: (·)-idL, (·)-idR
- Demonstre uma das: (^)-idL, (^)-idR
- Defina a função
pred : Nat → Nat
de “predecessor”, onde consideramos que o predecessor de zero é o próprio zero mesmo: AVISO: a maioria das vezes que um aluno de 2022.1 e de 2022.2 usou apred
em outras definições, estava errando - Defina as funções:
fact : Nat → Nat
fib : Nat → Nat
min : Nat × Nat → Nat
max : Nat × Nat → Nat
div : Nat × Nat → Nat × Nat
quot : Nat × Nat → Nat
rem : Nat × Nat → Nat
gcd : Nat × Nat → Nat
lcm : Nat × Nat → Nat
2024-10-07: IDMa (hw2)
- Instale Lean e Haskell no teu computador (veja o FAQ de instalações).
- Demonstre?:
(·),(+)-distr
: ?(+)-res
: ?(·)-res
: ?(·)-can∗
: ?nzd
:(∀a,b)[ ab = 0 ⇒ a = 0 ou b = 0 ]
2024-10-08: IRI (hw2)
- Jogue (complete) o nng. (Recomendo trabalhar no «editor mode» (botão na top-right corner do jogo).)
2024-10-11: IDMa (hw3)
- Cap «Os interios»: §«Primeiros passos»
- Demonstre, ainda com os 8 primeiros axiomas (4 aditivos, 3 multiplicativos, e a distributividade) a equivalência:
nzd
⊣⊢(·)-can*R
2024-10-11: IRI (hw3)
- Cap «Recursão; Indução»: até a §«Demonstrando propriedades de naturais sem indução»
2024-10-14: IDMa (hw4)
- Cap «Os inteiros»: até a §«Conjuntos fechados sob operações»
2024-10-16: IRI (hw4)
- Cap «Recursão; Indução»: até a §«Por que aceitar o princípio da indução?»
2024-10-18: IDMa (hw4)
- Resolva tudo que não resolveu na Prova IDMa.1.
2024-10-21: IDMa (hw5)
- Cap «Inteiros»: até o §«Mínima e máxima»
2024-10-24: IDMa (hw6)
- Cap «Inteiros»: até o primeiro intervalo de problemas
2024-11-18: IDMa (hw7)
- Cap «Inteiros»: até a §«Melhor divisor comum»
2024-11-25: IRI (hw5)
- Implemente como novo tipos, tendo já definido o Nat:
- os parzinhos-de-Nats
- listas-finitas-de-Nats como Nat
- Defina as:
length : List α → Nat
elem : Nat → List Nat → Bool
sum : List Nat → Nat
product : List Nat → Nat
(⧺) : List Nat → List Nat → List Nat
reverse : List α → List α
min : Nat → Nat → Nat
max : Nat → Nat → Nat
allEven : List Nat → Bool
anyEven : List Nat → Bool
allOdd : List Nat → Bool
anyOdd : List Nat → Bool
allZero : List Nat → Bool
anyZero : List Nat → Bool
addNat : Nat → List Nat → List Nat
multNat : Nat → List Nat → List Nat
expNat : Nat → List Nat → List Nat
enumFromTo : Nat → Nat → List Nat
enumTo : Nat → List Nat
take : Nat → List α → List α
drop : Nat → List α → List α
elemIndices : α → List α → List Nat
pwAdd : List Nat → List Nat → List Nat
pwMult : List Nat → List Nat → List Nat
isSorted : List Nat → Bool
filterEven : List Nat → List Nat
filterOdd : List Nat → List Nat
minimum : List Nat ⇀ Nat
maximum : List Nat ⇀ Nat
isPrefixOf : List Nat → List Nat → Bool
mix : List α → List α → List α
intersperse : α → List α → List α
- Defina as:
head : List α → α
tail : List α → List α
init : List α → List α
last : List α → α
- Demonstre os teoremas (escolhe algo interessante para botar nos
??
)(∀xs,ys:ListNat) [ sum (xs ⧺ ys) = ?? ]
(∀xs,ys:ListNat) [ product (xs ⧺ ys) = ?? ]
(∀ℓ:ListNat) [ length (filterEven ℓ ⧺ filterOdd ℓ) = ?? ]
(∀ℓ:ListNat) [ reverse (filterEven ℓ) = ?? ]
(∀n:Nat)(∀ℓ:ListNat) [ length (addNat n ℓ) = ?? ]
(∀n:Nat)(∀ℓ:ListNat) [ sum (addNat n ℓ) = ?? ]
(∀n:Nat)(∀ℓ:ListNat) [ sum (multNat n ℓ) = ?? ]
(∀n:Nat)(∀ℓ:ListNat) [ product (multNat n ℓ) = ?? ]
(∀n:Nat)(∀ℓ:ListNat) [ product (expNat n ℓ) = ?? ]
(∀n:Nat)(∀ℓ:ListNat) [ isSorted (addNat n ℓ) = ?? ]
(∀ℓ:ListNat) [ isEven (product ℓ) = anyEven ℓ ]
(∀ℓ:ListNat) [ isEven (sum ℓ) = isEven (length (filterOdd ℓ)) ]
(∀ℓ:ListNat) [ isZero (sum ℓ) = ?? ]
(∀ℓ:ListNat) [ isZero (product ℓ) = ?? ]
(∀n,m:Nat)(∀ℓ:List Nat) [ addNat (n + m) ℓ = ?? ]
(∀n,m:Nat)(∀ℓ:List Nat) [ multNat (n · m) ℓ = ?? ]
- Demonstre também:
(∀xs,ys:ListNat) [ length (xs ⧺ ys) = ?? ]
(∀xs,ys:ListNat) [ reverse (xs ⧺ ys) = ?? ]
(∀n:Nat)(∀xs,ys:ListNat)[ addNat n (xs ⧺ ys) = ?? ]
(∀ℓ:ListNat) [ reverse (reverse ℓ) = ?? ]
(∀ℓ:ListNat) [ length (reverse ℓ) = ?? ]
- Associatividade da
(⧺)
[]
é uma(⧺)
-identidade
- Pense em mais propriedades, enuncie, e demonstre!
2024-11-27: IDMa (hw8)
- Resolva em condições de prova as provas seguintes:
- Resolva em condições tranqüilas as mesmas provas.
- Escreva sozinho a definição de m.d.c.
- Troque o que precisa trocar para virar a definição de mínimo.
- Troque o que precisa trocar para virar a definição de máximo.
- Troque o que precisa trocar para virar a definição de m.m.c.
- Dados inteiros a,b, demonstre a existência dum m.d.c. deles, e mostre que ele pode ser escrito como combinação linear dos a,b.
- Demonstre as propriedades básicas dum m.d.c., que denotamos aqui simplesmente por (_,_), exceto uma, que é refutável (e logo refute e depois obviamente tente a ajustar para virar demonstrável, e demonstre–phew!):
- (a,b) = (a,-b) = (-a,b) = (-a,-b)
- (a,a) = ?
- (a,0) = ?
- (a,1) = ?
- (a,b) = (b,a)
- ((a,b),c) = ?
- (a,b) = (a, a + b)
- (a,b) = (a, a - b)
- (ca,cb) = c(a,b)
- (uv,a) = (u,a)(v,a)
- (a,b) = (b, rem(a,b))
- Demonstre: Invertible(x) ⇔ Unit(x)
- Demonstre: Irreducible(x) ⇔ Prime(x)
- Demonstre ou refute: para quaisquer primos distintos p,q, pq | n² ⇒ pq | n.
- 🚀 Bora viajar legal!
- Num universo de conjuntos (por exemplo no
Set(Int)
) considere a mesma definição de m.d.c., mas essa vez usando como guia a ordem de (⊆). Qual conceito definiu? O que acontece se virar as direções? (⊇). - Tendo P, Q : Prop, escrevemos
P ⊢ Q
para a (meta)proposição «Dado aP
, podemos demonstrar aQ
.». No universo de proposições, mostre que (⊢) é uma pré-ordem. Qual seria o “m.d.c.” de duas props, e qual o “m.m.c” delas?
- Num universo de conjuntos (por exemplo no
2024-12-06: IDMa (hw9)
- Cap «Inteiros»: até o terceiro intervalo de problemas
2024-12-10: IDMa (hw10)
- Investiga a aritmética dos planetas 1–6:
- Completa as tabelas de adição e de multiplicação.
- Para quais deles temos: (·)-inversos, (+)-inversos, (·)-cancelamento, (·)-inversos, zerodivisores, resoluções únicas
- Os inversos (quando tem) são únicos?
2024-12-16: IRI (hw6)
- Defina as:
replicate : Nat → α → List α
map : (α → β) → List α → List β
filter : (α → Bool) → List α → List α
- a generalização
all
das:allZero
,allEven
,allOdd
- a generalização
any
das:anyZero
,anyEven
,anyOdd
- a generalização
pointwise
das:pwAdd
,pwMult
- a generalização
fold
das:sum
,product
,and
,or
,concat
- simplifique as definições antigas para aproveitar essas funções poderosas
takeWhile : (α → Bool) → List α → List α
dropWhile : (α → Bool) → List α → List α
head : List α → Maybe α
tail : List α → Maybe (List α)
init : List α → Maybe (List α)
last : List α → Maybe α
pick : Nat → List α → Maybe α
findFirst : α → List α → Maybe Nat
find : α → List α → List Nat
curry : ?
uncurry : ?
flip : ?
- Qual seria uma melhor tipágem para a
pw : (α → α → α) → List α → List α → List α
?
Histórico
Quadros das aulas
-
Quadro IDMa: lec09 – lec20
Last update: 2024-12-18 -
Quadro IRI: lec12
Last update: 2024-12-16
2024-09-16: Meta & IntroProof (1)
- Overview
- tipos e type errors
- intensão vs extensão
- (=) vs (≡)
- type inference
- Os construtores de tipos (→) e (×)
- diss valores-de-verdade
- açúcar sintáctico
2024-09-18: IntroProof (2)
- umas definições bugadas de «_ é par»
- duas maneiras que uma definição pode ser errada
- REPLs e demonstrações
- proposiões vs objetos
- Prop vs Bool
- juízos (judgements) vs proposições
- comandos vs proposições
- Exemplos de teoremas e seus tabuleiros (estados) iniciais
- Dados e Alvo
- construtores de props e seus tipos
- os ¬,⇒,⇔,&,ou,∀,∃,=
- (∃): como usar
- variáveis frescas e nomes bons
- ocorrência de variável ligada e livre
2024-09-20: IntroProof (3)
- (∀): como atacar
- (⇒): como atacar
- (∃): como usar
- (ou): como atacar
- (&): como usar
- (=): como usar (substituição)
- contra o poeminha: «não podes supor seu próprio alvo»
- nomes bons e bairros
- mais açúcar sintáctico (
Sejam …
,(∀,,)[…]
) - precedências entre (⇒),(&),(ou)
2024-09-23: IntroProof (4)
- o resto dos conectivos para nossa linguagem de demonstrações
- os ⇒,&,ou,∀,∃,=,⊥ como primitivos
- os ⇔,¬,⇐ como açúcar sintáctico
- como usar e como atacar (cada um dos conectivos)
- quando e como aceitar uma suposta “lei de lógica”
- conexões entre ataques/usos de disjunção/conjunção e usos/ataques de conjunção/disjunção
- conexões entre disjunção/conjunção e quantificação existencial/universal
- conexões entre implicação e quantificação universal
- umas “leis de lógica” e como demonstrá-las
- a linguagem low-level
- o «xou»
2024-09-25: IntroProof (5)
2024-09-27: IntroProof (6)
Vou demonstrar _.
- Θ. a irrefutabilidade do LEM
- magias ⛤
- LEM
- RAA
- Contrapositiva
- a briga Brouwer vs Hilbert
2024-09-30: IDMa (1)
- Convenção sobre (∀)[…]
- «_ é um _-inverso de _» e predicados similares
- Igualdade: refl, sym, trans, subst/repl
- refl e subst são suficientes para inferir as sym e trans
- Θ.
(+)-idL
Calculamos
: notação, efeitos, convenções
2024-10-02: IRI (1)
IntroProof
- IntroProof: existência e unicidade
- IntroProof: (∃!x:α)[φ(x)] como açúcar sintáctico
- IntroProof: $\exists_{\geq n} x : \alpha)[ \varphi(x) ]$
- IntroProof: $\exists_{\leq n} x : \alpha)[ \varphi(x) ]$
- IntroProof: definição vs especificação:
Nat
de IRI vsInt
de IDMa - IntroProof: números vs numerais
- 4 maneiras de definir o tipo de dados
Nat
- casamento de padrões
- notação de cálculos e suas justificativas
- 2 + 3 = 5
- 2 + 3 ≢ 3 + 2
2024-10-04: IDMa (2)
- IntroProof: (≝) vs (=)
- funções anônimas
- muitos teoremas parecidos e como demonstrá-los
(+)-id
vs(+)-id-0
- currificação teaser:
α×β→γ
vsα→β→γ
- duas maneiras de demonstrar o
(+)-canR
- como justificar o «aplique a
(+ (-c))
nos dois lados»
2024-10-07: IDMa (3)
- IntroProof: açúcar:
(∀x legal)[φ(x)]
e(∃x legal)[φ(x)]
- IntroProof: zoom-in/out de modo rua para modo formal e vice-versa
- IntroProof: DRY: não re-demonstre as mesmas idéias em novas demonstrações
(·)-canR*
: 3 intensões- subtração como operação definida:
_-_ : Int × Int → Int
- mais uma convenção sintáctica: justaposição
- mundo aditivo vs mundo aplicativo
- necessidade de algum axioma os conectando
- specification update:
(·),(+)-distrR
- 3 proposições difíceis de demonstrar
(·)-annR-0
(·)-canR∗
nzd
- Θ.
(·)-annR-0
2024-10-09: IRI (2)
- pattern-matching com match-with expressions
- definição da (·)
- especificação vs implementação: por que não podemos considerar o (+)-ass como axioma aqui
- tentativa sem sucesso: demonstrar o (+)-ass
- dois princípios sobre construtores
- lazy vs strict evaluation
2024-10-11: IRI (3); IDMa (3⁺)
- buraquizando subexpressões
- limitações da notação de buracos
- a notação ↦
- a notação λ
- currificação
nzd
e(·)-can*R
: axiomas ou teoremas?
2024-10-14: IDMa (4)
- terminologia de ordens
- D.
(|) : Int × Int → Prop
- divide, mede, é multiplo de, é
(|)
-maior de, é(|)
-menor de, … - Θ.
(|)-refl
- Θ.
(|)-trans
- Θ.
(|)-bottom-1
- Θ.
(|)-top-0
- maneiras alternativas de rotular dados
- criando dados on the fly
- «pela escolha de»
- notação de conjuntos; set comprehension
- conjunto fechado sobre operação binária
- novamente: os açúcares (∀x∈A)[φ(x)] e (∃x∈A)[φ(x)]
2024-10-16: IRI (4)
- Indução
- O comando
Por indução.
- 3 demonstrações da associatividade da (+)
- Indução como regra de inferência
- Base & Passo indutivo como regras de inferência
2024-10-18: IDMa (5⁻); Prova IDMa.1
- Conjuntos e sua notação, incluindo o set builder (comprehension)
- gerador x ∈ A vs proposição x ∈ A
- Prova IDMa.1
2024-10-21: IDMa (5)
Set : Type → Type
- Positividade e ordem, e sua “equivalência”
- Especificação de inteiros v3/?: Pos & seus axiomas
- Θ. (∀a ≠ 0)[ a² positivo ]
- Θ?. 1 é positivo
2024-10-23: IDMa (6); IRI (5)
- 0≠1?
- (Meta)demonstrando a não-demonstrabilidade e a não-refutabilidade de proposições
- Inteiros, especificação v4/?
- Entendendo o princípio da indução em mais uma forma
- Os construtores preservam/respeitam uma propriedade
- teoremas sobre Nats, suas operações, e suas relações principais
- implementando as
ev
eod
- Não abusarás tipos e seus habitantes.
- reimplementando as
ev
eod
- O tipo
Bool
2024-10-25: IDMa (7)
- valor absoluto
- mínima e máxima
- unicidade de mínimo de conjunto
- valor absoluto
2024-10-30: IRI (6)
- Internalização de conceitos
- Corretude (soundess and completeness)
leq : Nat → Nat → Bool
eq : Nat → Nat → Bool
- 3 maneiras diferentes de implementar os
ev
eod
- Recursão mútua
- O tipo
ListNat
2024-11-01: IRI (7)
List : Type → Type
length
,sum
,prod
- abstraindo de
doubles
etriples
paramults
e paramap
2024-11-04: IDMa (8)
- Especificação de inteiros (v5/5)
- O princípio da indução
- O princípio da boa ordem
2024-11-06: IRI (8)
- recursão/indução de ListNat
- presentes de recursão
index : Nat → ListNat → Nat
head, last : ListNat → Nat
init, tail : ListNat → ListNat
- Θ.
(∀f : Nat → Nat)(∀ℓ : ListNat)[ length (map f ℓ) = length ℓ ]
2024-11-08: IDMa (9)
- Justificando versões de indução nos inteiros
- Indução «a partir de
c
» - Indução para os negativos
- Indução para os pares
- Indução com
b
bases - Indução forte
2024-11-11: IRI (9)
- Tentativas de implementar os inteiros
- Polimorfismo
- de
ListNat
paraList α
2024-11-13: IDMa (10)
- PBO e versões inferíveis
- Como usar o PBO na prática
- Θ.
¬(∃x)[ 0 < x < 1 ]
- Wishlist
2024-11-18: IDMa (11)
- Sistemas posicionais de numerais
- Θ. Divisão (de Euclides)
- mdc: melhor divisor comum
- Desenhando a
(|)
no $\mathbb Z_{\geq 0}$
2024-11-22: IDMa (12)
- Desenhando a
(|)
nos inteiros - Vocabulário: associados, invertíveis, unidades, irredutíveis, primos
- Propriedades da
(|)
- Desenhar a busca de mdc
- mais 3 teoremas de Euclides:
- infinitude dos irredutíveis
- irredutível ⇔ primo
- existência de mdc
2024-11-25: IRI (10)
- Recursão e indução em listas
(⧺) : L α → L α → L α
- Θ.
sum (xs ⧺ ys) = sum xs + sum ys
2024-11-27: IDMa (13)
- existência de mdc
- conjuntos fechados sob operações
- membros arbitrários
- propriedades de mdc
- algoritmo de Euclides para mdc
2024-11-29: IDMa (14)
- Θ. (a,b) = (b,r)
- teorema de existência mdc (com PBO)
- teorema de existência mdc (de Euclides)
- algoritmo de Euclides para mdc
- corretude e terminação
- eficiência: criança-BR vs euclides
- Lemma de Euclides: p irredutível ⇒ p primo
2024-12-02: IRI (11)
- abstraindo
- pw (pointwise)
- fold
- let-in expressions
2024-12-04: IDMa (15)
- Teorema de Euclides (infinidade de irredutíveis)
- Teorema Fundamental de Aritmética
2024-12-06: IDMa (16)
- Logaritmos
- Θ. Sistemas posicionais de numerais
- Somatórios e produtórios, notação Σ–Π
- Lemmas spoilerosos de irracionalidades
2024-12-09: IDMa (17)
- comb(r,n): definição
- Teorema binomial
- “planetas” e aritmética modular
2024-12-11: IDMa (18)
- tabelas de operações
- planetas com zerodivisores
- planetas sem (·)-cancelamento*
- congruência modulo um inteiro
- (≡ₘ) é uma congruência
- compatibilidade com operações
- o planeta 0
2024-12-13: IDMa (19)
- invertibilidade modulo m
- critéria de divisibilidade
2024-12-16: IRI (12)
- a verdadeira cara do
void
da C - a verdadeira interpretação da
f()
da C - o tipo
Unit
(𝟙) - o tipo
Empty
(𝟘) - funções saindo e entrando de 𝟙
- funções saindo e entrando de 𝟘
- teaser: aritmética de tipos
Maybe α
Either α β
- soma de tipos
- billion dollar mistake
2024-12-18: IDMa (20)
- exponenciação modulo m
- Θ. Sonho do calouro
- Θ. Fermatinho
- Sistemas (completos e reduzidos) de resíduos