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

# LaTeX أقوى مما تظن - حساب أعداد فيبوناتشي واكتمال تورنغ

**المؤلف: Robert Murrish (أبريل 2012 (حرره Overleaf في أبريل 2023))**

LaTeX أداة قوية. بل قوية جدًا، في الواقع، إلى درجة أنه يمكن استخدامها لأكثر بكثير من تنسيق المستندات. LaTeX هو [مكتمل تورنغ](https://en.wikipedia.org/wiki/Turing_completeness)؛ أي أنه يمكن برمجته ليحسب تقريبًا أي شيء.

لإظهار قدرات LaTeX العامة في البرمجة، سنلقي نظرة على مثال يحسب أول أعداد فيبوناتشي. ورغم أن هذا ليس برهانًا على اكتمال تورنغ، فهو مثال جيد على خوارزمية كاملة مطبقة في LaTeX.

### أعداد فيبوناتشي

كل عدد في متتالية فيبوناتشي هو مجموع الحدّين السابقين في المتتالية، مع تعريف الحدّين الأولين على أنهما 1 لتوفير نقطة بداية.

يمكننا كتابة أمر جديد لحساب هذه الأعداد. فلنبدأ بتحديد الشكل الذي قد تبدو عليه استدعاء الأمر الذي لم نكتبه بعد:

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

عندما يُستدعى هذا الأمر من مستند LaTeX الخاص بنا، ينبغي أن ينتج قائمة من `n` أعداد فيبوناتشي (حيث إن `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/ar/altnsyq/10-counters.md) يمكن استخدامها مباشرة كما في `\count0`, `\count1`، إلخ. ولكن إسناد أسماء إليها يمنعنا من الكتابة إلى عداد مستخدم بالفعل. إذا كنت فضوليًا، فاستبدل أحد المتغيرات في هذه الشيفرة بـ `\count0`، وستصبح أرقام الصفحات خاطئة لبقية المستند.

لدينا بعد ذلك الأمر `\fibonacci` الأمر. ننشئه باستخدام `\newcommand`، والذي نزوده بالاسم، وعدد الوسيطات، وشيفرة TeX لمعالجة الوسيطات. بالنسبة لهذا الأمر، نقبل وسيطًا واحدًا، وهو عدد أعداد فيبوناتشي المطلوب إخراجها. ومحتوى هذا الأمر بسيط: نضبط القيم الأولية لمتغيراتنا، ونطبع أول رقمين من أعداد فيبوناتشي (لأنه لا حاجة إلى حسابهما)، ثم نستدعي `\fibloop`، والذي سيتولى العمل الشاق في حساباتنا.

الأمر `\fibloop` يُعرَّف بالطريقة نفسها، لكن جزءًا أساسيًا من هذا الأمر هو كيفية تكراره. نستخدم أمرًا يُسمّى `\next`، وهو مهيأ إلى `\fibloop` داخل `\fibonacci`، ويُستخدم داخل `\fibloop` للتحكم في التكرار. `\fibloop` سيظل يتكرر حتى `\next` يتغير بواسطة الشيفرة داخل `\fibloop` الأمر نفسه. `n` مرة، لذا نستخدم `\ifnum` تعليمة تتحقق من قيمة العداد لدينا (`\fcnt`) ثم إذا لم يصل إلى القيمة الحدية 0، `\fcnt` يُنقَص في كل مرة تتكرر فيها الحلقة. وإذا تحقق الشرط، نعيّن `\next` إلى `\\relax`، مما سيمنع `\fibloop` من التكرار — فالـ `\next` الأمر الأخير لا يفعل شيئًا، وتنتهي الحلقة.

تحسب الأوامر الأخرى في هذه الكتلة رقم فيبوناتشي التالي في المتتالية وتحدّث قيم المتغيرات بحيث تكون جاهزة للمرة التالية. الأمر `\the\ftwo` يطبع قيمة رقم فيبوناتشي الحالي إلى المستند، وستلاحظ أيضًا فاصلة ومسافة في أعلى `\fibloop` الأمر المستخدم لفصل كل قيمة.

#### النتيجة

أبسط طريقة لرؤية هذه الشيفرة أثناء العمل هي تشغيلها على Overleaf باستخدام **افتح هذا المثال في Overleaf** الرابط الموجود في أسفل عرض الشيفرة. تنمو متتالية فيبوناتشي بسرعة، لذا فإن أي `n>44` سيؤدي إلى تجاوز سعة عدد صحيح في هذا التنفيذ تحديدًا.

### إلى أين نتجه من هنا؟

كإثبات غير رسمي على أن LaTeX مكتمل تورنغ، أقدّم الشيفرة التالية، وهي تنفيذ سريع وبدائي لـ [بوابة 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) لها خاصية مثيرة للاهتمام، وهي أن أي بوابة منطقية أخرى يمكن بناؤها باستخدام هذا النوع الواحد من البوابات. ومن بوابات المنطق الأساسية يمكنك بناء المزالج، والقلابات، والذاكرة. وهذه هي المكونات اللازمة لحاسوب عام الاستخدام. يمكنك اختبار بوابة 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 مكتمل تورنغ تفتح عالمًا من الإمكانات. فالشيفرة مثل هذه شائعة في الجزء الخلفي من LaTeX لأشياء مثل تتبّع أرقام الصفحات والأشكال وتحديد مواضع العناصر العائمة. إنها أداة يمكنك استخدامها لصالحك لتبسيط تخطيطات المستندات المعقدة.

لإنهاء هذه التدوينة، سأترك لك مزيدًا من القراءات حول أمثلة البرمجة في LaTeX وآلات تورنغ.

#### أمثلة على برمجة LaTeX

* [مجموعة ماندلبروت في LaTeX](http://warp.povusers.org/MandScripts/latex.html) . شكر خاص لهذا المثال؛ فقد كانت هذه الشيفرة مثالًا مفيدًا أثناء كتابة أمر فيبوناتشي الخاص بي.
* [آلة تورنغ في LaTeX: المتابعة](http://pbelmans.ncag.info/blog/2010/12/12/a-turing-machine-in-latex-follow-u/) ملاحظة: عند نقل هذه المقالة إلى نظام استضافة محتوى آخر، لاحظنا أن الموقع المشار إليه في المقالة الأصلية (<http://en.literateprograms.org/Turing_machine_simulator_(LaTeX))> لم يعد متاحًا، لذا استبدلنا ذلك الرابط بمقالة متابعة كتبها مؤلف آخر.
* [ويكي كتاب عن أوامر TeX](http://en.wikibooks.org/wiki/Category:TeX)
* [LaTeX في مسابقة برمجة](http://sdh33b.blogspot.com/2008/07/icfp-contest-2008.html). تفوق متحكم لمركبة جوالة على المريخ مكتوب بـ LaTeX على مشاركات بلغات برمجة أكثر شيوعًا.

### آلات تورنغ في أماكن غير متوقعة

* [لعبة الحياة لكُونواي مكتملة تورنغ](http://rendell-attic.org/gol/utm/index.htm). إليك تنفيذًا لآلة تورنغ.
* [القاعدة 110](http://en.wikipedia.org/wiki/Rule_110) هي آلية خلوية أحادية البعد ومكتملة تورنغ.
* ماينكرافت (لعبة الفيديو) مكتملة تورنغ. وقد بُنيت عدة أمثلة، لذا فالرابط التالي ليس سوى إلى [صفحة نتائج بحث 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/ar/mqalat-mtamqh/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.
