Algoritmi e Dimostrazioni Stefano Berardi Università di Torino http://www.di.unito.it/~stefano E-mail: stefano@di.unito.it
Un po’ di terminologia Un algoritmo è un procedimento meccanico, affidabile a un calcolatore, per ottenere un certo risultato: è uno strumento di uso pratico. Una dimostrazione è invece un argomento rigoroso per mostrare, senza possibilità di dubbio, la verità di una certa affermazione matematica: è uno strumento concettuale.
Argomento della conferenza Algoritmi e dimostrazioni sono oggetti di uso molto diverso. Mostreremo tuttavia come, in vari casi, una dimostrazione si possa leggere come un algoritmo, e quindi essere “usata” per risolvere dei problemi pratici. Tale nuova lettura delle dimostrazioni matematiche, prevista dalla Logica, è stata sviluppata grazie all’Informatica.
Sommario Daremo esempi di dimostrazioni fatte per Induzione che si possono “usare” per risolvere dei problemi. 1. Le dimostrazioni per induzione. 2. La prova di Euclide che esistono infiniti numeri primi. 3. Un algoritmo di ordinamento. 4. Un risultato generale.
1. Dimostrazioni per induzione L’induzione è una regola per dimostrare enunciati del tipo: “ogni numero naturale ha una certa proprietà P”. Un esempio (facile): possiamo utilizzare la regola di induzione per dimostrare: “ogni numero naturale è pari oppure dispari”.
Regola di Induzione. (Passo base) Supponiamo di aver dimostrato che 0 soddisfa la proprietà P. (Passo Induttivo) Supponiamo di aver anche dimostrato, per ogni numero naturale n, che se n soddisfa P anche n+1 soddisfa P. (Conclusione) Allora ogni numero naturale soddisfa P.
Perché P vale per ogni n? 0 soddisfa P. Se 0 soddisfa P, anche 1=0+1 soddisfa P. Dunque 1 soddisfa P. Se 1 soddisfa P, anche 2=1+1 soddisfa P. Dunque 2 soddisfa P. Se 2 soddisfa P, anche 3=2+1 soddisfa P. Dunque 3 soddisfa P. Se 3 soddisfa P, anche 3=2+1 soddisfa P. Dunque 4 soddisfa P. ………………… eccetera …………………
Un Esempio (facile) Proviamo che ogni numero naturale è pari o dispari. (Passo base) 0 è pari, dunque pari o dispari. (Passo Induttivo) Se n è pari, allora n+1 è dispari, e se n è dispari, allora n+1 è pari. Dunque: se n è pari o dispari, anche n+1 è pari o dispari.
Un Esempio (continua) Concludiamo, per la Regola di Induzione, che la proprietà P “essere pari o dispari” vale per ogni n. Lo sapevamo già, ma non importa: volevamo solo spiegare come si usa la regola.
Perché P vale per ogni n? 0 è pari o dispari. Se 0 è pari o dispari, allora 1=0+1 è pari o dispari. Dunque 1 è pari o dispari. Se 1 è pari o dispari, allora 2=1+1 è pari o dispari. Dunque 2 è pari o dispari. Se 2 è pari o dispari, allora 3=2+1 è pari o dispari. Dunque 3 è pari o dispari. Se 3 è pari o dispari, allora 4=3+1 è pari o dispari. Dunque 4 è pari o dispari. ………… eccetera …………
2. La Prova di Euclide. Negli “Elementi di Geometria”, Euclide prova che esistono infiniti numeri primi. La prova contiene un algoritmo (non molto efficiente, per la verità), per generare infiniti numeri primi.
Dimostrazione per induzione Proveremo per Induzione che, per ogni n, esistono almeno n+1 primi (distinti tra loro). Dobbiamo provare che esiste almeno un numero primo, e che se ne esistono almeno n+1, allora ne esistono almeno (n+1)+1=n+2 (almeno uno in più).
Dimostrazione per Induzione: passo base Esiste almeno un numero primo, il numero 2.
Dimostrazione per Induzione: passo induttivo Supponiamo che esistano n+1 primi: p1, p2, p3, …, pn+1 Sia X = (p1p2p3…pn+1 + 1). X diviso pi fa (p1…pi-1pi+1…pn+1), con resto 1. Dunque nessun pi divide esattamente X, cioè nessun pi è fattore primo di X.
Dimostrazione per Induzione: passo induttivo (segue) Segue che ogni fattore primo di X è distinto da p1, p2, p3, …, pn+1. Sia pn+2 il minimo fattore primo di X. Allora p1, p2, p3, …, pn+1 , pn+2 sono n+2 primi distinti.
L’algoritmo nascosto nella prova di Euclide. Partiamo con una lista di un solo primo, p1 = 2. Sia X = (prodotto del solo 2) + 1 = 2+1=3. Il minimo fattore primo di X, cioè 3, è il secondo primo nella nostra lista. Sia X =2.3+1=7. Il minimo fattore primo di X, cioè 7, è il terzo primo della nostra lista.
L’algoritmo nascosto nella prova di Euclide (segue) La lista dei primi prosegue con: X= 2.3.7+1 = 43, p4= 43 X= 2.3.7.43+1 = 1807 = 13.139 p5= 13 X= 2.3.7.43.13+1= 23479 = 53.443 p6= 53 Il procedimento trova dunque infiniti numeri primi (non trova però tutti i numeri primi, ma solo alcuni, disposti per di più in modo bizzarro).
3.Un algoritmo di ordinamento (ottenuto da una dimostrazione) Daremo un esempio di una prova per induzione corrispondente ad un algoritmo di ordinamento. Per la cronaca, l’algoritmo di ordinamento che otterremo porta il nome di InsertSort.
Cos’è un algoritmo di ordinamento Un algoritmo di ordinamento prende una lista di oggetti (per esempio, una lista di nomi), e la dispone seguendo un certo ordine (per esempio, quello alfabetico), senza aggiungere né togliere elementi. Si tratta di un procedimento che viene ampiamente usato in Informatica.
Un Esempio. Sia L una lista di nomi: Gabriele, Eloisa, Emanuele, Federico Una versione ordinata L’ di L è: Eloisa, Emanuele, Federico, Gabriele
Dimostrazione: una lista può sempre essere ordinata. Proviamo per induzione che, per ogni n, ogni lista L di n+1 elementi ha una versione ordinata L’. Dobbiamo provare che una lista di 1 elemento ha una versione ordinata, e che se le liste di n+1 elementi hanno versioni ordinate, allora anche le liste di (n+1)+1=n+2 elementi hanno versioni ordinate.
Passo base. Una lista L di 1 elemento è già ordinata. Infatti L non ha due elementi, e dunque, a maggior ragione, non ha due elementi in ordine errato (l’argomento può apparire paradossale, ma è logicamente corretto).
Passo Induttivo. Sia L = a1, a2, a3, …, an+1 una lista di n+1 elementi, M = L, an+2 una lista di n+2 elementi. Supponiamo che L abbia una versione ordinata L’= b1, b2, b3, …, bn+1. Dobbiamo definire una versione ordinata M’ della lista M.
Passo Induttivo (segue) Inseriamo an+2 entro L’, dopo tutti gli elementi b1, …, bi, che precedono an+2 nell’ordine, ma prima di tutti gli elementi bi+1, …, bn+1 che seguono an+2 . Sia M’ = b1, …, bi, an+2 , bi+1, …, bn+1 M’ è una versione ordinata di M. Infatti in M’ vengono prima gli elementi di L precedenti an+2, nel loro ordine, poi an+2 stesso, poi gli elementi di L che seguono an+2, sempre nel loro ordine.
L’algoritmo nascosto nella prova di ordinamento. Sia L = Gabriele, Eloisa, Emanuele, Federico, una lista di nomi. Utilizzeremo la prova di ordinamento come algoritmo per ordinare L (in ordine alfabetico).
L’algoritmo di ordinamento (passo 1) La lista di 1 elemento L1 = Gabriele viene lasciata com’è.
L’algoritmo di ordinamento (passo 2) Sia L2 = L1, Eloisa = Gabriele, Eloisa Si inizia col dividere L1 in due parti: i nomi che precedono Eloisa nell’ordine alfabetico (la lista vuota), e i nomi che seguono Eloisa (il solo Gabriele). Quindi si forma la lista ordinata L’2 = Eloisa, Gabriele ponendo prima i nomi precedenti Eloisa, poi Eloisa stessa, infine i nomi che seguono Eloisa.
L’algoritmo di ordinamento (passo 3) Sia L3 = L’2, Emanuele = Eloisa, Gabriele, Emanuele. Si inizia col dividere L’2 in due parti: i nomi che precedono Emanuele nell’ordine alfabetico (la sola Eloisa), e i nomi che seguono Emanuele (il solo Gabriele).
L’algoritmo di ordinamento (segue passo 3) Quindi si forma la lista ordinata L’3 = Eloisa, Emanuele, Gabriele ponendo prima i nomi precedenti Emanuele, poi Emanuele stesso, infine i nomi che seguono Emanuele
L’algoritmo di ordinamento (passo 4) Sia L4 = L’3, Federico = Eloisa, Emanuele, Gabriele, Federico. Si inizia col dividere L’3 in due parti: i nomi che precedono Federico nell’ordine alfabetico (Eloisa e Emanuele), e i nomi che seguono Federico (il solo Gabriele).
L’algoritmo di ordinamento (passo 4 e fine) Quindi si forma la lista ordinata L’4 = Eloisa, Emanuele, Federico, Gabriele ponendo prima i nomi precedenti Federico, poi Federico stesso, infine i nomi che seguono Federico.
4. Un risultato generale Un logico, G. Kreisel, ha provato nel 1960 che ogni dimostrazione matematica dell’esistenza di un oggetto con proprietà decidibili (=verificabili mediante un procedimento meccanico) può essere letta come un algoritmo. Tale algoritmo utilizza effettivamente le idee contenute nella dimostrazione stessa.
Un esempio di applicazione del Teorema di Kreisel L’enunciato “esiste una versione ordinata L’ di una lista L data” afferma l’esistenza di un oggetto, L’, con una proprietà “decidibile”, essere ordinata. Dunque ogni prova per induzione di tale proprietà, contiene, per il per il Teorema di Kreisel, un metodo per costruire tale versione ordinata L’ di L.
Conclusioni In questa conferenza abbiamo visto come la regola di Induzione abbia una “lettura” come algoritmo abbastanza intuitiva. Il Teorema di Kreisel, però, ci dice che la stessa “lettura” è possibile per tutte le dimostrazioni dell’esistenza di un oggetto con proprietà decidibili, anche per quelle che utilizzano ragionamenti per assurdo, in cui la lettura come algoritmo non è affatto evidente (pero c’è).
Uno Slogan Dimostrazioni di esistenza di un x avente una proprietà P = un algoritmo che trova tale x + una prova che x soddisfa P (purché la proprietà P sia decidibile).
Estrazione di Programmi da Prove Esistono vari sistemi di sviluppo di dimostrazione al calcolatore, come il francese Coq. Essi consentono di scrivere una dimostrazione al calcolatore, quindi di controllarne la correttezza logica, infine di produrre automaticamente l’algoritmo associato alla prova stessa.