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.