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

Il -calcolo semplicemente tipizzato (spesso indicato anche come -calcolo o con l’acronimo STLC, dall’inglese Simply Typed Lambda Calculus), Γ¨ un’espansione del -calcolo che include i tipi.

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:

  1. Β Γ¨ una variabile,
  2. Γ¨ una costante,
  3. Β Γ¨ un’astrazioneΒ con argomentoΒ Β e corpoΒ  e
  4. Β Γ¨ 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

NelΒ -calcolo, unΒ contestoΒ Β Γ¨ una funzione parziale da variabili aΒ tipi:

Ora abbiamo tutti gli strumenti per definire formalmente unΒ giudizio.

Definizione: giudizio

NelΒ -calcolo, unΒ giudizioΒ Γ¨ una proposizione logica che asserisce che, dati deiΒ contestiΒ , unΒ termineΒ Β haΒ tipoΒ :

doveΒ Β indica l’unione deiΒ contestiΒ :

Il giudizio puΓ² anche non avere contesti se Γ¨ un combinatore:

Esempio di giudizio

IlΒ giudizio

indica che la variabileΒ , nelΒ contestoΒ , ha tipo atomico :

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

Un termine si dice ben tipato se e solo se esiste un contesto e un tipo tali che:

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

Una regola di tipo Γ¨ una regola di inferenza che stabilisce, in base alla forma sintattica di un termine e al tipo dei suoi costituenti, quale tipo puΓ² essere assegnato all’intero termine .

Una regola di tipo Γ¨ generalmente espressa come:

dove:

  • sono le premesse, espresse sotto forma di giudizi, che indicano i tipi dei costituenti del termine e
  • Γ¨ la conclusione, espressa anch’essa sotto forma di giudizio, che stabilisce il tipo del termine .

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:

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:

  1. Β Γ¨ una variabile,
  2. Γ¨ una costante che puΓ² assumere come valori soltantoΒ Β eΒ Β (),
  3. Β Γ¨ un’astrazioneΒ con argomentoΒ Β e corpoΒ ,
  4. Β Γ¨ un’applicazioneΒ in cui laΒ funzioneΒ Β viene applicata all’argomentoΒ ,
  5. Β Γ¨ 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

SiaΒ Β l’insiemeΒ di termini del -calcolo. Dati due termini , se in un contesto ha tipo e si riduce a , allora anche avrΓ  tipo nel contesto :

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