Dal momento che il -calcolo Γ¨ computazionalmente completo, abbiamo visto come Γ¨ possibile con esso creare con esso dei veri e propri programmi, semplicemente codificando in termini determinati costrutti della programmazione classica (come abbiamo fatto, per esempio, con la codifica di Church).
Tuttavia, possiamo subito notare un problemino non trascurabile: nella codifica di Church, possiamo tranquillamente scrivere -espressioni che da un punto di vista puramente sintattico hanno senso, ma semanticamente no.
Per esempio, possiamo fare unβaddizione tra due valori booleani:
PerΓ² questa -espressione, da un punto di vista semantico, non ha senso: cosa dovrebbe significarci la somma di due valori booleani?
Allo stesso modo, possiamo provare a fare una disgiunzione logica tra due numerali di Church:
Ma cosa vuole dire questa -espressione?
Proprio per questo motivo, ci serve in qualche modo discriminare sulla forma che vogliamo che abbiano i nostri termini quando andiamo a usarli: ecco che quindi importiamo direttamente dal mondo della programmazione la classica nozione di tipo per espandere il -calcolo e crearne sue versioni βtipizzateβ, come il -calcolo semplicemente tipizzato.
Definizione: -calcolo semplicemente tipizzato
Questi tipi non sono altro che semplici βetichetteβ che decidiamo noi di assegnare ai termini per distinguere lβuso che dobbiamo farne di loro nelle nostre -espressioni.
Nel -calcolo vogliamo distinguere i termini solo in due categorie: quelli che rappresentano dati atomici (come numeri, valori booleani, stringhe, ecc.) e quelli che rappresentano funzioni che, dato un termine di un certo tipo, restituiscono un altro termine di un altro tipo.
Definizione: tipo nel -calcolo
Nel -calcolo, un tipo Γ¨ unβetichetta assegnata a un termine che corrisponde a una stringa ben formata a partire dalla seguente grammatica espressa in BNF:
dove:
- Γ¨ il tipo atomico, ossia un tipo non ulteriormente riducibile.
- Γ¨ il tipo funzione, ossia un tipo che indica che unβastrazione prende come argomento un termine di tipo e restituisce un termine di tipo .
Esempi di tipi
Esempi di tipo atomico sono e , da assegnare a termini che rappresentano rispettivamente valori booleani e numeri naturali.
Un esempio invece di tipo funzione Γ¨ , da assegnare a unβastrazione che prende come argomento un termine di tipo atomico e restituisce un termine di tipo atomico . Per esempio, nella codifica di Church cβΓ¨ il test per zero che prende come argomento un numerale di Church (che rappresenta un numero naturale) e restituisce un valore booleano.
Ecco che quindi possiamo ridefinire il termine per includere al suo interno le costanti, che ci aiuteranno a rappresentare i tipi atomici.
Definizione: termine nel -calcolo
NelΒ -calcolo, unΒ termineΒ Β (anche dettoΒ -termineΒ oΒ -espressione) Γ¨ una stringa ben formata a partire dalla seguente grammatica espressa in BNF:
dove:
- Β Γ¨ una variabile,
- Γ¨ una costante,
- Β Γ¨ unβastrazioneΒ con argomentoΒ Β e corpoΒ e
- Β Γ¨ unβapplicazioneΒ in cui laΒ funzioneΒ Β viene applicata allβargomentoΒ .
Ognuna di queste 4 forme che puΓ² assumere un termine Γ¨ detta forma sintattica.
NelΒ -calcolo semplicemente tipizzato, lβavverbioΒ semplicementeΒ indica che, a differenza di altri varianti tipizzate delΒ -calcolo, in questa decidiamo di adottare solamente il tipo atomico e il tipo funzione e nientβaltro.
Giudizi sui tipi
Il motivo per cui abbiamo introdotto questa nozione diΒ tipiΒ Γ¨ per determinare se unΒ termine, oltre a essere sintatticamente corretto, lo Γ¨ anche dal punto di vista semantico.
Questo lo controlleremo attraverso deiΒ giudizi, ossia proposizioni logiche in cui affermiamo che unΒ termineΒ Β haΒ tipoΒ Β e le esprimeremo nella seguente notazione:
CβΓ¨ solo un problemino: questoΒ termineΒ Β potrebbe contenere al proprio interno delle variabili libere e, di conseguenza, per capire qual Γ¨ il tipo da assegnare a queste variabili non ci basta piΓΉ il soloΒ termineΒ Β ma ci serve unΒ contestoΒ che ci aiuti a capirlo, sotto forma di una funzione parziale che associa a ogni variabile che usiamo nelΒ termineΒ unΒ tipo.
Definizione: contesto
Ora abbiamo tutti gli strumenti per definire formalmente unΒ giudizio.
Definizione: giudizio
Esempio di giudizio
Grazie ai giudizi possiamo determinare se un termine Γ¨ ben tipato o meno, ossia se le sue componenti rispettano i loro tipi.
Definizione: termine ben tipato
Regole di tipo
Avendo definito questiΒ giudiziΒ come proposizioni logiche, possiamo usare le regole di inferenza per dedurre nuoviΒ giudiziΒ a partire da quelli che sappiamo giΓ per certo, in modo da poter stabilire se un termine Γ¨ ben tipato o meno. Queste regole di inferenza le chiameremo regole di tipo.
Definizione: regola di tipo
Definizione: regola di tipo assiomatica
Una regola di tipo si dice assiomatica se non ha premesse ma solo la conclusione:
Ogni regola di tipo, a partire da un gruppo di giudizi (ossia le premesse) Γ¨ in grado di generare un nuovo giudizio (la conclusione). Tuttavia, a loro volta le premesse possono essere conclusioni di altre regole di tipo precedenti, come nel caso
dove le premesse e sono a loro volta conclusioni di regole di tipo che hanno come premesse, rispettivamente, i giudizi e , mentre la premessa Γ¨ conclusione di una regola di tipo assiomatica, non avendo premesse.
Possiamo quindi costruire dei grafici a forma di albero che ci permettono di risalire da un determinato giudizio alle regole di tipo assiomatiche che ci permettono di dedurlo: lβalbero di derivazione.
Definizione: albero di derivazione
Nel -calcolo, un albero di derivazione Γ¨ una struttura ad albero che mostra passo per passo come un certo giudizio Γ¨ ottenuto applicando le regole di tipo a partire da quelle assiomatiche. In particolare:
- la radice dellβalbero Γ¨ rappresentata dal giudizio ,
- ogni nodo interno Γ¨ rappresentato da un giudizio ottenuto applicando una specifica regola di tipo, in modo che i figli del nodo siano esattamente i giudizi presenti nelle premesse della regola di tipo applicata e
- le foglie sono rappresentate da regole di tipo assiomatiche.
STLC con booleani (STLCB)
Ora , seguendo quanto ho studiato nel corso di Linguaggi e Paradigmi di Programmazione che ho seguito allβUniversitΓ , proviamo a espandere ulteriormente il -calcolo accettando come unico tipo atomico quello booleano.
Definizione: -calcolo con booleani
Il -calcolo con booleani (spesso indicato anche come -calcolo o con lβacronimo STLCB, dallβinglese Simply Typed Lambda Calculus with Booleans), Γ¨ unβespansione del -calcolo che ammette tra i tipi atomici unicamente il tipo booleano.
Ridefiniamo quindi il concetto di tipo.
Definizione: tipo nel -calcolo
Nel -calcolo, un tipo Γ¨ unβetichetta assegnata a un termine che corrisponde a una stringa ben formata a partire dalla seguente grammatica espressa in BNF:
dove:
- Γ¨ il tipo booleano, ossia il tipo che possono assumere le costanti booleane.
- Γ¨ il tipo funzione, ossia un tipo che indica che unβastrazione prende come argomento un termine di tipo e restituisce un termine di tipo .
Nel -calcolo, avendo sovrascritto la definizione di tipo, dobbiamo ridefinire anche il termine, in cui perΓ² specifichiamo che gli unici valori che possono assumere le costanti sono solo quelli booleani ( e ) e aggiungiamo una nuova forma sintattica: quella della struttura di controllo.
Definizione: termine nel -calcolo
NelΒ -calcolo, unΒ termineΒ Β (anche dettoΒ -termineΒ oΒ -espressione) Γ¨ una stringa ben formata a partire dalla seguente grammatica espressa in BNF:
dove:
- Β Γ¨ una variabile,
- Γ¨ una costante che puΓ² assumere come valori soltantoΒ Β eΒ Β (),
- Β Γ¨ unβastrazioneΒ con argomentoΒ Β e corpoΒ ,
- Β Γ¨ unβapplicazioneΒ in cui laΒ funzioneΒ Β viene applicata allβargomentoΒ ,
- Β Γ¨ una struttura di controllo in cui, se la condizioneΒ Β risulta vera (), allora Γ¨ uguale aΒ , altrimenti Γ¨ uguale aΒ :
Ognuna di queste 5 forme che puΓ² assumere un termine Γ¨ detta forma sintattica.
Regole di tipo
Prima di tutto, dichiariamo 5 regole di tipo per le 5 forme sintattiche che puΓ² assumere un termine nel -calcolo.
Definizione: regola di tipo
Sia lβinsiemeΒ diΒ terminiΒ del -calcolo.
La regola di tipo dice che, se in un contesto un termine della forma di una variabile ha tipo , allora ha tipo :
Definizione: regola di tipo
Sia lβinsiemeΒ diΒ terminiΒ del -calcolo.
La regola di tipo dice che, se in un contesto un termine della forma di una costante Γ¨ di tipo booleano , allora ha tipo booleano :
Definizione: regola di tipo
Sia lβinsiemeΒ diΒ terminiΒ del -calcolo.
La regola di tipo dice che, se in un contesto un termine della forma di unβastrazione avente lβargomento con tipo abbiamo con tipo , allora lβintera astrazione ha tipo funzione :
Definizione: regola di tipo
Sia lβinsiemeΒ diΒ terminiΒ del -calcolo.
La regola di tipo dice che, se in un contesto un termine della forma di unβapplicazione abbiamo la funzione con tipo funzione e lβargomento con tipo , allora lβintera applicazione ha tipo :
Definizione: regola di tipo
Sia lβinsiemeΒ diΒ terminiΒ del -calcolo.
La regola di tipo dice che, se in un contesto un termine della forma di una struttura di controllo ha di tipo booleano ed ed entrambi di tipo , allora lβintera struttura di controllo ha tipo :
Nonostante non abbiamo ancora tutti gli strumenti corretti per farlo, proviamo a vedere come andrebbero usate queste regole di tipo per verificare se un termine Γ¨ ben tipato provando a costruire un albero di derivazione (spoiler: piΓΉ avanti introdurremo un algoritmo per farlo correttamente, lβalgoritmo di inferenza).
Esempio di uso delle regole di tipo in un albero di derivazione
Prendiamo come esempio il seguente termine:
Assumiamo che sia ben tipato: che tipo avrΓ ?
Possiamo barare un poβ e notare che Γ¨ unβapplicazione del combinatore identitΓ alla costante booleana , quindi il risultato sarΓ proprio la costante booleana e avrΓ lo stesso tipo di , ossia il tipo booleano .
Avremo quindi il seguente giudizio:
Per procedere da questo giudizio, basta guardare la forma sintattica del termine: essendo unβapplicazione, useremo la regola di tipo che dice che, affinchΓ© lβapplicazione sia ben tipata, la funzione deve essere di un tipo funzione dove deve coincidere con il tipo dellβargomento (che ha tipo booleano ), mentre usiamo momentaneamente come segnaposto per decidere piΓΉ tardi cosa metterci lΓ¬. Avremo quindi:
Il ramo della costante possiamo subito chiuderlo usando la regola di tipo che Γ¨ assiomatica, quindi siamo arrivati al capolinea da questo lato:
Dallβaltro lato, quel come segnaposto possiamo sostituirlo barando un altro poβ e vedendo che, dato che lβastrazione Γ¨ il combinatore identitΓ , se gli passiamo un argomento di tipo booleano ci restituirΓ un risultato sempre di tipo booleano :
Per la [regola di tipo ], il corpo Γ¨ ben tipato in un contesto in cui lβargomento ha tipo e ottiene tipo :
Infine, il giudizio Γ¨ frutto dellβuso della regola di tipo :
Dato che anche qui siamo arrivati a usare una regola di tipo assiomatica, abbiamo concluso qua e abbiamo dimostrato che il termine è ben tipato e ha tipo booleano , costruendo così correttamente un albero di derivazione.
ProprietΓ dei termini ben tipati
Se un termine Γ¨ ben tipato e si riduce a un altro termine , allora ed avranno lo stesso tipo. CiΓ² significa quindi che la riduzione singola preserva il tipo.
Lemma di subject reduction
Definizione: valore
Nel -calcolo, un valore Γ¨ un termine che Γ¨ della forma semantica di una costante booleana o di unβastrazione.
Esempi di valori
Ecco una lista di termini e per ognuno dei quali vediamo se sono valori o meno:
- : non Γ¨ un valore perchΓ© Γ¨ unβapplicazione con funzione e argomento . Tuttavia, con un passaggio di -riduzione, otteniamo che Γ¨ una costante booleana e diventa un valore.
- : non Γ¨ un valore perchΓ© Γ¨ unβapplicazione con funzione e argomento . Γ in forma normale, quindi non Γ¨ riducibile e non potrΓ mai diventare un valore.
- : Γ¨ un valore perchΓ© Γ¨ unβastrazione con argomento e corpo .
Possiamo dimostrare che, per ogni termine riducibile in zero o piΓΉ passi in un altro termine in forma normale, questβultimo Γ¨ un valore.
Teorema del progresso
SiaΒ Β lβinsiemeΒ di termini del -calcolo. Dati due termini con combinatore e in forma normale, se ha tipo ed Γ¨ riducibile in zero o piΓΉ passi in , allora Γ¨ un valore:
Fonti
- π« Corso di Laurea in Informatica (
L-31 R) presso lβUniversitΓ di Torino:
- Corso di Linguaggi e Paradigmi di Programmazione, A.A. 2020-21 (pagina Moodle):
- Prof. Luca Padovani, slide del corso:
- Prof. Luca Padovani, videoregistrazioni del corso:
- Corso di Linguaggi e Paradigmi di Programmazione, A.A. 2025-26 (pagina Moodle):
- Prof. Viviana Bono,Β lezioni del corso.
- πΉ Eyesomorphic,Β Programming with Math | The Lambda Calculus su YouTube.
- π Lambda-calcolo su Wikipedia in lingua italiana, URL consultato lβultima volta eΒ archiviatoΒ il 25 novembre 2025.
- π Simply typed lambda calculus su Wikipedia in lingua inglese, URL consultato lβultima volta e archiviato il 25 novembre 2025.
- π§ Consultazione di ChatGPT.