Können reguläre Sprachen vollständig sein?


32

Ich las über Iota und Jot und fand diesen Abschnitt verwirrend:

Im Gegensatz zu Iota, wo der syntaktische Baum für einen String entweder links oder rechts verzweigt sein kann, ist die Jot-Syntax einheitlich links verzweigt. Infolgedessen ist Iota streng kontextfrei, aber Jot ist eine reguläre Sprache.

Mein Verständnis ist, dass sowohl Iota als auch Jot vollständig sind. Aber anscheinend ist einer kontextfrei und der andere regelmäßig! Sicherlich können reguläre Sprachen nicht vollständig sein?


3
Man beachte, dass eine Sprache, die eine Turingmaschine beschreibt, einfach in einer regulären Sprache geschrieben werden kann, zum Beispiel i = {0,1, -1}, b = {Ende der Eingabe} (i + bi + bi) + b (i +) beschreibt Ein nicht leerer Regelsatz, gefolgt von einer nicht leeren Eingabe. Oder vielmehr können Sie es so interpretieren, wenn Sie einen Dolmetscher haben, der, wie die Antworten sagen, ein von der Klasse der Sprache getrenntes Konzept ist.
Cubic

1
@Cubic: Übrigens können Turing-Maschinen so nummeriert werden, dass jede Zahl genau eine Maschine darstellt (dh sie sind zählbar), und diese Zahlen können in unärer Notation ausgedrückt werden. Ich habe dieses Zeug nie richtig studiert, also muss ich über die Definitionen 1*0nachdenken , aber ich gehe davon aus, dass es sich um eine reguläre Sprache handelt.
Steve Jessop

Antworten:


40

Kurz gesagt lautet die Antwort ja.

Aber Sie mischen zwei völlig unabhängige Bedeutungen des Begriffs "Sprache" (ja, das ist verwirrend):

  • Eine Reihe von Zeichenfolgen. "Kontextfreie Sprache" bedeutet "eine Menge von Zeichenfolgen, die unter Verwendung einer kontextfreien Grammatik erkannt werden können".
  • Eine Methode zum Angeben einer Berechnung. "Turing-vollständige Sprache" bedeutet "eine Möglichkeit, Programme anzugeben, in denen die Turing-Maschine angegeben werden kann".

Beachten Sie, dass Sie von "der C ++ - Sprache" aus zwei völlig unabhängigen Blickwinkeln sprechen können, wobei Sie die beiden unabhängigen Bedeutungen des Wortes "Sprache" verwenden:

  • C ++ als eine Menge von Zeichenfolgen, die gemäß der C ++ - Grammatik zulässig sind
  • C ++ zur Angabe von Programmen.

Die Merkmale der "C ++ - Sprache" unter diesen beiden Gesichtspunkten hängen nicht zusammen.

Weitere Beispiele zum Trennen dieser Konzepte:

  • Der Ausdruck "[az] + @ [az]. [Az]" beschreibt eine Menge von Zeichenketten, die durch endliche Automaten erkennbar sind, dh eine reguläre Sprache. Es ist jedoch nur so, dass - eine Reihe von Zeichenfolgen: keine Methode zum Spezifizieren von Programmen ist (es sei denn, Sie schreiben eine Methode zum Interpretieren einer solchen Zeichenfolge als Programm vor), sodass es keinen Sinn macht, darüber zu sprechen, ob es sich um Turing handelt oder nicht Komplett.
  • Die Sprache der Flussdiagramme ist eine Möglichkeit, Programme zu spezifizieren. Abhängig von der jeweiligen Ausführung der Flussdiagramme kann es sein, dass es vollständig ist oder nicht. Flussdiagramme sind jedoch keine Zeichenfolgen, sodass es absolut sinnlos ist, über Flussdiagramme im Sinne von "Sprache als Zeichenfolge" zu sprechen.

