<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Grundlagen_der_Theoretischen_Informatik</id>
	<title>Grundlagen der Theoretischen Informatik - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="http://dev.kaibel.net/index.php?action=history&amp;feed=atom&amp;title=Grundlagen_der_Theoretischen_Informatik"/>
	<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Grundlagen_der_Theoretischen_Informatik&amp;action=history"/>
	<updated>2026-05-15T09:18:57Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in dev.kaibel.net</subtitle>
	<generator>MediaWiki 1.43.0</generator>
	<entry>
		<id>http://dev.kaibel.net/index.php?title=Grundlagen_der_Theoretischen_Informatik&amp;diff=191&amp;oldid=prev</id>
		<title>PhilKa: Die Seite wurde neu angelegt: „{{Infobox Fachgebiet | Name = Grundlagen der Theoretischen Informatik | Gebiet = Informatik | Teilgebiete = Automatentheorie, Formale Sprachen, Berechenbarkeitstheorie, Komplexitätstheorie, Logik | Zentrale Fragen = Was ist berechenbar? Wie effizient ist ein Problem lösbar? Wie lassen sich Sprachen, Automaten und Algorithmen formal beschreiben? }}  &#039;&#039;&#039;Theoretische Informatik&#039;&#039;&#039; ist ein Teilgebiet der Informatik, das sich mit den mathematischen Grundlage…“</title>
		<link rel="alternate" type="text/html" href="http://dev.kaibel.net/index.php?title=Grundlagen_der_Theoretischen_Informatik&amp;diff=191&amp;oldid=prev"/>
		<updated>2026-04-30T10:05:55Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „{{Infobox Fachgebiet | Name = Grundlagen der Theoretischen Informatik | Gebiet = Informatik | Teilgebiete = Automatentheorie, Formale Sprachen, Berechenbarkeitstheorie, Komplexitätstheorie, Logik | Zentrale Fragen = Was ist berechenbar? Wie effizient ist ein Problem lösbar? Wie lassen sich Sprachen, Automaten und Algorithmen formal beschreiben? }}  &amp;#039;&amp;#039;&amp;#039;Theoretische Informatik&amp;#039;&amp;#039;&amp;#039; ist ein Teilgebiet der Informatik, das sich mit den mathematischen Grundlage…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Infobox Fachgebiet&lt;br /&gt;
