∀ Matematica discreta

Implicazione, inversa e contronominale: non confonderle mai

Differenza tra implicazione, inversa, contraria e contronominale, condizione necessaria e sufficiente, con esempi presi dal codice e dalla vita reale.

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.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche