Quelle est la différence entre la réécriture de termes et la correspondance de motifs?

25

Comme il n'y a pas eu de réponse à Lambda the Ultimate, je réessaye ici: les systèmes de réécriture de termes sont utilisés par exemple dans un théorème automatisé prouvant un calcul symbolique, et bien sûr pour définir des grammaires formelles. Il existe certains langages de programmation basés sur la réécriture de termes, mais pour autant que je sache, le concept est plus connu sous le nom de correspondance de motifs . La correspondance de motifs est beaucoup utilisée dans les langages fonctionnels. Barry Jay a créé toute une théorie appelée calcul de modèle , mais il ne mentionne que la réécriture des termes en bref. J'ai le sentiment qu'ils se réfèrent tous à la même idée de base, pouvez-vous donc utiliser la réécriture des termes et la correspondance de motifs de manière synonyme?

Jakob
la source

Réponses:

26

Une façon d'examiner ces deux concepts est de dire que la correspondance de motifs est une caractéristique des langages de programmation permettant de combiner la discrimination sur les constructeurs et la destruction de termes (tout en sélectionnant et en nommant localement des fragments de termes) de manière sûre, compacte et efficace. La recherche sur la correspondance de modèles se concentre généralement sur l'efficacité de la mise en œuvre, par exemple sur la façon de minimiser le nombre de comparaisons que le mécanisme de correspondance doit effectuer.

En revanche, la réécriture de termes est un modèle général de calcul qui étudie un large éventail de méthodes (potentiellement non déterministes) de remplacement de sous-termes d'expressions syntaxiques (plus précisément un élément d'une algèbre de termes sur un ensemble de variables) par d'autres termes. La recherche sur les systèmes de réécriture des termes porte généralement sur les propriétés abstraites des systèmes de réécriture telles que la confluence, le déterminisme et la terminaison, et plus précisément sur la façon dont ces propriétés sont ou ne sont pas préservées par les opérations algébriques sur les systèmes de réécriture, c'est-à-dire dans quelle mesure ces propriétés sont de composition.

Il existe clairement des chevauchements conceptuels entre les deux, et la distinction est dans une certaine mesure traditionnelle plutôt que technique. Une différence technique est que la réécriture des termes se produit dans des contextes arbitraires (c'est-à-dire qu'une règle induit des réécritures pour des contextes arbitraires Et des substitutions ), tandis que la correspondance de motifs dans les langages modernes comme Haskell, OCaml ou Scala ne permet que la réécriture «en haut» d'un terme. Cette restriction est également, je pense, imposée dans le calcul des motifs de Jay. Permettez-moi d'expliquer ce que je veux dire par cette restriction. Avec la correspondance de motifs dans le sens OCaml, Haskell, Scala, vous ne pouvez pas dire quelque chose commeC [ l σ ] C [ r σ ] C [ . ] σ(l,r)C[lσ]C[rσ]C[.]σ

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

Qu'y a-t-il C[.]ici? C'est censé être une variable qui s'étend sur des contextes à trou unique. Mais des langages comme OCaml, Haskell ou Scala ne donnent pas aux programmeurs des variables qui s'étendent sur des contextes arbitraires (un trou), seulement des variables qui s'étendent sur des valeurs. En d'autres termes, dans de telles langues, vous ne pouvez pas appliquer de correspondance de motifs à une position arbitraire dans un terme. Vous devez toujours spécifier le chemin de la racine du motif aux parties qui vous intéressent. Je suppose que la principale raison pour imposer cette restriction est qu'autrement, la correspondance de motifs ne serait pas déterministe, car un terme pourrait correspondre à un motif dans plus d'une façon. Par exemple, le terme (true, [9,7,4], "hello", 7)correspond au modèle C[7]de deux manières, en supposant qu'il C[.] varie dans de tels contextes.

Martin Berger
la source
11

Je ne pense pas qu'il soit correct de les appeler synonymes; il y a un certain chevauchement en termes de recherche et de mise en œuvre. Je ne suis pas du tout familier avec le travail de Jay, et je ne suis que quelque peu familier avec les systèmes de réécriture de termes, donc je peux aussi manquer quelque chose.

