Das Muster-Zusammenbringen

In der Informatik ist Muster, das zusammenpasst, die Tat, eine Folge von Jetons für die Anwesenheit der Bestandteile von einem Muster zu überprüfen. Im Gegensatz zur Muster-Anerkennung muss das Match gewöhnlich genau sein. Die Muster haben allgemein die Form entweder von Folgen oder von Baumstrukturen. Der Gebrauch des Musters, das zusammenpasst, schließt outputting die Positionen (wenn irgendwelcher) eines Musters innerhalb einer Scheinfolge, zur Produktion ein Bestandteil des verglichenen Musters ein, und das zusammenpassende Muster mit einer anderen Scheinfolge einzusetzen (d. h., Suche, und ersetzen Sie).

Folge-Muster (z.B, eine Textschnur) werden häufig mit regelmäßigen Ausdrücken beschrieben und haben Verwenden-Techniken wie das Zurückverfolgen verglichen.

Baummuster werden auf einigen Programmiersprachen als ein allgemeines Werkzeug verwendet, um Daten zu bearbeiten, die auf seiner Struktur, z.B, Haskell, ML und der symbolischen Mathematik-Sprache gestützt sind, Mathematica haben spezielle Syntax, um Baummuster und eine Sprachkonstruktion für die bedingte Ausführung auszudrücken, und schätzen darauf gestützte Wiederauffindung. Aus Einfachheits- und Leistungsfähigkeitsgründen haben diese Baummuster an einigen Eigenschaften Mangel, die in regelmäßigen Ausdrücken verfügbar sind.

Häufig ist es möglich, alternative Muster zu geben, die eins nach dem anderen versucht werden, der eine starke bedingte Programmierkonstruktion nachgibt. Muster, das manchmal zusammenpasst, schließt Unterstützung für Wächter ein.

Das Begriff-Neuschreiben und die Graph-Neuschreiben-Sprachen verlassen sich auf das Muster, das für die grundsätzliche Weise zusammenpasst, wie ein Programm in ein Ergebnis bewertet.

Geschichte

Die ersten Computerprogramme, um Muster zu verwenden, das zusammenpasst, waren Textaufbereiter. An Glockenlaboratorien hat Ken Thompson das Suchen und Ersetzen von Eigenschaften QED Redakteur erweitert, um regelmäßige Ausdrücke zu akzeptieren. Frühe Programmiersprachen mit dem Muster, das Konstruktionen vergleicht, schließen SNOBOL von 1962, SASL von 1976, NPL von 1977 und KRC von 1981 ein. Die erste Programmiersprache mit dem baumbasierten Muster, das Eigenschaften vergleicht, war die Erweiterung von Fred McBride des LISPELNS 1970.

Primitive Muster

Das einfachste Muster im Muster, das zusammenpasst, ist ein ausführlicher Wert oder eine Variable. Für ein Beispiel, denken Sie eine einfache Funktionsdefinition in der Syntax von Haskell (Funktionsrahmen sind nicht in Parenthesen, aber werden durch Räume getrennt, = ist nicht Anweisung, aber Definition):

f 0 = 1

</Quelle>

Hier, 0 ist ein einzelnes Wertmuster. Jetzt, wann auch immer f 0 als Argument gegeben wird, kehren die Muster-Matchs und die Funktion 1 zurück. Mit jedem anderen Argument, dem Zusammenbringen und so der Funktion scheitern. Da die Syntax alternative Muster in Funktionsdefinitionen unterstützt, können wir die Definition fortsetzen, die sie erweitert, um mehr allgemeine Argumente zu nehmen:

f n = n * f (n-1)

</Quelle>

Hier ist das erste ein einzelnes variables Muster, das absolut jedes Argument vergleichen und es zum Namen n verpflichten wird, im Rest der Definition verwendet zu werden. In Haskell (verschieden von mindestens Hope) werden Muster in der Ordnung versucht, so gilt die erste Definition noch im sehr spezifischen Fall des Eingangs, der 0 ist, während für jedes andere Argument die Funktion mit n zurückgibt das Argument zu sein.

Das Wildcard-Muster (häufig schriftlich als) ist auch einfach: Wie ein Variablenname vergleicht es jeden Wert, aber bindet den Wert zu keinem Namen.

