A Redex (abbreviazione per espressione riducibile ) fa parte di un'espressione in un linguaggio di programmazione che può essere semplificato o ridotto Secondo le regole di valutazione della lingua . Pensalo come una sotto-espressione che è "matura" per il calcolo.
In sostanza, un redex è il pezzo di codice in cui può accadere il prossimo passo computazionale.
Come si collega alla valutazione:
La valutazione di un'espressione implica identificare e ridurre ripetutamente ridex fino a quando l'espressione non è in una "forma normale" - uno stato in cui non sono possibili ulteriori riduzioni. Questa forma normale rappresenta il risultato finale dell'espressione.
Ecco una rottura della connessione:
1. Identifica il redex: Il processo di valutazione inizia scansionando l'espressione per trovare una sottoespressione che corrisponda a una regola di riduzione nota. Questo è il redex.
2. Riduci il redex: Il redex viene quindi "ridotto" o "riscritto" usando la regola di riduzione corrispondente. Questo di solito comporta la sostituzione del redex con un'espressione più semplice.
3. Ripeti: Il processo viene ripetuto. La nuova espressione (dopo la riduzione) viene controllata per un altro redex. Questo continua fino a quando non si possono trovare più ridex.
4. Forma normale: L'espressione finale, che non contiene ridexes, è considerata il risultato della valutazione. È il "valore" dell'espressione originale.
Esempi da illustrare:
1. Calcolo Lambda (un semplice modello di calcolo):
* Espressione: `(λx. x + 1) 5` (questo rappresenta una funzione che aggiunge 1 al suo argomento, applicata al valore 5)
* Redex: `(λx. x + 1) 5` è il Redex. È un'applicazione di una funzione Lambda a un argomento.
* Regola di riduzione: La regola di riduzione beta (sostituendo l'argomento per il parametro nel corpo della funzione).
* Riduzione: `(λx. x + 1) 5` si riduce a` 5 + 1`
* Next Redex: `5 + 1`
* Regola di riduzione: Aggiunta.
* Riduzione: `5 + 1` si riduce a` 6`
* Forma normale: `6` (niente più ridexes. Questo è il risultato finale.)
2. Espressione aritmetica:
* Espressione: `(2 + 3) * 4`
* Redex (in un ordine di valutazione rigoroso, come nella maggior parte delle lingue): `2 + 3`
* Regola di riduzione: Aggiunta.
* Riduzione: `(2 + 3) * 4` si riduce a` 5 * 4`
* Next Redex: `5 * 4`
* Regola di riduzione: Moltiplicazione.
* Riduzione: `5 * 4` si riduce a` 20`
* Forma normale: `20`
3. Dichiarazione condizionale (in un linguaggio ipotetico):
* Espressione: `se vero allora 10 else 20`
* Redex: `se vero allora 10 else 20`
* Regola di riduzione: Se la condizione è vera, sostituire l'intera espressione con il ramo "allora".
* Riduzione: `se vero, allora 10 else 20` si riduce a` 10`
* Forma normale: `10`
Concetti chiave relativi a Redexes:
* Strategia di valutazione: L'ordine in cui vengono scelti le ridex per la riduzione influisce sul processo di valutazione. Le strategie comuni includono:
* Ordine applicativo (valutazione ansiosa): Valuta gli argomenti a una funzione * Prima * di applicare la funzione stessa. Ciò è spesso implementato con una valutazione rigorosa (come molte lingue imperative come Java, C ++, Python).
* Ordine normale (valutazione pigra): Valuta gli argomenti a una funzione * solo quando * i loro valori sono effettivamente necessari. Questo è usato in linguaggi puramente funzionali come Haskell.
* Call-by-Name: Sostituisci l'argomento non valutato direttamente nel corpo della funzione.
* Call-by-Value: Valutare l'argomento e passare il suo valore alla funzione. Simile all'ordine applicativo.
* Call-by-Need: Simile a Call-by-Name, ma mametta il risultato della prima valutazione in modo che gli usi successivi dell'argomento non richiedano una rivalutazione. Haskell lo usa.
* Confluence: Una proprietà desiderabile di un sistema di riduzione è che, indipendentemente dall'ordine in cui i ridex sono ridotti, la forma normale finale (se esiste) sarà la stessa. Questo è noto come teorema della Chiesa-Rosser e vale per il calcolo di Lambda e molti altri sistemi formali.
Perché i ridex sono importanti?
* Semantica formale: Redex e regole di riduzione forniscono un modo preciso e formale per definire la semantica (significato) di un linguaggio di programmazione.
* Ottimizzazione del compilatore: I compilatori possono utilizzare l'identificazione e la riduzione del Redex per ottimizzare il codice. Ad esempio, la piegatura costante (valutare espressioni costanti al tempo di compilazione) è una forma di riduzione del redex.
* Comprensione teorica: Le ridex sono fondamentali per capire come funziona il calcolo a un livello molto semplice. Sono una pietra miliare di molti concetti di teoria del linguaggio di programmazione.
* Ragionamento equazionale: Il ragionamento sulla correttezza del programma utilizzando le regole di riduzione per trasformare il codice in forme equivalenti.
In sintesi, il concetto di Redex è fondamentale per capire come le espressioni vengono valutate nei linguaggi di programmazione. Fornisce un framework per la definizione, l'implementazione e il ragionamento sul calcolo. Trovando e riducendo ripetutamente ridex, possiamo determinare il risultato finale di un'espressione.
Programmazione © www.354353.com