En informática , la coincidencia de patrones consiste en comprobar si una secuencia de tokens contiene los elementos de un patrón determinado . A diferencia del reconocimiento de patrones , la coincidencia suele ser exacta: «o coincide o no coincide». Los patrones generalmente tienen la forma de secuencias o estructuras de árbol . Entre los usos de la coincidencia de patrones se incluyen la obtención de las ubicaciones (si las hay) de un patrón dentro de una secuencia de tokens, la obtención de algún componente del patrón coincidente y la sustitución del patrón coincidente por otra secuencia de tokens (es decir, búsqueda y reemplazo ).
Los patrones de secuencia (por ejemplo, una cadena de texto) a menudo se describen utilizando expresiones regulares y se comparan utilizando técnicas como el retroceso .
Los patrones de árbol se utilizan en algunos lenguajes de programación como una herramienta general para procesar datos en función de su estructura, por ejemplo, C# , [ 1 ] F# , [ 2 ] Haskell , [ 3 ] Java , [ 4 ] ML , Python , [ 5 ] Racket , [ 6 ] Ruby , [ 7 ] Rust , [ 8 ] Scala , [ 9 ] Swift [ 10 ] y el lenguaje matemático simbólico Mathematica tienen una sintaxis especial para expresar patrones de árbol y una construcción de lenguaje para la ejecución condicional y la recuperación de valores basada en ella.
A menudo es posible proporcionar patrones alternativos que se prueban uno por uno, lo que da como resultado una potente construcción de programación condicional. La coincidencia de patrones a veces incluye soporte para guardas . [ 11 ]
Historia
Entre los primeros lenguajes de programación con construcciones de coincidencia de patrones se encuentran COMIT (1957) y SNOBOL (1962), que introdujo la coincidencia de patrones como una capacidad fundamental del lenguaje para la manipulación de cadenas y texto. Este paradigma evolucionó hacia la evaluación de datos estructurados y basados en árboles con Refal (1968), que utilizó la coincidencia de patrones para manipular expresiones simbólicas. El concepto pronto se adaptó a la programación lógica con Prolog (1972), donde la coincidencia de patrones tomó la forma de unificación estructural para resolver consultas lógicas. Los lenguajes de programación funcional adoptaron y formalizaron rápidamente esta característica a finales de la década de 1970 y principios de la de 1980, comenzando con el St Andrews Static Language (SASL) (1976), NPL (1977) y la Kent Recursive Calculator (KRC) (1981). [ 12 ]
La característica de coincidencia de patrones de los argumentos de función en el lenguaje ML (1973) y su dialecto Standard ML (1983) formalizó en gran medida la comprobación de exhaustividad en tiempo de compilación. Este enfoque se ha trasladado a otros lenguajes de programación funcional influenciados por ellos, como Haskell (1990), Scala (2004) y F# (2005). La construcción de coincidencia de patrones con la matchpalabra clave introducida en el dialecto ML Caml (1985) fue seguida por lenguajes como OCaml (1996), F# (2005), F* (2011) y Rust (2015). Con el tiempo, los lenguajes multiparadigma comenzaron a implementar tipos de datos algebraicos y coincidencia de patrones de forma nativa, culminando en implementaciones modernas como la sintaxis de Pythonmatch-case (2021) y las mejoras de coincidencia de patrones de Java (2023). [ 13 ]
Muchos editores de texto admiten la coincidencia de patrones de diversos tipos para facilitar las funciones avanzadas de búsqueda y reemplazo. El editor QED , diseñado por Ken Thompson , fue pionero en la compatibilidad con la búsqueda mediante expresiones regulares. La implementación del análisis de expresiones regulares por parte de Thompson en QED sentó las bases para las utilidades de búsqueda de texto en ed , sed y grep . Además, algunas versiones del editor TECO admitían funciones de coincidencia avanzadas, incluido el operador lógico OR en las búsquedas. [ 14 ]
Los sistemas de álgebra computacional (CAS) generalmente admiten la coincidencia de patrones en expresiones algebraicas para lograr la simplificación e integración simbólicas. Los primeros sistemas, como Macsyma (1968), utilizaban la coincidencia de patrones semánticos para reconocer la equivalencia algebraica ; por ejemplo, su motor interno podía hacer coincidir con éxito tanto como como ocurrencias de una plantilla de patrón "cuadrática en x". Los sistemas modernos de álgebra computacional, incluidos Mathematica y Maple , dependen en gran medida de las reglas de coincidencia de patrones para transformar expresiones de usuario, encontrar soluciones analíticas a ecuaciones diferenciales y construir marcos de simplificación definidos por el usuario. [ 15 ]3x2 + 4(x + 1)(x + 6)
Terminología
La coincidencia de patrones requiere terminología especializada.
- Pareo
- El acto de comparar un elemento examinado con un patrón (o conjunto de patrones), posiblemente seleccionando una continuación , extrayendo enlaces , realizando una sustitución o cualquier combinación de estos. También conocido como desestructuración .
- Patrón
- Sintaxis que describe la estructura esperada en el elemento analizado , además de la especificación de las partes del elemento analizado que se deben extraer ( enlaces ) o ignorar ( comodines ). Los lenguajes de patrones pueden ser complejos; consulte a continuación la terminología que denota tipos específicos de patrones.
- Escrutador
- El valor que se examinará y comparará con un patrón. En la mayoría de los casos, se tratará de una estructura de datos cuyo tipo será el mismo que el del patrón aplicado. También se conoce como valor de referencia o discriminante .
- Continuación
- En algunos lenguajes, cuando se aplican varios patrones alternativos a un elemento analizado, si uno de ellos coincide, se ejecuta un fragmento de código asociado en un entorno ampliado con las vinculaciones del patrón coincidente . Este fragmento de código es la continuación asociada al patrón.
- Sustitución
- Sustitución de una parte de la estructura de datos analizada por un valor calculado. El cálculo puede depender tanto de la parte sustituida de la estructura analizada como de otras vinculaciones extraídas de la misma.
Terminología de patrones
Si bien algunos conceptos son relativamente comunes a muchos lenguajes de patrones, otros lenguajes de patrones incluyen extensiones únicas o inusuales.
- Vinculante
- Una forma de asociar un nombre con una parte del objeto examinado, de modo que el nombre quede vinculado a esa parte cuando se ejecute la continuación. Por ejemplo, en Rust, se espera que sea un par, y y son enlaces que traen variables del mismo nombre al ámbito en la continuación (" ").
matchv{(a,b)=>...}vab...
- Comodín
- A menudo escrito como un solo guion bajo
_, el patrón comodín acepta todos los valores sin examinarlos más a fondo, ignorando su estructura. También conocido como descarte , patrón comodín , patrón comodín general o como agujero .
- Guardia
- Una condición de guarda es una expresión que debe tener éxito (o devolver un valor booleano verdadero) como paso final antes de considerar que un patrón ha coincidido correctamente. En algunos lenguajes (por ejemplo, Erlang ), las condiciones de guarda se escriben utilizando un subconjunto restringido del lenguaje completo; en otros (por ejemplo, Haskell ), pueden utilizar el lenguaje completo.
- Predicado
- Algunos lenguajes de patrones permiten incrustar funciones predicado definidas por el usuario dentro de un patrón. El predicado se aplica a la parte del elemento analizado que corresponde a su posición en el patrón; si el predicado devuelve falso, se considera que el patrón ha fallado. Por ejemplo, en Racket, el patrón espera primero una lista y luego aplica el predicado a cada elemento; por lo tanto, el patrón solo tiene éxito cuando el elemento analizado es una lista de números pares.
(list(?even?)...)even?
- Patrón de visualización
- Lenguajes como Haskell [ 16 ] y Racket [ 17 ] incluyen patrones de vista , donde una función definida por el usuario transforma la porción del elemento examinado que corresponde a la posición del patrón de vista antes de continuar la coincidencia. Los patrones de vista generalizan los patrones de predicado, permitiendo una coincidencia adicional con el resultado de la función en lugar de simplemente esperar un valor booleano.
- Restricción
- Algunos lenguajes de patrones permiten la comparación directa de partes del objeto analizado con estructuras de datos previamente calculadas (o constantes). Por ejemplo, el patrón en Racket compara el valor con el resultado de evaluar . En Erlang, la mención de cualquier variable que ya esté dentro del ámbito en un patrón hace que actúe como una restricción de esta manera (en lugar de como una vinculación).
(==expr)expr
- Patrón literal; patrón atómico
- Los patrones que coinciden con datos atómicos simples, como
123o ,"hello"se denominan patrones literales .
- Patrón compuesto
- Los patrones que desestructuran valores compuestos, como listas, tablas hash, tuplas, estructuras o registros, con subpatrones para cada uno de los valores que componen la estructura de datos compuesta, se denominan patrones compuestos .
- Alternativa (
or-patrón) - Muchos lenguajes permiten múltiples alternativas en el nivel superior de una construcción de coincidencia de patrones, cada una asociada a una continuación ; algunos lenguajes permiten alternativas dentro de un patrón. En la mayoría de los casos, dichas alternativas tienen restricciones adicionales: por ejemplo, puede ser necesario que cada alternativa produzca el mismo conjunto de enlaces (de los mismos tipos).
- Macros
- Algunos lenguajes permiten el uso de macros en el contexto de patrones para permitir la abstracción sobre los mismos. Por ejemplo, en Racket, los expansores de coincidencia cumplen esta función. [ 18 ]
Tipos
Patrones primitivos
El patrón más simple en la coincidencia de patrones es un valor explícito o una variable. Por ejemplo, consideremos una definición de función simple en la sintaxis de Haskell (los parámetros de la función no están entre paréntesis, sino separados por espacios; el signo = no es una asignación, sino una definición):
f 0 = 1Aquí, 0 representa un patrón de valor único. Ahora bien, siempre que a f se le pase 0 como argumento, el patrón coincide y la función devuelve 1. Con cualquier otro argumento, la coincidencia y, por lo tanto, la función, fallan. Dado que la sintaxis admite patrones alternativos en las definiciones de funciones, podemos continuar la definición extendiéndola para que acepte argumentos más genéricos:
f n = n * f ( n - 1 )Aquí, el primero nes un patrón de una sola variable, que coincidirá con cualquier argumento y lo vinculará al nombre n para ser utilizado en el resto de la definición. En Haskell (a diferencia de Hope, al menos ), los patrones se prueban en orden, por lo que la primera definición sigue siendo válida en el caso específico de que la entrada sea 0, mientras que para cualquier otro argumento la función devuelve n * f (n-1)n como argumento.
El patrón comodín (a menudo escrito como _) también es simple: al igual que un nombre de variable, coincide con cualquier valor, pero no lo vincula a ningún nombre. Se han desarrollado algoritmos para la coincidencia de comodines en situaciones simples de coincidencia de cadenas en varias variantes recursivas y no recursivas. [ 19 ]
Patrones de árboles
A partir de los patrones primitivos de la sección anterior, se pueden construir patrones más complejos, generalmente de la misma manera que se construyen los valores mediante la combinación de otros valores. La diferencia radica en que, con las partes variables y los comodines, un patrón no se compone de un único valor, sino que coincide con un grupo de valores que son la combinación de los elementos concretos y los elementos que pueden variar dentro de la estructura del patrón.
Un patrón de árbol describe una parte de un árbol comenzando con un nodo y especificando algunas ramas y nodos, dejando otros sin especificar mediante un patrón variable o comodín. Puede resultar útil pensar en el árbol de sintaxis abstracta de un lenguaje de programación y en los tipos de datos algebraicos .
Haskell
En Haskell, la siguiente línea define un tipo de dato algebraico Colorque tiene un único constructor de datos ColorConstructorque encapsula un entero y una cadena.
Datos Color = ColorConstructor Cadena enteraEl constructor es un nodo en un árbol y el entero y la cadena son hojas en las ramas.
Cuando queremos escribir funciones para crear Colorun tipo de dato abstracto , deseamos escribir funciones para interactuar con el tipo de dato y, por lo tanto, queremos extraer algunos datos del tipo de dato, por ejemplo, solo la cadena o solo la parte entera de Color.
Si pasamos una variable de tipo Color, ¿cómo podemos obtener los datos de esta variable? Por ejemplo, para que una función obtenga la parte entera de Color, podemos usar un patrón de árbol simple y escribir:
integerPart ( ColorConstructor theInteger _ ) = theIntegerTambién:
stringPart ( ColorConstructor _ theString ) = theStringLa creación de estas funciones puede automatizarse mediante la sintaxis de registro de datos de Haskell .
OCaml
Este ejemplo de OCaml , que define un árbol rojo-negro y una función para reequilibrarlo tras la inserción de elementos, muestra cómo realizar coincidencias en una estructura más compleja generada por un tipo de dato recursivo. El compilador verifica en tiempo de compilación que la lista de casos sea exhaustiva y que ninguno sea redundante.
tipo color = Rojo | Negro tipo ' un árbol = Vacío | Árbol de color * ' un árbol * ' un * ' un árbolreequilibrar t = coincidir t con | Árbol ( Negro , Árbol ( Rojo , Árbol ( Rojo , a , x , b ), y , c ) , z , d ) | Árbol ( Negro , Árbol ( Rojo , a , x , Árbol ( Rojo , b , y , c )), z , d ) | Árbol ( Negro , a , x , Árbol ( Rojo , Árbol ( Rojo , b , y , c ), z , d )) | Árbol ( Negro , a , x , Árbol ( Rojo , b , y , Árbol ( Rojo , c , z , d ))) -> Árbol ( Rojo , Árbol ( Negro , a , x , b ), y , Árbol ( Negro , c , z , d )) | _ -> t (* el caso 'cajón de sastre' si ningún patrón anterior coincide *)Uso
Filtrado de datos con patrones
La coincidencia de patrones se puede utilizar para filtrar datos con una estructura determinada. Por ejemplo, en Haskell se podría usar una comprensión de lista para este tipo de filtrado:
[ A x | A x <- [ A 1 , B 1 , A 2 , B 2 ]]evalúa a
[A 1, A 2]
Coincidencia de patrones en Mathematica
En Mathematica , la única estructura que existe es el árbol , que está poblado por símbolos. En la sintaxis de Haskell utilizada hasta ahora, esto podría definirse como
datos SymbolTree = Cadena de símbolos [ SymbolTree ]Un ejemplo de árbol podría verse así:
Símbolo "a" [ Símbolo "b" [], Símbolo "c" []]En la sintaxis tradicional, más adecuada, los símbolos se escriben tal cual y los niveles del árbol se representan usando [], de modo que, por ejemplo, a[b,c]es un árbol con a como padre y b y c como hijos.
Un patrón en Mathematica implica colocar "_" en posiciones de ese árbol. Por ejemplo, el patrón
A[_]
coincidirá con elementos como A[1], A[2] o, más generalmente, A[ x ], donde x es cualquier entidad. En este caso, Aes el elemento concreto, mientras que _denota la parte del árbol que puede variar. Un símbolo antepuesto a _vincula la coincidencia a ese nombre de variable, mientras que un símbolo añadido a _restringe las coincidencias a los nodos de ese símbolo. Tenga en cuenta que incluso los espacios en blanco se representan internamente como Blank[]para _y Blank[x]para _x.
La función de Mathematica Casesfiltra los elementos del primer argumento que coinciden con el patrón del segundo argumento: [ 20 ]
Casos [{ a [ 1 ], b [ 1 ], a [ 2 ], b [ 2 ]}, a [ _ ] ]evalúa a
{ a [ 1 ], a [ 2 ]}La coincidencia de patrones se aplica a la estructura de las expresiones. En el siguiente ejemplo,
Casos [ { a [ b ], a [ b , c ], a [ b [ c ], d ], a [ b [ c ], d [ e ]], a [ b [ c ], d , e ]}, a [ b [ _ ], _ ] ]devoluciones
{ a [ b [ c ], d ], a [ b [ c ], d [ e ]]}porque solo estos elementos coincidirán con el patrón a[b[_],_]anterior.
En Mathematica, también es posible extraer estructuras a medida que se crean durante el cálculo, independientemente de cómo o dónde aparezcan. La función Tracese puede utilizar para monitorizar un cálculo y devolver los elementos que surgen y que coinciden con un patrón. Por ejemplo, podemos definir la secuencia de Fibonacci como
mentira [ 0 | 1 ] := 1 fib [ n_ ] := fib [ n -1 ] + fib [ n -2 ]Entonces, podemos hacernos la pregunta: dado fib[3], ¿cuál es la secuencia de llamadas recursivas de Fibonacci?
Rastrear [ fib [ 3 ], fib [ _ ]]Devuelve una estructura que representa las ocurrencias del patrón fib[_]en la estructura computacional:
{ mentira [ 3 ], { mentira [ 2 ], { mentira [ 1 ]}, { mentira [ 0 ]}}, { mentira [ 1 ]}}Programación declarativa
En los lenguajes de programación simbólica, es fácil usar patrones como argumentos de funciones o como elementos de estructuras de datos. Esto permite utilizar patrones para realizar declaraciones sobre datos y para indicar de forma flexible cómo operar las funciones.
Por ejemplo, la función de MathematicaCompile se puede usar para crear versiones más eficientes del código. En el siguiente ejemplo, los detalles no son particularmente importantes; lo que importa es que la subexpresión {{com[_], Integer}}indica Compileque las expresiones de la forma com[_]se pueden considerar como números enteros a efectos de compilación:
com [ i_ ] := Binomial [ 2 i , i ] Compile [{ x , { i , _Integer }}, x ^ com [ i ], {{ com [ _ ], Integer }}]Los buzones de correo en Erlang también funcionan de esta manera.
La correspondencia de Curry-Howard entre pruebas y programas relaciona la coincidencia de patrones al estilo ML con el análisis de casos y la prueba por agotamiento .
Coincidencia de patrones y cadenas
La forma más común de coincidencia de patrones implica cadenas de caracteres. En muchos lenguajes de programación, se utiliza una sintaxis específica de cadenas para representar expresiones regulares, que son patrones que describen caracteres de cadena.
Sin embargo, es posible realizar alguna coincidencia de patrones de cadena dentro del mismo marco que se ha analizado a lo largo de este artículo.
Patrones de árbol para cadenas
En Mathematica, las cadenas se representan como árboles cuya raíz es StringExpression, y todos los caracteres en orden son hijos de la raíz. Por lo tanto, para coincidir con "cualquier cantidad de caracteres finales", se necesita un nuevo comodín ___ en contraste con _ que solo coincidiría con un único carácter.
En Haskell y en los lenguajes de programación funcional en general, las cadenas se representan como listas funcionales de caracteres. Una lista funcional se define como una lista vacía o un elemento construido sobre una lista existente. En la sintaxis de Haskell:
[] -- una lista vacía x : xs -- un elemento x construido sobre una lista xsLa estructura de una lista con algunos elementos es, por lo tanto element:list, . Al realizar la coincidencia de patrones, afirmamos que un determinado dato es igual a un determinado patrón. Por ejemplo, en la función:
cabeza ( elemento : lista ) = elementoAfirmamos que el primer elemento del headargumento se llama elemento, y la función devuelve este. Sabemos que este es el primer elemento debido a la forma en que se definen las listas: un único elemento se añade a una lista. Este único elemento debe ser el primero. Una lista vacía no coincidiría en absoluto con el patrón, ya que una lista vacía no tiene cabeza (el primer elemento que se construye).
En el ejemplo, no necesitamos list, así que podemos ignorarlo y escribir la función:
cabeza ( elemento : _ ) = elementoLa transformación equivalente en Mathematica se expresa como
cabeza[elemento, ]:=elemento
Ejemplos de patrones de cadena
En Mathematica, por ejemplo,
StringExpression [ "a" , _ ]coincidirá con una cadena que tenga dos caracteres y comience con "a".
El mismo patrón en Haskell:
[ 'a' , _ ]Se pueden introducir entidades simbólicas para representar muchas clases diferentes de características relevantes de una cadena. Por ejemplo,
StringExpression[LetraCarácter, DígitoCarácter]
coincidirá con una cadena que consta primero de una letra y luego de un número.
En Haskell, se podrían usar guardias para lograr las mismas coincidencias:
[ letra , dígito ] | esAlfabético letra && esDígito dígitoLa principal ventaja de la manipulación simbólica de cadenas es que puede integrarse completamente con el resto del lenguaje de programación, en lugar de ser una subunidad separada y específica. Se puede aprovechar todo el potencial del lenguaje para construir los patrones o analizar y transformar los programas que los contienen.
SNOBOL
SNOBOL ( String Oriented and symBOlic Language ) es un lenguaje de programación informática desarrollado entre 1962 y 1967 en los Laboratorios Bell de AT&T por David J. Farber , Ralph E. Griswold e Ivan P. Polonsky.
SNOBOL4 se distingue de la mayoría de los lenguajes de programación por considerar los patrones como un tipo de dato de primera clase ( es decir, un tipo de dato cuyos valores pueden manipularse de todas las maneras permitidas para cualquier otro tipo de dato en el lenguaje de programación) y por proporcionar operadores para la concatenación y alternancia de patrones . Las cadenas generadas durante la ejecución pueden tratarse como programas y ejecutarse.
SNOBOL se enseñaba bastante en las universidades más grandes de Estados Unidos a finales de la década de 1960 y principios de la de 1970, y se utilizó ampliamente en las décadas de 1970 y 1980 como lenguaje de manipulación de textos en las humanidades .
Desde la creación de SNOBOL, lenguajes más recientes como AWK y Perl han puesto de moda la manipulación de cadenas mediante expresiones regulares . Sin embargo, los patrones de SNOBOL4 engloban las gramáticas de forma Backus-Naur (BNF), que son equivalentes a las gramáticas libres de contexto y más potentes que las expresiones regulares . [ 21 ]
Véase también
- Lenguaje de marcado de inteligencia artificial (AIML) para un lenguaje de IA basado en la coincidencia de patrones en el habla.
- Lenguaje AWK
- El patrón Coccinelle coincide con el código fuente C
- Comodines coincidentes
- glob (programación)
- Cálculo de patrones
- Reconocimiento de patrones para patrones difusos
- PCRE ( Expresiones regulares compatibles con Perl) es una implementación moderna y común de la coincidencia de patrones de cadena, adaptada a muchos lenguajes.
- Dialecto de análisis sintáctico REBOL para la coincidencia de patrones utilizado para implementar dialectos de lenguaje.
- Integración simbólica
- Unión etiquetada
- Tom (lenguaje de coincidencia de patrones)
- SNOBOL es un lenguaje de programación basado en un tipo de coincidencia de patrones.
- Lenguaje de patrones : metafórico, tomado de la arquitectura.
- Coincidencia de gráficos
- Coincidencia de patrones bidimensionales
Referencias
- El libro de Mathematica, capítulo Sección 2.3: Patrones
- El informe Haskell 98, capítulo 3.17 Coincidencia de patrones .
- Manual de referencia de Python, capítulo 6.3 Sentencias de asignación .
- El lenguaje de programación puro , capítulo 4.3: Patrones
- ↑ "Coincidencia de patrones - Guía de C#" . 13 de marzo de 2024.
- ↑ "Coincidencia de patrones - Guía de F#" . 5 de noviembre de 2021.
- ↑ "Una introducción sencilla a Haskell: Patrones" . www.haskell.org .
- ↑ "Coincidencia de patrones" . Centro de ayuda de Oracle .
- ↑ "Novedades de Python 3.10 — Documentación de Python 3.10.0b3" . docs.python.org . Consultado el 6 de julio de 2021 .
- ↑ "Coincidencia de patrones" . docs.racket-lang.org . Consultado el 25 de junio de 2025 .
- ↑ "pattern_matching - Documentación para Ruby 3.0.0" . docs.ruby-lang.org . Consultado el 6 de julio de 2021 .
- ↑ "Redireccionando..." doc.rust-lang.org .
{{cite web}}: La cita utiliza un título genérico ( ayuda ) - ↑ "Coincidencia de patrones" . Documentación de Scala . Consultado el 17 de enero de 2021 .
- ↑ "Documentación" . docs.swift.org .
- ^ Augustsson, Lennart (1985), "Compilación de coincidencia de patrones" , en Jouannaud, Jean-Pierre (ed.), Lenguajes de programación funcional y arquitectura informática , vol. 201, Berlín, Heidelberg: Springer Berlin Heidelberg, págs. 368–381 , doi : 10.1007/3-540-15975-4_48 , ISBN 978-3-540-15975-9, consultado el 21 de mayo de 2026
- ↑ Henderson, Peter (1980). Programación funcional: aplicación e implementación . Serie internacional de Prentice-Hall en ciencias de la computación. Englewood Cliffs, NJ: Prentice-Hall International. ISBN 978-0-13-331579-0.
- ↑ Pierce, Benjamin C. (2002). Tipos y lenguajes de programación . Cambridge, Massachusetts: MIT Press. ISBN 978-0-262-16209-8.
- ↑ "https://dl.acm.org/action/cookieAbsent" . Biblioteca Digital ACM . doi : 10.1145/363347.363387 . Consultado el 21 de mayo de 2026 .
{{cite web}}: Enlace externo en( ayuda )|title= - ↑ Apostolico, Alberto; Galil, Zvi, eds. (2020). Pattern matching algorithms . Oxford scholarship online. Nueva York: Oxford University Press. ISBN 978-0-19-511367-9.
- ↑ "6.7.2. Patrones de vista — Guía del usuario del compilador Glasgow Haskell 9.15.20250917" . ghc.gitlab.haskell.org .
- ↑ "9 Coincidencia de patrones" . docs.racket-lang.org .
- ↑ "9 Coincidencia de patrones" . docs.racket-lang.org .
- ↑ Cantatore, Alessandro (2003). "Algoritmos de coincidencia con comodines" .
- ↑ "Casos—Documentación del lenguaje Wolfram" . reference.wolfram.com . Consultado el 17 de noviembre de 2020 .
- ↑ Gimpel, JF 1973. Una teoría de patrones discretos y su implementación en SNOBOL4. Commun. ACM 16, 2 (febrero de 1973), 91–100. DOI= http://doi.acm.org/10.1145/361952.361960 .
Enlaces externos
- Vistas: Una extensión para la coincidencia de patrones en Haskell
- Nikolaas N. Oosterhof, Philip KF Hölzenspies y Jan Kuper. Patrones de aplicación . Presentación en Tendencias en Programación Funcional, 2005.
- JMatch : el lenguaje Java extendido con coincidencia de patrones
- ShowTrend : Comparación de patrones en línea para precios de acciones
- Una historia incompleta del editor de texto QED, por Dennis Ritchie : ofrece la historia de las expresiones regulares en los programas informáticos.
- La implementación de lenguajes de programación funcional, páginas 53–103, Simon Peyton Jones, publicado por Prentice Hall, 1987.
- Nemerle, coincidencia de patrones .
- Erlang, coincidencia de patrones .
- Prop: un lenguaje de coincidencia de patrones basado en C++, 1999
- PatMat: una biblioteca de coincidencia de patrones en C++ basada en SNOBOL / SPITBOL.
- Temur Kutsia. Emparejamiento plano . Journal of Symbolic Computation 43(12): 858–873. Describe en detalle el emparejamiento plano en Mathematica.
- EasyPattern es un lenguaje de coincidencia de patrones para personas sin conocimientos de programación.
- Coincidencia de patrones
- Construcciones condicionales
- Programación funcional
- Comparación de lenguajes de programación