La correspondance de modèles traite généralement le problème suivant: vous avez une structure (une arborescence ou une liste ou un multi-ensemble) et vous voulez vérifier si la structure correspond à un modèle (ou l'un d'un certain nombre de modèles). Cette question est certainement pertinente pour la réécriture de termes, car dans les systèmes de réécriture de termes, le fait qu'un terme corresponde à un modèle signifie que le terme peut être réécrit en un terme différent, mais ce n'est pas synonyme de réécriture de termes. (Il peut y avoir une formulation de correspondance de motifs comme réécriture: "Étant donné un terme, pouvez-vous le réécrire pour correspondre à un motif?" Mais je n'ai jamais vu cela.)

La correspondance de motifs dans un langage de programmation fonctionnel a une interprétation logique en termes de mise au point (voir par exemple "Focusing on Pattern Matching" de Krishnaswami ). Les systèmes de réécriture de termes, d'autre part, font souvent correspondre à modulo certaines propriétés équationnelles, qui ne sont pas présentes dans la plupart des langages de programmation fonctionnels (vous ne pouvez pas vous comparer à un multiset en ML ou Haskell). Cependant, il n'y a pas de raison fondamentale pour laquelle les propriétés équationnelles modulo correspondantes ne devraient pas être présentes dans les langages fonctionnels.

Rob Simmons
la source
1
Merci pour votre réponse. Je suis d'accord que la correspondance de motifs en général n'est pas synonyme de réécriture de termes mais elle est plus fondamentale. Mais si quelqu'un dit qu'un système avec une puissance de calcul est basé sur une correspondance de modèle, je ne vois pas la différence avec un système de réécriture de terme avec une puissance de calcul. Pouvez-vous illustrer davantage la différence entre «a une interprétation logique» et «certaines propriétés équationnelles»?
Jakob
"Je ne vois pas la différence avec un système de réécriture de termes avec une puissance de calcul" - je ne sais pas ce que cela signifie. Comme le dit Martin, la réécriture des termes est un modèle général de calcul, et la correspondance de motifs est une caractéristique, pas un modèle de calcul.
Rob Simmons
Pouvez-vous illustrer davantage la différence entre «a une interprétation logique» et «certaines propriétés équationnelles»? - Il n'y a pas de différence superficielle - ce sont juste des propriétés différentes, des pommes et des oranges. Je pense que tout lien réel entre ces deux pourrait s'avérer être une question de recherche assez approfondie! Pun avec une inférence profonde - voir alessio.guglielmi.name/res/cos - probablement destiné.
Rob Simmons
1

(Je préfère écrire ceci comme un commentaire, mais je ne peux pas pour le moment.)

Corrigez-moi si je me trompe, mais d'après ce que je comprends, une autre différence entre la correspondance de modèles et la réécriture de termes, en dehors de ce que Martin Berger a dit dans son excellente réponse , est que les règles de correspondance de modèles viennent avec un ordre fixe (dans les implémentations comme Haskell), alors qu'avec les règles de réécriture des termes, ce n'est pas nécessairement le cas. Cette fonctionnalité, comme on pourrait s'y attendre, peut faire beaucoup de différence lorsque l'on considère le comportement (en particulier, la terminaison) des règles (voir «Une introduction douce à Haskell, version 98», section 4.2 , par exemple, ou simplement la factorielle exemple à "Learn you a Haskell" ).

Des personnes plus compétentes en théorie de la réécriture auraient plus à dire à ce sujet (par exemple, comment la dactylographie correspond-elle exactement à une telle comparaison?), Mais, il me semble juste d'être d'accord avec Martin Berger, en ce sens , la réécriture peut être considérée comme englobant la mise en correspondance de modèles (au moins car elle est implémentée dans des langages comme Haskell), dans la mesure où les deux peuvent être (plutôt sèchement) considérés comme des dispositifs qui utilisent simplement des règles relatives aux termes.

Basilic
la source