L'implicazione è il connettivo che genera più errori di ragionamento, sia nelle dimostrazioni sia nella vita di tutti i giorni. Data una frase del tipo «se p allora q», si possono costruire tre frasi imparentate che sembrano dire la stessa cosa, ma solo una di esse è davvero equivalente all'originale. Saperle distinguere è una competenza di base per chi scrive codice, specifiche o argomentazioni.
Le quattro forme
Partiamo da un'implicazione p → q, per esempio: «se un utente è amministratore, allora può cancellare i file».
| Nome | Forma | Esempio |
|---|---|---|
| Implicazione (diretta) | p → q | se è amministratore, può cancellare |
| Inversa (o conversa) | q → p | se può cancellare, è amministratore |
| Contraria | ¬p → ¬q | se non è amministratore, non può cancellare |
| Contronominale | ¬q → ¬p | se non può cancellare, non è amministratore |
La regola da ricordare è una sola: l'implicazione è equivalente alla sua contronominale, e l'inversa è equivalente alla contraria. Ma implicazione e inversa non sono equivalenti tra loro.
Nell'esempio, il fatto che gli amministratori possano cancellare non dice nulla su chi altro possa farlo: magari anche il proprietario del file. Quindi l'inversa può essere falsa mentre la diretta è vera. La contronominale invece regge sempre: se qualcuno non può cancellare, non può essere amministratore, perché altrimenti potrebbe.
Verifica con la tavola di verità
Confrontiamo le colonne:
| p | q | p → q | q → p | ¬q → ¬p |
|---|---|---|---|---|
| V | V | V | V | V |
| V | F | F | V | F |
| F | V | V | F | V |
| F | F | V | V | V |
La colonna di p → q coincide con quella di ¬q → ¬p, mentre quella di q → p è diversa nella seconda e nella terza riga. La tavola conferma ciò che l'esempio suggeriva.
Condizione necessaria e condizione sufficiente
Nell'implicazione p → q:
- p è condizione sufficiente per q: basta che p sia vera perché q lo sia.
- q è condizione necessaria per p: senza q, p non può essere vera.
«Essere divisibile per 4 è sufficiente per essere pari» corrisponde a «divisibile per 4 → pari». «Essere pari è necessario per essere divisibile per 4» dice esattamente la stessa cosa, letta dall'altro lato. Quando una condizione è sia necessaria sia sufficiente si scrive p ↔ q e si dice «p se e solo se q».
Una trappola linguistica frequente riguarda «solo se». La frase «p solo se q» significa p → q, non q → p. «Puoi accedere solo se hai la password» vuol dire che l'accesso implica il possesso della password; non dice che avere la password basti (potrebbe servire anche un secondo fattore).
Errori tipici di ragionamento
Due fallacie classiche nascono proprio dalla confusione tra queste forme.
Affermazione del conseguente
«Se il server è sotto attacco, il traffico aumenta. Il traffico è aumentato. Quindi il server è sotto attacco.» È un ragionamento non valido: si sta usando l'inversa come se fosse vera. Il traffico può aumentare per una campagna pubblicitaria, un aggiornamento automatico, un articolo che ha avuto successo.
Negazione dell'antecedente
«Se il file è cifrato, è protetto. Il file non è cifrato. Quindi non è protetto.» Anche questo è sbagliato: si sta usando la contraria. Il file potrebbe essere protetto dai permessi del sistema operativo o da un supporto fisicamente isolato.
In entrambi i casi la conclusione può essere vera per caso, ma non segue dalle premesse. Nel mio lavoro, quando analizzo i segnali di un incidente, questa distinzione è fondamentale: un indizio compatibile con un'ipotesi non la dimostra.
L'implicazione nel codice
Nei linguaggi di programmazione non esiste di solito un operatore di implicazione, ma la si esprime facilmente sfruttando l'equivalenza p → q ≡ ¬p ∨ q:
# "se l'ordine è spedito, allora deve avere un indirizzo"
valido = (not ordine.spedito) or (ordine.indirizzo is not None)
Questo schema è utile nei controlli di integrità e nelle asserzioni. Scrivere spedito and indirizzo is not None sarebbe un errore: renderebbe non valido ogni ordine non ancora spedito.
La contronominale torna utile anche nel debugging. Se sappiamo che «se la configurazione è corretta, il servizio parte», e il servizio non parte, possiamo concludere con certezza che la configurazione non è corretta (a patto che l'implicazione sia davvero vera, cosa che va verificata).
La contronominale nelle dimostrazioni
Molte dimostrazioni diventano più semplici se si prova la contronominale. Esempio: «se n² è pari, allora n è pari». Dimostrarlo direttamente è scomodo; la contronominale è «se n è dispari, allora n² è dispari». Se n = 2k + 1, allora n² = 4k² + 4k + 1 = 2(2k² + 2k) + 1, che è dispari. Fatto: abbiamo dimostrato l'enunciato originale.
In sintesi
- p → q è equivalente alla contronominale ¬q → ¬p, non all'inversa q → p.
- In p → q, p è sufficiente per q e q è necessaria per p; «p solo se q» significa p → q.
- Affermare il conseguente e negare l'antecedente sono fallacie, anche quando la conclusione è vera per caso.
- Nel codice l'implicazione si scrive come
not p or q. - Dimostrare la contronominale è spesso la strada più breve.