Logica Lineare e Ludica verso una teoria strutturale della dimostrazione Simona Ronchi Della Rocca Università di Torino Dipartimento di Informatica Riassunto Questo articolo presenta, con un approccio divulgativo, la Logica Lineare e la Ludica, che sono certamente le maggiori novità sviluppate nell’area della Logica negli ultimi 50 anni. Vengono in particolare messi in evidenza due aspetti estremamente innovativi di tali logiche: l’interpretazione computazionale della dimostrazione, che ha avuto interessanti ricadute nell’Informatica, e un diverso approccio alla semantica delle dimostrazioni, che ha dato nuovo impulso alla “proof-theory”. La Logica Lineare è stata proposta da Girard [5] nel 1987, e può essere considerata come la maggiore novità nel campo della logica degli ultimi 50 anni. La Logica Lineare (LL) nasce da due esigenze fra loro apparentemente disgiunte: affinare lo sguardo sulla Logica Classica, cambiando prospettiva semantica, e indagare sulle sue proprietà computazionali. La semantica usuale con cui si interpreta la Logica Classica è basata sulla nozione di verità. La verità è statica e immutabile, e in conseguenza di ciò ogni frase della logica ha uno e un solo valore di verità. Conseguenza naturale di questa visione semantica è il principio del terzo escluso: se A rappresenta una qualsiasi proposizione logica, e ∼ A denota la sua negazione, la proposizione A∨ ∼ A sempre vera. Infatti il simbolo ∨ rappresenta la disgiunzione, e la frase A∨ ∼ A è vera se e solo se o è vera A o è vera ∼ A, cioè sempre. Alla Logica Classica è associato un Sistema Formale, cioè un insieme di regole, che permettono di costruire proposizioni vere a partire da proposizioni vere. Più specificatamente, un sistema formale permette di dimostrare assunti del tipo: P1 , ..., Pn ⊢ C1 , ..., Cm (n, m ≥ 0) il cui significato è: assumendo che siano vere le premesse P1 , ..., Pn , si può dimostrare la verità di almeno una delle conclusioni C1 , ..., Cm . Nella Logica Classica l’accento, come si è detto, viene posto sulla nozione di verità, quindi le regole del sistema formale associato sono viste come meri strumenti per arrivare a conclusioni vere. Girard rovescia questa visione, spostando l’accento dalla verità delle proposizioni al procedimento di dimostrazione di questa verità. Per capire meglio questo spostamento, vediamo alcuni esempi di regole della Logica Classica. Per questa presentazione molto informale, mi restringerò a casi in cui le regole hanno un’unica conclusione. La regola più semplice è l’assioma: A⊢A che dice semplicemente che, se assumiamo che A sia vera, possiamo dedurre la verità di A. Vi sono poi regole che introducono ed eliminano i vari connettivi logici. Ad esempio la regola di introduzione del connettivo ∧, che denota la congiunzione, è la seguente: Γ ⊢ A Γ ⊢ B (∧I) Γ⊢A∧B che dice che, se da un dato insieme di premesse Γ abbiamo dedotto sia la verità di A che quella di B , possiamo, dallo stesso insieme, dedurre la verità di A ∧ B . Una classe speciale di regole è la classe delle regole strutturali, che non dimostrano la verità di nuove proposizioni ma parlano della struttura della dimostrazione “di per sè”. Un esempio è la regola dell’ indebolimento: Γ ⊢ B (weak) Γ, A ⊢ B che ci dice che si può aggiungere una premessa preservando la verità della conclusione. La Logica Lineare sostituisce alla nozione di verità la nozione di uso. Una premessa è una risorsa che può essere usata. Allora l’asserzione: P1 , ..., Pn ⊢ C1 , ..., Cm (n, m ≥ 0) si può interpretare come: usando le risorse P1 , ..., Pn si possono produrre gli oggetti C1 , ..., Cm . Risorse e oggetti possono poi essere diversamente instanziati per adattarsi a contesti diversi: cosı̀ le une possono essere viste come denaro, tempo, ingredienti mentre i secondi possono rappresentare rispettivamente merci, attività, ricette. Se si vuole, è una visione capitalistica della Logica! Le risorse sono poi divise in due classi: le risorse consumabili, che quindi possono essere usate una sola volta, e quelle sempre disponibili, e quindi di uso illimitato. Per dividere queste due classi si introduce una modalità !, che premessa ad una proposizione A interpretata come risorsa, denota il fatto che tale risorsa è di uso illimitato. Questo semplice spostamento di visuale ha conseguenze molto forti. Innanzitutto aumenta il numero dei connettivi della logica, e quindi la sua espressività. Ad esempio la congiunzione classica ∧ si sdoppia nei due connettivi ⊗ e &. A ⊗ B significa che le risorse A e B sono entrambi disponibili, e saranno usate tutte e due insieme (es. col tempo e con la paglia maturano le nespole). A&B denota che le risorse A e B sono entrambi disponibili, ma io ne potrò usare una sola, a mia scelta (es. col menu a prezzo fisso posso avere frutta o dessert). Notiamo qui che la congiunzione & corrsponde ad un o nel linguaggio quotidiano, ma questo è solo una spia del fatto che non sempre le interpretazioni informali possono avere il rigore di quelle formali! Anche la disgiunzione si sdoppia nei due connettivi ⊕ e ≀. E qui l’interpretazione distingue in modo molto raffinato due possibili situazioni. La disgiunzione classica (A ∨ B è vera se o è vera A o è vera B ) già contiene in sè l’idea di una possibile scelta tra le due proposizioni coinvolte, ma la Logica Lineare riesce a distinguere tra il caso in cui la scelta è possibile, e quello in cui una scelta non è possibile. A ⊕ B indica che una sola delle risorse A o B è disponibile, io non so quale, ma qualcuno sceglierà per me (es. il menu prevede frutta di stagione: pere o arance). A ≀ B indica che una sola delle risorse A o B è disponibile, e non si sa quale. (es. domani pioverà o non pioverà). E’ naturale chiedersi se il principio del terzo escluso valga nella Logica Lineare, e in caso positivo se valga per entrambe le disgiunzioni o no. La risposta è che vale per ≀ ma non per ⊕, cioè si può dimostrare A ≀ A⊥ ma non si può dimostrare A ⊕ A⊥ (in LL A⊥ denota la negazione di A). Notiamo che abbiamo parlato qui di dimostrabilità, non di verità, come nella Logica Classica. Come esempio di uso della modalità, consideriamo l’asserzione della Logica Classica: A ⊢ A ∧ A, che ci dice che, se A è vera, allora possiamo ribadire A due volte, e ottenere ancora una proposizione vera. Se “oggi piove” è un’affermazione vera, anche “oggi piove e oggi piove” è vera (al limite può essere considerata ridondante!). Ma adesso sostituiamo il classico ∧ con il connettivo ⊗: dalla semantica informale che ho dato prima a questo connettivo, è chiaro che A ⊢ A ⊗ A non è dimostrabile, in quanto per ottenere due copie dell’oggetto A abbiamo bisogno di due copie della risorsa A. Per ottenere quindi la conseguenza A ⊗ A ho quindi bisogno adesso o di avere a disposizione due copie di A, o A deve essere una risorsa sempre disponibile. Quindi posso dimostrare sia A, A ⊢ A ⊗ A, sia !A ⊢ A ⊗ A. Una regola strutturale particolare è la regola del taglio, che esiste sia nella Logica Classica che nella Logica Lineare: Γ ⊢ A, ∆ Γ, A ⊢ ∆ (cut) Γ⊢∆ L’importanza della regola del taglio è di essere inutile: infatti sia nella Logica Classica che nella Logica Lineare vale la proprietà che si può decidere di non usarla, nel senso che ogni dimostrazione che usa la regola del taglio può essere trasformata in una dimostrazione che prova la stessa conclusione, senza però usare il taglio. L’interpretazione classica di tale proprietà può essere la seguente. Se per dimostrare ∆ mi serve una AX A⊥ • AX A B B⊥ ⊗ A⊗B ≀ (A ⊗ B) ≀ B ⊥ • Figura 1: La rete di prova corrispondente alla dimostrazione di A ⊢ (A ⊗ B) ≀ B ⊥ (o di (A ⊗ B) ≀ B ⊥ ⊢ A ). I due nodi senza nome denotano uno la premessa e l’altro la conclusione della dimostrazione, che sono concetti qui simmetrici e interscambiabili. dimostrazione di A, magari per usarla più di una volta, posso dimostrare A con una dimostrazione a parte, e poi usarlo tutte le volte che mi serve, come un Lemma ausiliario, e questa è una dimostrazione con il taglio. Ma posso anche non usare questo metodo, e semplicemente ricopiare la dimostrazione di A dentro la dimostrazione di ∆, ogni volta che è necessario: ottengo una dimostrazione certamente meno efficiente, ma ugualmente corretta, e questa è una dimostrazione senza taglio. Ma nella Logica Lineare la proprietà dell’eliminazione del taglio è più forte, e assume un preciso significato computazionale. Assumiamo di avere una dimostrazione che usa il taglio, e di voler eliminare tale regola: esiste un modo effettivo di farlo. Però la dimostrazione può usare il taglio più di una volta, e quindi ci si pone la scelta di quale regola eliminare per prima: nella Logica Classica diverse scelte possono portare a ottenere dimostrazioni diverse, se pure con la stessa conclusione. Invece una proprietà importante della Logica Lineare è che la dimostrazione ottenuta è unica, indipendentemente dalle scelte fatte. Questo permette di dare una interpretazione computazionale alla Logica Lineare: una dimostrazione può essere vista come un programma, la regola del taglio come la regola di calcolo, e la dimostrazione normalizzata (cioè senza taglio) come il risultato della computazione. Il fatto che l’eliminazione del taglio sia una procedura deterministica corrisponde al ben noto principio che il risultato di una computazione non deve dipendere dall’ordine in cui vengono effettuate le operazioni (pensiamo al calcolo delle espressioni aritmetiche!). L’analogia dimostrazione = programma è ulteriormente sviluppato con l’introduzione delle reti di prova [8]. Una rete di prova è una rappresentazione grafica di una dimostrazione della Logica Lineare, con una struttura a grafo, cioè un insieme di punti (nodi ) su di un piano che possono essere connessi da archi, cioè segmenti di retta. I punti rappresentano i connettivi, gli archi rappresentano le formule, e il modo in cui essi sono connessi riproduce la struttura della dimostrazione (si veda un esempio di rete di prova nella Figura ) . La rappresentazione delle dimostrazioni mediante le reti di prova non è solo un mero esercizio di riscrittura, ma permette di eseguire in modo molto efficiente l’eliminazione del taglio, e quindi il procedimento di calcolo, se usiamo il paradigma prima esposto che associa la programmazione alla dimostrazione logica [9]. Infatti tale rappresentazione ha permesso lo sviluppo di un interprete ottimale per un linguaggio paradigmatico, il λ-calcolo [1], e ha inoltre suggerito la definizione di logiche particolari, derivate dalla Logica Lineare, che hanno la proprietà che la procedura di eliminazione del taglio per esse si può effettuare in un tempo che dipende in modo polinomiale dalla dimensione della rete da normalizzare [6] [2], mentre nella la Logica Lineare, come nella Logica Classica, tale dipendenza è esponenziale. In questo modo queste logiche cosidette leggere possono essere la base per linguaggi di programmazione in cui si possono scrivere solo programmi la cui esecuzione avviene in tempo accettabile. Per comprendere l’importanza di questo risultato, pensiamo che una funzione che cresce in tempo esponenziale, come ad esempio 2n , assume rapidamente valori grandissimmi, al crescere del parametro n: se per n = 3 vale 8, per n = 10 vale 1024 e per n = 100 il suo valore è un numero addirittura maggiore del numero di microsecondi trascorsi dal big-bang! Quindi un programma il cui tempo di esecuzione cresca in modo esponenziale in dipendenza dei dati in input può essere considerato come virtualmente non eseguibile, in quanto la sua esecuzione può richiedere più tempo della vita del programmatore che l’ha scritto! Ovviamente non tutti i grafi i cui nodi hanno nomi di connettivi e i cui archi hanno nomi di formule della Logica Lineare rappresentano dimostrazioni in tale logica; anzi, se disegnamo a caso un grafo, e poi assegniamo a caso dei nomi ai suoi componenti, sarà ben raro che questo denoti una dimostrazione. Ma esiste un risultato sorprendente: un grafo di questo tipo rappresenta una dimostrazione se e solo se soddisfa ad una proprietà meramente geometrica, che è indipendente dai nomi delle formule che decorano i suoi archi. Questo porta a pensare che l’essenza di una dimostrazione si basi sulla sua struttura, piuttosto che sulle formule che vi compaiono. Come dire che, se ci si pone il problema (un po’ peregrino, se vogliamo): sono nate prima le formule o le dimostrazioni?, forse la risposta: le dimostrazioni è la più corretta! Continuiamo a divertirci con domande fuori dall’ordinario. Un metodo di verifica delle dimostrazioni che può essere usato fruttuosamente è il metodo interattivo: si simula una discussione tra S (sostenitore della correttezza della dimostrazione in questione) e O (che mette in discussione tale correttezza). O pone domande ad S , che indagano sulla struttura della dimostrazione da analizzare. Si assume che S dica sempre la verità, e se S sa rispondere esaurientemente a tutte le domande di O , in modo da convincerlo, la dimostrazione è corretta. Se la dimostrazione invece è scorretta, S sarà costretto a dichiarare qualcosa di contradditorio, e verrà quindi smascherato da O . Ovviamente S e O sono entità immaginarie, che quindi non fanno parte della logica stessa. A questo punto possiamo porci un problema, apparentemente un pò strano: si possono internalizzare nella logica stessa S e O ? cioè una logica può dimostrare al suo interno la sua stessa correttezza? S può essere la dimostrazione stessa, che si assume il compito di difendersi dai dubbi di O , ma chi può impersonare O ? la correttezza formale ci porterebbe a dire che anche O deve essere una dimostrazione, che dimostra la negazione di quanto dimostra S , ma questo non è possibile, perchè si possono dimostrare solo proposizioni vere, e quindi se esiste una dimostrazione di A non può esistere una dimostrazione di A⊥ , e viceversa. La Ludica viene proposta da Girard [7] come una nuova logica, che vede al suo centro la nozione di dimostrazione, e in cui i problemi apparentemente assurdi che ci siamo posti trovano una loro soluzione, per quanto anti-intuitiva. Il sottotitolo dell’articolo in cui Girard presenta la Ludica è indicativo: dalle regole della logica alla logica delle regole, in quanto pone subito l’accento sul fatto che il centro dell’interesse della Ludica non sono più le formule, ma le regole per manipolare le dimostrazioni. Infatti nella Ludica le formule non ci sono più! Gli oggetti di base sono i “loci”, che rappresentano posti in cui le formule potrebbero trovare posto: ma poichè le formule in questo contesto non sono interessanti, i loci vengono lasciati vuoti, denotati semplicemente da numeri. La nascita “tecnica” della Ludica si può ricondurre all’osservazione che i connettivi della Logica Lineare si possono dividere in due classi. I negativi, o reversibili, sono quei connettivi la cui regola di introduzione non aggiunge informazione rispetto all’informazione delle premesse, ad esempio, il connettivo &: Γ ⊢ A Γ ⊢ B (&I) Γ ⊢ A&B e quelli positivi o irreversibili, per cui succede il contrario, ad esempio ⊕: Γ ⊢ A (⊕I ) d Γ⊢A⊕B Γ ⊢ B (⊕I ) s Γ ⊢ A⊕B . Una regola della Ludica corrisponde a una sequenza di regole della Logica Lineare, tutte introducenti connettivi della stessa classe. Quindi avremo una regola negativa, un’istanza della quale è la seguente, che costruisce a partire dal loco 3 i due loci 33 e 37: ⊢ 33, 37 (−{3, 7}) 3⊢ e una regola positiva, che scompone i loci 33 e 37 in sotto-loci: 332 ⊢ 331, 337 ⊢ 37 (+{{2}{1, 7}}) ⊢ 33, 37 . Inoltre, vi è un solo assioma, chiamato “demone”, che permette di generare un qualunque loco, ad esempio: ⊢ 3054 Ψ . Notate che le due regole sono etichettate da insiemi di numeri positivi, che possono essere virtualmente di cardinalità infinita, quindi possiamo scrivere istanze delle regole con un numero infinito di loci, o addirittura con un numero infinito di premesse. Il demone poi, ci permette di derivare qualunque cosa, e grazie a questo possiamo internalizzare nella Ludica la verifica interattiva delle dimostrazioni, di cui abbiamo parlato in precedenza. Infatti due dimostrazioni della Ludica (ma qui le dimostrazioni si chiamano disegni) possono interagire l’una con l’altra attraverso una procedura simile all’eliminazione del taglio. L’interazione può avere tre possibili risultati: o termina con la vittoria di uno dei due disegni, quando l’altro si riduce a coincidere con una instanza dell’assioma, o non termina mai, o si blocca senza arrivare ad un risultato preciso. Come succede con un programma per il calcolatore, che non è detto termini con successo: quindi la Ludica spinge ulteriormente l’analogia della Logica con la computazione, arrivando anche a modellare computazioni che sono normalmente considerate “scorrette” (come certamente quelle effettuate da un programma che non restituisce mai un risultato!). Ma poichè la Ludica è stata introdotta a partire da problematiche nate all’interno della Logica Lineare, è naturale chiedersi la relazione tra i due sistemi. Certamente i disegni della Ludica possono essere interpretate come classi (anche infinite) di dimostrazioni nella Logica Lineare. Ad esempio, il disegno: 332 ⊢ 33, 337 ⊢ 37 (+{{2}{1, 7}}) ⊢ 33, 37 (−{3, 7}) ⊢3 rappresenta (tra le altre), le due dimostrazioni seguenti: ⊢P ⊢ Q, R (⊗I) ⊢ P ⊗ Q, R (≀I) ⊢ (P ⊗ Q) ≀ R ⊢ S ⊢ T (⊗I) ⊢ (S ⊗ T ) ⊢ Q, R (⊗I) ⊢ (S ⊗ T ) ⊗ Q, R (&I) ⊢ ((S ⊗ T ) ⊗ Q)&R Se consideriamo la Logica Lineare senza la modalità (MALL), la corrispondenza tra Logica Lineare e Ludica può essere stabilita in modo preciso. Infatti i connettivi della Logica Lineare corrispondono a insiemi di disegni (con particolari caratteristiche), e le formule a proprietà di disegni. Esplorando tali analogie, la Ludica diventa una fondazione per la Logica Lineare, in quanto vale il seguente teorema: Teorema 1 (correttezza) Per ogni dimostrazione in MALL della formula A, esiste un disegno della Ludica che ha la proprietà A ed è vincente. (completezza) Per ogni formula A, esiste un disegno della Ludica che gode della proprieta’ A e rappresenta una dimostrazione senza tagli di A in MALL. Un disegno è vincente quando ogni sua interazione con un disegno complementare termina con la sua vittoria. Ricordando la nozione di interazione, il disegno complementare quindi introduce la nozione di dimostrazione sbagliata di A⊥ . Rimane ancora aperto il problema di estendere la Ludica in modo che il teorema di correttezza e completezza valga per tutta LL (compresa quindi la mdalità). Per ora quindi la Ludica ci offre una teoria strutturale delle dimostrazioni della Logica Lineare, ristretta al caso in cui tutte le risorse sono consumabili. Per un approccio introduttivo alla Logica Lineare e alla Ludica si vedano rispettivamente [4] e [3]. Riferimenti bibliografici [1] A.Asperti and S.Guerrini, 1998, The optimal Implementation of Functional Programming Languages. Cambridge Tracts in Theoretical Computer Science, Cambridge University Press. [2] Asperti and L.Roversi, 2002, Intuitionistic light affine logic. ACM Transactions on Computational Logic, 3(1), pp. 1 - 39. [3] Curien P.-L., 2004, Introduction to Ludics. http://www.pps.jussieu.fr/ curien. [4] Danos V., Di Cosmo R. , 2004,The Linear Logic Primer, course notes, http://www.pps.jussieu.fr/ dicosmo/CourseNotes/LinLog/. [5] Girard J.-Y., 1987, Linear Logic, Theoretical Computer Science, London Mathematical 50:1, pp. 1-102. [6] Girard, J.-Y., 1998, Light Linear Logic, Information and Computation 143. [7] Girard J.-Y., 2001, Locus Solum: From the rules of logic to the logic of rules. Mathematical Structures in Computer Science 11, pp. 301-506. [8] Girard, J.-Y., 1996, Proof-nets : the parallel syntax for proof-theory, Logic and Algebra, eds Ursini and Agliano, Marcel Dekker, New York. [9] Y. Lafont, 1988, The linear abstract machine, Theoretical Computer Science 59, North-Holland, pp. 157-180. Torino, 19 febbraio 2004