Gramáticas livres de contexto

Construir e provar gramáticas, derivações, árvores sintáticas, ambiguidade e precedência.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

A regra S→aSbS\to aSb acrescenta um aa à esquerda e um bb à direita, deixando SS no meio para repetir a operação. Com uma regra de paragem S→εS\to\varepsilon, obtemos abab, aabbaabb e blocos maiores com as mesmas contagens.

Uma gramática livre de contexto, CFG, usa regras para substituir variáveis como SS por sequências. Os terminais, aqui aa e bb, ficam na palavra final. A substituição de SS não depende dos símbolos à sua volta.

Definição e derivações

Uma gramática livre de contexto, CFG, é G=(V,Σ,P,S)G=(V,\Sigma,P,S), onde VV é um conjunto finito de variáveis, Σ\Sigma é o alfabeto de terminais, V∩Σ=∅V\cap\Sigma=\emptyset, PP é o conjunto finito de produções e S∈VS\in V é a variável inicial.

Cada produção tem forma A→αA\to\alpha, com uma única variável AA à esquerda e α∈(V∪Σ)∗\alpha\in(V\cup\Sigma)^* à direita. A palavra vazia pode aparecer à direita. Chama-se livre de contexto porque podes substituir AA por α\alpha independentemente dos símbolos à sua volta.

Escreve xAy⇒xαyxAy\Rightarrow x\alpha y para um passo de derivação e ⇒∗\Rightarrow^* para zero ou mais passos. Uma forma sentencial é uma sequência derivável de SS, que ainda pode conter variáveis e terminais. A linguagem contém só resultados inteiramente terminais:

L(G)={w∈Σ∗∣S⇒∗w}.L(G)=\{w\in\Sigma^*\mid S\Rightarrow^*w\}.

Na gramática S→aSb∣εS\to aSb\mid\varepsilon:

S⇒aSb⇒aaSbb⇒aabb.S\Rightarrow aSb\Rightarrow aaSbb\Rightarrow aabb.

aaSbbaaSbb ainda não é uma palavra da linguagem, porque contém SS. Se queres excluir ε\varepsilon, podes usar S→aSb∣abS\to aSb\mid ab.

Para uma apresentação em vídeo de linguagens e gramáticas livres de contexto, tens Rodrigo Dias:

Abrir no YouTube

Construir uma gramática e provar a linguagem

Para L={anb2n∣n≥0}L=\{a^nb^{2n}\mid n\ge0\}, a produção recursiva deve acrescentar um aa e dois bb:

S→aSbb∣ε.S\to aSbb\mid\varepsilon.

Provar L(G)=LL(G)=L exige duas inclusões.

A gramática não gera palavras extra. Faz indução no número de aplicações da produção recursiva. Sem aplicações, produz ε=a0b0\varepsilon=a^0b^0. Se o meio gera anb2na^nb^{2n}, então aSbbaSbb gera an+1b2n+2a^{n+1}b^{2n+2}, mantendo a ordem e a proporção.

A gramática gera todas as palavras pretendidas. Para qualquer n≥0n\ge0, aplica S→aSbbS\to aSbb exatamente nn vezes, obtendo anSb2na^nSb^{2n}, e termina com S→εS\to\varepsilon.

Separar blocos e desigualdades

Para {anbm∣n≥m≥0}\{a^nb^m\mid n\ge m\ge0\}, usa

S→aSb∣A,A→aA∣ε.S\to aSb\mid A,\qquad A\to aA\mid\varepsilon.

As primeiras mm aplicações emparelham um aa com um bb. Depois, AA acrescenta n−mn-m letras aa. Assim, S⇒∗amAbm⇒∗anbmS\Rightarrow^*a^mAb^m\Rightarrow^*a^nb^m. Para exigir n>mn>m, troca a base de AA por aa: A→aA∣aA\to aA\mid a.

Para palíndromos binários de qualquer comprimento, uma gramática é S→0S0∣1S1∣0∣1∣εS\to0S0\mid1S1\mid0\mid1\mid\varepsilon. As bases 0,10,1 geram o centro de palavras ímpares; ε\varepsilon gera as pares. Omitir essas bases muda a linguagem.