| Name = Grundlagen der Theoretischen Informatik&lt;br /&gt;
| Gebiet = Informatik&lt;br /&gt;
| Teilgebiete = Automatentheorie, Formale Sprachen, Berechenbarkeitstheorie, Komplexitätstheorie, Logik&lt;br /&gt;
| Zentrale Fragen = Was ist berechenbar? Wie effizient ist ein Problem lösbar? Wie lassen sich Sprachen, Automaten und Algorithmen formal beschreiben?&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Theoretische Informatik&amp;#039;&amp;#039;&amp;#039; ist ein Teilgebiet der Informatik, das sich mit den mathematischen Grundlagen von Berechnung, Algorithmen, formalen Sprachen und Komplexität beschäftigt. Während die praktische Informatik häufig konkrete Systeme, Programme oder Anwendungen betrachtet, untersucht die theoretische Informatik abstrakte Modelle und allgemeine Gesetzmäßigkeiten. Sie beantwortet grundlegende Fragen wie: Was kann ein Computer prinzipiell berechnen? Welche Probleme sind algorithmisch lösbar? Welche Probleme sind zwar lösbar, aber nur mit sehr hohem Aufwand? Und wie kann man Programme, Sprachen und Berechnungen formal beschreiben?&lt;br /&gt;
&lt;br /&gt;
Die theoretische Informatik bildet damit eine wichtige Grundlage für viele andere Bereiche der Informatik, etwa Compilerbau, Kryptographie, Datenbanken, Softwareverifikation, künstliche Intelligenz und Algorithmik.&lt;br /&gt;
&lt;br /&gt;
== Überblick ==&lt;br /&gt;
&lt;br /&gt;
Die Grundlagen der theoretischen Informatik lassen sich grob in mehrere zentrale Themenbereiche einteilen:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Formale Sprachen und Grammatiken&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Automatentheorie&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Berechenbarkeitstheorie&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Komplexitätstheorie&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Logik und formale Systeme&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Algorithmische Grundlagen&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Diese Bereiche hängen eng miteinander zusammen. Formale Sprachen beschreiben beispielsweise Mengen von Wörtern nach festen Regeln. Automaten können solche Sprachen erkennen. Berechenbarkeitstheorie untersucht, welche Probleme überhaupt mit einem Algorithmus lösbar sind. Komplexitätstheorie betrachtet, wie viel Zeit oder Speicherplatz zur Lösung eines Problems benötigt wird.&lt;br /&gt;
&lt;br /&gt;
== Grundbegriffe ==&lt;br /&gt;
&lt;br /&gt;
=== Alphabet ===&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Alphabet&amp;#039;&amp;#039;&amp;#039; ist eine endliche, nichtleere Menge von Zeichen. In der theoretischen Informatik wird ein Alphabet häufig mit dem Symbol &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma = \{0,1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein binäres Alphabet mit den Zeichen 0 und 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma = \{a,b,c\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dies ist ein Alphabet mit drei Zeichen.&lt;br /&gt;
&lt;br /&gt;
=== Wort ===&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Wort&amp;#039;&amp;#039;&amp;#039; ist eine endliche Folge von Zeichen aus einem Alphabet.&lt;br /&gt;
&lt;br /&gt;
Beispiele über dem Alphabet &amp;lt;math&amp;gt;\Sigma = \{0,1\}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;101&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;00110&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das leere Wort wird meist mit &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt; bezeichnet. Es enthält kein Zeichen und hat die Länge 0.&lt;br /&gt;
&lt;br /&gt;
=== Sprache ===&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;formale Sprache&amp;#039;&amp;#039;&amp;#039; ist eine Menge von Wörtern über einem Alphabet.&lt;br /&gt;
&lt;br /&gt;
Formal gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L \subseteq \Sigma^*&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei bezeichnet &amp;lt;math&amp;gt;\Sigma^*&amp;lt;/math&amp;gt; die Menge aller endlichen Wörter über dem Alphabet &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L = \{w \in \{0,1\}^* \mid w \text{ enthält eine gerade Anzahl von Einsen}\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Sprache enthält alle binären Wörter, in denen die Anzahl der Einsen gerade ist.&lt;br /&gt;
&lt;br /&gt;
== Formale Sprachen ==&lt;br /&gt;
&lt;br /&gt;
Formale Sprachen sind ein zentrales Konzept der theoretischen Informatik. Sie dienen dazu, syntaktische Strukturen exakt zu beschreiben. Ein wichtiges Anwendungsgebiet ist der Compilerbau, da Programmiersprachen durch formale Grammatiken beschrieben werden können.&lt;br /&gt;
&lt;br /&gt;
=== Grammatiken ===&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;Grammatik&amp;#039;&amp;#039;&amp;#039; ist ein Regelsystem zur Erzeugung von Wörtern einer Sprache. Sie besteht typischerweise aus:&lt;br /&gt;
&lt;br /&gt;
* einer Menge von Nichtterminalsymbolen,&lt;br /&gt;
* einer Menge von Terminalsymbolen,&lt;br /&gt;
* einem Startsymbol,&lt;br /&gt;
* einer Menge von Produktionsregeln.&lt;br /&gt;
&lt;br /&gt;
Eine Grammatik wird häufig als Tupel dargestellt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;G = (N, T, P, S)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei gilt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symbol&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;N&amp;lt;/math&amp;gt;&lt;br /&gt;
| Menge der Nichtterminalsymbole&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;T&amp;lt;/math&amp;gt;&lt;br /&gt;
| Menge der Terminalsymbole&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt;&lt;br /&gt;
| Menge der Produktionsregeln&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;S&amp;lt;/math&amp;gt;&lt;br /&gt;
| Startsymbol&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Beispiel einer Grammatik ===&lt;br /&gt;
&lt;br /&gt;
Gegeben sei die Grammatik:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;G = (\{S\}, \{a,b\}, P, S)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mit den Produktionsregeln:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
S -&amp;gt; aSb&lt;br /&gt;
S -&amp;gt; ε&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Grammatik erzeugt die Sprache:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L = \{a^n b^n \mid n \geq 0\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sprache enthält also Wörter wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ε&lt;br /&gt;
ab&lt;br /&gt;
aabb&lt;br /&gt;
aaabbb&lt;br /&gt;
aaaabbbb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chomsky-Hierarchie ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Chomsky-Hierarchie&amp;#039;&amp;#039;&amp;#039; ordnet formale Grammatiken und Sprachen nach ihrer Ausdrucksstärke. Sie ist eine der wichtigsten Klassifikationen in der theoretischen Informatik.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Typ&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
! Erzeugte Sprachen&lt;br /&gt;
! Erkennendes Maschinenmodell&lt;br /&gt;
|-&lt;br /&gt;
| Typ 0&lt;br /&gt;
| Unbeschränkte Grammatiken&lt;br /&gt;
| Rekursiv aufzählbare Sprachen&lt;br /&gt;
| Turingmaschine&lt;br /&gt;
|-&lt;br /&gt;
| Typ 1&lt;br /&gt;
| Kontext-sensitive Grammatiken&lt;br /&gt;
| Kontext-sensitive Sprachen&lt;br /&gt;
| Linear beschränkter Automat&lt;br /&gt;
|-&lt;br /&gt;
| Typ 2&lt;br /&gt;
| Kontextfreie Grammatiken&lt;br /&gt;
| Kontextfreie Sprachen&lt;br /&gt;
| Kellerautomat&lt;br /&gt;
|-&lt;br /&gt;
| Typ 3&lt;br /&gt;
| Reguläre Grammatiken&lt;br /&gt;
| Reguläre Sprachen&lt;br /&gt;
| Endlicher Automat&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Hierarchie ist echt gestuft. Jede reguläre Sprache ist auch kontextfrei, jede kontextfreie Sprache ist auch kontextsensitiv, und jede kontextsensitive Sprache ist auch rekursiv aufzählbar. Umgekehrt gilt dies jedoch nicht immer.&lt;br /&gt;
&lt;br /&gt;
== Reguläre Sprachen ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Reguläre Sprachen&amp;#039;&amp;#039;&amp;#039; sind die einfachste Klasse formaler Sprachen innerhalb der Chomsky-Hierarchie. Sie können durch endliche Automaten, reguläre Ausdrücke oder reguläre Grammatiken beschrieben werden.&lt;br /&gt;
&lt;br /&gt;
=== Beispiele regulärer Sprachen ===&lt;br /&gt;
&lt;br /&gt;
Über dem Alphabet &amp;lt;math&amp;gt;\Sigma = \{0,1\}&amp;lt;/math&amp;gt; sind folgende Sprachen regulär:&lt;br /&gt;
&lt;br /&gt;
* Alle Wörter, die mit 0 beginnen.&lt;br /&gt;
* Alle Wörter, die eine gerade Anzahl von Einsen enthalten.&lt;br /&gt;
* Alle Wörter, die auf 101 enden.&lt;br /&gt;
* Alle Wörter mit höchstens drei Zeichen.&lt;br /&gt;
&lt;br /&gt;
=== Reguläre Ausdrücke ===&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;regulärer Ausdruck&amp;#039;&amp;#039;&amp;#039; beschreibt eine reguläre Sprache. Wichtige Operatoren sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operator&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&lt;br /&gt;
| Das Zeichen &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;r \mid s&amp;lt;/math&amp;gt;&lt;br /&gt;
| Alternative: &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;rs&amp;lt;/math&amp;gt;&lt;br /&gt;
| Konkatenation von &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt; und &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;r^*&amp;lt;/math&amp;gt;&lt;br /&gt;
| Beliebig viele Wiederholungen von &amp;lt;math&amp;gt;r&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;&lt;br /&gt;
| Leeres Wort&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(0 \mid 1)^*101&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dieser reguläre Ausdruck beschreibt alle binären Wörter, die auf 101 enden.&lt;br /&gt;
&lt;br /&gt;
== Automatentheorie ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Automatentheorie&amp;#039;&amp;#039;&amp;#039; untersucht abstrakte Maschinenmodelle. Diese Modelle dienen dazu, formale Sprachen zu erkennen oder Berechnungen zu beschreiben.&lt;br /&gt;
&lt;br /&gt;
Wichtige Automatenmodelle sind:&lt;br /&gt;
&lt;br /&gt;
* endliche Automaten,&lt;br /&gt;
* Kellerautomaten,&lt;br /&gt;
* linear beschränkte Automaten,&lt;br /&gt;
* Turingmaschinen.&lt;br /&gt;
&lt;br /&gt;
== Endliche Automaten ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;endlicher Automat&amp;#039;&amp;#039;&amp;#039; ist ein einfaches Berechnungsmodell mit endlich vielen Zuständen. Er liest ein Eingabewort Zeichen für Zeichen und wechselt abhängig vom aktuellen Zustand und Eingabezeichen in einen neuen Zustand.&lt;br /&gt;
&lt;br /&gt;
Endliche Automaten erkennen genau die regulären Sprachen.&lt;br /&gt;
&lt;br /&gt;
=== Deterministischer endlicher Automat ===&lt;br /&gt;
&lt;br /&gt;
Ein deterministischer endlicher Automat, kurz &amp;#039;&amp;#039;&amp;#039;DEA&amp;#039;&amp;#039;&amp;#039;, wird formal beschrieben als:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A = (Q, \Sigma, \delta, q_0, F)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dabei gilt:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symbol&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;Q&amp;lt;/math&amp;gt;&lt;br /&gt;
| Endliche Menge von Zuständen&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\Sigma&amp;lt;/math&amp;gt;&lt;br /&gt;
| Eingabealphabet&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\delta&amp;lt;/math&amp;gt;&lt;br /&gt;
| Übergangsfunktion&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;q_0&amp;lt;/math&amp;gt;&lt;br /&gt;
| Startzustand&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;F&amp;lt;/math&amp;gt;&lt;br /&gt;
| Menge akzeptierender Endzustände&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Die Übergangsfunktion hat die Form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\delta : Q \times \Sigma \rightarrow Q&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet: Für jeden Zustand und jedes Eingabezeichen ist eindeutig festgelegt, in welchen Folgezustand der Automat wechselt.&lt;br /&gt;
&lt;br /&gt;
=== Nichtdeterministischer endlicher Automat ===&lt;br /&gt;
&lt;br /&gt;
Ein nichtdeterministischer endlicher Automat, kurz &amp;#039;&amp;#039;&amp;#039;NEA&amp;#039;&amp;#039;&amp;#039;, darf für einen Zustand und ein Eingabezeichen mehrere mögliche Folgezustände besitzen. Außerdem können sogenannte &amp;lt;math&amp;gt;\varepsilon&amp;lt;/math&amp;gt;-Übergänge erlaubt sein, bei denen der Automat den Zustand wechseln kann, ohne ein Zeichen zu lesen.&lt;br /&gt;
&lt;br /&gt;
Obwohl NEAs auf den ersten Blick mächtiger wirken, erkennen sie genau dieselbe Sprachklasse wie DEAs, nämlich die regulären Sprachen. Jeder NEA kann in einen äquivalenten DEA umgewandelt werden.&lt;br /&gt;
&lt;br /&gt;
== Kellerautomaten ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Kellerautomat&amp;#039;&amp;#039;&amp;#039; ist ein Automat, der zusätzlich zu seinen Zuständen einen Speicher in Form eines Stapels besitzt. Dieser Stapel wird auch &amp;#039;&amp;#039;&amp;#039;Keller&amp;#039;&amp;#039;&amp;#039; genannt. Ein Kellerautomat kann Symbole auf den Stapel legen und wieder entfernen.&lt;br /&gt;
&lt;br /&gt;
Kellerautomaten erkennen genau die kontextfreien Sprachen.&lt;br /&gt;
&lt;br /&gt;
Ein typisches Beispiel für eine kontextfreie Sprache ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L = \{a^n b^n \mid n \geq 0\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Sprache ist nicht regulär, weil ein endlicher Automat sich nicht beliebig viele gelesene &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;-Zeichen merken kann. Ein Kellerautomat kann dagegen für jedes gelesene &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ein Symbol auf den Stapel legen und für jedes gelesene &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; wieder ein Symbol entfernen.&lt;br /&gt;
&lt;br /&gt;
== Turingmaschinen ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Turingmaschine&amp;#039;&amp;#039;&amp;#039; ist eines der wichtigsten Modelle der theoretischen Informatik. Sie wurde von Alan Turing eingeführt und dient als mathematisches Modell für allgemeine Berechnung.&lt;br /&gt;
&lt;br /&gt;
Eine Turingmaschine besitzt:&lt;br /&gt;
&lt;br /&gt;
* eine endliche Zustandsmenge,&lt;br /&gt;
* ein Eingabeband,&lt;br /&gt;
* einen Schreib-/Lesekopf,&lt;br /&gt;
* eine Übergangsfunktion,&lt;br /&gt;
* Start-, Akzeptier- und Verwerfzustände.&lt;br /&gt;
&lt;br /&gt;
Im Gegensatz zu einem endlichen Automaten kann eine Turingmaschine nicht nur lesen, sondern auch schreiben. Außerdem kann sich der Schreib-/Lesekopf nach links und rechts bewegen.&lt;br /&gt;
&lt;br /&gt;
=== Bedeutung der Turingmaschine ===&lt;br /&gt;
&lt;br /&gt;
Die Turingmaschine ist deshalb so wichtig, weil sie als formales Modell für das gilt, was algorithmisch berechenbar ist. Viele moderne Computer sind praktisch viel komplexer als Turingmaschinen, aber im theoretischen Sinn nicht mächtiger: Alles, was ein realer Computer berechnen kann, kann auch eine Turingmaschine berechnen.&lt;br /&gt;
&lt;br /&gt;
== Berechenbarkeitstheorie ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Berechenbarkeitstheorie&amp;#039;&amp;#039;&amp;#039; untersucht, welche Probleme durch Algorithmen lösbar sind. Dabei geht es nicht darum, ob ein Problem effizient lösbar ist, sondern ob überhaupt ein Algorithmus existiert, der für jede zulässige Eingabe eine korrekte Antwort liefert.&lt;br /&gt;
&lt;br /&gt;
=== Entscheidungsprobleme ===&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Entscheidungsproblem&amp;#039;&amp;#039;&amp;#039; ist ein Problem, dessen Antwort entweder „ja“ oder „nein“ lautet.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
* Ist eine gegebene Zahl eine Primzahl?&lt;br /&gt;
* Enthält ein Graph einen Kreis?&lt;br /&gt;
* Ist ein gegebenes Wort Element einer bestimmten Sprache?&lt;br /&gt;
* Hält ein bestimmtes Programm bei einer bestimmten Eingabe?&lt;br /&gt;
&lt;br /&gt;
Viele Probleme der theoretischen Informatik werden als Entscheidungsprobleme formuliert, weil sie sich gut formal untersuchen lassen.&lt;br /&gt;
&lt;br /&gt;
=== Entscheidbarkeit ===&lt;br /&gt;
&lt;br /&gt;
Ein Problem heißt &amp;#039;&amp;#039;&amp;#039;entscheidbar&amp;#039;&amp;#039;&amp;#039;, wenn es eine Turingmaschine gibt, die für jede Eingabe nach endlich vielen Schritten anhält und die korrekte Antwort liefert.&lt;br /&gt;
&lt;br /&gt;
Ein Problem heißt &amp;#039;&amp;#039;&amp;#039;unentscheidbar&amp;#039;&amp;#039;&amp;#039;, wenn kein solcher Algorithmus existiert.&lt;br /&gt;
&lt;br /&gt;
=== Semi-Entscheidbarkeit ===&lt;br /&gt;
&lt;br /&gt;
Ein Problem heißt &amp;#039;&amp;#039;&amp;#039;semi-entscheidbar&amp;#039;&amp;#039;&amp;#039;, wenn es eine Turingmaschine gibt, die bei Ja-Instanzen anhält und akzeptiert, bei Nein-Instanzen aber möglicherweise unendlich lange weiterläuft.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet: Positive Fälle können erkannt werden, negative Fälle aber nicht immer zuverlässig.&lt;br /&gt;
&lt;br /&gt;
== Das Halteproblem ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Halteproblem&amp;#039;&amp;#039;&amp;#039; ist ein klassisches Beispiel für ein unentscheidbares Problem.&lt;br /&gt;
&lt;br /&gt;
Es lautet:&lt;br /&gt;
&lt;br /&gt;
: Gegeben sei ein Programm &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; und eine Eingabe &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt;. Hält &amp;lt;math&amp;gt;P&amp;lt;/math&amp;gt; bei Eingabe &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; nach endlich vielen Schritten an?&lt;br /&gt;
&lt;br /&gt;
Alan Turing zeigte, dass es keinen allgemeinen Algorithmus geben kann, der dieses Problem für alle Programme und Eingaben korrekt entscheidet.&lt;br /&gt;
&lt;br /&gt;
=== Bedeutung des Halteproblems ===&lt;br /&gt;
&lt;br /&gt;
Das Halteproblem zeigt eine fundamentale Grenze der Informatik. Es beweist, dass es Probleme gibt, die grundsätzlich nicht algorithmisch lösbar sind, unabhängig davon, wie schnell oder leistungsfähig ein Computer ist.&lt;br /&gt;
&lt;br /&gt;
Dies ist ein wichtiger Unterschied zur Komplexitätstheorie: Dort geht es um den Aufwand lösbarer Probleme. Beim Halteproblem geht es darum, dass überhaupt keine allgemeine algorithmische Lösung existiert.&lt;br /&gt;
&lt;br /&gt;
== Komplexitätstheorie ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Komplexitätstheorie&amp;#039;&amp;#039;&amp;#039; untersucht den Ressourcenverbrauch von Algorithmen. Besonders wichtig sind dabei:&lt;br /&gt;
&lt;br /&gt;
* Zeitaufwand,&lt;br /&gt;
* Speicheraufwand,&lt;br /&gt;
* Eingabegröße.&lt;br /&gt;
&lt;br /&gt;
Ein Problem kann also berechenbar sein, aber trotzdem praktisch kaum lösbar, wenn der Aufwand zu groß ist.&lt;br /&gt;
&lt;br /&gt;
=== Zeitkomplexität ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Zeitkomplexität&amp;#039;&amp;#039;&amp;#039; beschreibt, wie viele Rechenschritte ein Algorithmus in Abhängigkeit von der Eingabegröße benötigt.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Notation&lt;br /&gt;
! Bedeutung&lt;br /&gt;
! Einordnung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Konstante Laufzeit&lt;br /&gt;
| Sehr effizient&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Logarithmische Laufzeit&lt;br /&gt;
| Sehr effizient&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Lineare Laufzeit&lt;br /&gt;
| Effizient&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;O(n \log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Linear-logarithmische Laufzeit&lt;br /&gt;
| Häufig bei effizienten Sortierverfahren&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Quadratische Laufzeit&lt;br /&gt;
| Für große Eingaben oft problematisch&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;O(2^n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| Exponentielle Laufzeit&lt;br /&gt;
| Meist praktisch schwer handhabbar&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Speicherkomplexität ===&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Speicherkomplexität&amp;#039;&amp;#039;&amp;#039; beschreibt, wie viel Speicherplatz ein Algorithmus abhängig von der Eingabegröße benötigt.&lt;br /&gt;
&lt;br /&gt;
Auch hier verwendet man häufig die O-Notation, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt; für konstanten Speicher,&lt;br /&gt;
* &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; für linearen Speicher,&lt;br /&gt;
* &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt; für quadratischen Speicher.&lt;br /&gt;
&lt;br /&gt;
== O-Notation ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;O-Notation&amp;#039;&amp;#039;&amp;#039; beschreibt das asymptotische Wachstum einer Funktion. Sie wird verwendet, um den Ressourcenverbrauch eines Algorithmus für große Eingaben abzuschätzen.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Algorithmus beispielsweise eine Laufzeit von&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
hat, bedeutet das, dass seine Laufzeit höchstens proportional zu &amp;lt;math&amp;gt;n^2&amp;lt;/math&amp;gt; wächst, wenn die Eingabegröße &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; groß wird.&lt;br /&gt;
&lt;br /&gt;
Die O-Notation ignoriert konstante Faktoren und niedrigere Terme. Daher gilt beispielsweise:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;3n^2 + 5n + 7 \in O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der Algorithmusanalyse interessiert man sich also vor allem für den dominierenden Term.&lt;br /&gt;
&lt;br /&gt;
== Komplexitätsklassen ==&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;Komplexitätsklasse&amp;#039;&amp;#039;&amp;#039; ist eine Menge von Problemen, die unter bestimmten Ressourcenbeschränkungen lösbar sind.&lt;br /&gt;
&lt;br /&gt;
Wichtige Komplexitätsklassen sind:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;NP&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;NP-schwer&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;NP-vollständig&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;PSPACE&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;EXPTIME&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Die Klasse P ==&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;#039;&amp;#039;&amp;#039;P&amp;#039;&amp;#039;&amp;#039; enthält alle Entscheidungsprobleme, die von einer deterministischen Turingmaschine in polynomialer Zeit entschieden werden können.&lt;br /&gt;
&lt;br /&gt;
Polynomial bedeutet, dass die Laufzeit durch ein Polynom beschränkt ist, zum Beispiel:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;&lt;br /&gt;
* &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Probleme in P gelten im Allgemeinen als effizient lösbar.&lt;br /&gt;
&lt;br /&gt;
Beispiele für Probleme in P:&lt;br /&gt;
&lt;br /&gt;
* Sortieren einer Liste,&lt;br /&gt;
* Kürzeste Wege in Graphen mit nichtnegativen Kantengewichten,&lt;br /&gt;
* Testen, ob eine Zahl durch eine andere teilbar ist,&lt;br /&gt;
* Erreichbarkeit in bestimmten Graphmodellen.&lt;br /&gt;
&lt;br /&gt;
== Die Klasse NP ==&lt;br /&gt;
&lt;br /&gt;
Die Klasse &amp;#039;&amp;#039;&amp;#039;NP&amp;#039;&amp;#039;&amp;#039; enthält alle Entscheidungsprobleme, deren Ja-Lösungen in polynomialer Zeit überprüft werden können.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist: NP bedeutet nicht „nicht polynomial“. NP steht für &amp;#039;&amp;#039;&amp;#039;nondeterministic polynomial time&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Ein Problem liegt in NP, wenn man eine vorgeschlagene Lösung effizient überprüfen kann.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Beim Problem des Handlungsreisenden in Entscheidungsform fragt man:&lt;br /&gt;
&lt;br /&gt;
: Gibt es eine Rundreise mit Gesamtlänge höchstens &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
Wenn jemand eine konkrete Rundreise vorgibt, kann man in polynomialer Zeit prüfen, ob sie alle Städte genau einmal besucht und ob ihre Länge höchstens &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; beträgt.&lt;br /&gt;
&lt;br /&gt;
== NP-schwere Probleme ==&lt;br /&gt;
&lt;br /&gt;
Ein Problem heißt &amp;#039;&amp;#039;&amp;#039;NP-schwer&amp;#039;&amp;#039;&amp;#039;, wenn jedes Problem aus NP in polynomialer Zeit auf dieses Problem reduziert werden kann.&lt;br /&gt;
&lt;br /&gt;
Anschaulich bedeutet das: Ein NP-schweres Problem ist mindestens so schwer wie alle Probleme aus NP.&lt;br /&gt;
&lt;br /&gt;
Ein NP-schweres Problem muss selbst nicht zwingend in NP liegen. Es kann also auch ein Optimierungsproblem oder sogar ein unentscheidbares Problem sein.&lt;br /&gt;
&lt;br /&gt;
== NP-vollständige Probleme ==&lt;br /&gt;
&lt;br /&gt;
Ein Problem heißt &amp;#039;&amp;#039;&amp;#039;NP-vollständig&amp;#039;&amp;#039;&amp;#039;, wenn zwei Bedingungen erfüllt sind:&lt;br /&gt;
&lt;br /&gt;
# Das Problem liegt in NP.&lt;br /&gt;
# Das Problem ist NP-schwer.&lt;br /&gt;
&lt;br /&gt;
NP-vollständige Probleme sind die schwierigsten Probleme innerhalb von NP. Wenn man für ein NP-vollständiges Problem einen polynomialen Algorithmus finden würde, dann könnte jedes Problem aus NP in polynomialer Zeit gelöst werden.&lt;br /&gt;
&lt;br /&gt;
== P-vs.-NP-Problem ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;P-vs.-NP-Problem&amp;#039;&amp;#039;&amp;#039; ist eines der bekanntesten offenen Probleme der Informatik und Mathematik.&lt;br /&gt;
&lt;br /&gt;
Es fragt:&lt;br /&gt;
&lt;br /&gt;
: Gilt &amp;lt;math&amp;gt;P = NP&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;P \neq NP&amp;lt;/math&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
Anders formuliert:&lt;br /&gt;
&lt;br /&gt;
: Kann jedes Problem, dessen Lösung effizient überprüfbar ist, auch effizient gelöst werden?&lt;br /&gt;
&lt;br /&gt;
Bis heute ist nicht bekannt, ob &amp;lt;math&amp;gt;P = NP&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;P \neq NP&amp;lt;/math&amp;gt; gilt. Die meisten Fachleute vermuten, dass &amp;lt;math&amp;gt;P \neq NP&amp;lt;/math&amp;gt; gilt.&lt;br /&gt;
&lt;br /&gt;
== Reduktionen ==&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;Reduktion&amp;#039;&amp;#039;&amp;#039; ist eine Methode, um ein Problem auf ein anderes Problem zurückzuführen.&lt;br /&gt;
&lt;br /&gt;
Wenn ein Problem &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; auf ein Problem &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; reduziert werden kann, bedeutet das: Eine Lösung für &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; kann verwendet werden, um auch &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; zu lösen.&lt;br /&gt;
&lt;br /&gt;
Formal schreibt man häufig:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A \leq_p B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Das bedeutet: &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; ist in polynomialer Zeit auf &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; reduzierbar.&lt;br /&gt;
&lt;br /&gt;
Reduktionen sind besonders wichtig, um NP-Schwere oder NP-Vollständigkeit zu zeigen.&lt;br /&gt;
&lt;br /&gt;
== Algorithmen ==&lt;br /&gt;
&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;Algorithmus&amp;#039;&amp;#039;&amp;#039; ist eine eindeutige, endliche Handlungsvorschrift zur Lösung eines Problems.&lt;br /&gt;
&lt;br /&gt;
Ein Algorithmus sollte folgende Eigenschaften besitzen:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Eigenschaft&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| Eindeutigkeit&lt;br /&gt;
| Jeder Schritt ist klar definiert&lt;br /&gt;
|-&lt;br /&gt;
| Endlichkeit&lt;br /&gt;
| Die Beschreibung des Algorithmus ist endlich&lt;br /&gt;
|-&lt;br /&gt;
| Ausführbarkeit&lt;br /&gt;
| Jeder Schritt kann tatsächlich ausgeführt werden&lt;br /&gt;
|-&lt;br /&gt;
| Terminierung&lt;br /&gt;
| Der Algorithmus endet nach endlich vielen Schritten&lt;br /&gt;
|-&lt;br /&gt;
| Korrektheit&lt;br /&gt;
| Der Algorithmus liefert das richtige Ergebnis&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
In der theoretischen Informatik werden Algorithmen nicht nur implementiert, sondern mathematisch analysiert.&lt;br /&gt;
&lt;br /&gt;
== Korrektheit von Algorithmen ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Korrektheit&amp;#039;&amp;#039;&amp;#039; eines Algorithmus bedeutet, dass er für jede zulässige Eingabe das richtige Ergebnis liefert.&lt;br /&gt;
&lt;br /&gt;
Man unterscheidet:&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;partielle Korrektheit&amp;#039;&amp;#039;&amp;#039;,&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;totale Korrektheit&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
=== Partielle Korrektheit ===&lt;br /&gt;
&lt;br /&gt;
Ein Algorithmus ist partiell korrekt, wenn gilt:&lt;br /&gt;
&lt;br /&gt;
: Falls der Algorithmus terminiert, liefert er ein korrektes Ergebnis.&lt;br /&gt;
&lt;br /&gt;
Die partielle Korrektheit sagt also noch nichts darüber aus, ob der Algorithmus tatsächlich immer endet.&lt;br /&gt;
&lt;br /&gt;
=== Totale Korrektheit ===&lt;br /&gt;
&lt;br /&gt;
Ein Algorithmus ist total korrekt, wenn er partiell korrekt ist und zusätzlich für jede zulässige Eingabe terminiert.&lt;br /&gt;
&lt;br /&gt;
Totale Korrektheit umfasst also:&lt;br /&gt;
&lt;br /&gt;
* Korrektheit des Ergebnisses,&lt;br /&gt;
* Terminierung.&lt;br /&gt;
&lt;br /&gt;
== Beweismethoden in der theoretischen Informatik ==&lt;br /&gt;
&lt;br /&gt;
In der theoretischen Informatik spielen mathematische Beweise eine zentrale Rolle. Wichtige Beweismethoden sind:&lt;br /&gt;
&lt;br /&gt;
* direkter Beweis,&lt;br /&gt;
* Beweis durch Widerspruch,&lt;br /&gt;
* vollständige Induktion,&lt;br /&gt;
* strukturelle Induktion,&lt;br /&gt;
* Reduktionsbeweis,&lt;br /&gt;
* Pumping-Lemma-Beweis.&lt;br /&gt;
&lt;br /&gt;
== Vollständige Induktion ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;vollständige Induktion&amp;#039;&amp;#039;&amp;#039; ist eine Beweismethode für Aussagen über natürliche Zahlen.&lt;br /&gt;
&lt;br /&gt;
Ein Induktionsbeweis besteht aus:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Induktionsanfang&amp;#039;&amp;#039;&amp;#039;: Die Aussage wird für einen Startwert bewiesen, meist &amp;lt;math&amp;gt;n = 0&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;n = 1&amp;lt;/math&amp;gt;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Induktionsvoraussetzung&amp;#039;&amp;#039;&amp;#039;: Man nimmt an, dass die Aussage für ein beliebiges &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; gilt.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Induktionsschritt&amp;#039;&amp;#039;&amp;#039;: Man zeigt, dass daraus die Aussage für &amp;lt;math&amp;gt;n+1&amp;lt;/math&amp;gt; folgt.&lt;br /&gt;
&lt;br /&gt;
Induktion wird häufig verwendet, um Eigenschaften von Algorithmen, Rekursionen oder formalen Sprachen zu beweisen.&lt;br /&gt;
&lt;br /&gt;
== Pumping-Lemma ==&lt;br /&gt;
&lt;br /&gt;
Das &amp;#039;&amp;#039;&amp;#039;Pumping-Lemma&amp;#039;&amp;#039;&amp;#039; ist ein wichtiges Werkzeug, um zu zeigen, dass eine Sprache nicht regulär ist.&lt;br /&gt;
&lt;br /&gt;
Vereinfacht besagt es:&lt;br /&gt;
&lt;br /&gt;
: Wenn eine Sprache regulär ist, dann lassen sich hinreichend lange Wörter dieser Sprache in Teile zerlegen, sodass ein bestimmter Mittelteil beliebig oft wiederholt werden kann und das Wort trotzdem in der Sprache bleibt.&lt;br /&gt;
&lt;br /&gt;
Das Pumping-Lemma wird meist indirekt verwendet:&lt;br /&gt;
&lt;br /&gt;
# Man nimmt an, eine Sprache sei regulär.&lt;br /&gt;
# Dann müsste das Pumping-Lemma gelten.&lt;br /&gt;
# Man zeigt, dass dies zu einem Widerspruch führt.&lt;br /&gt;
# Also ist die Sprache nicht regulär.&lt;br /&gt;
&lt;br /&gt;
=== Beispielidee ===&lt;br /&gt;
&lt;br /&gt;
Die Sprache&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L = \{a^n b^n \mid n \geq 0\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ist nicht regulär.&lt;br /&gt;
&lt;br /&gt;
Ein endlicher Automat kann nicht beliebig viele &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt;-Zeichen zählen, um anschließend genau dieselbe Anzahl von &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt;-Zeichen zu überprüfen.&lt;br /&gt;
&lt;br /&gt;
== Aussagenlogik ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Aussagenlogik&amp;#039;&amp;#039;&amp;#039; beschäftigt sich mit Aussagen, die entweder wahr oder falsch sind.&lt;br /&gt;
&lt;br /&gt;
Beispiele für Aussagen:&lt;br /&gt;
&lt;br /&gt;
* „Es regnet.“&lt;br /&gt;
* „5 ist eine Primzahl.“&lt;br /&gt;
* „Ein Automat akzeptiert das Wort.“&lt;br /&gt;
&lt;br /&gt;
Wichtige logische Operatoren sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symbol&lt;br /&gt;
! Bedeutung&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\neg&amp;lt;/math&amp;gt;&lt;br /&gt;
| Nicht&lt;br /&gt;
| &amp;lt;math&amp;gt;\neg A&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\land&amp;lt;/math&amp;gt;&lt;br /&gt;
| Und&lt;br /&gt;
| &amp;lt;math&amp;gt;A \land B&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\lor&amp;lt;/math&amp;gt;&lt;br /&gt;
| Oder&lt;br /&gt;
| &amp;lt;math&amp;gt;A \lor B&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\rightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| Implikation&lt;br /&gt;
| &amp;lt;math&amp;gt;A \rightarrow B&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\leftrightarrow&amp;lt;/math&amp;gt;&lt;br /&gt;
| Äquivalenz&lt;br /&gt;
| &amp;lt;math&amp;gt;A \leftrightarrow B&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Aussagenlogik ist wichtig für Schaltalgebra, Verifikation, Datenbanken und formale Spezifikationen.&lt;br /&gt;
&lt;br /&gt;
== Prädikatenlogik ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Prädikatenlogik&amp;#039;&amp;#039;&amp;#039; erweitert die Aussagenlogik um Variablen, Prädikate und Quantoren.&lt;br /&gt;
&lt;br /&gt;
Wichtige Quantoren sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symbol&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\forall&amp;lt;/math&amp;gt;&lt;br /&gt;
| Für alle&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;\exists&amp;lt;/math&amp;gt;&lt;br /&gt;
| Es existiert&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\forall x \in \mathbb{N}: x + 0 = x&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Aussage bedeutet: Für alle natürlichen Zahlen &amp;lt;math&amp;gt;x&amp;lt;/math&amp;gt; gilt, dass &amp;lt;math&amp;gt;x + 0 = x&amp;lt;/math&amp;gt; ist.&lt;br /&gt;
&lt;br /&gt;
== Mengen, Relationen und Funktionen ==&lt;br /&gt;
&lt;br /&gt;
Mathematische Grundbegriffe wie Mengen, Relationen und Funktionen sind für die theoretische Informatik unverzichtbar.&lt;br /&gt;
&lt;br /&gt;
=== Mengen ===&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;Menge&amp;#039;&amp;#039;&amp;#039; ist eine Zusammenfassung von unterscheidbaren Objekten.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;A = \{1,2,3,4\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wichtige Mengenoperationen sind:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Operation&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;A \cup B&amp;lt;/math&amp;gt;&lt;br /&gt;
| Vereinigung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;A \cap B&amp;lt;/math&amp;gt;&lt;br /&gt;
| Schnittmenge&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;A \setminus B&amp;lt;/math&amp;gt;&lt;br /&gt;
| Differenz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;A \subseteq B&amp;lt;/math&amp;gt;&lt;br /&gt;
| Teilmenge&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Relationen ===&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;Relation&amp;#039;&amp;#039;&amp;#039; beschreibt eine Beziehung zwischen Elementen.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;R = \{(1,2), (2,3), (3,4)\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Relationen sind wichtig für Graphen, Ordnungen, Äquivalenzklassen und Datenbanken.&lt;br /&gt;
&lt;br /&gt;
=== Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Eine &amp;#039;&amp;#039;&amp;#039;Funktion&amp;#039;&amp;#039;&amp;#039; ordnet jedem Element einer Definitionsmenge genau ein Element einer Zielmenge zu.&lt;br /&gt;
&lt;br /&gt;
Formal:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f : A \rightarrow B&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;f(x) = x^2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Graphentheorie ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;#039;&amp;#039;&amp;#039;Graphentheorie&amp;#039;&amp;#039;&amp;#039; ist ein wichtiges Hilfsmittel der theoretischen Informatik. Ein Graph besteht aus Knoten und Kanten.&lt;br /&gt;
&lt;br /&gt;
Formal wird ein Graph oft als&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;G = (V,E)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
geschrieben.&lt;br /&gt;
&lt;br /&gt;
Dabei ist:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Symbol&lt;br /&gt;
! Bedeutung&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;V&amp;lt;/math&amp;gt;&lt;br /&gt;
| Menge der Knoten&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;math&amp;gt;E&amp;lt;/math&amp;gt;&lt;br /&gt;
| Menge der Kanten&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Graphen werden verwendet, um Netzwerke, Abhängigkeiten, Zustandsräume, Verkehrsverbindungen oder Datenstrukturen zu modellieren.&lt;br /&gt;
&lt;br /&gt;
=== Gerichtete und ungerichtete Graphen ===&lt;br /&gt;
&lt;br /&gt;
Bei einem &amp;#039;&amp;#039;&amp;#039;ungerichteten Graphen&amp;#039;&amp;#039;&amp;#039; haben Kanten keine Richtung.&lt;br /&gt;
&lt;br /&gt;
Bei einem &amp;#039;&amp;#039;&amp;#039;gerichteten Graphen&amp;#039;&amp;#039;&amp;#039; haben Kanten eine Richtung. Eine gerichtete Kante von &amp;lt;math&amp;gt;u&amp;lt;/math&amp;gt; nach &amp;lt;math&amp;gt;v&amp;lt;/math&amp;gt; wird als &amp;lt;math&amp;gt;(u,v)&amp;lt;/math&amp;gt; geschrieben.&lt;br /&gt;
&lt;br /&gt;
=== Wichtige graphentheoretische Probleme ===&lt;br /&gt;
&lt;br /&gt;
* Gibt es einen Weg zwischen zwei Knoten?&lt;br /&gt;
* Was ist der kürzeste Weg?&lt;br /&gt;
* Enthält der Graph einen Kreis?&lt;br /&gt;
* Gibt es eine topologische Sortierung?&lt;br /&gt;
* Gibt es eine Hamiltonsche Rundreise?&lt;br /&gt;
* Ist der Graph färbbar?&lt;br /&gt;
&lt;br /&gt;
Einige dieser Probleme sind effizient lösbar, andere sind NP-vollständig.&lt;br /&gt;
&lt;br /&gt;
== Zusammenhang zwischen den Teilgebieten ==&lt;br /&gt;
&lt;br /&gt;
Die verschiedenen Gebiete der theoretischen Informatik bauen stark aufeinander auf.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Teilgebiet&lt;br /&gt;
! Zentrale Frage&lt;br /&gt;
! Beispiel&lt;br /&gt;
|-&lt;br /&gt;
| Formale Sprachen&lt;br /&gt;
| Wie beschreibt man Mengen von Wörtern?&lt;br /&gt;
| Syntax einer Programmiersprache&lt;br /&gt;
|-&lt;br /&gt;
| Automatentheorie&lt;br /&gt;
| Welche Maschinen erkennen welche Sprachen?&lt;br /&gt;
| Endlicher Automat für ein Suchmuster&lt;br /&gt;
|-&lt;br /&gt;
| Berechenbarkeitstheorie&lt;br /&gt;
| Was ist überhaupt algorithmisch lösbar?&lt;br /&gt;
| Halteproblem&lt;br /&gt;
|-&lt;br /&gt;
| Komplexitätstheorie&lt;br /&gt;
| Wie effizient ist ein Problem lösbar?&lt;br /&gt;
| P, NP, NP-vollständig&lt;br /&gt;
|-&lt;br /&gt;
| Logik&lt;br /&gt;
| Wie formalisiert man Aussagen und Beweise?&lt;br /&gt;
| Programmverifikation&lt;br /&gt;
|-&lt;br /&gt;
| Graphentheorie&lt;br /&gt;
| Wie modelliert man Beziehungen und Strukturen?&lt;br /&gt;
| Netzwerke und Abhängigkeiten&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Von Sprache zu Automat ==&lt;br /&gt;
&lt;br /&gt;
Angenommen, es soll die Sprache aller binären Wörter erkannt werden, die auf &amp;lt;math&amp;gt;01&amp;lt;/math&amp;gt; enden.&lt;br /&gt;
&lt;br /&gt;
Das Alphabet lautet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\Sigma = \{0,1\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Sprache ist:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;L = \{w \in \{0,1\}^* \mid w \text{ endet auf } 01\}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Diese Sprache ist regulär. Sie kann beschrieben werden durch den regulären Ausdruck:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;(0 \mid 1)^*01&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein endlicher Automat kann diese Sprache erkennen, indem er sich merkt, ob zuletzt eine 0 gelesen wurde und ob danach eine 1 folgt.&lt;br /&gt;
&lt;br /&gt;
== Beispiel: Von Problem zu Komplexitätsklasse ==&lt;br /&gt;
&lt;br /&gt;
Betrachtet wird das Problem:&lt;br /&gt;
&lt;br /&gt;
: Gibt es in einem Graphen einen Weg von Knoten &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; zu Knoten &amp;lt;math&amp;gt;t&amp;lt;/math&amp;gt;?&lt;br /&gt;
&lt;br /&gt;
Dieses Problem ist ein Entscheidungsproblem. Es kann mit einer Breitensuche oder Tiefensuche effizient gelöst werden. Die Laufzeit ist linear in der Anzahl der Knoten und Kanten.&lt;br /&gt;
&lt;br /&gt;
Daher gehört das Problem zur Klasse P.&lt;br /&gt;
&lt;br /&gt;
Ein anderes Problem lautet:&lt;br /&gt;
&lt;br /&gt;
: Gibt es in einem Graphen einen Kreis, der jeden Knoten genau einmal besucht?&lt;br /&gt;
&lt;br /&gt;
Dies ist das Hamiltonkreisproblem. Es liegt in NP, weil eine vorgeschlagene Lösung effizient überprüft werden kann. Gleichzeitig ist es NP-vollständig, weil es zu den schwierigsten Problemen innerhalb von NP gehört.&lt;br /&gt;
&lt;br /&gt;
== Praktische Bedeutung ==&lt;br /&gt;
&lt;br /&gt;
Obwohl theoretische Informatik abstrakt wirkt, hat sie viele praktische Anwendungen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Bereich&lt;br /&gt;
! Bedeutung der theoretischen Informatik&lt;br /&gt;
|-&lt;br /&gt;
| Compilerbau&lt;br /&gt;
| Formale Grammatiken beschreiben die Syntax von Programmiersprachen&lt;br /&gt;
|-&lt;br /&gt;
| Datenbanken&lt;br /&gt;
| Relationen, Logik und Anfrageauswertung beruhen auf formalen Grundlagen&lt;br /&gt;
|-&lt;br /&gt;
| Kryptographie&lt;br /&gt;
| Sicherheit hängt oft von komplexitätstheoretisch schwierigen Problemen ab&lt;br /&gt;
|-&lt;br /&gt;
| Softwareverifikation&lt;br /&gt;
| Logik wird genutzt, um Programme formal zu prüfen&lt;br /&gt;
|-&lt;br /&gt;
| Netzwerke&lt;br /&gt;
| Graphen modellieren Verbindungen und Routing&lt;br /&gt;
|-&lt;br /&gt;
| Künstliche Intelligenz&lt;br /&gt;
| Suchprobleme und Optimierungsprobleme werden formal analysiert&lt;br /&gt;
|-&lt;br /&gt;
| Algorithmik&lt;br /&gt;
| Laufzeiten und Korrektheit werden mathematisch untersucht&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Typische Klausurfragen ==&lt;br /&gt;
&lt;br /&gt;
Typische Aufgaben in der theoretischen Informatik sind:&lt;br /&gt;
&lt;br /&gt;
* Geben Sie eine formale Grammatik für eine Sprache an.&lt;br /&gt;
* Konstruieren Sie einen endlichen Automaten für eine gegebene Sprache.&lt;br /&gt;
* Wandeln Sie einen NEA in einen DEA um.&lt;br /&gt;
* Zeigen Sie mit dem Pumping-Lemma, dass eine Sprache nicht regulär ist.&lt;br /&gt;
* Bestimmen Sie, ob eine Sprache regulär, kontextfrei oder entscheidbar ist.&lt;br /&gt;
* Analysieren Sie die Laufzeit eines Algorithmus.&lt;br /&gt;
* Ordnen Sie ein Problem einer Komplexitätsklasse zu.&lt;br /&gt;
* Zeigen Sie, dass ein Problem NP-schwer oder NP-vollständig ist.&lt;br /&gt;
* Beweisen Sie die Korrektheit eines Algorithmus.&lt;br /&gt;
* Entscheiden Sie, ob eine logische Formel erfüllbar ist.&lt;br /&gt;
&lt;br /&gt;
== Wichtige Begriffe ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Begriff&lt;br /&gt;
! Kurzdefinition&lt;br /&gt;
|-&lt;br /&gt;
| Alphabet&lt;br /&gt;
| Endliche Menge von Zeichen&lt;br /&gt;
|-&lt;br /&gt;
| Wort&lt;br /&gt;
| Endliche Folge von Zeichen&lt;br /&gt;
|-&lt;br /&gt;
| Sprache&lt;br /&gt;
| Menge von Wörtern&lt;br /&gt;
|-&lt;br /&gt;
| Grammatik&lt;br /&gt;
| Regelsystem zur Erzeugung einer Sprache&lt;br /&gt;
|-&lt;br /&gt;
| Automat&lt;br /&gt;
| Abstraktes Berechnungsmodell&lt;br /&gt;
|-&lt;br /&gt;
| Reguläre Sprache&lt;br /&gt;
| Sprache, die durch endliche Automaten erkannt wird&lt;br /&gt;
|-&lt;br /&gt;
| Kontextfreie Sprache&lt;br /&gt;
| Sprache, die durch Kellerautomaten erkannt wird&lt;br /&gt;
|-&lt;br /&gt;
| Turingmaschine&lt;br /&gt;
| Allgemeines mathematisches Modell der Berechnung&lt;br /&gt;
|-&lt;br /&gt;
| Entscheidbares Problem&lt;br /&gt;
| Problem, für das ein Algorithmus immer anhält und korrekt entscheidet&lt;br /&gt;
|-&lt;br /&gt;
| Unentscheidbares Problem&lt;br /&gt;
| Problem, für das kein allgemeiner Entscheidungsalgorithmus existiert&lt;br /&gt;
|-&lt;br /&gt;
| Komplexitätsklasse&lt;br /&gt;
| Menge von Problemen mit ähnlichem Ressourcenbedarf&lt;br /&gt;
|-&lt;br /&gt;
| P&lt;br /&gt;
| Klasse effizient entscheidbarer Probleme&lt;br /&gt;
|-&lt;br /&gt;
| NP&lt;br /&gt;
| Klasse effizient überprüfbarer Entscheidungsprobleme&lt;br /&gt;
|-&lt;br /&gt;
| NP-schwer&lt;br /&gt;
| Mindestens so schwer wie alle Probleme aus NP&lt;br /&gt;
|-&lt;br /&gt;
| NP-vollständig&lt;br /&gt;
| Problem ist sowohl in NP als auch NP-schwer&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Zusammenfassung ==&lt;br /&gt;
&lt;br /&gt;
Die theoretische Informatik untersucht die formalen Grundlagen von Berechnung und Information. Sie beschäftigt sich mit Sprachen, Automaten, Algorithmen, Berechenbarkeit, Komplexität und Logik. Ihre zentrale Bedeutung liegt darin, die Möglichkeiten und Grenzen algorithmischer Verfahren zu verstehen.&lt;br /&gt;
&lt;br /&gt;
Formale Sprachen und Automaten helfen dabei, syntaktische Strukturen und einfache Berechnungsmodelle zu beschreiben. Die Berechenbarkeitstheorie zeigt, welche Probleme grundsätzlich algorithmisch lösbar sind. Die Komplexitätstheorie untersucht, welche lösbaren Probleme effizient lösbar sind und welche vermutlich einen hohen Rechenaufwand benötigen. Logik, Mengenlehre und Graphentheorie liefern die mathematischen Werkzeuge, um diese Fragen präzise zu formulieren und zu beweisen.&lt;br /&gt;
&lt;br /&gt;
Damit ist die theoretische Informatik nicht nur ein abstraktes Grundlagenfach, sondern eine zentrale Basis für viele praktische Bereiche der Informatik.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Automatentheorie]]&lt;br /&gt;
* [[Formale Sprachen]]&lt;br /&gt;
* [[Reguläre Sprachen]]&lt;br /&gt;
* [[Kontextfreie Sprachen]]&lt;br /&gt;
* [[Turingmaschine]]&lt;br /&gt;
* [[Berechenbarkeit]]&lt;br /&gt;
* [[Halteproblem]]&lt;br /&gt;
* [[Komplexitätstheorie]]&lt;br /&gt;
* [[P]]&lt;br /&gt;
* [[NP]]&lt;br /&gt;
* [[NP-schwer]]&lt;br /&gt;
* [[NP-vollständig]]&lt;br /&gt;
* [[P versus NP]]&lt;br /&gt;
* [[Graphentheorie]]&lt;br /&gt;
* [[Aussagenlogik]]&lt;br /&gt;
* [[Prädikatenlogik]]&lt;br /&gt;
&lt;br /&gt;
== Kategorien ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Theoretische Informatik]]&lt;br /&gt;
[[Kategorie:Informatik]]&lt;br /&gt;
[[Kategorie:Formale Sprachen]]&lt;br /&gt;
[[Kategorie:Automatentheorie]]&lt;br /&gt;
[[Kategorie:Komplexitätstheorie]]&lt;br /&gt;
[[Kategorie:Berechenbarkeit]]&lt;/div&gt;</summary>
		<author><name>PhilKa</name></author>
	</entry>
</feed>