Lambda calcolo

sistema formale definito nel 1936 dal matematico Alonzo Church
(Reindirizzamento da Lambda-calcolo)

Il lambda calcolo o λ-calcolo è un sistema formale definito nel 1936 dal matematico Alonzo Church, sviluppato per analizzare formalmente le funzioni e il loro calcolo. Le prime sono espresse per mezzo di un linguaggio formale, che stabilisce quali siano le regole per formare un termine, il secondo con un sistema di riscrittura, che definisce come i termini possano essere ridotti e semplificati.

La lettera lambda minuscola, undicesima dell'alfabeto greco è il simbolo del lambda calcolo.

Descrizione modifica

La combinazione di semplicità ed espressività ha reso il lambda calcolo uno strumento frequente in diversi campi scientifici:

Termini modifica

Si definisce termine del lambda calcolo o, più brevemente, lambda termine o lambda espressione qualunque stringa ben formata a partire dalla seguente grammatica, in forma Backus-Naur:

 

dove la metavariabile   denota una variabile appartenente a un insieme infinito numerabile di variabili.

Parafrasando la definizione formale, un lambda termine può essere, rispettivamente, un nome di variabile, l'astrazione di un termine rispetto ad una variabile, o l'applicazione di un termine come argomento (o parametro attuale) di un altro.

Variabili modifica

Dato un generico lambda termine  , si definisce   l'insieme che contiene tutte le variabili menzionate in  . Tra queste si distinguono due partizioni: l'insieme delle variabili libere, scritto  , e l'insieme delle variabili legate, indicate con  . L'insieme delle variabili libere è definito ricorsivamente come segue:

  1.  ;
  2.  ;
  3.  .

L'insieme delle variabili legate è quindi ottenibile per differenza:

 .

Il punto 2 della definizione implica che il costrutto sintattico dell'astrazione è un legatore di variabile: se  , allora  .

Un nome di variabile si dice fresco, relativamente ad un termine, se esso non è compreso tra i nomi di variabile di quello stesso termine.

Alcuni esempi che si ottengono semplicemente applicando le definizioni date sopra:

 ;
 ;
 ;

Regole di riscrittura modifica

Sostituzione modifica

Una sostituzione è il rimpiazzo di tutte le occorrenze di un sotto-termine con un altro, all'interno di un terzo termine che rappresenta il contesto della sostituzione stessa. Si indica con   la sostituzione del termine   al posto di   all'interno del termine  : ogni occorrenza libera della variabile   in   è sostituita da  . Un semplice esempio di sostituzione è il seguente:

 .

Una definizione ricorsiva dell'algoritmo di sostituzione è la successiva:

  1.  ;
  2.  , se  ;
  3.  ;
  4.  , se   e  ;
  5.  , se  ,  , e   è un nome fresco;
  6.  .

Alcuni esempi di sostituzione:

 ;
 ;
 , dove   è un nome fresco.

I controlli di occorrenza al punto 4 e 5, sono necessari per evitare un fenomeno sgradito chiamato cattura di variabile. Senza tali controlli, l'operazione di sostituzione porterebbe una variabile libera di un termine, a diventare legata per effetto della sostituzione stessa, il che risulta essere anche intuitivamente scorretto.

Alfa conversione modifica

 .

L'alfa conversione si applica ai termini che sono astrazioni. Data un'astrazione, è possibile riscriverla sostituendo la variabile astratta ( ) con un'altra ( ), a patto che, nell'intero sotto-termine, al posto di ogni occorrenza della prima, si scriva la seconda.

La regola di alfa conversione non si occupa di fare alcuna distinzione fra occorrenze libere o legate delle variabili, dato che l'operazione di sostituzione si occupa già di fare ciò. Alcuni esempi di alfa conversione:

 
 

Beta riduzione modifica

La beta riduzione è la più importante regola di riscrittura del lambda calcolo, visto che implementa il passo di computazione. La sua prescrizione è definita come segue, dove l'eventuale contesto presente è omesso:

 .

(Sostituire N, alle occorrenze delle variabili legate, in M)

La regola ha come oggetto un'applicazione di una lambda astrazione nella forma   su un secondo termine  . La configurazione sintattica riducibile è appunto chiamata redex, contrazione della inglese "red-ucible ex-pression", a sua volta raramente ricalcato in italiano come "redesso", il suo risultato è chiamato ridotto.

Proseguendo l'analogia con i linguaggi di programmazione, la regola riguarda una funzione applicata ad un argomento. Essa corrisponde pertanto ad un passo di calcolo, che restituisce il corpo della funzione   dove il parametro attuale (effettivo)   viene sostituito al parametro formale   della funzione. In questo contesto dunque la sostituzione rappresenta proprio il passaggio del parametro.

Alcuni esempi di beta riduzione sono:

 
 

Eta conversione modifica

 , se  .

Intuitivamente, l'importanza di questa regola risiede nel fatto che consente di dichiarare identici due lambda termini sulla base del principio che se essi si comportano allo stesso modo (una volta applicati ad un parametro) essi devono quindi essere considerati, per l'appunto, identici.