Igualdade de contagens em qualquer ordem

Para palavras sobre {a,b}\{a,b\} com o mesmo número de aa e de bb, usa

S→SS∣aSb∣bSa∣ab∣ba∣ε.S\to SS \mid aSb \mid bSa \mid ab \mid ba \mid \varepsilon.

A regra SSSS junta dois blocos equilibrados. As regras aSbaSb e bSabSa envolvem um par equilibrado à volta de outro bloco equilibrado. As bases cobrem os pares de comprimento 2 e a palavra vazia.

Para provar que só gera palavras equilibradas, faz indução na árvore de derivação. A base vazia está equilibrada; envolver uma palavra equilibrada acrescenta um símbolo de cada tipo, e SSSS soma duas diferenças nulas.

Para a outra inclusão, usa indução no comprimento de ww equilibrada não vazia:

  1. Se ww começa e termina em símbolos diferentes, escreve w=aubw=aub ou w=buaw=bua com uu equilibrada e aplica aSbaSb ou bSabSa.
  2. Se começa e termina no mesmo símbolo, a diferença entre contagens vale 11 ou −1-1 depois da primeira letra e tem o sinal oposto antes da última. Como varia uma unidade por letra, anula-se numa posição interior e ww parte-se em dois blocos equilibrados não vazios; aplica-se SSSS.

Para abbaabba:

S⇒SS⇒abS⇒abba.S \Rightarrow SS \Rightarrow abS \Rightarrow abba.

Desigualdade com três blocos

Para {aibjck∣i+j≥k, i,j,k≥0}\{a^ib^jc^k \mid i+j \ge k,\ i,j,k \ge 0\}, gera primeiro os aa, depois os bb, e emparelha cada cc com um aa ou bb anterior, sem misturar a ordem dos blocos. Uma gramática:

S→aS∣aSc∣B,B→bB∣bBc∣ε.S \to aS \mid aSc \mid B, \qquad B \to bB \mid bBc \mid \varepsilon.

Cada aScaSc acrescenta um aa à esquerda e um cc à direita, enquanto cada aSaS acrescenta um aa sem cc. Depois de chegar a BB, cada bBcbBc acrescenta um bb e um cc, e cada bBbB acrescenta um bb sem cc.

Antes de mudar para BB, a forma sentencial é a∗Sc∗a^*Sc^*; depois é a∗b∗Bc∗a^*b^*Bc^*, e ao eliminar BB fica a∗b∗c∗a^*b^*c^*. Se S⇒∗apBcqS \Rightarrow^* a^pBc^q então p≥qp \ge q, e se B⇒∗brcsB \Rightarrow^* b^rc^s então r≥sr \ge s.

Logo a palavra final é apbrcq+sa^pb^rc^{q+s} com p+r≥q+sp+r \ge q+s. Isto prova que só gera palavras com i+j≥ki+j \ge k.

Para a outra inclusão, seja i+j≥ki+j \ge k. Escolhe quantos cc emparelhar com aa e quantos com bb:

  • q=min⁡(i,k)q=\min(i,k) pares a/ca/c e s=k−qs=k-q pares b/cb/c. Então q≤iq \le i e s≤js \le j.
  • Gera i−qi-q letras aa com aSaS, depois qq pares com aScaSc, depois j−sj-s letras bb com bBbB, depois ss pares com bBcbBc.

Para aabbbcaabbbc temos i=2i=2, j=3j=3, k=1k=1, logo q=1q=1 e s=0s=0. Uma derivação:

S⇒aS⇒aaSc⇒aaBc⇒aabBc⇒aabbBc⇒aabbbBc⇒aabbbc.S \Rightarrow aS \Rightarrow aaSc \Rightarrow aaBc \Rightarrow aabBc \Rightarrow aabbBc \Rightarrow aabbbBc \Rightarrow aabbbc.

Os dois primeiros passos geram o excedente aa e o par a/ca/c. Os três passos seguintes geram os três bb sem cc. O último passo aplica B→εB \to \varepsilon. Testa abcabc com q=1,s=0q=1,s=0 e aabbccaabbcc com q=2,s=0q=2,s=0; abcccabccc tem i+j=2<3i+j=2<3 e nenhum par (q,s)(q,s) cumpre as desigualdades, por isso não é gerada.

