Qual è la differenza tra la riscrittura dei termini e la corrispondenza dei pattern?


25

Dato che Lambda the Ultimate non ha ricevuto alcuna risposta, la provo di nuovo qui: i sistemi di riscrittura dei termini sono usati ad esempio nel teorema automatizzato che dimostra un calcolo simbolico e, naturalmente, per definire grammatiche formali. Esistono alcuni linguaggi di programmazione basati sulla riscrittura dei termini, ma per quanto ho capito il concetto è più noto come pattern matching . La corrispondenza dei modelli è molto usata nei linguaggi funzionali. Barry Jay ha creato un'intera teoria chiamata modello di calcolo , ma menziona solo il termine di riscrittura in breve. Ho la sensazione che si riferiscano tutti alla stessa idea di base, quindi puoi usare il termine riscrittura e pattern matching in modo sinonimo?

Risposte:


26

Un modo di considerare questi due concetti è quello di dire che la corrispondenza dei modelli è una caratteristica dei linguaggi di programmazione per combinare la discriminazione sui costruttori e la distruzione dei termini (mentre allo stesso tempo selezionare e denominare localmente i frammenti di termini) in modo sicuro, compatto ed efficiente. La ricerca sull'abbinamento dei modelli si concentra in genere sull'efficienza di implementazione, ad esempio su come ridurre al minimo il numero di confronti che il meccanismo di abbinamento deve fare.

Al contrario, la riscrittura dei termini è un modello generale di calcolo che indaga una vasta gamma di metodi (potenzialmente non deterministici) per sostituire i sottrazioni di espressioni sintattiche (più precisamente un elemento di una algebra di termini su un insieme di variabili) con altri termini. La ricerca sui sistemi di riscrittura dei termini di solito riguarda le proprietà astratte dei sistemi di riscrittura come confluenza, determinismo e terminazione, e più specificamente su come tali proprietà sono o non sono preservate dalle operazioni algebriche sui sistemi di riscrittura, cioè in che misura queste proprietà sono composizionali.

Chiaramente ci sono sovrapposizioni concettuali tra i due, e la distinzione è in una certa misura tradizionale, piuttosto che tecnica. Una differenza tecnica è che il termine riscrittura avviene in contesti arbitrari (ovvero una regola induce a riscrivere per contesti arbitrari E sostituzioni ), mentre la corrispondenza dei modelli in lingue moderne come Haskell, OCaml o Scala prevede solo la riscrittura "al vertice" di un termine. Questa limitazione è anche, credo, imposta nel calcolo del modello di Jay. Lasciami spiegare cosa intendo con questa restrizione. Con la corrispondenza dei modelli in senso OCaml, Haskell, Scala, non puoi dire qualcosa del genere(l,r)C[lσ]C[rσ]C[.]σ

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

Cosa c'è C[.]qui? Dovrebbe essere una variabile che si estende su contesti a un buco. Ma linguaggi come OCaml, Haskell o Scala non danno ai programmatori variabili che spaziano su contesti arbitrari (a un foro), ma solo variabili che spaziano su valori. In altre parole, in tali lingue non è possibile modellare la corrispondenza in una posizione arbitraria in un termine. Devi sempre specificare il percorso dalla radice del modello alle parti che ti interessano. Immagino che il motivo principale per imporre questa restrizione sia che altrimenti la corrispondenza del modello non sarebbe deterministica, perché un termine potrebbe corrispondere a un modello in più di un modo. Ad esempio, il termine (true, [9,7,4], "hello", 7)corrisponde al modello C[7]in due modi, assumendo che C[.] spaziasse su tali contesti.


11

Non penso sia corretto chiamarli sinonimi; vi è una certa sovrapposizione in termini di ricerca e attuazione. Non ho alcuna familiarità con il lavoro di Jay e ho solo una certa familiarità con i sistemi di riscrittura dei termini, quindi potrei anche perdere qualcosa.

La corrispondenza dei modelli in generale risolve il seguente problema: si dispone di una struttura (un albero o un elenco o un multiset) e si desidera verificare se la struttura corrisponde a un modello (o a uno di un numero di motivi). Questa domanda è certamente rilevante per la riscrittura dei termini, perché nei sistemi di riscrittura dei termini il fatto che un termine corrisponda a un modello significa che il termine può essere riscritto in un altro termine, ma non è anche un termine di riscrittura. (Potrebbe esserci una formulazione di corrispondenza del modello come riscrittura: "Dato un termine, puoi riscriverlo per abbinare il modello?", Ma non l'ho mai visto.)

Il pattern matching in un linguaggio di programmazione funzionale ha un'interpretazione logica in termini di focus (vedi "Focusing on Pattern Matching" di Krishnaswami , per esempio). I sistemi di riscrittura dei termini, d'altra parte, spesso fanno corrispondere al modulo alcune proprietà equazionali, che non è presente nella maggior parte dei linguaggi di programmazione funzionale (non è possibile abbinare un multiset in ML o Haskell). Non esiste alcun motivo fondamentale per cui la corrispondenza delle proprietà equazionali del modulo non dovrebbe essere presente nei linguaggi funzionali.


1
Grazie per la tua risposta. Concordo sul fatto che la corrispondenza dei modelli in generale non è sinonimo di riscrittura dei termini, ma è più basilare. Ma se qualcuno dice che un sistema con potenza computazionale si basa sulla corrispondenza dei modelli, non riesco a vedere la differenza con un termine sistema di riscrittura con potenza computazionale. Puoi esemplificare ulteriormente la differenza tra "ha un'interpretazione logica" e "alcune proprietà equazionali"?
Jakob,

"Non riesco a vedere la differenza con un termine sistema di riscrittura con potenza computazionale" - Non sono sicuro di cosa significhi. Come dice Martin, la riscrittura dei termini è un modello generale di calcolo e la corrispondenza dei modelli è una caratteristica, non un modello di calcolo.
Rob Simmons,

Puoi esemplificare ulteriormente la differenza tra "ha un'interpretazione logica" e "alcune proprietà equazionali"? - Non c'è alcun tipo di differenza superficiale - sono solo proprietà diverse, mele e arance. Penso che qualsiasi connessione effettiva tra questi due potrebbe rivelarsi una domanda di ricerca piuttosto profonda! Gioco di parole con profonda deduzione - vedi alessio.guglielmi.name/res/cos - probabilmente inteso.
Rob Simmons,

1

(Preferirei scriverlo come commento, ma al momento non posso.)

Correggimi se sbaglio, ma per quanto ho capito, un'altra differenza tra la corrispondenza dei modelli e la riscrittura dei termini, a parte ciò che Martin Berger ha detto nella sua eccellente risposta , è che le regole di corrispondenza dei modelli hanno un ordine fisso (in implementazioni come Haskell's), mentre con le regole di riscrittura dei termini questo non è necessariamente il caso. Questa funzionalità, come ci si aspetterebbe, può fare molta differenza quando si considera il comportamento (in particolare, la risoluzione) delle regole (vedere "Una dolce introduzione a Haskell, versione 98", sezione 4.2 , per esempio, o solo il fattoriale esempio in "Impara un Haskell" ).

Le persone più esperte nella teoria della riscrittura avrebbero più da dire su questo (ad esempio, in che modo la digitazione si adatta esattamente a un simile confronto?), Ma, mi sembra giusto concordare con Martin Berger, in quel termine si può vedere che la riscrittura comprende pattern matching (almeno in quanto implementato in linguaggi come Haskell), nella misura in cui entrambi possono essere (piuttosto seccamente) visti come dispositivi che utilizzano semplicemente regole relative ai termini.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.