¿Cuál es la diferencia entre la reescritura de términos y la coincidencia de patrones?


25

Como no hubo respuesta en Lambda the Ultimate, lo intento de nuevo aquí: los sistemas de reescritura de términos se utilizan, por ejemplo, en teoremas automatizados que prueban un cálculo simbólico y, por supuesto, para definir gramáticas formales. Hay algunos lenguajes de programación basados ​​en la reescritura de términos, pero hasta donde yo entiendo, el concepto se conoce más como coincidencia de patrones . La coincidencia de patrones se usa mucho en lenguajes funcionales. Barry Jay ha creado una teoría completa llamada cálculo de patrones , pero solo menciona brevemente la reescritura de términos. Tengo la sensación de que todos se refieren a la misma idea básica, entonces, ¿puede usar la reescritura de términos y la coincidencia de patrones como sinónimos?

Respuestas:


26

Una forma de ver estos dos conceptos es decir que la coincidencia de patrones es una característica de los lenguajes de programación para combinar la discriminación en constructores y destruir términos (al mismo tiempo que selecciona y nombra localmente fragmentos de términos) de forma segura, compacta y eficiente. La investigación sobre la coincidencia de patrones generalmente se centra en la eficiencia de la implementación, por ejemplo, sobre cómo minimizar el número de comparaciones que tiene que hacer el mecanismo de coincidencia.

Por el contrario, la reescritura de términos es un modelo general de computación que investiga una amplia gama de métodos (potencialmente no deterministas) para reemplazar subterms de expresiones sintácticas (más precisamente, un elemento de un álgebra de términos sobre un conjunto de variables) con otros términos. La investigación sobre los sistemas de reescritura de términos generalmente trata sobre las propiedades abstractas de los sistemas de reescritura, como la confluencia, el determinismo y la terminación, y más específicamente sobre cómo dichas propiedades se conservan o no mediante operaciones algebraicas en los sistemas de reescritura, es decir, en qué medida estas propiedades son compositivas.

Claramente, hay superposiciones conceptuales entre ambos, y la distinción es hasta cierto punto tradicional, más que técnica. Una diferencia técnica es que la reescritura de términos ocurre en contextos arbitrarios (es decir, una regla induce reescrituras para contextos arbitrarios Y sustituciones ), mientras que La coincidencia de patrones en lenguajes modernos como Haskell, OCaml o Scala proporciona solo la reescritura 'en la parte superior' de un término. Creo que esta restricción también se impone en el cálculo de patrones de Jay. Permítanme explicar lo que quiero decir con esta restricción. Con la coincidencia de patrones en el sentido OCaml, Haskell, Scala, no se puede decir algo comoC [ l σ ] C [ r σ ] C [ . ] σ(l,r)C[lσ]C[rσ]C[.]σ

match M with
   | C[ x :: _ ]  -> printf "%i ...\n" x
   | C[ [] ] -> printf "[]"

Que hay C[.]aqui Se supone que es una variable que se extiende sobre contextos de un solo agujero. Pero los lenguajes como OCaml, Haskell o Scala no le dan a los programadores variables que se extiendan sobre contextos arbitrarios (un agujero), solo variables que se extiendan sobre valores. En otras palabras, en dichos lenguajes no puede coincidir un patrón en una posición arbitraria de un término. Siempre debe especificar la ruta desde la raíz del patrón hasta las partes que le interesan. Creo que la razón clave para imponer esta restricción es que, de lo contrario, la coincidencia de patrones no sería determinista, porque un término podría coincidir con un patrón en Más de una manera. Por ejemplo, el término (true, [9,7,4], "hello", 7)coincide con el patrón C[7]de dos maneras, suponiendo que se C[.] extienda sobre tales contextos.


11

No creo que sea correcto llamarlos sinónimos; hay cierta superposición en términos de investigación e implementación. No estoy familiarizado en absoluto con el trabajo de Jay, y solo estoy un poco familiarizado con los sistemas de reescritura de términos, por lo que también me puede faltar algo.

La coincidencia de patrones en general trata el siguiente problema: tiene alguna estructura (un árbol o una lista o un conjunto múltiple) y desea verificar si la estructura coincide con un patrón (o uno de varios patrones). Esta pregunta es ciertamente relevante para la reescritura de términos, porque en los sistemas de reescritura de términos el hecho de que un término coincida con un patrón significa que el término puede reescribirse en un término diferente, pero no es sinónimo de reescritura de términos. (Puede haber una formulación de coincidencia de patrones como reescritura: "Dado un término, ¿puede reescribirlo para que coincida con el patrón?", Pero nunca he visto esto).

La coincidencia de patrones en un lenguaje de programación funcional tiene una interpretación lógica en términos de enfoque (ver "Focusing on Pattern Matching" de Krishnaswami , por ejemplo). Los sistemas de reescritura de términos, por otro lado, a menudo hacen coincidir el módulo con algunas propiedades ecuacionales, que no están presentes en la mayoría de los lenguajes de programación funcionales (no puede coincidir con un multiset en ML o Haskell). Sin embargo, no hay una razón fundamental por la que las propiedades de ecuación de módulo coincidente no estén presentes en lenguajes funcionales.


1
Gracias por tu respuesta. Estoy de acuerdo en que la coincidencia de patrones en general no es sinónimo de reescritura de términos, pero es más básica. Pero si alguien dice que un sistema con potencia computacional se basa en la coincidencia de patrones, no puedo ver la diferencia con un sistema de reescritura de términos con potencia computacional. ¿Puede ejemplificar aún más la diferencia entre "tiene una interpretación lógica" y "algunas propiedades ecuacionales"?
Jakob

"No puedo ver la diferencia con un sistema de reescritura de términos con potencia computacional". No estoy seguro de lo que esto significa. Como dice Martin, la reescritura de términos es un modelo general de cómputo, y la coincidencia de patrones es una característica, no un modelo de cómputo.
Rob Simmons

¿Puede ejemplificar aún más la diferencia entre "tiene una interpretación lógica" y "algunas propiedades ecuacionales"? - No hay ningún tipo de diferencia superficial: son solo propiedades diferentes, manzanas y naranjas. ¡Creo que cualquier conexión real entre estos dos podría ser una pregunta de investigación bastante profunda! Juego de palabras con una inferencia profunda: ver alessio.guglielmi.name/res/cos , probablemente intencionado.
Rob Simmons el

1

(Prefiero escribir esto como un comentario, pero no puedo en este momento).

Corríjame si me equivoco, pero por lo que entiendo, una diferencia más entre la coincidencia de patrones y la reescritura de términos, aparte de lo que Martin Berger dijo en su excelente respuesta , es que las reglas de coincidencia de patrones vienen con un orden fijo (en implementaciones como Haskell), mientras que con las reglas de reescritura de términos esto no es necesariamente el caso. Esta característica, como cabría esperar, puede marcar una gran diferencia al considerar el comportamiento (en particular, la terminación) de las reglas (consulte "Una introducción suave a Haskell, Versión 98", sección 4.2 , por ejemplo, o simplemente el factorial ejemplo en "Learn you a Haskell" ).

Las personas más conocedoras de la teoría de la reescritura tendrían más que decir al respecto (por ejemplo, ¿cómo se ajusta exactamente la mecanografía a tal comparación?), Pero, me parece justo estar de acuerdo con Martin Berger, en ese término se puede ver que la reescritura abarca coincidencia de patrones (al menos ya que esto se implementa en lenguajes como Haskell), en la medida en que ambos pueden ser vistos (de manera bastante seca) como dispositivos que simplemente emplean reglas relacionadas con términos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.