Derivação à esquerda e à direita

Na derivação mais à esquerda, substitui sempre a variável mais à esquerda. Na derivação mais à direita, escolhe sempre a mais à direita. Nenhuma regra de produção muda, apenas a ordem de expansão.

Para S→ABS\to AB, A→aA∣εA\to aA\mid\varepsilon, B→bB∣εB\to bB\mid\varepsilon, a palavra abab tem derivação mais à esquerda:

S⇒AB⇒aAB⇒aB⇒abB⇒ab,S\Rightarrow AB\Rightarrow aAB\Rightarrow aB\Rightarrow abB\Rightarrow ab,

e mais à direita:

S⇒AB⇒AbB⇒Ab⇒aAb⇒ab.S\Rightarrow AB\Rightarrow AbB\Rightarrow Ab\Rightarrow aAb\Rightarrow ab.

Estas duas ordens não demonstram ambiguidade. Ambas descrevem a mesma estrutura: AA gera aa e BB gera bb.

Árvores sintáticas e ambiguidade

Numa árvore sintática, a raiz é SS. Um nó AA com filhos X1,…,XkX_1,\ldots,X_k usa a produção A→X1⋯XkA\to X_1\cdots X_k. As folhas lidas da esquerda para a direita dão a palavra; uma folha ε\varepsilon não acrescenta símbolo.

Uma gramática é ambígua se alguma palavra terminal tem duas árvores sintáticas distintas. Equivalentemente, essa palavra tem duas derivações mais à esquerda distintas, ou duas mais à direita distintas.

A gramática E→E+E∣E∗E∣aE\to E+E\mid E*E\mid a é ambígua. A palavra a+a∗aa+a*a pode separar-se na raiz pelo ++ ou pelo ∗*:

Na primeira árvore, a raiz soma aa com (a∗a)(a*a); na segunda, multiplica (a+a)(a+a) por aa. As duas derivações mais à esquerda começam por regras diferentes:

E⇒E+E⇒a+E⇒a+E∗E⇒a+a∗E⇒a+a∗a,E\Rightarrow E+E\Rightarrow a+E\Rightarrow a+E*E\Rightarrow a+a*E\Rightarrow a+a*a, E⇒E∗E⇒E+E∗E⇒a+E∗E⇒a+a∗E⇒a+a∗a.E\Rightarrow E*E\Rightarrow E+E*E\Rightarrow a+E*E\Rightarrow a+a*E\Rightarrow a+a*a.

Uma testemunha basta para provar ambiguidade. Para provar ausência de ambiguidade, precisas de um argumento para todas as palavras, não de falhar na procura de uma testemunha.

Precedência e associatividade

Para dar maior precedência a ∗* e associar os operadores à esquerda, separa níveis:

E→E+T∣T,T→T∗F∣F,F→a∣(E).E\to E+T\mid T,\qquad T\to T*F\mid F,\qquad F\to a\mid(E).

FF é um fator, um átomo ou uma expressão entre parênteses. TT junta fatores por multiplicação. EE junta termos por soma. Agora, o ++ só surge no nível que pode separar somas, enquanto o produto fica dentro de TT.

A recursão em E→E+TE\to E+T fica à esquerda, logo a+a+aa+a+a agrupa-se como (a+a)+a(a+a)+a. Com E→T+E∣TE\to T+E\mid T, agrupar-se-ia à direita. Os parênteses em FF permitem alterar a precedência.

Compara as duas gramáticas do laboratório para a+a+aa+a+a. A primeira expande a soma no ramo esquerdo, representando (a+a)+a(a+a)+a; a segunda expande-a no ramo direito, representando a+(a+a)a+(a+a). Para a+a∗aa+a*a, ambas mantêm o produto dentro de TT. Os testes de aceitação não distinguem estas estruturas, porque as duas gramáticas aceitam as mesmas expressões. Observa a árvore, além da resposta de aceitação.

Palavra aceite.

Testes

Passar estes casos não prova que a gramática gera toda e só a linguagem pedida.

Sintaxe

Uma produção por linha, com -> ou →. Separa alternativas com | e usa ε para a palavra vazia. A primeira variável é a inicial.