3
Ich möchte hinzufügen , dass (([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*eine reguläre Sprache ist , die Grammatik einer Sprache der Klasse zu beschreiben , der Lage ist , 0
Erbureth sagt wieder einzusetzen Monica

2
{0,1}

10

Während der Satz von legalen Programmen in Jot regelmäßig ist, ist Jot selbst Turing-vollständig. Das bedeutet, dass jede berechenbare Funktion in Jot ausgedrückt werden kann. Wir können uns sogar eine Sprache einfallen lassen, in der alle binären Zeichenfolgen legal sind, aber die Sprache selbst ist vollständig (Übung). Sie sind Syntax und Semantik verwirrend.

Übrigens sind kontextfreie Sprachen (wahrscheinlich) auch nicht NP-vollständig, da sie über einen polynomiellen Zeitanalysealgorithmus verfügen.


9

Die Syntax allein (wie in Syntaxbäumen kodiert) moderner Programmiersprachen ist weit von allem entfernt, was sie tun. Tatsächlich sind die formalen Sprachen, die durch die Menge aller Programme in einer bestimmten Sprache definiert werden, die fehlerfrei kompiliert werden, selten sogar kontextfrei .

Statische und dynamische Semantik fließen in die Gleichung ein. Sie sind im Syntaxbaum unsichtbar, bestimmen jedoch, ob ein Codeteil tatsächlich ein Programm ist und was es berechnet. Unterm Strich ist die kontextfreie resp. reguläre formale Sprache, die durch "Syntax" definiert ist, ergibt eine Überapproximation der Programmiersprache.

Nun zur Beantwortung Ihrer Frage: Ja, das ist möglich. Denken Sie beispielsweise an eine Gödel-Nummerierung von Turing-Maschinen. Sie erhalten die "Programmiersprache" aller natürlichen Zahlen, die jeweils ein TM darstellen. Zugegeben, es ist keine schöne Sprache zum Programmieren, aber es ist sicherlich eine Turing-vollständige Sprache, die regelmäßig ist - sogar trivial.


3
  1. Eine Programmiersprache ist Turing-vollständig, wenn sie aussagekräftig genug ist, um jede von Turing-Maschinen berechenbare Funktion anzugeben. Hier diskutieren wir die Macht der in den Programmiersprachen angegebenen Sprachen . ZB ist es nicht schwierig, einen Interpreter für Turing-Maschinen in Python zu schreiben, daher ist Python eine vollständige Programmiersprache für Turing.

  2. Die Syntax einer Programmiersprache , dh die Menge von Zeichenfolgen, die gültigen Programmen in der Programmiersprache entsprechen, ist selbst eine Sprache. ZB die Menge aller möglichen Python-Programme berücksichtigen. Die Syntax einer Programmiersprache kann kontextsensitiv , kontextfrei , regulär usw. sein. Wir sind an der Schwierigkeit interessiert, zu überprüfen, ob ein bestimmter String ein gültiges Programm in der Programmiersprache ist (dies wird von Compilern / Interpreten durchgeführt). Wenn wir sagen, dass die Syntax einer Programmiersprache kontextfrei ist, bedeutet dies, dass es eine kontextfreie Grammatik für ihre Syntax gibt, und impliziert, dass es Push-Down-Automaten gibt, mit denen die Gültigkeit von Programmen überprüft werden kann.

Beachten Sie, dass die Einfachheit der Syntax einer Programmiersprache keine Einschränkung der Rechenleistung der in diesen Programmiersprachen angegebenen Programme bedeutet.


1

Die Antwort ist ja. Sie sehen, wie die akzeptierte Antwort besagt, dass eine Grammatik unabhängig von ihrer Bedeutung ist. In Chomskys eigenen Worten:

Ich denke, wir sind gezwungen zu folgern, dass eine Grammatik autonom und bedeutungsunabhängig ist ...

Chomsky, Syntaktische Strukturen (1956)

Wenn eine Grammatik genügend Sätze erzeugt, um alle Dinge zu beschreiben, die berechnet werden können, können wir ihren Sätzen willkürlich eine rechnerische Bedeutung zuweisen - eine für jedes Ding, das berechnet werden kann.

Als konkretes Beispiel hat die populäre Sprache whitespaceeine reguläre Grammatik und vielleicht sogar x86 assembly languages(muss überprüft werden).


Ich glaube nicht, dass diese Passage bedeutet, dass Go's Grammatik eine reguläre Sprache im formalen Sinne ist. Ich denke, es bedeutet nur, dass die Grammatik nicht unregelmäßig , dh konsistent ist. Wenn die Syntax von Go tatsächlich eine reguläre Sprache in der Chomsky-Hierarchie wäre, wäre sie nicht in der Lage, z. B. ausgeglichene, geschachtelte Klammern zu generieren.
Tsleyson

Ja, in Go's Grammatik gibt es eine Rekursion. Beitrag wird aktualisiert.
Eric
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.