Dire che   e   si comportano allo stesso modo, equivale a dire che per ogni  :  . In altre parole la eta-conversione assiomatizza la dimostrabilità dell'uguaglianza nel  -calcolo estensionale[1].

Termini equivalenti modifica

Le regole di conversione possono essere estese a vere e proprie relazioni di equivalenza, assumendo di poter riscrivere nel senso delle frecce appena definite (da sinistra verso destra) e che valgano anche le riscritture nella direzione opposta (da destra verso sinistra, quindi). Formalmente, si applicano le seguenti relazioni:

  •  ,
  •  , se  .

Le due doppie implicazioni sono chiamate, rispettivamente, alfa-equivalenza e eta-equivalenza. Due termini t ed s si dicono alfa-eta-equivalenti quando è soddifatta la relazione:

 .

In altre parole, due termini sono alfa-eta-equivalenti se esiste una catena finita di riscritture che impieghi solo le regole di alfa-equivalenza e di eta-equivalenza.

Codifiche modifica

Attraverso il λ-calcolo sono state formulate diverse codifiche. Alcuni esempi sono la codifica di Church, e quella di Mogensen-Scott. Esistono anche codifiche che usano il lambda calcolo tipato, come il Sistema F.

Numerazione modifica

La numerazione di Church può esprimere l'insieme dei numeri naturali   attraverso gli assiomi di Peano. Ogni numero viene espresso come il successivo del precedente, mentre lo zero è l'unico che non è il successivo di alcun numero.

 

Tutti i numeri appartenenti all'insieme dei naturali possono essere espressi analogamente.

 

Operazioni aritmetiche modifica

Relativamente alla precedente numerazione dei numeri naturali è possibile esprimere alcune computazioni elencate di seguito.

Funzione Definizione aritmetica Definizione secondo Church
Successore    
Addizione    
Moltiplicazione    
Potenza    

Esempi modifica

 

 

 

Logica di Boole modifica

La logica booleana o algebra di Boole, è una formalizzazione della logica che si basa su due valori, cioè vero e falso, esprimibili come di seguito.

 

 

Da notarsi che la funzione   rappresenta sia il valore zero che falso.

Operazioni logiche modifica

Di seguito, verranno espresse alcune delle più semplici operazioni relative alla logica booleana.

Funzione Logica Simbolo Definizione
E (AND)    
O (OR)    
NON (NOT)    

Esempi modifica

 

 

 

Forme normali modifica

Un termine del lambda calcolo si trova in forma normale se esso non è riscrivibile per mezzo della regola di beta riduzione. Se la beta riduzione rappresenta un passo di computazione di un lambda termine che descrive un programma, allora la sua chiusura transitiva ne rappresenta una qualsiasi computazione. Quando una riduzione è finita e massimale, il termine ridotto in forma normale rappresenta il risultato finale della computazione.

Per esempio, si supponga di arricchire il calcolo aggiungendovi i numeri naturali (semplicemente denotati come  ) e l'operazione di addizione binaria su di essi (scritta in forma prefissa come  ), entrambi peraltro direttamente codificabili come lambda termini. Si consideri ora un termine che somma   al suo argomento, ovvero   e si usi come argomento il valore  . Tale applicazione converge a forma normale  , infatti:  .

Non tutti i lambda termini hanno forma normale e la beta riduzione non ha sempre lunghezza finita. Questo fenomeno rappresenta il fatto che il calcolo di un programma può procedere indefinitamente e divergere e permette di rappresentare funzioni parziali.

L'esempio classico di divergenza è costruibile a partire dal termine duplicatore  , che non fa altro che prendere un termine e restituirne due copie, l'una applicata all'altra. È possibile dunque definire il termine  , e notare che esso riduce a se stesso  .

Note modifica

  1. ^ Barendregt, The Lambda Calculus

Bibliografia modifica

  • (EN) Henk P. Barendregt, The Lambda Calculus, its Syntax and Semantics - Studies in Logic Volume 40, College Publication, London, 2012. ISBN 978-1-84890-066-0. Questo libro è una fonte enciclopedica per quanto riguarda il lambda calcolo non tipato. In esso sono presenti moltissime definizioni e dimostrazioni, ma pochissime spiegazioni sul significato e sull'interpretazione dei risultati presentati.
  • Maurizio Gabbrielli e Simone Martini, Linguaggi di programmazione: principi e paradigmi, 2ª edizione, Milano, McGraw-Hill, 2011. ISBN 978-88-386-6573-8.
  • (EN) Jean-Yves Girard, Proofs and Types, Paul Taylor and Yves Lafont, Cambridge University Press, 2003 [1989], ISBN 0-521-37181-3. URL consultato il 24 marzo 2014. Libro riguardante il lambda calcolo tipato e quello del secondo ordine.

Voci correlate modifica

Altri progetti modifica

Collegamenti esterni modifica

Controllo di autoritàLCCN (ENsh85074174 · GND (DE4166495-4 · BNF (FRcb119586908 (data) · J9U (ENHE987007553113905171