Cheat sheet

Decisões de tipos, listas, folds, parsers e execução em Prolog, com as condições que mudam a resposta.

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Cada linha regista a condição que muda a resposta e aponta a explicação completa.

Tipos: ler a assinatura

FormaDecisão
f x yÉ (f x) y; a aplicação tem prioridade sobre operadores e associa à esquerda.
a -> b -> cÉ a -> (b -> c); permite aplicação parcial. Os parênteses marcam funções como argumentos.
[a], (a,b)Lista homogénea; par com tipos possivelmente diferentes.
Eq, OrdIgualdade; comparação ordenada, que exige Eq.
Num, Fractional+,-,*; /. Num atual não implica Eq: podes precisar de (Num a, Eq a).
Integraldiv,mod (para baixo), quot,rem (para zero). Não mistures quociente de um com resto do outro.
fromIntegral nConverte um valor integral; a conversão nunca é automática.
if c then a else bc :: Bool; os dois ramos têm o mesmo tipo.
Padrões e guardasTentados pela ordem escrita; cobre todas as formas e declara o domínio. _ é curinga.
Erro frequentelength xs + 0.5 falha: length dá Int, / exige fracionário.

Deduzir tipos e expressões.

Listas: escolher a operação

map f (x:xs)    = f x : map f xs
filter p (x:xs) = if p x then x : filter p xs else filter p xs
foldr f z (x:xs) = f x (foldr f z xs)
foldl f z (x:xs) = foldl f (f z x) xs
PedidoPadrão e condição
Transformar cadamap; conserva o comprimento.
Ficar só com algunsfilter; pode precisar da lista inteira.
Prefixo até falhartakeWhile, dropWhile; param no primeiro que falha.
Todos / algumall p [] = True; any p [] = False.
Juntar listasfoldr (:) ys xs; xs ++ ys percorre xs.
Achatarfoldr (++) [].
Inverterfoldl (flip (:)) [], linear; lista finita.
Bits para inteirofoldl (\n b -> 2*n+b) 0; bits em ordem, cada um 0 ou 1.
Inteiro para bitsDivide positivos por dois, recolhe restos e inverte; define zero ([0]) e trata negativos.
PermutaçõesPermuta a cauda e insere a cabeça em todas as posições; caso base [[]], n! ocorrências.

foldr (-) 0 [1,2,3] = 2; foldl (-) 0 [1,2,3] = -6. Direita e esquerda descrevem os parênteses, não o ponto de partida. Para listas possivelmente infinitas, foldr com operação que ignore a cauda; para reduções finitas estritas, foldl'; evita foldl sem apóstrofo em listas grandes.

Listas e recursão e ordem superior.

Árvores, I/O, parsers e propriedades

TemaDecisão a recordar
dataUm caso por construtor; recursão pelos componentes menores.
BSTInvariância em cada nó; a procura custa a altura, não sempre log n.
AusênciaMaybe a: Nothing ou Just x; o recetor trata ambos.
IO aAção que produz a; x <- acao, let x = calculoPuro. return não termina o bloco.
Parser completoConfere o resto, não só o valor: só [(v,"")] valida a entrada inteira.
many pCada sucesso tem de consumir entrada; senão não progride.
GramáticaPrioridade e associatividade são escolhas separadas; evita recursão à esquerda no parser descendente.
PropriedadePré-condições, conservação e resultado; 100 casos não provam o universal.
ShrinkingContraexemplo reduzido, sem garantia de mínimo global.
Intervalo infinitoNuma lista ordenada, dropWhile (<inicio) e takeWhile (<=fim) antes de length.

Árvores, parsers e propriedades.

Prolog: o que cada operação faz

OperaçãoContrato
X = TermoUnifica e pode ligar variáveis; propaga a todas as ocorrências.
X == YTesta identidade sem criar ligações.
X is EAvalia E; as variáveis de E têm de estar instanciadas.
A =:= BAvalia e compara números; não unifica expressões.
A \= BTesta que não unificam agora; com ambas livres, falha em vez de adiar.
\+ GSucede se G falhar finitamente; não enumera o complemento. Gera candidatos antes de negar.
!Elimina escolhas desde a entrada até ao corte e cláusulas alternativas desse predicado; a direita continua.
Corte verdeRetirar o corte não muda as respostas no contrato indicado; confirma com saídas já instanciadas.
findall(T,G,L)Conserva repetições; sem respostas dá [].
bagof, setofAgrupam por variáveis livres; ^ retira um agrupamento; falham sem respostas. setof ordena e elimina repetições.
keysort/2Ordena pares pela chave; conserva repetidos e a ordem dos empates.
=../2, call/1Constrói e desmonta um termo; executa um objetivo. São operações distintas.
op(P,T,Nome)P menor liga mais forte; x exige prioridade menor, y permite igual. xfy à direita, yfx à esquerda.
Impressão e failRetrocesso não apaga efeitos de I/O; enumeração finita e cláusula final para sucesso.

Na árvore SLD: renomeia as variáveis da cláusula, unifica a cabeça, propaga a substituição e resolve o objetivo mais à esquerda. Marca alternativas para retrocesso. Para termos finitos, rejeita X=f(X) pelo occurs check; o = de algumas implementações aceita ciclos.

DFS não garante o caminho mais curto. BFS garante menor número de arestas com custos iguais e expansão finita. Minimax escolhe máximo ou mínimo conforme o jogador; não tira o máximo das folhas. Unificação, controlo, soluções e procura.

SICStus e SWI: write/1 e nl/0 são portáteis. writeln/1 e extensões de biblioteca precisam de conferência no motor da aula.

Aplicar a estrutura e as condições

  • Agrupar por relação: fixa o primeiro elemento e usa span (rel primeiro) na cauda. Não confundir com comparar vizinhos quando a relação não é transitiva.
  • Contar intervalo infinito: numa lista ordenada, delimita com dropWhile (<inicio) e takeWhile (<=fim) antes de length. É preciso alcançar um valor acima do limite em passos finitos; filtrar sem fronteira não produz o fim.
  • Substituir variáveis: caso por construtor, consulta o ambiente com lookup, conserva variáveis ausentes e os operadores. Não avaliar nem preencher com zero por omissão.
  • Mudar de tipo recursivo: transforma cada componente e conserva a ordem dos filhos. Folha x vira Rosa x []; Ramo e x d vira Rosa x [conversao e, conversao d].
  • Negar irmãos: candidato único antes da negação; progenitor e outro filho dentro do objetivo negado. Caso contrário, negas apenas irmãos por um progenitor escolhido.
  • Todos os ids: valida existência e permissão de cada cabeça. Uma busca de violações restrita a objetos existentes pode ignorar ids desconhecidos.

Agrupar, intervalos, transformações e quantificação em Prolog.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.