As variáveis começam por maiúscula e precisam de uma produção. Os outros caracteres são terminais; usa aspas, como "A", para um terminal maiúsculo. Os espaços entre símbolos são ignorados.

A palavra em branco representa ε. O editor aceita recursão à esquerda e mostra uma árvore possível, sem decidir se a gramática é ambígua.

O laboratório mostra uma árvore possível para a palavra. Essa árvore permite seguir as produções usadas; uma única árvore não prova que nenhuma outra existe.

Ambiguidade é uma propriedade da gramática. Uma gramática ambígua pode ter outra gramática não ambígua para a mesma linguagem. Algumas linguagens livres de contexto são inerentemente ambíguas, ou seja, todas as suas gramáticas são ambíguas. Não existe um algoritmo geral que decida a ambiguidade de qualquer CFG.

Classificar gramáticas

A hierarquia de Chomsky compara restrições sobre as produções. A,BA,B representam variáveis, aa um terminal, u,vu,v sequências de variáveis e terminais.

TipoRestrição nas regrasModelo para a linguagem
3, regularTodas lineares à direita, A→wBA\to wB ou A→wA\to w, ou todas à esquerda, A→BwA\to Bw ou A→wA\to w, com w∈Σ∗w\in\Sigma^*.Autómato finito
2, livre de contextoA→vA\to v: uma única variável à esquerda.PDA não determinístico
1, sensível ao contextou→vu\to v, com uma variável em uu e ∣u∣≤∣v∣\lvert u\rvert\le\lvert v\rvert.Máquina de Turing com fita limitada pelo comprimento da entrada
0, sem restriçõesu→vu\to v, com pelo menos uma variável em uu.Máquina de Turing reconhecedora

No tipo 3, podes decompor blocos de terminais com variáveis auxiliares até obter regras A→aBA\to aB, A→aA\to a e A→εA\to\varepsilon na versão à direita. As regras unitárias A→BA\to B, possíveis quando w=εw=\varepsilon, podem ser eliminadas.

Para o tipo 1, esta é a convenção de regras que não diminuem o comprimento. Se for preciso gerar ε\varepsilon, admite-se a exceção S→εS\to\varepsilon, desde que SS não apareça em nenhum lado direito. No tipo 3, misturar regras lineares à esquerda com regras lineares à direita não prova regularidade.

Para classificar uma gramática, procura a classe mais restrita que todas as suas regras respeitam. Por exemplo, S→aSb∣abS\to aSb\mid ab é de tipo 2: o lado esquerdo é uma variável, mas a variável do lado direito fica entre dois terminais, impedindo tipo 3.

Classificar a gramática não determina a menor classe da sua linguagem. S→SS∣aS\to SS\mid a não é linear, mas gera {an∣n≥1}\{a^n\mid n\ge1\}, uma linguagem regular descrita por aa∗aa^*. As regras dadas são de tipo 2; outra gramática regular pode gerar a mesma linguagem.

De DFA para gramática

Toda a linguagem regular é livre de contexto. Para ver a construção, cria uma variável AqA_q por estado de um DFA. Para cada δ(q,a)=r\delta(q,a)=r, acrescenta Aq→aArA_q\to aA_r. Para cada final ff, acrescenta Af→εA_f\to\varepsilon. A variável inicial é a do estado inicial.

Uma derivação acompanha um percurso da máquina, escrevendo a letra de cada transição. Só pode terminar quando chega a um final, por isso gera exatamente a linguagem do DFA.

A inclusão é estrita: {anbn∣n≥0}\{a^nb^n\mid n\ge0\} tem CFG, mas não tem DFA, pelo lema da repetição regular. As formas normais reorganizam CFG para facilitar algoritmos, sem aumentar o seu poder.

Exercícios

A questão das bases dos palíndromos adapta a questão 4 do teste de 13/6/2024, com símbolos binários e pedidos de prova e construção. A desigualdade e a igualdade de contagens adaptam os tipos de problemas da folha prática 7. Os exemplos de ambiguidade e classificação usam dados próprios.

Bases dos palíndromos

