Funzioni, programmi e dimostrazioni - SELP

Transcript

Funzioni, programmi e dimostrazioni - SELP
Funzioni, programmi e dimostrazioni
Una rapidissima introduzione al λ-calcolo e all’isomorfismo di Curry-Howard
Parte 1
Giulio Guerrieri
[email protected]
Università Roma Tre / Université Paris 7
Siena, 25 marzo 2011
Incontro SeLP
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
1 / 30
Indice
1
Introduzione
2
Il λ-calcolo puro
3
Alcune rappresentazioni nel λ-calcolo puro
4
La deduzione naturale intuizionista
5
L’isomorfismo di Curry-Howard
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
2 / 30
Indice
1
Introduzione
2
Il λ-calcolo puro
3
Alcune rappresentazioni nel λ-calcolo puro
4
La deduzione naturale intuizionista
5
L’isomorfismo di Curry-Howard
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
3 / 30
Funzioni: estensione contro intensione
1/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista estensionale (teoria degli insiemi):
dati due insiemi A e B, una funzione f da A in B è un sottoinsieme del
prodotto cartesiano A × B tale che ad ogni x ∈ A esiste uno e uno solo
y ∈ B tale che (x, y ) ∈ f ;
grazie alla condizione di esistenza e unicità ha senso la notazione f (x) = y ;
una funzione f coincide con il suo grafico: f = {(x, f (x)) : x ∈ A} ⊆ A × B;
l’argomento (l’input x) determina univocamente il suo valore tramite f
(l’output y = f (x)), quello che succede nel passaggio da x a f (x) non
interessa ai fini della definizione di f (non si guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono estensionalmente la stessa funzione
la visione insiemistica è statica, è una risposta al “che cosa?” (cosa è
associato a cosa).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
4 / 30
Funzioni: estensione contro intensione
1/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista estensionale (teoria degli insiemi):
dati due insiemi A e B, una funzione f da A in B è un sottoinsieme del
prodotto cartesiano A × B tale che ad ogni x ∈ A esiste uno e uno solo
y ∈ B tale che (x, y ) ∈ f ;
grazie alla condizione di esistenza e unicità ha senso la notazione f (x) = y ;
una funzione f coincide con il suo grafico: f = {(x, f (x)) : x ∈ A} ⊆ A × B;
l’argomento (l’input x) determina univocamente il suo valore tramite f
(l’output y = f (x)), quello che succede nel passaggio da x a f (x) non
interessa ai fini della definizione di f (non si guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono estensionalmente la stessa funzione
la visione insiemistica è statica, è una risposta al “che cosa?” (cosa è
associato a cosa).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
4 / 30
Funzioni: estensione contro intensione
1/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista estensionale (teoria degli insiemi):
dati due insiemi A e B, una funzione f da A in B è un sottoinsieme del
prodotto cartesiano A × B tale che ad ogni x ∈ A esiste uno e uno solo
y ∈ B tale che (x, y ) ∈ f ;
grazie alla condizione di esistenza e unicità ha senso la notazione f (x) = y ;
una funzione f coincide con il suo grafico: f = {(x, f (x)) : x ∈ A} ⊆ A × B;
l’argomento (l’input x) determina univocamente il suo valore tramite f
(l’output y = f (x)), quello che succede nel passaggio da x a f (x) non
interessa ai fini della definizione di f (non si guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono estensionalmente la stessa funzione
la visione insiemistica è statica, è una risposta al “che cosa?” (cosa è
associato a cosa).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
4 / 30
Funzioni: estensione contro intensione
1/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista estensionale (teoria degli insiemi):
dati due insiemi A e B, una funzione f da A in B è un sottoinsieme del
prodotto cartesiano A × B tale che ad ogni x ∈ A esiste uno e uno solo
y ∈ B tale che (x, y ) ∈ f ;
grazie alla condizione di esistenza e unicità ha senso la notazione f (x) = y ;
una funzione f coincide con il suo grafico: f = {(x, f (x)) : x ∈ A} ⊆ A × B;
l’argomento (l’input x) determina univocamente il suo valore tramite f
(l’output y = f (x)), quello che succede nel passaggio da x a f (x) non
interessa ai fini della definizione di f (non si guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono estensionalmente la stessa funzione
la visione insiemistica è statica, è una risposta al “che cosa?” (cosa è
associato a cosa).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
4 / 30
Funzioni: estensione contro intensione
1/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista estensionale (teoria degli insiemi):
dati due insiemi A e B, una funzione f da A in B è un sottoinsieme del
prodotto cartesiano A × B tale che ad ogni x ∈ A esiste uno e uno solo
y ∈ B tale che (x, y ) ∈ f ;
grazie alla condizione di esistenza e unicità ha senso la notazione f (x) = y ;
una funzione f coincide con il suo grafico: f = {(x, f (x)) : x ∈ A} ⊆ A × B;
l’argomento (l’input x) determina univocamente il suo valore tramite f
(l’output y = f (x)), quello che succede nel passaggio da x a f (x) non
interessa ai fini della definizione di f (non si guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono estensionalmente la stessa funzione
la visione insiemistica è statica, è una risposta al “che cosa?” (cosa è
associato a cosa).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
4 / 30
Funzioni: estensione contro intensione
2/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista intensionale (teoria della computabilità):
una funzione f da A in B è una procedura effettiva (un algoritmo) che dato
un input x ∈ A consente di ottenere un output f (x) ∈ B in un numero finito
di passi elementari (meccanizzabili);
una funzione di questo tipo è detta calcolabile (non tutte le funzioni lo sono);
l’interesse è focalizzato nella procedura seguita per passare da x a f (x) (si
guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono intensionalmente funzioni diverse
Se prendiamo come operazione elementare la funzione succ successore di un intero:
(x, y ) 7→ x +y = succ y (x) è una procedimento diverso da (x, y ) 7→ y +x = succ x (y )
la visione “calcolatoria” è dinamica, è una risposta al “come?” (dato l’input,
come si arriva a calcolare l’output)
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
5 / 30
Funzioni: estensione contro intensione
2/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista intensionale (teoria della computabilità):
una funzione f da A in B è una procedura effettiva (un algoritmo) che dato
un input x ∈ A consente di ottenere un output f (x) ∈ B in un numero finito
di passi elementari (meccanizzabili);
una funzione di questo tipo è detta calcolabile (non tutte le funzioni lo sono);
l’interesse è focalizzato nella procedura seguita per passare da x a f (x) (si
guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono intensionalmente funzioni diverse
Se prendiamo come operazione elementare la funzione succ successore di un intero:
(x, y ) 7→ x +y = succ y (x) è una procedimento diverso da (x, y ) 7→ y +x = succ x (y )
la visione “calcolatoria” è dinamica, è una risposta al “come?” (dato l’input,
come si arriva a calcolare l’output)
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
5 / 30
Funzioni: estensione contro intensione
2/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista intensionale (teoria della computabilità):
una funzione f da A in B è una procedura effettiva (un algoritmo) che dato
un input x ∈ A consente di ottenere un output f (x) ∈ B in un numero finito
di passi elementari (meccanizzabili);
una funzione di questo tipo è detta calcolabile (non tutte le funzioni lo sono);
l’interesse è focalizzato nella procedura seguita per passare da x a f (x) (si
guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono intensionalmente funzioni diverse
Se prendiamo come operazione elementare la funzione succ successore di un intero:
(x, y ) 7→ x +y = succ y (x) è una procedimento diverso da (x, y ) 7→ y +x = succ x (y )
la visione “calcolatoria” è dinamica, è una risposta al “come?” (dato l’input,
come si arriva a calcolare l’output)
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
5 / 30
Funzioni: estensione contro intensione
2/2
Intuitivamente, una funzione f : A → B è un operatore che associa ad ogni x ∈ A
uno e un solo f (x) ∈ B secondo una qualche “legge”.
Le funzioni dal punto di vista intensionale (teoria della computabilità):
una funzione f da A in B è una procedura effettiva (un algoritmo) che dato
un input x ∈ A consente di ottenere un output f (x) ∈ B in un numero finito
di passi elementari (meccanizzabili);
una funzione di questo tipo è detta calcolabile (non tutte le funzioni lo sono);
l’interesse è focalizzato nella procedura seguita per passare da x a f (x) (si
guarda dentro la “scatola nera”);
Es. N23(x, y ) 7→ x +y e N23(x, y ) 7→ y +x sono intensionalmente funzioni diverse
Se prendiamo come operazione elementare la funzione succ successore di un intero:
(x, y ) 7→ x +y = succ y (x) è una procedimento diverso da (x, y ) 7→ y +x = succ x (y )
la visione “calcolatoria” è dinamica, è una risposta al “come?” (dato l’input,
come si arriva a calcolare l’output)
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
5 / 30
I modelli di calcolo
Un modello di calcolo è una rappresentazione matematica (astratta) della nozione di
calcolabilità
rendere rigoroso il concetto intuitivo di funzione calcolabile, scoprire quali
siano le possibilità ed i limiti del calcolo.
Origini (∼1930): tentare di rispondere al secondo problema di Hilbert (dimostrare con
metodi finitari la coerenza dell’aritmetica) posto nel 1900. Per definire i metodi finitari
serve la nozione di procedura effettiva quindi di funzione calcolabile.
Esistono più modelli di calcolo che approcciano la calcolabilità differentemente. Alcuni:
Funzioni ricorsive (Gödel, 1931; Kleene, 1937): approccio “assiomatico”;
pro: definizione matematicamente elegante dell’insieme delle funzioni ricorsive
facile stabilire proprietà matematiche di questo insieme;
contro: manca una nozione di passo di calcolo (i.e. il modo, anche astratto, con cui
i calcoli vengono effettuati)
Macchine di Turing (Turing, 1937): approccio “concreto” alla calcolabilità;
pro: nozione precisa di passo di calcolo, chiaramente meccanizzabile, consente
analisi della complessità dei calcoli;
contro: descrizione troppo esplicita della computazione
difficile dimostrare
proprietà astratte in questo modello.
λ-calcolo (Church, 1930): in una certa misura, unisce le virtù (eleganza
matematica, nozione esplicita di passo di calcolo) dei due modelli precedenti.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
6 / 30
I modelli di calcolo
Un modello di calcolo è una rappresentazione matematica (astratta) della nozione di
calcolabilità
rendere rigoroso il concetto intuitivo di funzione calcolabile, scoprire quali
siano le possibilità ed i limiti del calcolo.
Origini (∼1930): tentare di rispondere al secondo problema di Hilbert (dimostrare con
metodi finitari la coerenza dell’aritmetica) posto nel 1900. Per definire i metodi finitari
serve la nozione di procedura effettiva quindi di funzione calcolabile.
Esistono più modelli di calcolo che approcciano la calcolabilità differentemente. Alcuni:
Funzioni ricorsive (Gödel, 1931; Kleene, 1937): approccio “assiomatico”;
pro: definizione matematicamente elegante dell’insieme delle funzioni ricorsive
facile stabilire proprietà matematiche di questo insieme;
contro: manca una nozione di passo di calcolo (i.e. il modo, anche astratto, con cui
i calcoli vengono effettuati)
Macchine di Turing (Turing, 1937): approccio “concreto” alla calcolabilità;
pro: nozione precisa di passo di calcolo, chiaramente meccanizzabile, consente
analisi della complessità dei calcoli;
contro: descrizione troppo esplicita della computazione
difficile dimostrare
proprietà astratte in questo modello.
λ-calcolo (Church, 1930): in una certa misura, unisce le virtù (eleganza
matematica, nozione esplicita di passo di calcolo) dei due modelli precedenti.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
6 / 30
I modelli di calcolo
Un modello di calcolo è una rappresentazione matematica (astratta) della nozione di
calcolabilità
rendere rigoroso il concetto intuitivo di funzione calcolabile, scoprire quali
siano le possibilità ed i limiti del calcolo.
Origini (∼1930): tentare di rispondere al secondo problema di Hilbert (dimostrare con
metodi finitari la coerenza dell’aritmetica) posto nel 1900. Per definire i metodi finitari
serve la nozione di procedura effettiva quindi di funzione calcolabile.
Esistono più modelli di calcolo che approcciano la calcolabilità differentemente. Alcuni:
Funzioni ricorsive (Gödel, 1931; Kleene, 1937): approccio “assiomatico”;
pro: definizione matematicamente elegante dell’insieme delle funzioni ricorsive
facile stabilire proprietà matematiche di questo insieme;
contro: manca una nozione di passo di calcolo (i.e. il modo, anche astratto, con cui
i calcoli vengono effettuati)
Macchine di Turing (Turing, 1937): approccio “concreto” alla calcolabilità;
pro: nozione precisa di passo di calcolo, chiaramente meccanizzabile, consente
analisi della complessità dei calcoli;
contro: descrizione troppo esplicita della computazione
difficile dimostrare
proprietà astratte in questo modello.
λ-calcolo (Church, 1930): in una certa misura, unisce le virtù (eleganza
matematica, nozione esplicita di passo di calcolo) dei due modelli precedenti.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
6 / 30
I modelli di calcolo
Un modello di calcolo è una rappresentazione matematica (astratta) della nozione di
calcolabilità
rendere rigoroso il concetto intuitivo di funzione calcolabile, scoprire quali
siano le possibilità ed i limiti del calcolo.
Origini (∼1930): tentare di rispondere al secondo problema di Hilbert (dimostrare con
metodi finitari la coerenza dell’aritmetica) posto nel 1900. Per definire i metodi finitari
serve la nozione di procedura effettiva quindi di funzione calcolabile.
Esistono più modelli di calcolo che approcciano la calcolabilità differentemente. Alcuni:
Funzioni ricorsive (Gödel, 1931; Kleene, 1937): approccio “assiomatico”;
pro: definizione matematicamente elegante dell’insieme delle funzioni ricorsive
facile stabilire proprietà matematiche di questo insieme;
contro: manca una nozione di passo di calcolo (i.e. il modo, anche astratto, con cui
i calcoli vengono effettuati)
Macchine di Turing (Turing, 1937): approccio “concreto” alla calcolabilità;
pro: nozione precisa di passo di calcolo, chiaramente meccanizzabile, consente
analisi della complessità dei calcoli;
contro: descrizione troppo esplicita della computazione
difficile dimostrare
proprietà astratte in questo modello.
λ-calcolo (Church, 1930): in una certa misura, unisce le virtù (eleganza
matematica, nozione esplicita di passo di calcolo) dei due modelli precedenti.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
6 / 30
Equivalenze dei modelli e tesi di Church
Questi tre modelli di calcolo sono equivalenti, i.e. definiscono la stessa classe di funzioni:
Teorema (Church, Rosser, Turing, Kleene, 1935-1939)
Una funzione (parziale) da Nk in N è ricorsiva sse è Turing-calcolabile sse è λ-calcolabile
Tutti i modelli di calcolo proposti successivamente si sono rivelati equivalenti alle
macchie di Turing (quindi alle funzioni ricorsive e al λ-calcolo) o più deboli.
Non esiste una funzione calcolabile secondo un qualche modello di calcolo finora
proposto che non sia Turing-calcolabile (quindi ricorsiva e λ-calcolabile).
È stata accumulata un grande mole di evidenza positiva per affermare:
Tesi di Church, 1935-1939
Una funzione (parziale) da Nk in N è “calcolabile” sse è Turing-calcolabile
i.e. se un problema è intuitivamente calcolabile, allora esisterà una macchina di Turing in
grado di risolverlo (cioè di calcolarlo).
Quest’ipotesi non è dimostrabile: la nozione intuitiva di “funzione calcolabile” è
necessariamente vaga.
In linea di principio falsificabile, la tesi di Church è universalmente accettata
i modelli di calcolo proposti caratterizzano completamente la nozione di calcolabilità.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
7 / 30
Equivalenze dei modelli e tesi di Church
Questi tre modelli di calcolo sono equivalenti, i.e. definiscono la stessa classe di funzioni:
Teorema (Church, Rosser, Turing, Kleene, 1935-1939)
Una funzione (parziale) da Nk in N è ricorsiva sse è Turing-calcolabile sse è λ-calcolabile
Tutti i modelli di calcolo proposti successivamente si sono rivelati equivalenti alle
macchie di Turing (quindi alle funzioni ricorsive e al λ-calcolo) o più deboli.
Non esiste una funzione calcolabile secondo un qualche modello di calcolo finora
proposto che non sia Turing-calcolabile (quindi ricorsiva e λ-calcolabile).
È stata accumulata un grande mole di evidenza positiva per affermare:
Tesi di Church, 1935-1939
Una funzione (parziale) da Nk in N è “calcolabile” sse è Turing-calcolabile
i.e. se un problema è intuitivamente calcolabile, allora esisterà una macchina di Turing in
grado di risolverlo (cioè di calcolarlo).
Quest’ipotesi non è dimostrabile: la nozione intuitiva di “funzione calcolabile” è
necessariamente vaga.
In linea di principio falsificabile, la tesi di Church è universalmente accettata
i modelli di calcolo proposti caratterizzano completamente la nozione di calcolabilità.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
7 / 30
Funzioni non calcolabili
Esistono funzioni non calcolabili (indipendentemente dal modello di calcolo, se si
accetta la tesi di Church
limite intrinseco della calcolabilità). Esempi:
L’insieme R delle funzioni ricorsive totali da N in N è infinito numerabile.
L’insieme NN delle funzioni totali da N in N è più che numerabile (2ℵ0 )
R ( NN i.e. esistono funzioni totali da N in N non ricorsive (anzi, le
funzioni totali non ricorsive sono “di più” delle ricorsive).
Fissata un’enumerazione ϕ0 , ϕ1 , ϕ2 , . . . delle funzioni ricorsive totali da N in
N, la funzione g : N2 → N definita da g (m, n) = ϕm (n) non è ricorsiva.
Il problema della fermata: non esiste un algoritmo che, dato un qualsiasi
programma e un qualsiasi input, decide se il programma terminerà quando
viene lanciato con quell’input.
teorema di Church: non esiste un algoritmo che decide se una qualsiasi
formula della logica del 1◦ ordine sia dimostrabile o meno.
10◦ problema di Hilbert: non esiste un algoritmo che decide se una qualsiasi
equazione diofantina (a coefficienti interi) ammetta una soluzione intera.
...
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
8 / 30
Funzioni non calcolabili
Esistono funzioni non calcolabili (indipendentemente dal modello di calcolo, se si
accetta la tesi di Church
limite intrinseco della calcolabilità). Esempi:
L’insieme R delle funzioni ricorsive totali da N in N è infinito numerabile.
L’insieme NN delle funzioni totali da N in N è più che numerabile (2ℵ0 )
R ( NN i.e. esistono funzioni totali da N in N non ricorsive (anzi, le
funzioni totali non ricorsive sono “di più” delle ricorsive).
Fissata un’enumerazione ϕ0 , ϕ1 , ϕ2 , . . . delle funzioni ricorsive totali da N in
N, la funzione g : N2 → N definita da g (m, n) = ϕm (n) non è ricorsiva.
Il problema della fermata: non esiste un algoritmo che, dato un qualsiasi
programma e un qualsiasi input, decide se il programma terminerà quando
viene lanciato con quell’input.
teorema di Church: non esiste un algoritmo che decide se una qualsiasi
formula della logica del 1◦ ordine sia dimostrabile o meno.
10◦ problema di Hilbert: non esiste un algoritmo che decide se una qualsiasi
equazione diofantina (a coefficienti interi) ammetta una soluzione intera.
...
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
8 / 30
Funzioni non calcolabili
Esistono funzioni non calcolabili (indipendentemente dal modello di calcolo, se si
accetta la tesi di Church
limite intrinseco della calcolabilità). Esempi:
L’insieme R delle funzioni ricorsive totali da N in N è infinito numerabile.
L’insieme NN delle funzioni totali da N in N è più che numerabile (2ℵ0 )
R ( NN i.e. esistono funzioni totali da N in N non ricorsive (anzi, le
funzioni totali non ricorsive sono “di più” delle ricorsive).
Fissata un’enumerazione ϕ0 , ϕ1 , ϕ2 , . . . delle funzioni ricorsive totali da N in
N, la funzione g : N2 → N definita da g (m, n) = ϕm (n) non è ricorsiva.
Il problema della fermata: non esiste un algoritmo che, dato un qualsiasi
programma e un qualsiasi input, decide se il programma terminerà quando
viene lanciato con quell’input.
teorema di Church: non esiste un algoritmo che decide se una qualsiasi
formula della logica del 1◦ ordine sia dimostrabile o meno.
10◦ problema di Hilbert: non esiste un algoritmo che decide se una qualsiasi
equazione diofantina (a coefficienti interi) ammetta una soluzione intera.
...
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
8 / 30
Funzioni non calcolabili
Esistono funzioni non calcolabili (indipendentemente dal modello di calcolo, se si
accetta la tesi di Church
limite intrinseco della calcolabilità). Esempi:
L’insieme R delle funzioni ricorsive totali da N in N è infinito numerabile.
L’insieme NN delle funzioni totali da N in N è più che numerabile (2ℵ0 )
R ( NN i.e. esistono funzioni totali da N in N non ricorsive (anzi, le
funzioni totali non ricorsive sono “di più” delle ricorsive).
Fissata un’enumerazione ϕ0 , ϕ1 , ϕ2 , . . . delle funzioni ricorsive totali da N in
N, la funzione g : N2 → N definita da g (m, n) = ϕm (n) non è ricorsiva.
Il problema della fermata: non esiste un algoritmo che, dato un qualsiasi
programma e un qualsiasi input, decide se il programma terminerà quando
viene lanciato con quell’input.
teorema di Church: non esiste un algoritmo che decide se una qualsiasi
formula della logica del 1◦ ordine sia dimostrabile o meno.
10◦ problema di Hilbert: non esiste un algoritmo che decide se una qualsiasi
equazione diofantina (a coefficienti interi) ammetta una soluzione intera.
...
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
8 / 30
Funzioni non calcolabili
Esistono funzioni non calcolabili (indipendentemente dal modello di calcolo, se si
accetta la tesi di Church
limite intrinseco della calcolabilità). Esempi:
L’insieme R delle funzioni ricorsive totali da N in N è infinito numerabile.
L’insieme NN delle funzioni totali da N in N è più che numerabile (2ℵ0 )
R ( NN i.e. esistono funzioni totali da N in N non ricorsive (anzi, le
funzioni totali non ricorsive sono “di più” delle ricorsive).
Fissata un’enumerazione ϕ0 , ϕ1 , ϕ2 , . . . delle funzioni ricorsive totali da N in
N, la funzione g : N2 → N definita da g (m, n) = ϕm (n) non è ricorsiva.
Il problema della fermata: non esiste un algoritmo che, dato un qualsiasi
programma e un qualsiasi input, decide se il programma terminerà quando
viene lanciato con quell’input.
teorema di Church: non esiste un algoritmo che decide se una qualsiasi
formula della logica del 1◦ ordine sia dimostrabile o meno.
10◦ problema di Hilbert: non esiste un algoritmo che decide se una qualsiasi
equazione diofantina (a coefficienti interi) ammetta una soluzione intera.
...
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
8 / 30
Funzioni non calcolabili
Esistono funzioni non calcolabili (indipendentemente dal modello di calcolo, se si
accetta la tesi di Church
limite intrinseco della calcolabilità). Esempi:
L’insieme R delle funzioni ricorsive totali da N in N è infinito numerabile.
L’insieme NN delle funzioni totali da N in N è più che numerabile (2ℵ0 )
R ( NN i.e. esistono funzioni totali da N in N non ricorsive (anzi, le
funzioni totali non ricorsive sono “di più” delle ricorsive).
Fissata un’enumerazione ϕ0 , ϕ1 , ϕ2 , . . . delle funzioni ricorsive totali da N in
N, la funzione g : N2 → N definita da g (m, n) = ϕm (n) non è ricorsiva.
Il problema della fermata: non esiste un algoritmo che, dato un qualsiasi
programma e un qualsiasi input, decide se il programma terminerà quando
viene lanciato con quell’input.
teorema di Church: non esiste un algoritmo che decide se una qualsiasi
formula della logica del 1◦ ordine sia dimostrabile o meno.
10◦ problema di Hilbert: non esiste un algoritmo che decide se una qualsiasi
equazione diofantina (a coefficienti interi) ammetta una soluzione intera.
...
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
8 / 30
Indice
1
Introduzione
2
Il λ-calcolo puro
3
Alcune rappresentazioni nel λ-calcolo puro
4
La deduzione naturale intuizionista
5
L’isomorfismo di Curry-Howard
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
9 / 30
Alcune osservazioni sulle funzioni
Consideriamo due funzioni id : N → N e sqadd : N×N → N tali che:
sqadd(x, y ) = x ·x + y ·y
id(x) = x
1
I nomi delle funzioni non sono essenziali, possono essere sostituiti da una
descrizione concisa di che cosa associa la funzione:
id(x) = x
!
x 7→ x
!
λx x
sqadd(x) = x ·x + y ·y ! (x, y ) 7→ x ·x + y ·y ! λxλy (x ·x + y ·y )
2
Il nome degli argomenti delle funzioni è (in larga parte) irrilevante :
x 7→ x = y →
7 y
!
λx x = λy y
(x, y ) 7→ x ·x + y ·y = (u, v ) 7→ u·u + v ·v 6= (x, x) 7→ x ·x + x ·x
3
Una funzione di due argomenti è equivalente a una funzione di un solo
argomento che restituisce un’altra funzione di un solo argomento
(curryficazione, generalizzabile alle funzioni con un numero arbitrario di
argomenti):
(x, y ) 7→ x ·x + y ·y
=
x 7→ (y 7→ x ·x + y ·y )
Es.
((x, y ) 7→ x ·x + y ·y )(5, 2) = 5·5 + 2·2 = 29
!
((x 7→ (y 7→ x ·x + y ·y ))(5))(2) = (y 7→ 5·5 + y ·y )(2) = 5·5 + 2·2 = 29
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
10 / 30
Alcune osservazioni sulle funzioni
Consideriamo due funzioni id : N → N e sqadd : N×N → N tali che:
sqadd(x, y ) = x ·x + y ·y
id(x) = x
1
I nomi delle funzioni non sono essenziali, possono essere sostituiti da una
descrizione concisa di che cosa associa la funzione:
id(x) = x
!
x 7→ x
!
λx x
sqadd(x) = x ·x + y ·y ! (x, y ) 7→ x ·x + y ·y ! λxλy (x ·x + y ·y )
2
Il nome degli argomenti delle funzioni è (in larga parte) irrilevante :
x 7→ x = y →
7 y
!
λx x = λy y
(x, y ) 7→ x ·x + y ·y = (u, v ) 7→ u·u + v ·v 6= (x, x) 7→ x ·x + x ·x
3
Una funzione di due argomenti è equivalente a una funzione di un solo
argomento che restituisce un’altra funzione di un solo argomento
(curryficazione, generalizzabile alle funzioni con un numero arbitrario di
argomenti):
(x, y ) 7→ x ·x + y ·y
=
x 7→ (y 7→ x ·x + y ·y )
Es.
((x, y ) 7→ x ·x + y ·y )(5, 2) = 5·5 + 2·2 = 29
!
((x 7→ (y 7→ x ·x + y ·y ))(5))(2) = (y 7→ 5·5 + y ·y )(2) = 5·5 + 2·2 = 29
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
10 / 30
Alcune osservazioni sulle funzioni
Consideriamo due funzioni id : N → N e sqadd : N×N → N tali che:
sqadd(x, y ) = x ·x + y ·y
id(x) = x
1
I nomi delle funzioni non sono essenziali, possono essere sostituiti da una
descrizione concisa di che cosa associa la funzione:
id(x) = x
!
x 7→ x
!
λx x
sqadd(x) = x ·x + y ·y ! (x, y ) 7→ x ·x + y ·y ! λxλy (x ·x + y ·y )
2
Il nome degli argomenti delle funzioni è (in larga parte) irrilevante :
x 7→ x = y →
7 y
!
λx x = λy y
(x, y ) 7→ x ·x + y ·y = (u, v ) 7→ u·u + v ·v 6= (x, x) 7→ x ·x + x ·x
3
Una funzione di due argomenti è equivalente a una funzione di un solo
argomento che restituisce un’altra funzione di un solo argomento
(curryficazione, generalizzabile alle funzioni con un numero arbitrario di
argomenti):
(x, y ) 7→ x ·x + y ·y
=
x 7→ (y 7→ x ·x + y ·y )
Es.
((x, y ) 7→ x ·x + y ·y )(5, 2) = 5·5 + 2·2 = 29
!
((x 7→ (y 7→ x ·x + y ·y ))(5))(2) = (y 7→ 5·5 + y ·y )(2) = 5·5 + 2·2 = 29
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
10 / 30
Alcune osservazioni sulle funzioni
Consideriamo due funzioni id : N → N e sqadd : N×N → N tali che:
sqadd(x, y ) = x ·x + y ·y
id(x) = x
1
I nomi delle funzioni non sono essenziali, possono essere sostituiti da una
descrizione concisa di che cosa associa la funzione:
id(x) = x
!
x 7→ x
!
λx x
sqadd(x) = x ·x + y ·y ! (x, y ) 7→ x ·x + y ·y ! λxλy (x ·x + y ·y )
2
Il nome degli argomenti delle funzioni è (in larga parte) irrilevante :
x 7→ x = y →
7 y
!
λx x = λy y
(x, y ) 7→ x ·x + y ·y = (u, v ) 7→ u·u + v ·v 6= (x, x) 7→ x ·x + x ·x
3
Una funzione di due argomenti è equivalente a una funzione di un solo
argomento che restituisce un’altra funzione di un solo argomento
(curryficazione, generalizzabile alle funzioni con un numero arbitrario di
argomenti):
(x, y ) 7→ x ·x + y ·y
=
x 7→ (y 7→ x ·x + y ·y )
Es.
((x, y ) 7→ x ·x + y ·y )(5, 2) = 5·5 + 2·2 = 29
!
((x 7→ (y 7→ x ·x + y ·y ))(5))(2) = (y 7→ 5·5 + y ·y )(2) = 5·5 + 2·2 = 29
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
10 / 30
Alcune osservazioni sulle funzioni
Consideriamo due funzioni id : N → N e sqadd : N×N → N tali che:
sqadd(x, y ) = x ·x + y ·y
id(x) = x
1
I nomi delle funzioni non sono essenziali, possono essere sostituiti da una
descrizione concisa di che cosa associa la funzione:
id(x) = x
!
x 7→ x
!
λx x
sqadd(x) = x ·x + y ·y ! (x, y ) 7→ x ·x + y ·y ! λxλy (x ·x + y ·y )
2
Il nome degli argomenti delle funzioni è (in larga parte) irrilevante :
x 7→ x = y →
7 y
!
λx x = λy y
(x, y ) 7→ x ·x + y ·y = (u, v ) 7→ u·u + v ·v 6= (x, x) 7→ x ·x + x ·x
3
Una funzione di due argomenti è equivalente a una funzione di un solo
argomento che restituisce un’altra funzione di un solo argomento
(curryficazione, generalizzabile alle funzioni con un numero arbitrario di
argomenti):
(x, y ) 7→ x ·x + y ·y
=
x 7→ (y 7→ x ·x + y ·y )
Es.
((x, y ) 7→ x ·x + y ·y )(5, 2) = 5·5 + 2·2 = 29
!
((x 7→ (y 7→ x ·x + y ·y ))(5))(2) = (y 7→ 5·5 + y ·y )(2) = 5·5 + 2·2 = 29
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
10 / 30
Un’idea (molto) intuitiva del λ-calcolo
λ-calcolo = linguaggio di programmazione (funzionale)
λ-termini (i.e. stringhe sintatticamente ben formate) = programmi
β-riduzione (i.e. regola di riscrittura dei λ-termini) = passo di calcolo (i.e.
esecuzione del programma)
Idea di base: tutto è funzione!
Una funzione può ricevere in argomento una funzione qualsiasi (anche se
stessa!)
nei λ-termini, una variabile rappresenta una funzione generica.
Una funzione M può essere applicata a un “valore” N in input (esso stesso
una funzione)
sui λ-termini è definita un’operazione di applicazione: MN.
A partire da una stringa M si può creare la funzione x 7→ M(x) che alla
variabile x (che può occorrere o meno in M) associa la stringa M
sui
λ-termini è definita un’operazione di astrazione: λx M.
Una stringa della forma (λx M)N rappresenta la funzione x 7→ M(x)
applicata a N, il cui risultato è M[N/x] (M in cui le occorrenze libere di x
sono state sostituite da N)
nel λ-calcolo è definita un’operazione di
riscrittura (la β-riduzione): (λx M)N → M[N/x]
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
11 / 30
Un’idea (molto) intuitiva del λ-calcolo
λ-calcolo = linguaggio di programmazione (funzionale)
λ-termini (i.e. stringhe sintatticamente ben formate) = programmi
β-riduzione (i.e. regola di riscrittura dei λ-termini) = passo di calcolo (i.e.
esecuzione del programma)
Idea di base: tutto è funzione!
Una funzione può ricevere in argomento una funzione qualsiasi (anche se
stessa!)
nei λ-termini, una variabile rappresenta una funzione generica.
Una funzione M può essere applicata a un “valore” N in input (esso stesso
una funzione)
sui λ-termini è definita un’operazione di applicazione: MN.
A partire da una stringa M si può creare la funzione x 7→ M(x) che alla
variabile x (che può occorrere o meno in M) associa la stringa M
sui
λ-termini è definita un’operazione di astrazione: λx M.
Una stringa della forma (λx M)N rappresenta la funzione x 7→ M(x)
applicata a N, il cui risultato è M[N/x] (M in cui le occorrenze libere di x
sono state sostituite da N)
nel λ-calcolo è definita un’operazione di
riscrittura (la β-riduzione): (λx M)N → M[N/x]
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
11 / 30
Un’idea (molto) intuitiva del λ-calcolo
λ-calcolo = linguaggio di programmazione (funzionale)
λ-termini (i.e. stringhe sintatticamente ben formate) = programmi
β-riduzione (i.e. regola di riscrittura dei λ-termini) = passo di calcolo (i.e.
esecuzione del programma)
Idea di base: tutto è funzione!
Una funzione può ricevere in argomento una funzione qualsiasi (anche se
stessa!)
nei λ-termini, una variabile rappresenta una funzione generica.
Una funzione M può essere applicata a un “valore” N in input (esso stesso
una funzione)
sui λ-termini è definita un’operazione di applicazione: MN.
A partire da una stringa M si può creare la funzione x 7→ M(x) che alla
variabile x (che può occorrere o meno in M) associa la stringa M
sui
λ-termini è definita un’operazione di astrazione: λx M.
Una stringa della forma (λx M)N rappresenta la funzione x 7→ M(x)
applicata a N, il cui risultato è M[N/x] (M in cui le occorrenze libere di x
sono state sostituite da N)
nel λ-calcolo è definita un’operazione di
riscrittura (la β-riduzione): (λx M)N → M[N/x]
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
11 / 30
Un’idea (molto) intuitiva del λ-calcolo
λ-calcolo = linguaggio di programmazione (funzionale)
λ-termini (i.e. stringhe sintatticamente ben formate) = programmi
β-riduzione (i.e. regola di riscrittura dei λ-termini) = passo di calcolo (i.e.
esecuzione del programma)
Idea di base: tutto è funzione!
Una funzione può ricevere in argomento una funzione qualsiasi (anche se
stessa!)
nei λ-termini, una variabile rappresenta una funzione generica.
Una funzione M può essere applicata a un “valore” N in input (esso stesso
una funzione)
sui λ-termini è definita un’operazione di applicazione: MN.
A partire da una stringa M si può creare la funzione x 7→ M(x) che alla
variabile x (che può occorrere o meno in M) associa la stringa M
sui
λ-termini è definita un’operazione di astrazione: λx M.
Una stringa della forma (λx M)N rappresenta la funzione x 7→ M(x)
applicata a N, il cui risultato è M[N/x] (M in cui le occorrenze libere di x
sono state sostituite da N)
nel λ-calcolo è definita un’operazione di
riscrittura (la β-riduzione): (λx M)N → M[N/x]
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
11 / 30
Un’idea (molto) intuitiva del λ-calcolo
λ-calcolo = linguaggio di programmazione (funzionale)
λ-termini (i.e. stringhe sintatticamente ben formate) = programmi
β-riduzione (i.e. regola di riscrittura dei λ-termini) = passo di calcolo (i.e.
esecuzione del programma)
Idea di base: tutto è funzione!
Una funzione può ricevere in argomento una funzione qualsiasi (anche se
stessa!)
nei λ-termini, una variabile rappresenta una funzione generica.
Una funzione M può essere applicata a un “valore” N in input (esso stesso
una funzione)
sui λ-termini è definita un’operazione di applicazione: MN.
A partire da una stringa M si può creare la funzione x 7→ M(x) che alla
variabile x (che può occorrere o meno in M) associa la stringa M
sui
λ-termini è definita un’operazione di astrazione: λx M.
Una stringa della forma (λx M)N rappresenta la funzione x 7→ M(x)
applicata a N, il cui risultato è M[N/x] (M in cui le occorrenze libere di x
sono state sostituite da N)
nel λ-calcolo è definita un’operazione di
riscrittura (la β-riduzione): (λx M)N → M[N/x]
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
11 / 30
La sintassi del λ-calcolo: i λ-termini
Fissiamo un insieme infinito numerabile V di variabili, denotate con x, y , z, . . .
Definizione (per induzione) dell’insieme Λ dei λ-termini:
variabile: se x ∈ V, allora x è un λ-termine;
applicazione: se M e N sono λ-termini, allora MN è un λ-termine;
astrazione: se M è un λ-termine e x ∈ V, allora λx M è un λ-termine.
Più brevemente:
M ::= x | MM | λx M
Notazione: per ogni p ∈ N, MN1 N2 . . . Np denota il λ-termine (· · · ((MN1 )N2 ) · · · )Np , in
particolare per p = 0 denota il λ-termine M.
Es.
z, xxz, λx x, (λx x)y , λx y , λzλx y , λx yy , (λx y )x(λz z)z, λf λx f (f (fx))
Idea intuitiva:
λx x rappresenta la funzione identità x 7→ x
(λx x)y rappresenta la funzione identità applicata a y
λx y rappresenta la funzione costante x 7→ y , che restituisce y qualsiasi sia l’input
λzλx y rappresenta la funzione z 7→ (x 7→ y ) i.e., via curryficazione, la funzione
costante (con due argomenti) (z, x) 7→ y
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
12 / 30
La sintassi del λ-calcolo: i λ-termini
Fissiamo un insieme infinito numerabile V di variabili, denotate con x, y , z, . . .
Definizione (per induzione) dell’insieme Λ dei λ-termini:
variabile: se x ∈ V, allora x è un λ-termine;
applicazione: se M e N sono λ-termini, allora MN è un λ-termine;
astrazione: se M è un λ-termine e x ∈ V, allora λx M è un λ-termine.
Più brevemente:
M ::= x | MM | λx M
Notazione: per ogni p ∈ N, MN1 N2 . . . Np denota il λ-termine (· · · ((MN1 )N2 ) · · · )Np , in
particolare per p = 0 denota il λ-termine M.
Es.
z, xxz, λx x, (λx x)y , λx y , λzλx y , λx yy , (λx y )x(λz z)z, λf λx f (f (fx))
Idea intuitiva:
λx x rappresenta la funzione identità x 7→ x
(λx x)y rappresenta la funzione identità applicata a y
λx y rappresenta la funzione costante x 7→ y , che restituisce y qualsiasi sia l’input
λzλx y rappresenta la funzione z 7→ (x 7→ y ) i.e., via curryficazione, la funzione
costante (con due argomenti) (z, x) 7→ y
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
12 / 30
La sintassi del λ-calcolo: variabili libere e legate
Definiamo per induzione le occorrenze libere di una variabile x in un
λ-termine M:
I
I
I
se M = x, allora l’occorrenza di x in M è libera;
se M = PQ, allora le occorrenze libere di x in M sono quelle di x in P e in Q;
se M = λy N, le occorrenze libere di x in M sono quelle di x in N, tranne se
x = y ; in questo caso, nessuna occorrenza di x in M è libera.
Una variabile libera di M è una variabile che ha almeno una occorrenza libera
in M; denotiamo con FV (M) l’insieme delle variabili libere di M.
Un λ-termine M è chiuso se FV (M) = ∅ (cioè se M non ha variabili libere).
Una variabile legata di M è una variabile che occorre in M subito dopo un λ;
denotiamo con BV (M) l’insieme delle variabili legate di M.
NB: FV (M) e BV (M) non sono necessariamente complementari: la loro
intersezione può non essere vuota.
Es. M = (λx y x)x : x è un’occorrenza libera della variabile x, x non è
un’occorrenza libera di x (x è legata dal λ), FV (M) = {x, y }, BV (M) = {x}.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
13 / 30
La sintassi del λ-calcolo: variabili libere e legate
Definiamo per induzione le occorrenze libere di una variabile x in un
λ-termine M:
I
I
I
se M = x, allora l’occorrenza di x in M è libera;
se M = PQ, allora le occorrenze libere di x in M sono quelle di x in P e in Q;
se M = λy N, le occorrenze libere di x in M sono quelle di x in N, tranne se
x = y ; in questo caso, nessuna occorrenza di x in M è libera.
Una variabile libera di M è una variabile che ha almeno una occorrenza libera
in M; denotiamo con FV (M) l’insieme delle variabili libere di M.
Un λ-termine M è chiuso se FV (M) = ∅ (cioè se M non ha variabili libere).
Una variabile legata di M è una variabile che occorre in M subito dopo un λ;
denotiamo con BV (M) l’insieme delle variabili legate di M.
NB: FV (M) e BV (M) non sono necessariamente complementari: la loro
intersezione può non essere vuota.
Es. M = (λx y x)x : x è un’occorrenza libera della variabile x, x non è
un’occorrenza libera di x (x è legata dal λ), FV (M) = {x, y }, BV (M) = {x}.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
13 / 30
La sintassi del λ-calcolo: variabili libere e legate
Definiamo per induzione le occorrenze libere di una variabile x in un
λ-termine M:
I
I
I
se M = x, allora l’occorrenza di x in M è libera;
se M = PQ, allora le occorrenze libere di x in M sono quelle di x in P e in Q;
se M = λy N, le occorrenze libere di x in M sono quelle di x in N, tranne se
x = y ; in questo caso, nessuna occorrenza di x in M è libera.
Una variabile libera di M è una variabile che ha almeno una occorrenza libera
in M; denotiamo con FV (M) l’insieme delle variabili libere di M.
Un λ-termine M è chiuso se FV (M) = ∅ (cioè se M non ha variabili libere).
Una variabile legata di M è una variabile che occorre in M subito dopo un λ;
denotiamo con BV (M) l’insieme delle variabili legate di M.
NB: FV (M) e BV (M) non sono necessariamente complementari: la loro
intersezione può non essere vuota.
Es. M = (λx y x)x : x è un’occorrenza libera della variabile x, x non è
un’occorrenza libera di x (x è legata dal λ), FV (M) = {x, y }, BV (M) = {x}.
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
13 / 30
La sintassi del λ-calcolo: l’α-equivalenza
Due λ-termini M e M 0 sono α-equivalenti (M ≡α M 0 ) se M 0 è ottenuto da M
rinominando le variabili legate di M, a condizione che le nuove variabili legate in
M 0 non siano libere in M.
Più precisamente, M ≡α M 0 sse si verificano le seguenti condizioni:
1
M e M 0 sono la stessa sequenza di simboli (quando tutte le variabili sono
considerate uguali),
2
M e M 0 hanno le stesse occorrenze libere delle stesse variabili,
3
ciascun λ lega le stesse occorrenze di variabili in M e in M 0 .
Es.
λx x ≡α λy y
e
λx xz ≡α λy yz
ma
x 6≡α y
e
λx xz 6≡α λz zz
Intuitivamente: le variabili legate sono variabili mute, due λ-termini α-equivalenti
rappresentano la stessa funzione.
Es. λx x e λy y rappresentano risp. x 7→ x e y 7→ y cioè la stessa funzione identità.
Ma λx xz e λz zz rappresentano risp. x 7→ xz e z 7→ zz, due funzioni distinte!
Nel seguito, identificheremo i λ-termini α-equivalenti (
realtà Λ/≡α ).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
d’ora in avanti, Λ è in
25 marzo 2011
14 / 30
La sintassi del λ-calcolo: l’α-equivalenza
Due λ-termini M e M 0 sono α-equivalenti (M ≡α M 0 ) se M 0 è ottenuto da M
rinominando le variabili legate di M, a condizione che le nuove variabili legate in
M 0 non siano libere in M.
Più precisamente, M ≡α M 0 sse si verificano le seguenti condizioni:
1
M e M 0 sono la stessa sequenza di simboli (quando tutte le variabili sono
considerate uguali),
2
M e M 0 hanno le stesse occorrenze libere delle stesse variabili,
3
ciascun λ lega le stesse occorrenze di variabili in M e in M 0 .
Es.
λx x ≡α λy y
e
λx xz ≡α λy yz
ma
x 6≡α y
e
λx xz 6≡α λz zz
Intuitivamente: le variabili legate sono variabili mute, due λ-termini α-equivalenti
rappresentano la stessa funzione.
Es. λx x e λy y rappresentano risp. x 7→ x e y 7→ y cioè la stessa funzione identità.
Ma λx xz e λz zz rappresentano risp. x 7→ xz e z 7→ zz, due funzioni distinte!
Nel seguito, identificheremo i λ-termini α-equivalenti (
realtà Λ/≡α ).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
d’ora in avanti, Λ è in
25 marzo 2011
14 / 30
La sintassi del λ-calcolo: l’α-equivalenza
Due λ-termini M e M 0 sono α-equivalenti (M ≡α M 0 ) se M 0 è ottenuto da M
rinominando le variabili legate di M, a condizione che le nuove variabili legate in
M 0 non siano libere in M.
Più precisamente, M ≡α M 0 sse si verificano le seguenti condizioni:
1
M e M 0 sono la stessa sequenza di simboli (quando tutte le variabili sono
considerate uguali),
2
M e M 0 hanno le stesse occorrenze libere delle stesse variabili,
3
ciascun λ lega le stesse occorrenze di variabili in M e in M 0 .
Es.
λx x ≡α λy y
e
λx xz ≡α λy yz
ma
x 6≡α y
e
λx xz 6≡α λz zz
Intuitivamente: le variabili legate sono variabili mute, due λ-termini α-equivalenti
rappresentano la stessa funzione.
Es. λx x e λy y rappresentano risp. x 7→ x e y 7→ y cioè la stessa funzione identità.
Ma λx xz e λz zz rappresentano risp. x 7→ xz e z 7→ zz, due funzioni distinte!
Nel seguito, identificheremo i λ-termini α-equivalenti (
realtà Λ/≡α ).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
d’ora in avanti, Λ è in
25 marzo 2011
14 / 30
La sintassi del λ-calcolo: l’α-equivalenza
Due λ-termini M e M 0 sono α-equivalenti (M ≡α M 0 ) se M 0 è ottenuto da M
rinominando le variabili legate di M, a condizione che le nuove variabili legate in
M 0 non siano libere in M.
Più precisamente, M ≡α M 0 sse si verificano le seguenti condizioni:
1
M e M 0 sono la stessa sequenza di simboli (quando tutte le variabili sono
considerate uguali),
2
M e M 0 hanno le stesse occorrenze libere delle stesse variabili,
3
ciascun λ lega le stesse occorrenze di variabili in M e in M 0 .
Es.
λx x ≡α λy y
e
λx xz ≡α λy yz
ma
x 6≡α y
e
λx xz 6≡α λz zz
Intuitivamente: le variabili legate sono variabili mute, due λ-termini α-equivalenti
rappresentano la stessa funzione.
Es. λx x e λy y rappresentano risp. x 7→ x e y 7→ y cioè la stessa funzione identità.
Ma λx xz e λz zz rappresentano risp. x 7→ xz e z 7→ zz, due funzioni distinte!
Nel seguito, identificheremo i λ-termini α-equivalenti (
realtà Λ/≡α ).
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
d’ora in avanti, Λ è in
25 marzo 2011
14 / 30
La sintassi del λ-calcolo: le sostituzioni
Denotiamo con M[N/x] il λ-termine ottenuto a partire da M sostituendo tutte le
occorrenze libere di x con N, facendo attenzione che le variabili libere di N non vengano
legate dalle astrazioni di M (cattura di variabile). Più precisamente:
se M = x allora M[N/x] = N;
se M = y 6= x allora M[N/x] = y ;
se M = PQ allora M[N/x] = (P[N/x])Q[N/x];
se M = λy P allora M[N/x] = λy (P[N/x]), purché y 6= x e y 6∈ FV (N);
Le condizioni su y all’ultimo punto possono essere sempre soddisfatte rimpiazzando M
con un opportuno λ-termine che gli è α-equivalente.
Es. 1
λy x ≡α λz x
quindi
(λy x)[y /x] = ?
(λy x)[y /x] = (λz x)[y /x] = λz (x[y /x]) = λz y
La condizione y 6∈ FV (M) è cruciale per assicurare che la sostituzione di variabili non
cambi il significato della funzione rappresentata da M.
Es. 2
Se la sostituzione non rispettasse la condizione y 6∈ FV (M), allora:
(λy x)[y /x] = λy (x[y /x]) = λy y
la funzione costante y 7→ x verrebbe trasformata nella funzione identità y 7→ y !
NB: Nell’es. 1 la sostituzione [y /x] trasforma la funzione costante y 7→ x nella funzione
costante z 7→ y come è giusto che sia!
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
15 / 30
La sintassi del λ-calcolo: le sostituzioni
Denotiamo con M[N/x] il λ-termine ottenuto a partire da M sostituendo tutte le
occorrenze libere di x con N, facendo attenzione che le variabili libere di N non vengano
legate dalle astrazioni di M (cattura di variabile). Più precisamente:
se M = x allora M[N/x] = N;
se M = y 6= x allora M[N/x] = y ;
se M = PQ allora M[N/x] = (P[N/x])Q[N/x];
se M = λy P allora M[N/x] = λy (P[N/x]), purché y 6= x e y 6∈ FV (N);
Le condizioni su y all’ultimo punto possono essere sempre soddisfatte rimpiazzando M
con un opportuno λ-termine che gli è α-equivalente.
Es. 1
λy x ≡α λz x
quindi
(λy x)[y /x] = ?
(λy x)[y /x] = (λz x)[y /x] = λz (x[y /x]) = λz y
La condizione y 6∈ FV (M) è cruciale per assicurare che la sostituzione di variabili non
cambi il significato della funzione rappresentata da M.
Es. 2
Se la sostituzione non rispettasse la condizione y 6∈ FV (M), allora:
(λy x)[y /x] = λy (x[y /x]) = λy y
la funzione costante y 7→ x verrebbe trasformata nella funzione identità y 7→ y !
NB: Nell’es. 1 la sostituzione [y /x] trasforma la funzione costante y 7→ x nella funzione
costante z 7→ y come è giusto che sia!
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
15 / 30
La sintassi del λ-calcolo: le sostituzioni
Denotiamo con M[N/x] il λ-termine ottenuto a partire da M sostituendo tutte le
occorrenze libere di x con N, facendo attenzione che le variabili libere di N non vengano
legate dalle astrazioni di M (cattura di variabile). Più precisamente:
se M = x allora M[N/x] = N;
se M = y 6= x allora M[N/x] = y ;
se M = PQ allora M[N/x] = (P[N/x])Q[N/x];
se M = λy P allora M[N/x] = λy (P[N/x]), purché y 6= x e y 6∈ FV (N);
Le condizioni su y all’ultimo punto possono essere sempre soddisfatte rimpiazzando M
con un opportuno λ-termine che gli è α-equivalente.
Es. 1
λy x ≡α λz x
quindi
(λy x)[y /x] = ?
(λy x)[y /x] = (λz x)[y /x] = λz (x[y /x]) = λz y
La condizione y 6∈ FV (M) è cruciale per assicurare che la sostituzione di variabili non
cambi il significato della funzione rappresentata da M.
Es. 2
Se la sostituzione non rispettasse la condizione y 6∈ FV (M), allora:
(λy x)[y /x] = λy (x[y /x]) = λy y
la funzione costante y 7→ x verrebbe trasformata nella funzione identità y 7→ y !
NB: Nell’es. 1 la sostituzione [y /x] trasforma la funzione costante y 7→ x nella funzione
costante z 7→ y come è giusto che sia!
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
15 / 30
La dinamica del λ-calcolo: la β-riduzione
1/2
Un redesso è un λ-termine della forma (λxM)N e un passo di β-riduzione consiste
nel trasformarlo in M[N/x], ma questa operazione di riscrittura può essere
effettuata ovunque in un λ-termine. Più precisamente:
Definizione (per induzione) di → ⊆ Λ2 (β-riduzione in un passo)
se M = x allora non esiste M 0 tale che M → M 0 ;
se M = λxN allora M → M 0 sse M 0 = λxN 0 e N → N 0
se M = PQ allora M → M 0 sse si verifica uno dei seguenti casi:
I
I
I
M 0 = P 0 Q con P → P 0
M 0 = PQ 0 con Q → Q 0
P = λxN e M 0 = N[Q/x]
(i.e. (λxN)Q → N[Q/x])
Se M → M 0 si dice che M si β-riduce in un passo in M 0
La β-riduzione, denotata con →∗ , è la chiusura riflessiva e transitiva di →:
M →∗ M 0 (M si β-riduce in M 0 ) se esiste una successione M0 , M1 , . . . , Mn−1 , Mn
tale che M = M0 , M 0 = Mn e Mi → Mi+1 per 1 ≤ i ≤ n−1 (con n ≥ 0)
M ∈ Λ è normale se non contiene redessi i.e. se non esiste M 0 tale che M → M 0
Es. x, zzy , λx x, λx z, z(λx xy ) sono λ-termini normali
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
16 / 30
La dinamica del λ-calcolo: la β-riduzione
1/2
Un redesso è un λ-termine della forma (λxM)N e un passo di β-riduzione consiste
nel trasformarlo in M[N/x], ma questa operazione di riscrittura può essere
effettuata ovunque in un λ-termine. Più precisamente:
Definizione (per induzione) di → ⊆ Λ2 (β-riduzione in un passo)
se M = x allora non esiste M 0 tale che M → M 0 ;
se M = λxN allora M → M 0 sse M 0 = λxN 0 e N → N 0
se M = PQ allora M → M 0 sse si verifica uno dei seguenti casi:
I
I
I
M 0 = P 0 Q con P → P 0
M 0 = PQ 0 con Q → Q 0
P = λxN e M 0 = N[Q/x]
(i.e. (λxN)Q → N[Q/x])
Se M → M 0 si dice che M si β-riduce in un passo in M 0
La β-riduzione, denotata con →∗ , è la chiusura riflessiva e transitiva di →:
M →∗ M 0 (M si β-riduce in M 0 ) se esiste una successione M0 , M1 , . . . , Mn−1 , Mn
tale che M = M0 , M 0 = Mn e Mi → Mi+1 per 1 ≤ i ≤ n−1 (con n ≥ 0)
M ∈ Λ è normale se non contiene redessi i.e. se non esiste M 0 tale che M → M 0
Es. x, zzy , λx x, λx z, z(λx xy ) sono λ-termini normali
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
16 / 30
La dinamica del λ-calcolo: la β-riduzione
1/2
Un redesso è un λ-termine della forma (λxM)N e un passo di β-riduzione consiste
nel trasformarlo in M[N/x], ma questa operazione di riscrittura può essere
effettuata ovunque in un λ-termine. Più precisamente:
Definizione (per induzione) di → ⊆ Λ2 (β-riduzione in un passo)
se M = x allora non esiste M 0 tale che M → M 0 ;
se M = λxN allora M → M 0 sse M 0 = λxN 0 e N → N 0
se M = PQ allora M → M 0 sse si verifica uno dei seguenti casi:
I
I
I
M 0 = P 0 Q con P → P 0
M 0 = PQ 0 con Q → Q 0
P = λxN e M 0 = N[Q/x]
(i.e. (λxN)Q → N[Q/x])
Se M → M 0 si dice che M si β-riduce in un passo in M 0
La β-riduzione, denotata con →∗ , è la chiusura riflessiva e transitiva di →:
M →∗ M 0 (M si β-riduce in M 0 ) se esiste una successione M0 , M1 , . . . , Mn−1 , Mn
tale che M = M0 , M 0 = Mn e Mi → Mi+1 per 1 ≤ i ≤ n−1 (con n ≥ 0)
M ∈ Λ è normale se non contiene redessi i.e. se non esiste M 0 tale che M → M 0
Es. x, zzy , λx x, λx z, z(λx xy ) sono λ-termini normali
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
16 / 30
La dinamica del λ-calcolo: la β-riduzione
1/2
Un redesso è un λ-termine della forma (λxM)N e un passo di β-riduzione consiste
nel trasformarlo in M[N/x], ma questa operazione di riscrittura può essere
effettuata ovunque in un λ-termine. Più precisamente:
Definizione (per induzione) di → ⊆ Λ2 (β-riduzione in un passo)
se M = x allora non esiste M 0 tale che M → M 0 ;
se M = λxN allora M → M 0 sse M 0 = λxN 0 e N → N 0
se M = PQ allora M → M 0 sse si verifica uno dei seguenti casi:
I
I
I
M 0 = P 0 Q con P → P 0
M 0 = PQ 0 con Q → Q 0
P = λxN e M 0 = N[Q/x]
(i.e. (λxN)Q → N[Q/x])
Se M → M 0 si dice che M si β-riduce in un passo in M 0
La β-riduzione, denotata con →∗ , è la chiusura riflessiva e transitiva di →:
M →∗ M 0 (M si β-riduce in M 0 ) se esiste una successione M0 , M1 , . . . , Mn−1 , Mn
tale che M = M0 , M 0 = Mn e Mi → Mi+1 per 1 ≤ i ≤ n−1 (con n ≥ 0)
M ∈ Λ è normale se non contiene redessi i.e. se non esiste M 0 tale che M → M 0
Es. x, zzy , λx x, λx z, z(λx xy ) sono λ-termini normali
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
16 / 30
La dinamica del λ-calcolo: la β-riduzione
2/2
0
M ∈ Λ è normalizzabile se esiste M normale tale che M →∗ M 0 ; si dice
allora che M 0 è una forma normale di M.
M ∈ Λ è fortemente normalizzabile se non esiste alcuna successione infinita
(Mi )i∈N tale che M = M0 e Mi → Mi+1 per ogni i ∈ N
NB:
un λ-termine M può contenere più redessi
da M possono partire più
sequenze di riduzione, per es. (λx y )Ω dove Ω = (λx xx)λx xx
se M è normale e M →∗ M 0 allora M = M 0
fortemente normalizzabile ⇒ normalizzabile
Idea intuitiva:
(λx1 . . . λxp M)N1 · · · Np ! programma M che attende p argomenti (input)
applicato agli input N1 , . . . , Np
β-riduzione ! passo di calcolo (i.e. esecuzione del programma): se M → M 0
allora M 0 è uno stadio più avanzato della computazione del programma M
λ-termine normale ! risultato di una computazione (output)
λ-termine non normalizzabile ! programma che cicla all’infinito
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
17 / 30
La dinamica del λ-calcolo: la β-riduzione
2/2
0
M ∈ Λ è normalizzabile se esiste M normale tale che M →∗ M 0 ; si dice
allora che M 0 è una forma normale di M.
M ∈ Λ è fortemente normalizzabile se non esiste alcuna successione infinita
(Mi )i∈N tale che M = M0 e Mi → Mi+1 per ogni i ∈ N
NB:
un λ-termine M può contenere più redessi
da M possono partire più
sequenze di riduzione, per es. (λx y )Ω dove Ω = (λx xx)λx xx
se M è normale e M →∗ M 0 allora M = M 0
fortemente normalizzabile ⇒ normalizzabile
Idea intuitiva:
(λx1 . . . λxp M)N1 · · · Np ! programma M che attende p argomenti (input)
applicato agli input N1 , . . . , Np
β-riduzione ! passo di calcolo (i.e. esecuzione del programma): se M → M 0
allora M 0 è uno stadio più avanzato della computazione del programma M
λ-termine normale ! risultato di una computazione (output)
λ-termine non normalizzabile ! programma che cicla all’infinito
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
17 / 30
La dinamica del λ-calcolo: la β-riduzione
2/2
0
M ∈ Λ è normalizzabile se esiste M normale tale che M →∗ M 0 ; si dice
allora che M 0 è una forma normale di M.
M ∈ Λ è fortemente normalizzabile se non esiste alcuna successione infinita
(Mi )i∈N tale che M = M0 e Mi → Mi+1 per ogni i ∈ N
NB:
un λ-termine M può contenere più redessi
da M possono partire più
sequenze di riduzione, per es. (λx y )Ω dove Ω = (λx xx)λx xx
se M è normale e M →∗ M 0 allora M = M 0
fortemente normalizzabile ⇒ normalizzabile
Idea intuitiva:
(λx1 . . . λxp M)N1 · · · Np ! programma M che attende p argomenti (input)
applicato agli input N1 , . . . , Np
β-riduzione ! passo di calcolo (i.e. esecuzione del programma): se M → M 0
allora M 0 è uno stadio più avanzato della computazione del programma M
λ-termine normale ! risultato di una computazione (output)
λ-termine non normalizzabile ! programma che cicla all’infinito
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
17 / 30
Esempi
1/2
(λx xx)λy y è fortemente normalizzabile: l’unica sequenza di riduzione
possibile termina
(λx xx)λy y → x[λy y /x]x[λy y /x] = (λy y )λy y → y [λy y /y ] = λy y
Ω = (λx xx)λy yy non è normalizzabile: l’unica sequenza di riduzione
possibile non termina
(λx xx)λy yy → x[λy yy /x]x[λy yy /x] = (λy yy )λy yy → . . .
i.e. Ω → Ω → . . .
(λx y )Ω è normalizzabile ma non fortemente: una sequenza di riduzione
termina, un’altra no
1
2
(λx y )Ω → y [Ω/x] = y
(λx y )((λz zz)λy yy ) → (λx y )((λz zz)λy yy ) → . . .
i.e. (λx y )Ω → (λx y )Ω → . . .
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
18 / 30
Esempi
1/2
(λx xx)λy y è fortemente normalizzabile: l’unica sequenza di riduzione
possibile termina
(λx xx)λy y → x[λy y /x]x[λy y /x] = (λy y )λy y → y [λy y /y ] = λy y
Ω = (λx xx)λy yy non è normalizzabile: l’unica sequenza di riduzione
possibile non termina
(λx xx)λy yy → x[λy yy /x]x[λy yy /x] = (λy yy )λy yy → . . .
i.e. Ω → Ω → . . .
(λx y )Ω è normalizzabile ma non fortemente: una sequenza di riduzione
termina, un’altra no
1
2
(λx y )Ω → y [Ω/x] = y
(λx y )((λz zz)λy yy ) → (λx y )((λz zz)λy yy ) → . . .
i.e. (λx y )Ω → (λx y )Ω → . . .
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
18 / 30
Esempi
1/2
(λx xx)λy y è fortemente normalizzabile: l’unica sequenza di riduzione
possibile termina
(λx xx)λy y → x[λy y /x]x[λy y /x] = (λy y )λy y → y [λy y /y ] = λy y
Ω = (λx xx)λy yy non è normalizzabile: l’unica sequenza di riduzione
possibile non termina
(λx xx)λy yy → x[λy yy /x]x[λy yy /x] = (λy yy )λy yy → . . .
i.e. Ω → Ω → . . .
(λx y )Ω è normalizzabile ma non fortemente: una sequenza di riduzione
termina, un’altra no
1
2
(λx y )Ω → y [Ω/x] = y
(λx y )((λz zz)λy yy ) → (λx y )((λz zz)λy yy ) → . . .
i.e. (λx y )Ω → (λx y )Ω → . . .
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
18 / 30
Esempi
1/2
(λx xx)λy y è fortemente normalizzabile: l’unica sequenza di riduzione
possibile termina
(λx xx)λy y → x[λy y /x]x[λy y /x] = (λy y )λy y → y [λy y /y ] = λy y
Ω = (λx xx)λy yy non è normalizzabile: l’unica sequenza di riduzione
possibile non termina
(λx xx)λy yy → x[λy yy /x]x[λy yy /x] = (λy yy )λy yy → . . .
i.e. Ω → Ω → . . .
(λx y )Ω è normalizzabile ma non fortemente: una sequenza di riduzione
termina, un’altra no
1
2
(λx y )Ω → y [Ω/x] = y
(λx y )((λz zz)λy yy ) → (λx y )((λz zz)λy yy ) → . . .
i.e. (λx y )Ω → (λx y )Ω → . . .
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
18 / 30
Esempi
1/2
(λx xx)λy y è fortemente normalizzabile: l’unica sequenza di riduzione
possibile termina
(λx xx)λy y → x[λy y /x]x[λy y /x] = (λy y )λy y → y [λy y /y ] = λy y
Ω = (λx xx)λy yy non è normalizzabile: l’unica sequenza di riduzione
possibile non termina
(λx xx)λy yy → x[λy yy /x]x[λy yy /x] = (λy yy )λy yy → . . .
i.e. Ω → Ω → . . .
(λx y )Ω è normalizzabile ma non fortemente: una sequenza di riduzione
termina, un’altra no
1
2
(λx y )Ω → y [Ω/x] = y
(λx y )((λz zz)λy yy ) → (λx y )((λz zz)λy yy ) → . . .
i.e. (λx y )Ω → (λx y )Ω → . . .
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
18 / 30
Esempi
2/2
Siano M,N, M1 , . . . , Mq λ-termini qualsiasi.
funzione identità I : x 7→ x
!
λx x
(λx x)M → x[M/x] = M
funzione costante unaria CN1 : x 7→ N
!
λx N
dove x ∈
/ FV (N)
(λx N)M → N[M/x] = N
funzione costante binaria CN2 : (x1 , x2 ) 7→ N
!
λx1 λx2 N dove x1 , x2 ∈
/ FV (N)
i.e.
x1 7→ (x2 7→ N)
(λx1 λx2 N)M1 M2 → (λx2 N[M1 /x1 ])M2 = (λx2 N)M2 → N[M2 /x2 ] = N
funzione proiezione Piq : (x1 , . . . , xq ) 7→ xi (con 1 ≤ i ≤ q)
!
λx1 . . . λxq xi
(λx1 . . . λxq xi )M1 · · ·Mq → (λx2 . . . λxq xi [M1 /x1 ])M2 · · ·Mq = (λx2 . . . λxq xi )M2 · · · Mq →∗
→∗ (λxi . . . λxq xi )Mi · · ·Mq → (λxi+1 . . . λxq xi [Mi /xi ])Mi+1 · · ·Mq = (λxi+1 . . . λxq Mi )Mi+1 · · ·Mq
→∗ (λxq Mi )Mq → Mi [Mq /xq ] = Mi
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
19 / 30
Esempi
2/2
Siano M,N, M1 , . . . , Mq λ-termini qualsiasi.
funzione identità I : x 7→ x
!
λx x
(λx x)M → x[M/x] = M
funzione costante unaria CN1 : x 7→ N
!
λx N
dove x ∈
/ FV (N)
(λx N)M → N[M/x] = N
funzione costante binaria CN2 : (x1 , x2 ) 7→ N
!
λx1 λx2 N dove x1 , x2 ∈
/ FV (N)
i.e.
x1 7→ (x2 7→ N)
(λx1 λx2 N)M1 M2 → (λx2 N[M1 /x1 ])M2 = (λx2 N)M2 → N[M2 /x2 ] = N
funzione proiezione Piq : (x1 , . . . , xq ) 7→ xi (con 1 ≤ i ≤ q)
!
λx1 . . . λxq xi
(λx1 . . . λxq xi )M1 · · ·Mq → (λx2 . . . λxq xi [M1 /x1 ])M2 · · ·Mq = (λx2 . . . λxq xi )M2 · · · Mq →∗
→∗ (λxi . . . λxq xi )Mi · · ·Mq → (λxi+1 . . . λxq xi [Mi /xi ])Mi+1 · · ·Mq = (λxi+1 . . . λxq Mi )Mi+1 · · ·Mq
→∗ (λxq Mi )Mq → Mi [Mq /xq ] = Mi
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
19 / 30
Esempi
2/2
Siano M,N, M1 , . . . , Mq λ-termini qualsiasi.
funzione identità I : x 7→ x
!
λx x
(λx x)M → x[M/x] = M
funzione costante unaria CN1 : x 7→ N
!
λx N
dove x ∈
/ FV (N)
(λx N)M → N[M/x] = N
funzione costante binaria CN2 : (x1 , x2 ) 7→ N
!
λx1 λx2 N dove x1 , x2 ∈
/ FV (N)
i.e.
x1 7→ (x2 7→ N)
(λx1 λx2 N)M1 M2 → (λx2 N[M1 /x1 ])M2 = (λx2 N)M2 → N[M2 /x2 ] = N
funzione proiezione Piq : (x1 , . . . , xq ) 7→ xi (con 1 ≤ i ≤ q)
!
λx1 . . . λxq xi
(λx1 . . . λxq xi )M1 · · ·Mq → (λx2 . . . λxq xi [M1 /x1 ])M2 · · ·Mq = (λx2 . . . λxq xi )M2 · · · Mq →∗
→∗ (λxi . . . λxq xi )Mi · · ·Mq → (λxi+1 . . . λxq xi [Mi /xi ])Mi+1 · · ·Mq = (λxi+1 . . . λxq Mi )Mi+1 · · ·Mq
→∗ (λxq Mi )Mq → Mi [Mq /xq ] = Mi
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
19 / 30
Esempi
2/2
Siano M,N, M1 , . . . , Mq λ-termini qualsiasi.
funzione identità I : x 7→ x
!
λx x
(λx x)M → x[M/x] = M
funzione costante unaria CN1 : x 7→ N
!
λx N
dove x ∈
/ FV (N)
(λx N)M → N[M/x] = N
funzione costante binaria CN2 : (x1 , x2 ) 7→ N
!
λx1 λx2 N dove x1 , x2 ∈
/ FV (N)
i.e.
x1 7→ (x2 7→ N)
(λx1 λx2 N)M1 M2 → (λx2 N[M1 /x1 ])M2 = (λx2 N)M2 → N[M2 /x2 ] = N
funzione proiezione Piq : (x1 , . . . , xq ) 7→ xi (con 1 ≤ i ≤ q)
!
λx1 . . . λxq xi
(λx1 . . . λxq xi )M1 · · ·Mq → (λx2 . . . λxq xi [M1 /x1 ])M2 · · ·Mq = (λx2 . . . λxq xi )M2 · · · Mq →∗
→∗ (λxi . . . λxq xi )Mi · · ·Mq → (λxi+1 . . . λxq xi [Mi /xi ])Mi+1 · · ·Mq = (λxi+1 . . . λxq Mi )Mi+1 · · ·Mq
→∗ (λxq Mi )Mq → Mi [Mq /xq ] = Mi
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
19 / 30
Confluenza e unicità della forma normale
Un λ-termine M può ammettere più sequenze di riduzione
Se M è normalizzabile, ci si può chiedere se coincidano le sue forme normali
ottenute con le diverse sequenze di riduzione
Idea intuitiva: ci si domanda se nel λ-calcolo
è garantita l’unicità del risultato (stesso output a parità di input)
è possibile modellizzare la modularità dei programmi
La risposta è positiva:
Teorema della confluenza (Church, Rosser, 1933)
Per ogni M, M1 , M2 ∈ Λ tale che M →∗ M1 e M →∗ M2 esiste N ∈ Λ tale che
M1 →∗ N e M2 →∗ N.
Corollario (unicità della forma normale)
Per ogni M ∈ Λ se M1 e M2 sono forme normali di M, allora M1 = M2
Dim. M →∗ M1 e M →∗ M2 , quindi per la confluenza esiste N tale che
M1 →∗ N e M2 →∗ N; poiché M1 e M2 sono normali, M1 = N = M2 .
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
20 / 30
Confluenza e unicità della forma normale
Un λ-termine M può ammettere più sequenze di riduzione
Se M è normalizzabile, ci si può chiedere se coincidano le sue forme normali
ottenute con le diverse sequenze di riduzione
Idea intuitiva: ci si domanda se nel λ-calcolo
è garantita l’unicità del risultato (stesso output a parità di input)
è possibile modellizzare la modularità dei programmi
La risposta è positiva:
Teorema della confluenza (Church, Rosser, 1933)
Per ogni M, M1 , M2 ∈ Λ tale che M →∗ M1 e M →∗ M2 esiste N ∈ Λ tale che
M1 →∗ N e M2 →∗ N.
Corollario (unicità della forma normale)
Per ogni M ∈ Λ se M1 e M2 sono forme normali di M, allora M1 = M2
Dim. M →∗ M1 e M →∗ M2 , quindi per la confluenza esiste N tale che
M1 →∗ N e M2 →∗ N; poiché M1 e M2 sono normali, M1 = N = M2 .
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
20 / 30
Confluenza e unicità della forma normale
Un λ-termine M può ammettere più sequenze di riduzione
Se M è normalizzabile, ci si può chiedere se coincidano le sue forme normali
ottenute con le diverse sequenze di riduzione
Idea intuitiva: ci si domanda se nel λ-calcolo
è garantita l’unicità del risultato (stesso output a parità di input)
è possibile modellizzare la modularità dei programmi
La risposta è positiva:
Teorema della confluenza (Church, Rosser, 1933)
Per ogni M, M1 , M2 ∈ Λ tale che M →∗ M1 e M →∗ M2 esiste N ∈ Λ tale che
M1 →∗ N e M2 →∗ N.
Corollario (unicità della forma normale)
Per ogni M ∈ Λ se M1 e M2 sono forme normali di M, allora M1 = M2
Dim. M →∗ M1 e M →∗ M2 , quindi per la confluenza esiste N tale che
M1 →∗ N e M2 →∗ N; poiché M1 e M2 sono normali, M1 = N = M2 .
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
20 / 30
Indice
1
Introduzione
2
Il λ-calcolo puro
3
Alcune rappresentazioni nel λ-calcolo puro
4
La deduzione naturale intuizionista
5
L’isomorfismo di Curry-Howard
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
21 / 30
La codifica della logica proposizionale
> := λxλy x (vero)
NB:
∀M, N ∈ Λ:
⊥ := λxλy y (falso)
>MN → (λyM)N → M
e
⊥MN → (λy y )N → N
(se. . .allora. . .altrimenti) if = ?
if BMN →∗
M
N
se B = >
se B = ⊥
(non) ¬ = ?
¬B →∗
⊥
>
se B = >
se B = ⊥
(e) ∧ = ?
∧B1 B2 →
∗
>
⊥
se B1 = B2 = >
se B1 = ⊥ o B2 = ⊥
>
⊥
se B1 = > o B2 = >
se B1 = B2 = ⊥
(o) ∨ = ?
∨B1 B2 →∗
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
22 / 30
La codifica della logica proposizionale
> := λxλy x (vero)
NB:
∀M, N ∈ Λ:
⊥ := λxλy y (falso)
>MN → (λyM)N → M
(se. . .allora. . .altrimenti) if = λpλxλy pxy
M
if BMN →∗
N
e
⊥MN → (λy y )N → N
se B = >
se B = ⊥
(non) ¬ = ?
¬B →∗
⊥
>
se B = >
se B = ⊥
(e) ∧ = ?
∧B1 B2 →
∗
>
⊥
se B1 = B2 = >
se B1 = ⊥ o B2 = ⊥
>
⊥
se B1 = > o B2 = >
se B1 = B2 = ⊥
(o) ∨ = ?
∨B1 B2 →∗
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
22 / 30
La codifica della logica proposizionale
> := λxλy x (vero)
NB:
∀M, N ∈ Λ:
⊥ := λxλy y (falso)
>MN → (λyM)N → M
(se. . .allora. . .altrimenti) if = λpλxλy pxy
M
if BMN →∗
N
e
⊥MN → (λy y )N → N
se B = >
se B = ⊥
(non) ¬ = λp p⊥>
¬B →∗
⊥
>
se B = >
se B = ⊥
(e) ∧ = ?
∧B1 B2 →
∗
>
⊥
se B1 = B2 = >
se B1 = ⊥ o B2 = ⊥
>
⊥
se B1 = > o B2 = >
se B1 = B2 = ⊥
(o) ∨ = ?
∨B1 B2 →∗
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
22 / 30
La codifica della logica proposizionale
> := λxλy x (vero)
NB:
∀M, N ∈ Λ:
⊥ := λxλy y (falso)
>MN → (λyM)N → M
(se. . .allora. . .altrimenti) if = λpλxλy pxy
M
if BMN →∗
N
e
⊥MN → (λy y )N → N
se B = >
se B = ⊥
(non) ¬ = λp p⊥>
¬B →∗
⊥
>
se B = >
se B = ⊥
(e) ∧ = λpλq pqp
∧B1 B2 →∗
>
⊥
se B1 = B2 = >
se B1 = ⊥ o B2 = ⊥
∨B1 B2 →∗
>
⊥
se B1 = > o B2 = >
se B1 = B2 = ⊥
(o) ∨ = ?
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
22 / 30
La codifica della logica proposizionale
> := λxλy x (vero)
NB:
∀M, N ∈ Λ:
⊥ := λxλy y (falso)
>MN → (λyM)N → M
(se. . .allora. . .altrimenti) if = λpλxλy pxy
M
if BMN →∗
N
e
⊥MN → (λy y )N → N
se B = >
se B = ⊥
(non) ¬ = λp p⊥>
¬B →∗
⊥
>
se B = >
se B = ⊥
(e) ∧ = λpλq pqp
∧B1 B2 →
∗
>
⊥
se B1 = B2 = >
se B1 = ⊥ o B2 = ⊥
>
⊥
se B1 = > o B2 = >
se B1 = B2 = ⊥
(o) ∨ = λpλq ppq
∨B1 B2 →∗
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
22 / 30
La codifica dell’aritmetica
1/3
Gli interi di Church: per ogni n ∈ N
n volte
z }| {
n := λf λx f x = λf λx f (f · · · (f x) · · · )
n
Per es. 0 = λf λx x 1 = λf λx fx 2 = λf λx f (fx)
Intuitivamente, un intero n è interpretato come una funzione che itera n volte la
funzione che gli viene applicata, infatti:
n volte
z }| {
n
n
n
(λf λx f x)PQ → (λx P x)Q → P Q = P(P · · · (P Q) · · · )
Definizione (funzione λ-calcolabile)
Una funzione (parziale) ϕ : Np → N è λ-calcolabile se esiste un λ-termine Mϕ tale
che per ogni (n1 , . . . , np ) ∈ Np :
se ϕ(n1 , . . . , np ) è definita, allora Mϕ n1 · · · np →∗ ϕ(n1 , . . . , np )
se ϕ(n1 , . . . , np ) non è definita, allora Mϕ n1 · · · np è un λ-termine non
normalizzabile.
Teorema (Church, Rosser, Kleene, 1933-1935)
Una funzione (parziale) ϕ : Np → N è λ-calcolabile sse è ricorsiva
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
23 / 30
La codifica dell’aritmetica
1/3
Gli interi di Church: per ogni n ∈ N
n volte
z }| {
n := λf λx f x = λf λx f (f · · · (f x) · · · )
n
Per es. 0 = λf λx x 1 = λf λx fx 2 = λf λx f (fx)
Intuitivamente, un intero n è interpretato come una funzione che itera n volte la
funzione che gli viene applicata, infatti:
n volte
z }| {
n
n
n
(λf λx f x)PQ → (λx P x)Q → P Q = P(P · · · (P Q) · · · )
Definizione (funzione λ-calcolabile)
Una funzione (parziale) ϕ : Np → N è λ-calcolabile se esiste un λ-termine Mϕ tale
che per ogni (n1 , . . . , np ) ∈ Np :
se ϕ(n1 , . . . , np ) è definita, allora Mϕ n1 · · · np →∗ ϕ(n1 , . . . , np )
se ϕ(n1 , . . . , np ) non è definita, allora Mϕ n1 · · · np è un λ-termine non
normalizzabile.
Teorema (Church, Rosser, Kleene, 1933-1935)
Una funzione (parziale) ϕ : Np → N è λ-calcolabile sse è ricorsiva
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
23 / 30
La codifica dell’aritmetica
2/3
Succ : n 7→ n+1 è λ-calcolabile:
succ = ?
succ n →∗ n + 1
+ : (m, n) 7→ n+m è λ-calcolabile:
add = ?
add m n →∗ m + n
× : (m, n) 7→ n·m è λ-calcolabile:
mult = ?
mult m n →∗ m · n
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
24 / 30
La codifica dell’aritmetica
2/3
Succ : n 7→ n+1 è λ-calcolabile:
succ = λnλf λx f (nfx)
succ n →∗ n + 1
(λnλf λx f (nfx))n → λf λx f (nfx) → λf λx f (f n x) = λf λx f n+1 x = n + 1
+ : (m, n) 7→ n+m è λ-calcolabile:
add = ?
add m n →∗ m + n
× : (m, n) 7→ n·m è λ-calcolabile:
mult = ?
mult m n →∗ m · n
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
24 / 30
La codifica dell’aritmetica
2/3
Succ : n 7→ n+1 è λ-calcolabile:
succ = λnλf λx f (nfx)
succ n →∗ n + 1
(λnλf λx f (nfx))n → λf λx f (nfx) → λf λx f (f n x) = λf λx f n+1 x = n + 1
+ : (m, n) 7→ n+m è λ-calcolabile:
add = λmλnλf λx mf (nfx)
add m n →∗ m + n
(λmλnλf λx mf (nfx))m n →∗ λf λx m f (n fx) →∗ λf λx m f (f n x) →∗
λf λx f m (f n x) = λf λx f m+n x = m + n
× : (m, n) 7→ n·m è λ-calcolabile:
mult = ?
mult m n →∗ m · n
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
24 / 30
La codifica dell’aritmetica
2/3
Succ : n 7→ n+1 è λ-calcolabile:
succ = λnλf λx f (nfx)
succ n →∗ n + 1
(λnλf λx f (nfx))n → λf λx f (nfx) → λf λx f (f n x) = λf λx f n+1 x = n + 1
+ : (m, n) 7→ n+m è λ-calcolabile:
add = λmλnλf λx mf (nfx)
add m n →∗ m + n
(λmλnλf λx mf (nfx))m n →∗ λf λx m f (n fx) →∗ λf λx m f (f n x) →∗
λf λx f m (f n x) = λf λx f m+n x = m + n
× : (m, n) 7→ n·m è λ-calcolabile: mult = λmλnλf m(nf )
mult m n →∗ m · n
(λmλnλf m(nf ))2 3 →∗ λf 2(3 f ) →∗ λf λx(3 f )2 x = λf λx(3 f )(3 fx) →∗
λf λx3 f (f 3 x) →∗ λf λx f 3 (f 3 x) = λf λx f 6 x = 6 = 2 · 3
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
24 / 30
La codifica dell’aritmetica
Pred : N → N
Pred(n) =
è λ-calcolabile:
3/3
0
n−1
se n = 0
altrimenti
pred = ?
il predicato Test0 : N → {vero, falso} tale che:
vero se n = 0
Test0 (n) =
falso altrimenti
è rappresentabile nel λ-calcolo:
test0 = ?
> se n = 0
test0 n →∗
⊥ altrimenti
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
25 / 30
La codifica dell’aritmetica
Pred : N → N
Pred(n) =
è λ-calcolabile:
3/3
0
n−1
se n = 0
altrimenti
pred = sulla fiducia!
il predicato Test0 : N → {vero, falso} tale che:
vero se n = 0
Test0 (n) =
falso altrimenti
è rappresentabile nel λ-calcolo:
test0 = ?
> se n = 0
test0 n →∗
⊥ altrimenti
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
25 / 30
La codifica dell’aritmetica
Pred : N → N
3/3
Pred(n) =
è λ-calcolabile:
0
n−1
se n = 0
altrimenti
pred = sulla fiducia!
il predicato Test0 : N → {vero, falso} tale che:
vero se n = 0
Test0 (n) =
falso altrimenti
è rappresentabile nel λ-calcolo:
test0 = λn n(λx⊥)>
> se n = 0
∗
test0 n →
⊥ altrimenti
(λn n(λx⊥)>)0 → 0(λx⊥)> →∗ >
n+1 volte
∗
n+1
(λn n(λx⊥)>)n+1 → n+1(λx⊥)> → (λx⊥)
z
}|
{
> = (λx⊥) · · · (λx⊥)
n volte
z
}|
{
> → (λx⊥) · · · (λx⊥) ⊥ →∗ ⊥
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
25 / 30
La codifica della ricorsività
1/2
Data una funzione f : A → A, si dice che x ∈ A è un punto fisso di f se x = f (x)
Nel λ-calcolo, si dice che Y ∈ Λ è un combinatore di punto fisso se per ogni F ∈ Λ
YF →∗ F (YF )
Intuitivamente, YF è un punto fisso della funzione F
Proposizione (combinatore punto fisso di Turing)
Se A = λaλf f (aaf ), allora Θ := AA è un combinatore di punto fisso
Dim. Θ = (λaλf f (aaf ))A → λf f (AAf ) = λf f (Θf )
per ogni F ∈ Λ: ΘF → (λf f (Θf ))F → F (ΘF )
I combinatori di punto fisso sono cruciali per rappresentare nel λ-calcolo le funzioni
definite per ricorsione (e il ciclo while dei comuni linguaggi di programmazione).
Es. il fattoriale (·)! : N → N
1
se n = 0
n! =
n · (n − 1)! altrimenti
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
26 / 30
La codifica della ricorsività
1/2
Data una funzione f : A → A, si dice che x ∈ A è un punto fisso di f se x = f (x)
Nel λ-calcolo, si dice che Y ∈ Λ è un combinatore di punto fisso se per ogni F ∈ Λ
YF →∗ F (YF )
Intuitivamente, YF è un punto fisso della funzione F
Proposizione (combinatore punto fisso di Turing)
Se A = λaλf f (aaf ), allora Θ := AA è un combinatore di punto fisso
Dim. Θ = (λaλf f (aaf ))A → λf f (AAf ) = λf f (Θf )
per ogni F ∈ Λ: ΘF → (λf f (Θf ))F → F (ΘF )
I combinatori di punto fisso sono cruciali per rappresentare nel λ-calcolo le funzioni
definite per ricorsione (e il ciclo while dei comuni linguaggi di programmazione).
Es. il fattoriale (·)! : N → N
1
se n = 0
n! =
n · (n − 1)! altrimenti
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
26 / 30
La codifica della ricorsività
1/2
Data una funzione f : A → A, si dice che x ∈ A è un punto fisso di f se x = f (x)
Nel λ-calcolo, si dice che Y ∈ Λ è un combinatore di punto fisso se per ogni F ∈ Λ
YF →∗ F (YF )
Intuitivamente, YF è un punto fisso della funzione F
Proposizione (combinatore punto fisso di Turing)
Se A = λaλf f (aaf ), allora Θ := AA è un combinatore di punto fisso
Dim. Θ = (λaλf f (aaf ))A → λf f (AAf ) = λf f (Θf )
per ogni F ∈ Λ: ΘF → (λf f (Θf ))F → F (ΘF )
I combinatori di punto fisso sono cruciali per rappresentare nel λ-calcolo le funzioni
definite per ricorsione (e il ciclo while dei comuni linguaggi di programmazione).
Es. il fattoriale (·)! : N → N
1
se n = 0
n! =
n · (n − 1)! altrimenti
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
26 / 30
La codifica della ricorsività
2/2
“Moralmente” il λ-termine che rappresenta il fattoriale dovrebbe essere:
fact = λn if (test0 n)1(mult n(fact(pred n)))
Infatti (per induzione):
fact0 → if (test0 0)1(mult 0(fact(pred 0))) →
if >1(mult 0(fact(pred 0))) → 1
factn+1 → if (test0 n+1)1(mult n+1(fact(pred n+1))) →
if ⊥1(mult n+1(fact(pred n+1))) →∗ mult n+1(fact(pred n+1)) →∗
HI
mult n+1(fact n) →∗ mult n+1 n! →∗ (n+1) · n!
Problema: fact cosı̀ definito non è un λ-termine (sequenza infinita di caratteri)
Soluzione: usiamo il combinatore di punto fisso!
F := λf λn if (test0 n)1(mult n(f (pred n)))
fact := ΘF
fact = ΘF → F (ΘF ) = (λf λn if (test0 n)1(mult n(f (pred n))))fact →
λn if (test0 n)1(mult n(fact(pred n)))
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
27 / 30
La codifica della ricorsività
2/2
“Moralmente” il λ-termine che rappresenta il fattoriale dovrebbe essere:
fact = λn if (test0 n)1(mult n(fact(pred n)))
Infatti (per induzione):
fact0 → if (test0 0)1(mult 0(fact(pred 0))) →
if >1(mult 0(fact(pred 0))) → 1
factn+1 → if (test0 n+1)1(mult n+1(fact(pred n+1))) →
if ⊥1(mult n+1(fact(pred n+1))) →∗ mult n+1(fact(pred n+1)) →∗
HI
mult n+1(fact n) →∗ mult n+1 n! →∗ (n+1) · n!
Problema: fact cosı̀ definito non è un λ-termine (sequenza infinita di caratteri)
Soluzione: usiamo il combinatore di punto fisso!
F := λf λn if (test0 n)1(mult n(f (pred n)))
fact := ΘF
fact = ΘF → F (ΘF ) = (λf λn if (test0 n)1(mult n(f (pred n))))fact →
λn if (test0 n)1(mult n(fact(pred n)))
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
27 / 30
La codifica della ricorsività
2/2
Di fatto, grazie al combinatore di funto fisso di Turing, si ha
fact →∗ λn if (test0 n)1(mult n(fact(pred n)))
e questo basta. Infatti (per induzione):
fact0 → if (test0 0)1(mult 0(fact(pred 0))) →
if >1(mult 0(fact(pred 0))) → 1
factn+1 → if (test0 n+1)1(mult n+1(fact(pred n+1))) →
if ⊥1(mult n+1(fact(pred n+1))) →∗ mult n+1(fact(pred n+1)) →∗
HI
mult n+1(fact n) →∗ mult n+1 n! →∗ (n+1) · n!
Problema: fact cosı̀ definito non è un λ-termine (sequenza infinita di caratteri)
Soluzione: usiamo il combinatore di punto fisso!
F := λf λn if (test0 n)1(mult n(f (pred n)))
fact := ΘF
fact = ΘF → F (ΘF ) = (λf λn if (test0 n)1(mult n(f (pred n))))fact →
λn if (test0 n)1(mult n(fact(pred n)))
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
27 / 30
Indice
1
Introduzione
2
Il λ-calcolo puro
3
Alcune rappresentazioni nel λ-calcolo puro
4
La deduzione naturale intuizionista
5
L’isomorfismo di Curry-Howard
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
28 / 30
Indice
1
Introduzione
2
Il λ-calcolo puro
3
Alcune rappresentazioni nel λ-calcolo puro
4
La deduzione naturale intuizionista
5
L’isomorfismo di Curry-Howard
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
29 / 30
Riferimenti bibliografici
Hendrik Pieter Barendregt
The Lambda Calculus: Its Syntax and Semantics
North Holland, Amsterdam, 1984
Jean-Yves Girard, Yves Lafont & Paul Taylor
Proof and Types
Cambridge University Press, Cambridge, 1989
http://www.paultaylor.eu/stable/prot.pdf
Jean-Louis Krivine
Lambda Calculus, Types and Models
Ellis Horwood, Hemel Hempstead, 1993
www.pps.jussieu.fr/~krivine/articles/Lambda.pdf
Giulio Guerrieri (Roma Tre / Paris 7)
Funzioni, programmi e dimostrazioni
25 marzo 2011
30 / 30