> 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/it/articoli-approfonditi/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.md).

# LaTeX è più potente di quanto pensi - Calcolo dei numeri di Fibonacci e completezza di Turing

**Autore: Robert Murrish (aprile 2012 (modificato da Overleaf nell'aprile 2023))**

LaTeX è uno strumento potente. Così potente, infatti, che può essere usato per molto più della semplice marcatura di documenti. LaTeX è [Turing-completo](https://en.wikipedia.org/wiki/Turing_completeness); cioè, può essere programmato per calcolare praticamente qualsiasi cosa.

Per dimostrare le capacità di programmazione di uso generale di LaTeX, esamineremo un esempio che calcola i primi numeri di Fibonacci. Sebbene questo non sia una prova di completezza di Turing, è un buon esempio di un algoritmo completo implementato in LaTeX.

### I numeri di Fibonacci

Ogni numero nella successione di Fibonacci è la somma dei due termini precedenti della successione, con i primi due termini definiti come 1 per fornire un punto di partenza.

Possiamo scrivere un nuovo comando per calcolare questi numeri. Cominciamo decidendo come potrebbe apparire una chiamata al nostro comando ancora da scrivere:

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

Quando questo comando viene richiamato dal nostro documento LaTeX, dovrebbe produrre un elenco di `n` numeri di Fibonacci (dove `n=10` nella chiamata di esempio qui). Ecco il codice del `\fibonacci` comando (cioè, una macro LaTeX). Vediamo come funziona.

```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}
```

[Apri questo esempio in 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)

Per prima cosa, impostiamo alcune variabili che useremo più avanti. Il `\newcount` comando ci fornisce una variabile che possiamo usare per contenere un intero; qui ne creiamo quattro: `\fcnt`, `\fone`, `\ftwo` e `\temp`. Vale la pena menzionare che queste non sono nuove variabili; sono più simili ad alias per contatori esistenti. [I contatori LaTeX](/latex/it/formattazione/10-counters.md) possono essere usati direttamente come in `\count0`, `\count1`, ecc., ma assegnare loro dei nomi ci impedisce di scrivere su un contatore già in uso. Se sei curioso, sostituisci una delle variabili in questo codice con `\count0`, e i numeri di pagina saranno sbagliati per il resto del documento.

Poi abbiamo il `\fibonacci` comando. Lo creiamo con `\newcommand`, che gli forniamo con il nome, il numero di argomenti e il codice TeX da elaborare come argomenti. Per questo comando, accettiamo un singolo argomento, il numero di numeri di Fibonacci da produrre. Il contenuto di questo comando è semplice: impostiamo i valori iniziali per le nostre variabili, stampiamo i primi due numeri di Fibonacci (poiché non devono essere calcolati) e poi chiamiamo `\fibloop`, che farà il lavoro pesante per i nostri calcoli.

Il comando `\fibloop` è dichiarato nello stesso modo, ma una parte fondamentale di questo comando è il modo in cui esegue il ciclo. Usiamo un comando chiamato `\next`, inizializzato a `\fibloop` all'interno di `\fibonacci`, e usato all'interno di `\fibloop` per controllare il ciclo. `\fibloop` si ripeterà finché `\next` non verrà modificato dal codice all'interno del `\fibloop` comando stesso. Vogliamo eseguire il ciclo solo `n` volte, quindi usiamo una `\ifnum` istruzione che controlla il valore del nostro contatore (`\fcnt`) e poi, se non ha raggiunto il valore soglia di 0, `\fcnt` viene decrementato a ogni ripetizione del ciclo. Se la condizione è soddisfatta, impostiamo `\next` su `\relax`, che impedirà a `\fibloop` di ripetersi: il comando finale `\next` non fa nulla e il ciclo termina.

Gli altri comandi in questo blocco calcolano il successivo numero di Fibonacci nella sequenza e aggiornano i valori delle variabili in modo che siano pronti per il passaggio successivo. Il comando `\the\ftwo` stampa il valore del numero di Fibonacci corrente nel documento, e noterai anche una virgola e uno spazio nella parte superiore del `\fibloop` comando usato per separare ciascun valore.

#### Il risultato

Il modo più semplice per vedere questo codice in azione è eseguirlo su Overleaf usando il **Apri questo esempio in Overleaf** collegamento in fondo alla visualizzazione del codice. La successione di Fibonacci cresce rapidamente, quindi qualsiasi `n>44` porterà a un overflow intero in questa particolare implementazione.

### Dove andare da qui?

Come prova informale che LaTeX è Turing-completo, presento il seguente codice, che è un'implementazione grezza e rapida di una [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
}
```

Le porte logiche NAND (e anche NOR) hanno l'interessante proprietà che qualsiasi altra porta logica può essere realizzata con questo unico tipo di porta. A partire dalle porte logiche di base, si possono costruire latch, flip-flop e memoria. Questi sono gli ingredienti per un computer ad uso generale. Puoi testare questa porta NAND per ciascuno dei suoi quattro possibili ingressi con il seguente esempio che puoi aprire in 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}
```

[Apri questo esempio in 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)

Sapere che LaTeX è Turing-completo apre un mondo di possibilità. Codice come questo è comune nel back-end di LaTeX per cose come tenere traccia dei numeri di pagina e delle figure e decidere dove collocare gli elementi flottanti. È uno strumento che puoi usare a tuo vantaggio per semplificare layout di documenti complessi.

Per concludere questo post, ti lascio con ulteriori letture su esempi di programmazione in LaTeX e macchine di Turing.

#### Esempi di programmazione in LaTeX

* [L'insieme di Mandlebrot in LaTeX](http://warp.povusers.org/MandScripts/latex.html) . Un ringraziamento speciale a questo; questo codice è stato un esempio utile mentre scrivevo il mio comando Fibonacci.
* [Una macchina di Turing in LaTeX: il seguito](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) N.B.: Quando abbiamo trasferito questo articolo su un altro sistema di hosting dei contenuti abbiamo notato che il sito citato nell'articolo originale (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> non era più accessibile, quindi abbiamo sostituito quel collegamento con un articolo di approfondimento di un altro autore.
* [Wikibook sui comandi TeX](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX in una gara di programmazione](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). Un controllore per rover marziano in LaTeX ha superato le soluzioni in diversi linguaggi di programmazione più comuni.

### Macchine di Turing in luoghi inaspettati

* [Il gioco della vita di Conway è Turing-completo](http://rendell-attic.org/gol/utm/index.htm). Ecco un'implementazione di una macchina di Turing.
* [Regola 110](http://en.wikipedia.org/wiki/Rule_110) è un automa cellulare unidimensionale che è Turing-completo.
* Minecraft (il videogioco) è Turing-completo. Sono stati costruiti diversi esempi, quindi il seguente collegamento è semplicemente a una [pagina di risultati di ricerca pertinenti su 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/it/articoli-approfonditi/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.