Baummuster

Kompliziertere Muster können von den primitiven der vorherigen Abteilung gewöhnlich ebenso gebaut werden, wie Werte durch das Kombinieren anderer Werte gebaut werden. Der Unterschied ist dann, dass mit der Variable und den Wildcard-Teilen ein Muster in einen einzelnen Wert nicht einbaut, aber eine Gruppe von Werten vergleicht, die die Kombination der konkreten Elemente und der Elemente sind, denen erlaubt wird, sich innerhalb der Struktur des Musters zu ändern.

Ein Baummuster beschreibt einen Teil eines Baums durch das Starten mit einem Knoten und das Spezifizieren einiger Zweige und Knoten und das Verlassen von einigen unangegeben mit einer Variable oder Wildcard-Muster. Es kann helfen, an den abstrakten Syntax-Baum einer Programmiersprache und algebraischer Datentypen zu denken.

In Haskell definiert die folgende Linie einen algebraischen Datentyp, der einen einzelnen Datenkonstrukteur hat, der eine ganze Zahl und eine Schnur wickelt.

Datenfarbe = Schnur der Ganzen Zahl von ColorConstructor

</Quelle>

Der Konstrukteur ist ein Knoten in einem Baum, und die ganze Zahl und Schnur sind Blätter in Zweigen.

Wenn wir Funktionen schreiben wollen, einen abstrakten Datentyp zu machen, möchten wir Funktionen schreiben, mit dem Datentyp zu verbinden, und so wollen wir einige Daten aus dem Datentyp, zum Beispiel, gerade die Schnur oder gerade der Teil der ganzen Zahl dessen herausziehen.

Wenn wir eine Variable passieren, die ist vom Typ Color, wie können wir die Daten aus dieser Variable bekommen? Zum Beispiel, für eine Funktion, den Teil der ganzen Zahl zu bekommen, können wir ein einfaches Baummuster verwenden und schreiben:

integerPart (ColorConstructor theInteger _) = theInteger

</Quelle>

Ebenso:

stringPart (ColorConstructor _ theString) = theString

</Quelle>

Die Entwicklungen dieser Funktionen können durch die Datenrekordsyntax von Haskell automatisiert werden.

Die Entstörung von Daten mit Mustern

Muster, das zusammenpasst, kann an Filterdaten einer bestimmten Struktur gewöhnt sein. Zum Beispiel in Haskell konnte ein Listenverständnis für diese Art der Entstörung verwendet werden:

