Storia della logica non-monotona

L’uso della logica come tentativo di emulare il ragionamento umano è un arte antica. Già Aristotele nel IV secolo A.C., spinto dal suo enorme desiderio di razionalizzare il mondo, si era spinto fino al punto di cercare di meccanizzare il pensiero umano. Aristotele ci provò con i sillogismi che definiva come “un discorso nel quale, supposta la verità di alcune cose, si deduce la necessaria verità di una conclusione diversa dai presupposti”.

Verso la fine del 1200, il filosofo catalano Ramon Llull passò gran parte del suo tempo nel tentativo di creare macchine in grado di generare automaticamente ragionamenti utili (Ars generalis ultima). Sebbene il suo scopo fosse un po’ ardito (Ramon tentava di dimostrare la supremazia del Cristianesimo sull’Islam e l’Ebraismo facendo derivare automaticamente la dottrina Cristiana a partire da alcuni principi di base) la mole di tecniche di calcolo e di ragionamento create dal filosofo catalano fu decisamente elevata per l’epoca.

Tuttavia sia Aristotele che Lull che tutti gli altri che ci hanno provato nei secoli a venire (e ci provano tutt’ora) hanno fallito: i loro metodi si sono sempre trovati davanti al problema di non essere scalabili alla complessità del mondo reale. Apparve chiaro, insomma, che l’uomo non è una raffinata macchina risolutiva di formule logiche o, almeno, non solo.

La mente umana infatti, a differenza dei modelli logici classici, assume e ipotizza. Cosa significa matematicamente? Significa che la mente umana conclude più cose di quelle che sa (o che può logicamente dedurre) e, quindi, l’aggiunta di nuove informazioni non aumenta ed eventualmente modifica il numero delle conclusioni precedenti. Questo meccanismo prende il nome di logica non-monotona. Ma andiamo per gradi.

L’esempio classico di ragionamento non-monotono è dato dagli uccelli.

\forall x Uccello(x) \rightarrow Vola(x)

Secondo la logica classica questa frase va interpretata come “Per ogni x, se x è un Uccello allora x Vola” . Tuttavia sappiamo benissimo che i pinguini, pur essendo uccelli, non volano. Quindi:

\forall x Uccello(x) \wedge \neg Pinguino(x) \rightarrow Vola(x)

Purtroppo nella logica classica non possiamo dire che una certa x non è un Pinguino a meno che non sappiamo esplicitamente che non lo sia. Quindi non posso concludere nulla su ciò che non sia esplicitamente un non-pinguino. Mi spiego meglio.

Supponiamo di sapere che Polly è un uccello ma di non avere nessuna informazione sul fatto che sia o no un pinguino. Notate bene, non sapere nulla su un fatto significa che non posso dire ne che Pinguino(Polly) ne il contrario. Se chiediamo ad un agente logico se Vola(Polly) la risposta sarà solo una BOH. Poiché non ho informazioni su Pinguino(Polly) non posso in alcun modo utilizzare la regola precedente.

Se invece chiedo ad un agente umano se Polly vola, dato che è un uccello, la risposta sarà rapida e veloce: SI. Questo perché la mente umana assume più o meno in modo inconscio che se una cosa non viene menzionata significa che sia falsa e rimane falsa fino a prova contraria. Questo comportamento permette di prendere decisioni e di dedurre nuove informazioni anche nei casi in cui la logica classica fallisce ed è un comportamento che vorremmo simulare con le nostre macchine.

Il primo tentativo al riguardo risale agli anni 80 del secolo scorso quando John McCarthy formalizzò la tecnica chiamata Circumscription. Il meccanismo è semplice quanto potente:

\forall x Uccello(x) \wedge \neg Anormale(x) \rightarrow Vola(x)

Il meccanismo introduce un nuovo predicato Anormale(x) il quale, se non può essere provato che sia vero, è considerato falso. Anormale è un predicato che aggrega tutte le eccezioni che vanno contro il senso comune o la generalità di un affermazione, in particolare nel nostro esempio Anormale sarà vero se x è un pinguino, se x è una gallina e così via.

Notiamo ora la caratteristica non-monotona di questa logica. Se sappiamo solo che Polly è un uccello possiamo dedurre che vola, se aggiungiamo che Polly è Anormale deduciamo che non vola mentre invalidiamo la conclusione precedente!

Sempre in quel periodo viene formalizzata la logica di default che si basa sugli stessi principi ma che, essendo più complicata (e da certi punti di vista, potente) non è il caso di approfondirla.

Tutti questi formalismi però hanno lo stesso effetto: formalizzare una conoscenza che muta, varia, sbaglia e si corregge. La logica classica infatti impone che aggiungendo informazioni ad un insieme di conoscenze o entra in contraddizione (ed è quindi da buttare) oppure cresce nel senso che tutte le conclusioni precedenti devono continuare a valere. La bellezza della logica non-monotona invece sta proprio nel fatto che l’insieme di conoscenze che produce è aggiornabile ed evolve adattandosi alla realtà. Non importa che possa arrivare a conclusioni errate (ma coerenti con le sue conoscenze) perché è possibile correggerlo. La logica non-monotona incarna il principio dell’errore e della possibilità di correggersi. Un comportamento umano, umanissimo.

Insomma, ci abbiamo messo più di duemila anni per capire che a renderci così abili nel ragionare è proprio la nostra libertà di sbagliare. Errare è umano e anche le macchine, per essere umane, devono poter sbagliare.

Comments are closed.