> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/overleaf-learn-latex-pt/artigos-aprofundados/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.md).

# O LaTeX é mais poderoso do que pensa - calcular os números de Fibonacci e completude de Turing

**Autor: Robert Murrish (abril de 2012 (editado pela Overleaf em abril de 2023))**

LaTeX é uma ferramenta poderosa. Tão poderosa, na verdade, que pode ser usada para muito mais do que a marcação de documentos. O LaTeX é [Turing-completo](https://en.wikipedia.org/wiki/Turing_completeness); isto é, pode ser programado para computar praticamente qualquer coisa.

Para demonstrar as capacidades de programação de propósito geral do LaTeX, veremos um exemplo que calcula os primeiros números de Fibonacci. Embora isto não seja uma prova de completude de Turing, é um bom exemplo de um algoritmo completo implementado em LaTeX.

### Os números de Fibonacci

Cada número na sequência de Fibonacci é a soma dos dois termos anteriores na sequência, sendo os dois primeiros termos definidos como 1 para fornecer um ponto de partida.

Podemos escrever um novo comando para calcular estes números. Comecemos por decidir como poderia ser uma chamada ao nosso comando ainda por escrever:

```latex
\fibonacci{10}
```

Quando este comando é chamado a partir do nosso documento LaTeX, ele deve produzir uma lista de `n` números de Fibonacci (em que `n=10` no exemplo de chamada aqui). Aqui está o código para o comando `\fibonacci` (isto é, uma macro LaTeX). Vamos ver como funciona.

```latex
\documentclass{article}
\begin{document}

\newcount\temp
\newcount\fone
\newcount\ftwo
\newcount\fcnt

\newcommand{\fibonacci}[1]{%
	\fcnt=#1
	\fone=1
	\ftwo=1
	\temp=0
	\the\fone, \the\ftwo
	\let\next=\fibloop
	\fibloop
}

\def\fibloop{, %
	\temp=\fone
	\fone=\ftwo
	\advance\ftwo by \temp
	\ifnum\fcnt=0
            \let\next=\relax
        \else
            \advance\fcnt by -1
        \fi
	\the\ftwo
	\next
}

(\fibonacci{10})
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Fibonacci+sequence+in+LaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cnewcount%5Ctemp%0A%5Cnewcount%5Cfone%0A%5Cnewcount%5Cftwo%0A%5Cnewcount%5Cfcnt%0A%0A%5Cnewcommand%7B%5Cfibonacci%7D%5B1%5D%7B%25%0A%09%5Cfcnt%3D%231%0A%09%5Cfone%3D1%0A%09%5Cftwo%3D1%0A%09%5Ctemp%3D0%0A%09%5Cthe%5Cfone%2C+%5Cthe%5Cftwo%0A%09%5Clet%5Cnext%3D%5Cfibloop%0A%09%5Cfibloop%0A%7D%0A%0A%5Cdef%5Cfibloop%7B%2C+%25%0A%09%5Ctemp%3D%5Cfone%0A%09%5Cfone%3D%5Cftwo%0A%09%5Cadvance%5Cftwo+by+%5Ctemp%0A%09%5Cifnum%5Cfcnt%3D0%0A++++++++++++%5Clet%5Cnext%3D%5Crelax%0A++++++++%5Celse%0A++++++++++++%5Cadvance%5Cfcnt+by+-1%0A++++++++%5Cfi%0A%09%5Cthe%5Cftwo%0A%09%5Cnext%0A%7D%0A%0A%28%5Cfibonacci%7B10%7D%29%0A%5Cend%7Bdocument%7D)

Primeiro, configuramos algumas variáveis que usaremos mais tarde. O `\newcount` comando dá-nos uma variável que podemos usar para armazenar um inteiro; aqui, criamos quatro: `\fcnt`, `\fone`, `\ftwo` e `\temp`. Vale a pena mencionar que estas não são novas variáveis; são mais como aliases para contadores existentes. [Os contadores do LaTeX](/latex/overleaf-learn-latex-pt/formatacao/10-counters.md) podem ser usados diretamente, como em `\count0`, `\count1`, etc. mas atribuir nomes a eles impede-nos de escrever num contador já em uso. Se tiver curiosidade, substitua uma das variáveis neste código por `\count0`, e os números das páginas estarão errados pelo resto do documento.

Em seguida, temos o comando `\fibonacci` . Criamo-lo com `\newcommand`, que fornecemos com o nome, o número de argumentos e o código TeX a processar como argumentos. Para este comando, aceitamos um único argumento, o número de números de Fibonacci a apresentar. O conteúdo deste comando é simples: definimos os valores iniciais para as nossas variáveis, imprimimos os dois primeiros números de Fibonacci (já que não precisam de ser calculados) e depois chamamos `\fibloop`, que fará o trabalho pesado dos nossos cálculos.

O comando `\fibloop` é declarado da mesma forma, mas uma parte essencial deste comando é a forma como ele faz o ciclo. Usamos um comando chamado `\next`, inicializado com `\fibloop` dentro `\fibonacci`, e usado dentro de `\fibloop` para controlar o ciclo. `\fibloop` irá repetir-se até `\next` ser alterado pelo código dentro do próprio comando `\fibloop` . Queremos apenas repetir `n` vezes, por isso usamos uma instrução `\ifnum` que verifica o valor do nosso contador (`\fcnt`) e depois, se ele não tiver atingido o valor limite de 0, `\fcnt` é decrementado de cada vez que o ciclo se repete. Se a condição for satisfeita, definimos `\next` para `\relax`, o que impedirá `\fibloop` de se repetir — o final do comando `\next` não faz nada, e o ciclo termina.

Os outros comandos neste bloco calculam o próximo número de Fibonacci na sequência e atualizam os valores das variáveis para que fiquem prontos para a próxima passagem. O comando `\the\ftwo` imprime o valor do número de Fibonacci atual no documento, e também notará uma vírgula e um espaço no topo do comando `\fibloop` usado para separar cada valor.

#### O resultado

A forma mais simples de ver este código em ação é executá-lo no Overleaf usando a **Abra este exemplo no Overleaf** ligação na parte inferior da exibição do código. A sequência de Fibonacci cresce rapidamente, por isso qualquer `n>44` resultará numa estouro de inteiro nesta implementação específica.

### Para onde ir a partir daqui?

Como uma prova informal de que o LaTeX é Turing-completo, apresento o código seguinte, que é uma implementação rápida e rudimentar de uma [porta NAND](https://en.wikipedia.org/wiki/NAND_gate):

```latex
\newcount\nanone
\newcount\nantwo

\newcommand{\nand}[2]{%
\nanone=#1
\nantwo=#2
  \ifnum\nanone=\nantwo
    \ifnum\nanone=0\relax 1
      \else 0
    \fi
   \else 1
\fi
}
```

As portas lógicas NAND (e também NOR) têm a propriedade interessante de que qualquer outra porta lógica pode ser formada com este único tipo de porta. A partir das portas lógicas básicas, pode construir-se travas, flip-flops e memória. Estes são os ingredientes para um computador de propósito geral. Pode testar esta porta NAND para cada uma das quatro entradas possíveis com o exemplo seguinte, que pode abrir no Overleaf.

```latex
\documentclass{article}
\begin{document}

\newcount\nanone
\newcount\nantwo

\newcommand{\nand}[2]{%
\nanone=#1
\nantwo=#2
  \ifnum\nanone=\nantwo
    \ifnum\nanone=0\relax 1
      \else 0
    \fi
   \else 1
\fi
}

\nand{0}{0}
\nand{0}{1}
\nand{1}{0}
\nand{1}{1}
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=NAND+gate+in+LaTeX\&snip=%5Cdocumentclass%7Barticle%7D%0A%5Cbegin%7Bdocument%7D%0A%0A%5Cnewcount%5Cnanone%0A%5Cnewcount%5Cnantwo%0A%0A%5Cnewcommand%7B%5Cnand%7D%5B2%5D%7B%25%0A%5Cnanone%3D%231%0A%5Cnantwo%3D%232%0A++%5Cifnum%5Cnanone%3D%5Cnantwo%0A++++%5Cifnum%5Cnanone%3D0%5Crelax+1%0A++++++%5Celse+0%0A++++%5Cfi%0A+++%5Celse+1%0A%5Cfi%0A%7D%0A%0A%5Cnand%7B0%7D%7B0%7D%0A%5Cnand%7B0%7D%7B1%7D%0A%5Cnand%7B1%7D%7B0%7D%0A%5Cnand%7B1%7D%7B1%7D%0A%5Cend%7Bdocument%7D)

