> 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/el/se-vathos-arthra/31-latex-is-more-powerful-than-you-think-computing-the-fibonacci-numbers-and-turing-completeness.md).

# Το LaTeX είναι πιο ισχυρό από όσο νομίζετε - Υπολογισμός των αριθμών Fibonacci και πληρότητα Turing

**Συγγραφέας: Robert Murrish (Απρίλιος 2012 (με επιμέλεια από το Overleaf τον Απρίλιο του 2023))**

Το LaTeX είναι ένα ισχυρό εργαλείο. Τόσο ισχυρό, στην πραγματικότητα, που μπορεί να χρησιμοποιηθεί για πολύ περισσότερα από τη σήμανση εγγράφων. Το LaTeX είναι [πλήρες κατά Turing](https://en.wikipedia.org/wiki/Turing_completeness); δηλαδή, μπορεί να προγραμματιστεί ώστε να υπολογίζει σχεδόν τα πάντα.

Για να δείξουμε τις δυνατότητες προγραμματισμού γενικού σκοπού του LaTeX, θα εξετάσουμε ένα παράδειγμα που υπολογίζει τους πρώτους αριθμούς Fibonacci. Αν και αυτό δεν αποτελεί απόδειξη πληρότητας κατά Turing, είναι ένα καλό παράδειγμα ενός πλήρους αλγορίθμου υλοποιημένου στο LaTeX.

### Οι αριθμοί Fibonacci

Κάθε αριθμός στη σειρά Fibonacci είναι το άθροισμα των δύο προηγούμενων όρων της σειράς, με τους δύο πρώτους όρους να ορίζονται ως 1 για να παρέχουν ένα σημείο εκκίνησης.

Μπορούμε να γράψουμε μια νέα εντολή για να υπολογίσουμε αυτούς τους αριθμούς. Ας ξεκινήσουμε αποφασίζοντας πώς μπορεί να μοιάζει μια κλήση της εντολής που ακόμη δεν έχουμε γράψει:

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

Όταν αυτή η εντολή καλείται από το έγγραφο LaTeX μας, θα πρέπει να παράγει μια λίστα από `n` αριθμούς Fibonacci (όπου `n=10` στο παράδειγμα της κλήσης εδώ). Να ο κώδικας για την `\fibonacci` εντολή (δηλαδή, μακροεντολή LaTeX). Ας δούμε πώς λειτουργεί.

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

[Ανοίξτε αυτό το παράδειγμα στο 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)

Πρώτα, ρυθμίζουμε μερικές μεταβλητές που θα χρησιμοποιήσουμε αργότερα. Η `\newcount` εντολή μας δίνει μια μεταβλητή που μπορούμε να χρησιμοποιήσουμε για να αποθηκεύσουμε έναν ακέραιο· εδώ, δημιουργούμε τέσσερις: `\fcnt`, `\fone`, `\ftwo` και `\temp`. Αξίζει να αναφερθεί ότι αυτές δεν είναι νέες μεταβλητές· μοιάζουν περισσότερο με ψευδώνυμα για υπάρχοντες μετρητές. [Οι μετρητές του LaTeX](/latex/el/morfopoiisi/10-counters.md) μπορούν να χρησιμοποιηθούν απευθείας όπως στο `\count0`, `\count1`, κ.λπ., αλλά το να τους δίνουμε ονόματα μας εμποδίζει να γράψουμε σε έναν μετρητή που ήδη χρησιμοποιείται. Αν είστε περίεργοι, αντικαταστήστε μία από τις μεταβλητές σε αυτόν τον κώδικα με `\count0`, και οι αριθμοί σελίδων θα είναι λανθασμένοι για το υπόλοιπο του εγγράφου.

Έπειτα έχουμε την `\fibonacci` εντολή `\newcommand`. Τη δημιουργούμε με `\fibloop`, στην οποία δίνουμε το όνομα, τον αριθμό των ορισμάτων και τον κώδικα TeX που θα επεξεργαστεί ως ορίσματα. Για αυτή την εντολή, δεχόμαστε ένα μόνο όρισμα, τον αριθμό των αριθμών Fibonacci που θα εξάγουμε. Το περιεχόμενο αυτής της εντολής είναι απλό: ορίζουμε αρχικές τιμές για τις μεταβλητές μας, εκτυπώνουμε τους δύο πρώτους αριθμούς Fibonacci (αφού δεν χρειάζεται να υπολογιστούν) και έπειτα καλούμε

Η εντολή `\fibloop` ορίζεται με τον ίδιο τρόπο, αλλά ένα βασικό μέρος αυτής της εντολής είναι το πώς κάνει επανάληψη. Χρησιμοποιούμε μια εντολή που ονομάζεται `\next`, αρχικοποιημένη σε `\fibloop` μέσα σε `\fibonacci`, και χρησιμοποιείται μέσα στη `\fibloop` για τον έλεγχο της επανάληψης. `\fibloop` θα επαναλαμβάνεται μέχρι `\next` να αλλάξει από κώδικα μέσα στην `\fibloop` εντολή η ίδια. Θέλουμε να επαναλάβουμε μόνο `n` φορές, οπότε χρησιμοποιούμε μια `\ifnum` εντολή που ελέγχει την τιμή του μετρητή μας (`\fcnt`) και έπειτα, αν δεν έχει φτάσει την τιμή κατωφλίου 0, `\fcnt` μειώνεται κατά μία μονάδα κάθε φορά που η επανάληψη επαναλαμβάνεται. Αν ικανοποιείται η συνθήκη, ορίζουμε `\next` σε `\\relax`, η οποία θα αποτρέψει `\fibloop` το να επαναληφθεί—η τελική `\next` εντολή δεν κάνει τίποτα και η επανάληψη τερματίζεται.

Οι υπόλοιπες εντολές σε αυτό το μπλοκ υπολογίζουν τον επόμενο αριθμό Fibonacci της ακολουθίας και ενημερώνουν τις τιμές των μεταβλητών ώστε να είναι έτοιμες για το επόμενο πέρασμα. Η εντολή `\the\ftwo` εκτυπώνει την τιμή του τρέχοντος αριθμού Fibonacci στο έγγραφο, και θα παρατηρήσετε επίσης ένα κόμμα και ένα κενό στην κορυφή της `\fibloop` εντολής που χρησιμοποιείται για να διαχωρίζει κάθε τιμή.

#### Το αποτέλεσμα

Ο απλούστερος τρόπος να δείτε αυτόν τον κώδικα σε δράση είναι να τον εκτελέσετε στο Overleaf χρησιμοποιώντας τον **Ανοίξτε αυτό το παράδειγμα στο Overleaf** σύνδεσμο στο κάτω μέρος της προβολής κώδικα. Η ακολουθία Fibonacci μεγαλώνει γρήγορα, οπότε οποιοδήποτε `n>44` θα έχει ως αποτέλεσμα υπερχείλιση ακεραίου σε αυτή τη συγκεκριμένη υλοποίηση.

### Πού να πάμε από εδώ;

Ως μια ανεπίσημη απόδειξη ότι το LaTeX είναι πλήρες κατά Turing, παρουσιάζω τον ακόλουθο κώδικα, ο οποίος είναι μια πρόχειρη και βιαστική υλοποίηση μιας [πύλης 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
}
```

Οι λογικές πύλες NAND (και επίσης NOR) έχουν την ενδιαφέρουσα ιδιότητα ότι οποιαδήποτε άλλη λογική πύλη μπορεί να σχηματιστεί με αυτόν τον μοναδικό τύπο πύλης. Από τις βασικές λογικές πύλες, μπορείτε να κατασκευάσετε μάνδαλα, flip-flops και μνήμη. Αυτά είναι τα συστατικά για έναν υπολογιστή γενικής χρήσης. Μπορείτε να δοκιμάσετε αυτή την πύλη NAND για καθεμία από τις τέσσερις δυνατές εισόδους της με το ακόλουθο παράδειγμα που μπορείτε να ανοίξετε στο 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}
```

[Ανοίξτε αυτό το παράδειγμα στο 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)

Το να γνωρίζουμε ότι το LaTeX είναι πλήρες κατά Turing ανοίγει έναν κόσμο δυνατοτήτων. Κώδικας σαν κι αυτόν είναι συνηθισμένος στο back-end του LaTeX για πράγματα όπως η παρακολούθηση των αριθμών σελίδων και σχημάτων και ο καθορισμός του πού θα τοποθετηθούν τα αιωρούμενα αντικείμενα. Είναι ένα εργαλείο που μπορείτε να χρησιμοποιήσετε προς όφελός σας για να απλοποιήσετε πολύπλοκες διατάξεις εγγράφων.

Για να κλείσω αυτή την ανάρτηση, θα σας αφήσω με περαιτέρω ανάγνωση πάνω σε παραδείγματα προγραμματισμού στο LaTeX και σε μηχανές Turing.

#### Παραδείγματα προγραμματισμού στο LaTeX

* [Το σύνολο Mandelbrot στο LaTeX](http://warp.povusers.org/MandScripts/latex.html) . Ιδιαίτερες ευχαριστίες για αυτό· αυτός ο κώδικας ήταν ένα χρήσιμο παράδειγμα ενώ έγραφα την εντολή Fibonacci μου.
* [Μια μηχανή Turing στο LaTeX: η συνέχεια](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) Σημείωση: Όταν μεταφέραμε αυτό το άρθρο σε ένα άλλο σύστημα φιλοξενίας περιεχομένου, παρατηρήσαμε ότι ο ιστότοπος που αναφερόταν στο αρχικό άρθρο (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> δεν ήταν πλέον προσβάσιμος, οπότε αντικαταστήσαμε αυτόν τον σύνδεσμο με ένα επόμενο άρθρο από άλλον συγγραφέα.
* [Wikibook για εντολές TeX](http://en.wikibooks.org/wiki/Category:TeX)
* [Το LaTeX σε έναν διαγωνισμό προγραμματισμού](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). Ένας ελεγκτής ρόβερ του Άρη σε LaTeX ξεπέρασε συμμετοχές σε αρκετές πιο συνηθισμένες γλώσσες προγραμματισμού.

### Μηχανές Turing σε απροσδόκητα μέρη

* [Το Παιχνίδι της Ζωής του Conway είναι πλήρες κατά Turing](http://rendell-attic.org/gol/utm/index.htm). Ακολουθεί μια υλοποίηση μιας μηχανής Turing.
* [Ο κανόνας 110](http://en.wikipedia.org/wiki/Rule_110) είναι ένα μονοδιάστατο κυψελοαυτόματο που είναι πλήρες κατά Turing.
* Το Minecraft (το βιντεοπαιχνίδι) είναι πλήρες κατά Turing. Έχουν κατασκευαστεί αρκετά παραδείγματα, οπότε ο παρακάτω σύνδεσμος οδηγεί απλώς σε μια [σελίδα με σχετικά αποτελέσματα αναζήτησης στο 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/el/se-vathos-arthra/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.