[Ein x|A x

bewertet zu

[1, 2]

Muster, das in Mathematica zusammenpasst

In Mathematica ist die einzige Struktur, die besteht, der Baum, der durch Symbole bevölkert wird. In der Syntax von Haskell verwendet so weit konnte das als definiert werden

Daten SymbolTree = Symbol-Schnur [SymbolTree]

Ein Beispiel-Baum konnte dann wie aussehen

Symbol "a" [Symbol "b" [], Symbol "c"

In der traditionellen, passenderen Syntax werden die Symbole geschrieben, wie sie sind und die Niveaus des Baums mit [] vertreten werden, so dass zum Beispiel ein Baum mit als der Elternteil, und b und c als die Kinder ist.

Ein Muster in Mathematica schließt das Stellen "_" an Positionen in diesem Baum ein. Zum Beispiel, das Muster

[_]

wird Elemente solcher als [1], [2], oder mehr allgemein [x] vergleichen, wo x jede Entität ist. In diesem Fall, ist das konkrete Element, während das Stück des Baums anzeigt, der geändert werden kann. Ein Symbol prepended dazu bindet das Match zu diesem Variablennamen, während ein Symbol, das daran angehangen ist, die Matchs auf Knoten dieses Symbols einschränkt.

Die Mathematica-Funktionsfilterelemente des ersten Arguments, die das Muster im zweiten Argument vergleichen:

Fälle [{[1], b [1], [2], b [2]}, [_]]

bewertet zu

{[1], [2] }\

Muster, das zusammenpasst, gilt für die Struktur von Ausdrücken. Im Beispiel unten,

Fälle [{[b], [b, c], [b [c], d], [b [c], de, [b [c], d, e]}, [b [_], _]]

Umsatz

{[b [c], d], [b [c], de }\

weil nur diese Elemente das Muster oben vergleichen werden.

In Mathematica ist es auch möglich, Strukturen herauszuziehen, weil sie im Laufe der Berechnung, unabhängig davon geschaffen werden, wie, oder wo sie erscheinen. Die Funktion kann verwendet werden, um eine Berechnung zu kontrollieren, und die Elemente zurückzugeben, die entstehen, die ein Muster vergleichen. Zum Beispiel können wir die Folge von Fibonacci als definieren

Flunkerei [0|1]: =1

Flunkerei [n _]: = Flunkerei [n-1] + Flunkerei [n-2]

Dann können wir die Frage stellen: Gegebene Flunkerei [3], wie ist die Folge von rekursiven Anrufen von Fibonacci?

Spur [Flunkerei [3], fib_

gibt eine Struktur zurück, die die Ereignisse des Musters in der rechenbetonten Struktur vertritt:

Aussageprogrammierung

Auf symbolischen Programmiersprachen ist es leicht, Muster als Argumente für Funktionen oder als Elemente von Datenstrukturen zu haben. Eine Folge davon ist die Fähigkeit, Muster zu verwenden, um Erklärungen über Stücke von Daten Aussage-abzugeben und Funktionen flexibel anzuweisen, wie man funktioniert.

Zum Beispiel kann die Funktion von Mathematica verwendet werden, um effizientere Versionen des Codes zu machen. Im folgenden Beispiel sind die Details nicht besonders von Bedeutung; was Sachen ist, dass der Subausdruck anweist, dass, wie man annehmen kann, Ausdrücke der Form ganze Zahlen zu den Zwecken der Kompilation sind:

com [ich _]: = Binom [2i, ich]

Kompilieren Sie [{x, {mich, _Integer}}, x^com [ich],]

Briefkästen in Erlang arbeiten auch dieser Weg.

Die Ähnlichkeit des Currys-Howard zwischen Beweisen und Programmen verbindet ML-style Muster, das zusammenpasst, um Analyse und Beweis durch die Erschöpfung zu umgeben.

Muster, das zusammenpasst und Schnuren

Bei weitem der grösste Teil der Standardform des Musters, das zusammenpasst, schließt Reihen von Charakteren ein. Auf vielen Programmiersprachen wird eine besondere Syntax von Schnuren verwendet, um regelmäßige Ausdrücke zu vertreten, die Muster sind, die Schnur-Charaktere beschreiben.

Jedoch ist es möglich, ein Schnur-Muster durchzuführen, das innerhalb desselben Fachwerks zusammenpasst, das überall in diesem Artikel besprochen worden ist.

Baummuster für Schnuren

In Mathematica werden Schnuren als Bäume der Wurzel StringExpression und alle Charaktere in der Ordnung als Kinder der Wurzel vertreten. So, um "jeden Betrag zu vergleichen, Charaktere zu schleppen" ist eine neue Wildcard ___ im Gegensatz zu _ erforderlich, der nur einen einzelnen Charakter vergleichen würde.

In Haskell und funktionellen Programmiersprachen im Allgemeinen werden Schnuren als funktionelle Listen von Charakteren vertreten. Eine funktionelle Liste wird als eine leere Liste oder ein auf einer vorhandenen Liste gebautes Element definiert. In der Syntax von Haskell:

[] - eine leere Liste

x:xs — ein Element x gebaut auf einer Liste xs

Die Struktur für eine Liste mit einigen Elementen ist so. Wenn das Muster-Zusammenbringen, wir behaupten, dass ein bestimmtes Stück von Daten einem bestimmten Muster gleich ist. Zum Beispiel, in der Funktion:

Kopf (element:list) = Element

</Quelle>

wir behaupten, dass das erste Element 's Argument Element genannt wird, und die Funktion das zurückgibt. Wir wissen, dass das das erste Element wegen der Weise ist, wie Listen, ein einzelnes auf eine Liste gebautes Element definiert werden. Dieses einzelne Element muss erst sein. Die leere Liste würde das Muster überhaupt nicht vergleichen, weil eine leere Liste keinen Kopf hat (das erste Element, das gebaut wird).

Im Beispiel haben wir keinen Nutzen dafür, so können wir es ignorieren, und so die Funktion schreiben:

Kopf (Element: _) = Element

</Quelle>

Die gleichwertige Transformation von Mathematica wird als ausgedrückt

Kopf [Element]: =element

Beispiel-Schnur-Muster

In Mathematica, zum Beispiel,

StringExpression ["a",]

wird eine Schnur vergleichen, die zwei Charaktere hat und mit "a" beginnt.

Dasselbe Muster in Haskell:

[, _]

</Quelle>

Symbolische Entitäten können eingeführt werden, um viele verschiedene Klassen von relevanten Eigenschaften einer Schnur zu vertreten. Zum Beispiel,

StringExpression [LetterCharacter, DigitCharacter]

wird eine Schnur vergleichen, die aus einem Brief zuerst, und dann einer Zahl besteht.

In Haskell konnten Wächter verwendet werden, um dieselben Matchs zu erreichen:

[Brief, Ziffer] | isAlpha Brief && isDigit Ziffer

</Quelle>

Der Hauptvorteil der symbolischen Schnur-Manipulation besteht darin, dass sie mit dem Rest der Programmiersprache völlig integriert werden kann, anstatt eine getrennte, spezielle Zweck-Subeinheit zu sein. Die komplette Macht der Sprache kann gestärkt werden, um die Muster selbst aufzubauen oder die Programme zu analysieren und umzugestalten, die sie enthalten.

SNOBOL

SNOBOL (Schnur Orientierte Symbolische Sprache) ist eine Computerprogrammiersprache, die zwischen 1962 und 1967 an AT&T Glockenlaboratorien durch David J. Farber, Ralph E. Griswold und Ivan P. Polonsky entwickelt ist.

SNOBOL4 steht von den meisten Programmiersprachen zur Seite, indem er Muster als ein erstklassiger Datentyp gehabt wird (d. h. ein Datentyp, dessen Werte auf alle Weisen manipuliert werden können, die zu jedem anderen Datentyp auf der Programmiersprache erlaubt sind), und durch die Versorgung Maschinenbedienern für die Muster-Verkettung und den Wechsel. Während der Ausführung erzeugte Schnuren können als Programme behandelt und durchgeführt werden.

SNOBOL wurde in größeren US-Universitäten gegen Ende der 1960er Jahre und Anfang der 1970er Jahre ganz weit unterrichtet und wurde in den 1970er Jahren und 1980er Jahren als eine Textmanipulationssprache in den Geisteswissenschaften weit verwendet.

Seit der Entwicklung von SNOBOL haben neuere Sprachen wie Awk und Perl Schnur-Manipulation mittels regelmäßiger Ausdrücke modisch gemacht. SNOBOL4 Muster ordnen jedoch BNF Grammatiken unter, die zu Grammatiken ohne Zusammenhänge gleichwertig und stärker sind als regelmäßige Ausdrücke

Siehe auch

  • AIML für eine AI Sprache, die auf dem Zusammenbringen von Mustern in der Rede gestützt ist
  • AWK Sprache
  • Muster von Coccinelle vergleicht C Quellcode
  • Klacks, (programmierend)
  • Muster-Anerkennung für krause Muster
  • PCRE Perl Vereinbare Regelmäßige Ausdrücke, eine allgemeine moderne Durchführung des Schnur-Musters, das zusammenpasst, hat in viele Sprachen nach Backbord gehalten
  • REBOL Syntaxanalyse-Dialekt für das Muster, das zusammenpasst, hat gepflegt, Sprachdialekte durchzuführen
  • Tom (Muster, das Sprache vergleicht)
  • SNOBOL für eine Programmiersprache, die auf einer Art des Musters gestützt ist, das zusammenpasst
  • Vereinigung, ein ähnliches Konzept in der Einleitung
  • Das Mathematica-Buch, Kapitel Abschnitt 2.3: Muster
  • Der Haskell 98 Bericht, das Muster-Zusammenbringen des Kapitels 3.17.
  • Pythonschlange-Bedienungshandbuch, Zuweisungsbefehle des Kapitels 6.3.
  • Die Reine Programmiersprache, Kapitel 4.3: Muster

Links


TTY / Puerto Galera
Impressum & Datenschutz