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