Premessa

Ciao! Se è la prima volta che capiti su questo sito, ti consiglio di consultare la pagina principale di questo cosiddetto Giardino Digitale per scoprire meglio cos’è e come navigarlo.

Lo stato di questa nota è al momento: 🔴 Bozza.


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 .

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.

1 - 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:

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:

1.1 - 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:

2 - 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.

2.1 - Regole di tipo nell’STLCB

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).

2.2 - 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.

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

1 item under this folder.