Considera S→0S0∣1S1∣0∣1S\to0S0\mid1S1\mid0\mid1. Descreve a linguagem e prova ambas as inclusões. Deriva 0101001010 e explica por que 01100110 não é gerada. Como alterarias só as bases para gerar todos os palíndromos binários?

Pista

Cada passo recursivo acrescenta duas letras.

Solução

As bases têm comprimento um e são palíndromos. Cada regra recursiva acrescenta dois símbolos iguais nos extremos, conservando simetria e comprimento ímpar. Inversamente, retirar os extremos de um palíndromo ímpar deixa um palíndromo ímpar mais curto, até ao centro 00 ou 11; esta decomposição permite escolher as regras da derivação.

S⇒0S0⇒01S10⇒01010S\Rightarrow0S0\Rightarrow01S10\Rightarrow01010. A palavra 01100110 é um palíndromo par, logo não é gerada. Acrescentar S→εS\to\varepsilon conserva as palavras ímpares e permite parar sem centro, gerando as pares, incluindo a vazia.

Confere a tua resposta:

  • Provei simetria e paridade das palavras geradas.
  • Provei que qualquer palíndromo ímpar pode reduzir-se a uma base.
  • Dei a derivação e acrescentei a base vazia para as pares.
Voltar à explicação
Ordens de derivação e ambiguidade

Para S→ABS\to AB, A→aA\to a, B→bB\to b, compara S⇒AB⇒aB⇒abS\Rightarrow AB\Rightarrow aB\Rightarrow ab com S⇒AB⇒Ab⇒abS\Rightarrow AB\Rightarrow Ab\Rightarrow ab. Provam ambiguidade? Depois, para E→E+E∣E∗E∣aE\to E+E\mid E*E\mid a, prova ambiguidade de a+a∗aa+a*a com duas derivações mais à esquerda e identifica o operador na raiz de cada árvore.

Pista

Compara a primeira produção usada em cada derivação de E.

Solução

As duas derivações de abab expandem ramos independentes da mesma árvore. Uma é mais à esquerda, a outra mais à direita. Não provam ambiguidade.

Na gramática de expressões, há duas derivações mais à esquerda:

E⇒E+E⇒a+E⇒a+E∗E⇒a+a∗E⇒a+a∗a,E\Rightarrow E+E\Rightarrow a+E\Rightarrow a+E*E\Rightarrow a+a*E\Rightarrow a+a*a,E⇒E∗E⇒E+E∗E⇒a+E∗E⇒a+a∗E⇒a+a∗a.E\Rightarrow E*E\Rightarrow E+E*E\Rightarrow a+E*E\Rightarrow a+a*E\Rightarrow a+a*a.

A primeira árvore usa soma na raiz, lendo a+(a∗a)a+(a*a); a segunda usa produto, lendo (a+a)∗a(a+a)*a. A palavra terminal é a mesma e as árvores diferem, pelo que a gramática é ambígua.

Confere a tua resposta:

  • Distingui a ordem das expansões da estrutura da árvore.
  • Dei duas derivações com a mesma convenção mais à esquerda.
  • Identifiquei soma e produto nas raízes.
Voltar à explicação

A gramática editável seguinte tem um erro na base. Os casos incluem a fronteira n=mn=m, palavras com excedente e palavras fora da ordem a∗b∗a^*b^*. Corrige-a e usa o exercício para justificar a construção. Passar os testes apenas confirma esses casos, não substitui as duas inclusões da prova.

A gramática inicial permite n = m. Altera apenas a base de A para gerar aⁿbᵐ com n > m ≥ 0. Mantém a produção recursiva de S.

Palavra aceite.

Testes

Passar estes casos não prova que a gramática gera toda e só a linguagem pedida.

Sintaxe

Uma produção por linha, com -> ou →. Separa alternativas com | e usa ε para a palavra vazia. A primeira variável é a inicial.

As variáveis começam por maiúscula e precisam de uma produção. Os outros caracteres são terminais; usa aspas, como "A", para um terminal maiúsculo. Os espaços entre símbolos são ignorados.

A palavra em branco representa ε. O editor aceita recursão à esquerda e mostra uma árvore possível, sem decidir se a gramática é ambígua.

Construir uma desigualdade

Constrói uma CFG para {anbm∣n>m≥0}\{a^nb^m\mid n>m\ge0\} e mostra uma derivação de aaab.

Pista

Separa m pares e o excesso n−m de a.

Mais uma pista

Uma possibilidade é S→aSb∣AS\to aSb\mid A e A→aA∣aA\to aA\mid a.

Solução

Uma CFG possível é S→aSb∣AS\to aSb\mid A, A→aA∣aA\to aA\mid a. Assim, S⇒aSb⇒aAb⇒aaAb⇒aaabS\Rightarrow aSb\Rightarrow aAb\Rightarrow aaAb\Rightarrow aaab. Cada aplicação recursiva em S acrescenta um par; A produz um número positivo de a. Para quaisquer n>m, usa m pares e n−m letras em A. Não surgem b antes de a, e o excesso é sempre positivo.

Confere a tua resposta:

  • Usa uma recursão que emparelha a e b.
  • Garante pelo menos um a extra na base.
  • Prova que toda a palavra pretendida pode escolher o número certo de pares e de a extra.

Erros frequentes

Não uses A→ε, que permitiria igualdade. Não proves apenas que as palavras geradas têm a propriedade, esquecendo a outra inclusão.

Voltar à explicação
Gramática e linguagem

Classifica as gramáticas G1:S→aS∣bG_1: S\to aS\mid b e G2:S→SS∣aG_2: S\to SS\mid a pela forma das suas regras. Descreve as duas linguagens e explica se essa classificação prova que alguma delas não é regular.

Pista

Começa pela regra menos restrita de cada gramática.

Mais uma pista

SSSS tem duas variáveis. Ainda assim, todas as folhas terminais de G2G_2 são aa.

Solução

G1G_1 é de tipo 3 e gera a∗ba^*b: aplica S→aSS\to aS um número qualquer de vezes e termina em bb.

G2G_2 é de tipo 2, pois tem uma variável à esquerda, mas a regra S→SSS\to SS impede tipo 3. Gera aa∗aa^*: qualquer resultado terminal tem pelo menos um aa; para gerar ana^n, cria nn ocorrências de SS com n−1n-1 expansões e substitui cada uma por aa. As duas linguagens são regulares. O facto de as regras de G2G_2 não serem regulares não prova não regularidade da linguagem.

Confere a tua resposta:

  • G1 é linear à direita; G2 não é linear.
  • Descreve a estrela de a seguida de b e as palavras não vazias só de a.
  • Distingue a restrição nas regras da classe mínima da linguagem.

Erros frequentes

Não decidas o tipo usando uma só regra. Não confundas dois símbolos à direita com uma produção de tipo 1: a variável única à esquerda já permite tipo 2.

Voltar à explicação
Igualdade em qualquer ordem

Mostra que S→SS∣aSb∣bSa∣ab∣ba∣εS\to SS\mid aSb\mid bSa\mid ab\mid ba\mid\varepsilon gera palavras com tantos aa como bb.

Pista

Faz as duas inclusões por indução no comprimento.

Mais uma pista

Se os extremos são iguais, acompanha a diferença entre contagens até ao primeiro regresso a zero.

Solução

Por indução na árvore de derivação, cada regra conserva a diferença nula entre as contagens de aa e bb, logo só gera palavras equilibradas. Inversamente, uma equilibrada não vazia ou tem extremos diferentes (aubaub com uu equilibrada) ou tem extremos iguais. Neste segundo caso, a diferença entre contagens vale 1 ou −1 depois da primeira letra e tem o sinal oposto antes da última; como varia uma unidade por letra, regressa a zero numa posição interior. Esse prefixo e o sufixo restante são equilibrados e não vazios. A regra SSSS reduz ambos a palavras mais curtas. Para abbaabba, usa SSSS com abab e baba.

Confere a tua resposta:

  • Mostra que cada regra conserva o equilíbrio entre a e b.
  • Decompõe uma palavra equilibrada em blocos ou em extremos diferentes.
  • Deriva abba com SS e as bases.

Erros frequentes

Não proves só uma inclusão. Uma propriedade conservada não mostra que todas as palavras são geradas.

Voltar à explicação

À 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.