Saber que o LaTeX é Turing-completo abre um mundo de possibilidades. Código como este é comum no back-end do LaTeX para coisas como acompanhar os números das páginas e das figuras e decidir onde colocar flutuantes. É uma ferramenta que pode usar em seu proveito para simplificar esquemas complexos de documentos.

Para terminar este artigo, deixo-vos com leitura adicional sobre exemplos de programação em LaTeX e máquinas de Turing.

#### Exemplos de programação em LaTeX

* [O conjunto de Mandlebrot em LaTeX](http://warp.povusers.org/MandScripts/latex.html) . Um agradecimento especial a este; este código foi um exemplo útil ao escrever o meu comando Fibonacci.
* [Uma máquina de Turing em LaTeX: a continuação](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) NB: Ao transferir este artigo para outro sistema de alojamento de conteúdo, reparámos que o site referenciado no artigo original (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> já não estava acessível, por isso substituímos essa ligação por um artigo de seguimento de outro autor.
* [Livro do Wikibook sobre comandos TeX](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX num concurso de programação](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). Um controlador de rover de Marte em LaTeX derrotou entradas em várias linguagens de programação mais comuns.

### Máquinas de Turing em lugares inesperados

* [O Jogo da Vida de Conway é Turing-completo](http://rendell-attic.org/gol/utm/index.htm). Aqui está uma implementação de uma máquina de Turing.
* [A Regra 110](http://en.wikipedia.org/wiki/Rule_110) é um autómato celular 1-D que é Turing-completo.
* O Minecraft (o videojogo) é Turing-completo. Foram construídos vários exemplos, por isso a ligação seguinte é simplesmente para uma [página de resultados relevantes da pesquisa no YouTube](http://www.youtube.com/results?search_query=minecraft+turing+machine)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/overleaf-learn-latex-pt/artigos-aprofundados/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
