3  Inferenza Logica

3.1 Introduzione

L’inferenza logica è un processo fondamentale nel campo della logica, della matematica e della filosofia, utilizzato per derivare conclusioni a partire da premesse o informazioni date. Questo processo può essere visto come un mezzo per scoprire nuove verità o per confermare la validità di affermazioni esistenti. L’inferenza logica può essere di tre tipi :

  • inferenza deduttiva : la conclusione deriva necessariamente dalle premesse; se le premesse sono vere, la conclusione non può che essere vera. Un classico esempio di inferenza deduttiva è il sillogismo: “Tutti gli uomini sono mortali; Socrate è un uomo; quindi, Socrate è mortale.” In questo caso, la verità delle premesse garantisce la verità della conclusione.

  • inferenza induttiva : partendo da osservazioni specifiche o da una serie di dati, arriva a conclusioni più generali, che non sono necessariamente certe ma probabili. Ad esempio, se si osserva che il sole è sorto ogni giorno, si potrebbe inferire che il sole sorgerà anche domani. Questa forma di inferenza è molto utilizzata nella scienza, dove gli scienziati formulano ipotesi basate su dati osservati e sperimentali.

  • inferenza abduttiva : implica la formazione della migliore spiegazione possibile data un insieme di osservazioni. Questo tipo di inferenza è spesso utilizzato nella diagnosi medica, nella ricerca scientifica e nelle indagini criminali, dove si cerca di spiegare i dati osservati nel modo più coerente possibile.

L’inferenza logica è strettamente legata al concetto di validità e di correttezza degli argomenti. Un’argomentazione è valida se la sua struttura logica è tale che, qualora le premesse siano vere, anche la conclusione deve essere vera. Tuttavia, un’argomentazione può essere valida senza essere corretta; per essere corretta, deve avere anche premesse vere. Ad esempio, l’argomentazione “Tutti gli unicorni sono verdi; io possiedo un unicorno; quindi, il mio unicorno è verde” è valida dal punto di vista logico, ma non è corretta perché le premesse non sono vere.

L’inferenza logica è alla base di molti sistemi di intelligenza artificiale e di calcolo automatico, dove gli algoritmi vengono progettati per inferire nuove informazioni a partire da dati iniziali. Nei sistemi esperti, per esempio, vengono utilizzate regole di inferenza per simulare il processo decisionale umano. In conclusione, l’inferenza logica è uno strumento potente e versatile che permea molte aree del pensiero umano e della tecnologia, consentendo di avanzare nella conoscenza e nella comprensione del mondo che ci circonda.

3.2 Proposizioni Logiche

Le proposizioni logiche sono dichiarazioni atomiche che possono essere valutate come vere o false. Le proposizioni possono essere combinate utilizzando operatori logici come AND, OR, NOT, IMPLIES, che permettono di costruire regole complesse rappresentate da formule logiche (DeLancey 2017). Ecco alcuni esempi di proposizioni logiche:

  • p: “Il sole è luminoso” (Vero)
  • q: “La Luna è fatta di formaggio” (Falso)
  • r: “Se piove, allora la strada sarà bagnata” (Condizionale)

3.3 Calcolo delle Proposizioni Logiche

Le proposizioni logiche possono essere manipolate utilizzando vari operatori logici che eseguono operazioni specifiche:

  • Congiunzione (AND): L’operatore AND restituisce vero solo quando entrambe le proposizioni coinvolte sono vere. Ad esempio, se abbiamo due proposizioni p e q, p AND q è vero solo se entrambe p e q sono vere. La cosidetta tabella di verità riportata qui sotto consente di vedere come funziona l’operatore AD.
Tavola della verità per la congiunzione
p q p AND q
False False False
False True False
True False False
True True True
  • Disgiunzione (OR): L’operatore OR restituisce vero se almeno una delle due proposizioni coinvolte è vera. Ad esempio, p OR q è vero se p è vero oppure se q è vero oppure se entrambi sono veri. La tabella di verità riportata qui sotto consente di vedere come funziona l’operatore OR.
Tavola della verità per la disgiunzione
p q p OR q
False False False
False True True
True False True
True True True
  • Negazione (NOT - ¬): L’operatore NOT cambia il valore di verità di una proposizione. Ad esempio, ¬p è vero se p è falso e viceversa.
Tavola della verità per la negazione
p ¬p
False True
True False
  • Implicazione (→): L’implicazione è un’operazione logica che collega due proposizioni e stabilisce una relazione di condizionalità. Si rappresenta con il simbolo “→” e si legge come “se… allora”. In un’implicazione del tipo “p → q”, la proposizione p è chiamata l’antecedente e la proposizione q è il conseguente. L’implicazione è falsa solo nel caso in cui l’antecedente è vero e il conseguente è falso. In tutti gli altri casi, l’implicazione è considerata vera. Poiché questa operazione è alla base di molti algoritmi di inferenza, è importante capire come funziona. La tabella di verità riportata qui sotto consente di vedere come funziona l’operatore implicazione.
Tavola della verità per l’implicazione
p q p → q
False False True
False True True
True False False
True True True

Esempio di Implicazione: supponiamo di avere le seguenti proposizioni: - p: Il sole splende. - q: Faccio una passeggiata.

L’implicazione che possiamo formulare è: “Se il sole splende, allora faccio una passeggiata”, che si scrive come “p → q”. Dalla tabella della verità, possiamo vedere che in tre dei quattro casi l’implicazione “p → q” è vera. L’unico caso in cui l’implicazione è falsa è quando il sole splende (p è vero) ma non faccio una passeggiata (q è falso).

Quindi, in base alla logica dell’implicazione, se il sole splende, sto effettivamente facendo una passeggiata o potrei anche non farla (ad eccezione del caso in cui il sole splenda e io non faccia una passeggiata, in cui l’implicazione è falsa).

  • Implicazione Bilaterale (↔︎): L’implicazione bilaterale è un’operazione logica che stabilisce che due proposizioni sono equivalenti, cioè che entrambe le proposizioni hanno lo stesso valore di verità. Si rappresenta con il simbolo “↔︎” e si legge come “se e solo se”. L’implicazione bilaterale è vera solo quando le proposizioni hanno lo stesso valore di verità, sia entrambe vere che entrambe false.
Tavola della verità per l’implicazione bilaterale
p q p ↔︎ q
False False True
False True False
True False False
True True True

L’implicazione bilaterale, anche conosciuta come “se e solo se”, è un importante concetto logico che stabilisce che due proposizioni sono logicamente equivalenti, cioè entrambe sono vere o entrambe sono false contemporaneamente.

Esempio di Implicazione Bilaterale: supponiamo di avere le seguenti proposizioni:

  • p: Oggi è venerdì.
  • q: Domani è sabato.

L’implicazione bilaterale tra p e q può essere scritta come p ↔︎ q, che si legge come “Oggi è venerdì se e solo se domani è sabato”.

Dalla tabella di verità, possiamo notare che l’implicazione bilaterale “Oggi è venerdì se e solo se domani è sabato” è vera solo nei casi in cui entrambe le proposizioni sono vere (primo e ultimo caso) o entrambe sono false. Se c’è una discrepanza nelle verità delle proposizioni, l’implicazione bilaterale diventa falsa (secondo e terzo caso).

Quindi, nel nostro esempio, l’affermazione “Oggi è venerdì se e solo se domani è sabato” è vera solo quando entrambe le proposizioni sono vere o entrambe sono false, evidenziando l’equivalenza logica tra le due proposizioni nel contesto dell’implicazione bilaterale.

3.4 Basi della Conoscenza

La base della conoscenza in un agente a inferenza logica è costituita da proposizioni logiche, che sono affermazioni dichiarative che possono essere vere o false. Le proposizioni possono essere atomiche o composte e sono spesso rappresentate utilizzando variabili proposizionali. Queste variabili assumono valori di verità (vero o falso) e vengono combinate tramite operatori logici per formare regole logiche complesse. La base della conoscenza in un sistema logico definisce le relazioni tra le proposizioni e fornisce le fondamenta per il ragionamento e l’inferenza. Un agente a inferenza logica usa la Base della Conoscenza per giungere a conclusioni circa il mondo che la circonda; Per fare ciò ha bisogno di regole di implicazione logica (⊨): Se α ⊨ β, ovvero se α implica logicamente β, in ogni mondo dove α è vera allora β è vera. È diversa dall’implicazione perché non è un connettivo logico ma una relazione che dice che se α è vera allora β è vera e basta! ## Sistemi basati sulla conoscenza

I sistemi basati sulla conoscenza sono strumenti informatici progettati per emulare il processo decisionale umano attraverso l’utilizzo di una base di conoscenza strutturata. Questi sistemi raccolgono, organizzano e utilizzano informazioni specifiche di un dominio per risolvere problemi complessi che richiedono competenza specialistica. Una componente fondamentale è la base di conoscenza, che contiene fatti, regole ed euristiche rappresentative del sapere umano in un determinato campo. Il motore di inferenza è l’altro elemento chiave: applica regole logiche ai dati presenti nella base di conoscenza per dedurre nuove informazioni o prendere decisioni informate.

Processo di creazione e gestione di un sistema basato sulla conoscenza

Processo di creazione e gestione di un sistema basato sulla conoscenza

Il processo di creazione di un sistema esperto basato sull’inferenza logica inizia con l’acquisizione della conoscenza, dove gli esperti del dominio collaborano per estrarre informazioni e regole rilevanti. Queste conoscenze vengono poi formalizzate nella rappresentazione della conoscenza, utilizzando strutture come regole if-then, ontologie o reti semantiche, che alimentano la base di conoscenza. Il motore di inferenza viene sviluppato per applicare queste regole logiche ai dati forniti, deducendo nuove informazioni o prendendo decisioni informate. La gestione del sistema include l’aggiornamento continuo della base di conoscenza per riflettere nuove scoperte o cambiamenti nel dominio, nonché la verifica e la validazione del sistema per garantirne l’accuratezza e l’affidabilità. Gli utenti interagiscono con il sistema attraverso un’interfaccia che facilita l’inserimento dei dati e la visualizzazione dei risultati, permettendo anche il feedback per miglioramenti futuri.

Questi sistemi trovano applicazione in vari settori, come la medicina, l’ingegneria, la finanza e l’assistenza clienti. Ad esempio, in ambito medico, un sistema basato sulla conoscenza può aiutare nella diagnosi di malattie analizzando sintomi e storie cliniche dei pazienti. L’efficacia di tali sistemi dipende dalla qualità e dall’aggiornamento costante della base di conoscenza, nonché dalla capacità del motore di inferenza di elaborare correttamente le informazioni.

Tip

I sistemi esperti - Negli anni ’80, l’inferenza logica è stata fondamentale nello sviluppo dei sistemi esperti, strumenti avanzati di intelligenza artificiale progettati per risolvere problemi complessi emulando il ragionamento umano. Due noti prodotti commerciali di quel periodo sono stati MYCIN, un sistema esperto per la diagnosi di infezioni del sangue, e XCON, utilizzato per configurare sistemi di computer VAX di Digital Equipment Corporation. MYCIN e XCON sfruttavano regole di inferenza per elaborare informazioni e fornire raccomandazioni o soluzioni, dimostrando l’efficacia dell’inferenza logica in applicazioni pratiche e commerciali McDermott (1980)

Un vantaggio significativo dei sistemi basati sulla conoscenza è la possibilità di conservare e diffondere l’esperienza di esperti, rendendola accessibile a un pubblico più ampio e contribuendo alla standardizzazione delle pratiche. Tuttavia, la creazione e la manutenzione di una base di conoscenza richiedono notevoli risorse e competenze. Con l’avanzamento dell’intelligenza artificiale e dell’apprendimento automatico, questi sistemi continuano a evolversi, integrando nuove tecniche per migliorare l’efficienza, l’accuratezza e la capacità di apprendimento autonomo nelle loro applicazioni.

3.5 Laboratorio Python: inferenza logica

In questo paragrafo, useremo la libreria SymPy dell’ecosistema Python per creare un semplice sistema esperto basato sull’inferenza logica nell’ambito del diritto penale. Questo sistema aiuterà a determinare se determinati comportamenti costituiscono un reato, in base ai fatti noti e alle norme applicabili. Si noti che la libreria SymPy è stata sviluppata per consentire il calcolo simbolico in Python. In questo caso useremo le funzionalità di calcolo simbolico per la rappresentazione della conoscenza e per l’inferenza logica.

Esegui in Colab

(click-ando su questo pulsante aprirete il quaderno all’interno di COLAB di Google dove potrete eseguire il notebook comtenente tutto il codice di questo paragrafo online senza bisogno di avere un ambiente Python sulla vostra macchina.)

3.5.1 Esperimento 1: Semplice applicazione della inferenza logica al Diritto penale

Il diritto penale si basa su norme che definiscono quali comportamenti sono considerati reati e quali elementi devono essere presenti affinché un’azione sia punibile. Un sistema esperto in questo contesto può aiutare a: - Valutare se un’azione specifica costituisce un reato. - Identificare gli elementi costitutivi del reato. - Fornire una base logica per decisioni legali. Utilizzeremo SymPy per modellare proposizioni logiche, regole legali e per effettuare inferenze.

Caution

Nota: Assicurati di avere SymPy installato. Altrimenti, installalo da terminale con:

pip install sympy

Glossario dei termini usati

  • Fatti: Eventi o comportamenti specifici accaduti, rilevanti per il diritto penale in quanto potenzialmente costituenti reato o circostanze di esclusione della responsabilità.
  • Reati: Condotte umane attive o omissive, tipiche, antigiuridiche e colpevoli, sanzionate dalla legge penale.
  • Elementi Costitutivi del Reato: Presupposti oggettivi e soggettivi richiesti dalla norma incriminatrice per configurare un fatto come reato, tra cui la condotta (azione o omissione), il dolo o la colpa, il nesso di causalità e l’assenza di cause di giustificazione.
  • Regole Legali: Norme giuridiche che stabiliscono i presupposti di fatto e di diritto in presenza dei quali un comportamento umano è qualificabile come reato e punibile mediante una sanzione.

Modellazione con SymPy

# **Passo 1: Importare i Moduli Necessari** 
# Importiamo i moduli necessari da SymPy per 
# lavorare con la logica proposizionale.

from sympy import symbols
from sympy.logic.boolalg import And, Or, Not, Implies, Equivalent
from sympy.logic.inference import satisfiable

# **Passo 2: Definire le Proposizioni Logiche** Definiamo le variabili che rappresentano 
# i fatti e gli elementi costitutivi del reato.

# Fatti
Azione, Intenzione, NessoCausale = symbols('Azione Intenzione NessoCausale')

# Reato
Omicidio = symbols('Omicidio')

#**Passo 3: Definire le Regole che discendono dal Codice Penale** Ad esempio, secondo il codice 
# penale, l'omicidio richiede: 
# - **Azione**: Causare la morte di una persona. 
# - **Intenzione**: Volontà di causare la morte (dolo). 
# - **Nesso Causale**: La morte è conseguenza dell'azione. Definiamo la regola:

# Regola: 
# Se c'è Azione, Intenzione e Nesso Causale, allora si configura l'Omicidio
# regola_omicidio: And(Azione, Intenzione, NessoCausale) -> Omicidio
regola_omicidio = Implies(And(Azione, Intenzione, NessoCausale), Omicidio)

# **Passo 4: Definire i Fatti Noti** 
# Supponiamo di avere i seguenti fatti: 
# - Una persona ha compiuto un'azione che ha causato la morte di un'altra. 
# - Aveva l'intenzione di causare la morte. 
# - Esiste un nesso causale tra l'azione e la morte.

fatto1 = Azione  # L'azione di causare la morte
fatto2 = Intenzione  # Intenzione di causare la morte
fatto3 = NessoCausale  # La morte è conseguenza dell'azione

# **Passo 5: Creare la Base di Conoscenza** 
# Combiniamo fatti e regole:
# Base di conoscenza
base_conoscenza = And(fatto1, fatto2, fatto3, regola_omicidio)

# **Passo 6: Inferenza Logica** 
# Verifichiamo se, sulla base dei fatti e delle regole, possiamo concludere che si 
# tratta di omicidio.
# Verifichiamo se Omicidio è deducibile
ipotesi = And(base_conoscenza, Not(Omicidio))
risultato = satisfiable(ipotesi)

if not risultato:
    print("Si configura il reato di omicidio.")
else:
    print("Non possiamo concludere che si tratti di omicidio.")
Si configura il reato di omicidio.

3.5.2 Esperimento 2: Mancanza di intenzione

Caso con Mancanza di Intenzione Supponiamo che l’intenzione non sia presente (ad esempio, si tratta di omicidio colposo).

# Fatti noti senza Intenzione
fatto1 = Azione
fatto2 = Not(Intenzione)  # Mancanza di intenzione
fatto3 = NessoCausale

# Base di conoscenza aggiornata
base_conoscenza = And(fatto1, fatto2, fatto3, regola_omicidio)
# **Inferenza per Omicidio**
# Inferenza
ipotesi = And(base_conoscenza, Not(Omicidio))
risultato = satisfiable(ipotesi)

if not risultato:
    print("Si configura il reato di omicidio.")
else:
    print("Non possiamo concludere che si tratti di omicidio.")
Non possiamo concludere che si tratti di omicidio.

3.5.3 Esperimento 3: Omicidio Colposo

Aggiungiamo la regola per l’omicidio colposo:

# Definizione del reato di Omicidio Colposo
OmicidioColposo = symbols('OmicidioColposo')

# Regola per Omicidio Colposo: 
# Azione e Nesso Causale senza Intenzione
# regola_omicidio_colposo: And(Azione, Not(Intenzione), NessoCausale) -> OmicidioColposo
regola_omicidio_colposo = Implies(And(Azione, Not(Intenzione), NessoCausale), OmicidioColposo)

# Aggiorniamo la base di conoscenza
base_conoscenza = And(fatto1, fatto2, fatto3, regola_omicidio, regola_omicidio_colposo)

# **Inferenza per Omicidio Colposo**
# Verifichiamo se si configura l'Omicidio Colposo
ipotesi = And(base_conoscenza, Not(OmicidioColposo))
risultato = satisfiable(ipotesi)

if not risultato:
    print("Si configura il reato di omicidio colposo.")
else:
    print("Non possiamo concludere che si tratti di omicidio colposo.")
Si configura il reato di omicidio colposo.

Ricorda che questo è un modello semplificato e che il diritto penale è complesso e richiede una comprensione approfondita per essere modellato accuratamente. Questo sistema può essere un punto di partenza per sviluppi più avanzati e per esplorare l’intersezione tra intelligenza artificiale e diritto. Esplorazione che il lettore è invitato a sviluppare ulteriormente svolgendo gli esercizi proposti.

3.6 Esercizi

3.6.1 Esercizio 1: Legge di De Morgan

Verifica la seguente uguaglianza logica (Legge di De Morgan) usando le tavole della verità delle funzioni AND, NOT (¬) e OR :

¬(A OR B) = ¬A AND ¬B

3.6.2 Esercizio 2: semplice sistema esperto per valutare la legittima difesa

Implementa un sistema esperto per determinare se un caso si configura come legittima difesa utilizzando la logica proposizionale con SymPy.

La legittima difesa è ammissibile quando si verificano le seguenti condizioni:

  • Esistenza di un pericolo attuale: Il pericolo deve essere immediato e concreto.
  • Minaccia ingiusta: La minaccia deve essere illegittima o non giustificata.
  • Necessità di difendersi: Deve essere impossibile evitare il pericolo in altro modo.
  • Proporzionalità della difesa: La difesa deve essere adeguata e commisurata alla minaccia.

La codifica in Python, usando la libreria SymPy, potrebbe essere la seguente:

from sympy.logic.boolalg import And, Or, Not, Implies
from sympy import symbols, satisfiable

# Definizione dei simboli
PericoloAttuale = symbols('PericoloAttuale')
MinacciaIngiusta = symbols('MinacciaIngiusta')
NecessitaDifesa = symbols('NecessitaDifesa')
ProporzionalitaDifesa = symbols('ProporzionalitaDifesa')
LegittimaDifesa = symbols('LegittimaDifesa')

# Definizione della regola per la legittima difesa
regola_legittima_difesa = Implies(
    And(PericoloAttuale, MinacciaIngiusta, NecessitaDifesa, ProporzionalitaDifesa),
    LegittimaDifesa
)

# Caso di studio: 
# Una persona reagisce a un tentativo di rapina armata con una spinta che fa cadere l'aggressore
fatto1 = PericoloAttuale      # C'è un rapinatore armato
fatto2 = MinacciaIngiusta     # La minaccia è ingiusta
fatto3 = NecessitaDifesa      # Non c'è via di fuga
fatto4 = ProporzionalitaDifesa # La spinta è proporzionata rispetto alla minaccia

# Base di conoscenza
base_conoscenza = And(fatto1, fatto2, fatto3, fatto4, regola_legittima_difesa)

# Verifica se si configura la legittima difesa
ipotesi = And(base_conoscenza, Not(LegittimaDifesa))
risultato = satisfiable(ipotesi)

if not risultato:
    print("Si configura la legittima difesa.")
else:
    print("Non si configura la legittima difesa.")
Si configura la legittima difesa.

Aggiungi una nuova regola per l’eccesso colposo di legittima difesa e Implementa l’inferenza per verificare se si configura l’eccesso di legittima difesa

3.6.3 Esercizio 3: semplice sistema esperto per valutare la premeditazione

La base di consoscenza da modificare è la seguente codificata in Python, usando la libreria SymPy:

from sympy.logic.boolalg import And, Or, Not, Implies
from sympy import symbols, satisfiable

# Definizione dei simboli
Pianificazione = symbols('Pianificazione')
AcquistoStrumenti = symbols('AcquistoStrumenti')
Appostamento = symbols('Appostamento')
SceltaVittima = symbols('SceltaVittima')
Premeditazione = symbols('Premeditazione')

# Definizione della regola per la premeditazione
regola_premeditazione = Implies(
    And(Pianificazione, AcquistoStrumenti, Appostamento, SceltaVittima),
    Premeditazione
)

# Caso di studio:
# Un individuo ha commesso un crimine dopo aver:
fatto1 = Pianificazione      # Pianificato l'azione per settimane
fatto2 = AcquistoStrumenti  # Acquistato gli strumenti necessari
fatto3 = Appostamento       # Studiato le abitudini della vittima
fatto4 = SceltaVittima      # Scelto specificamente la vittima

# Base di conoscenza
base_conoscenza = And(fatto1, fatto2, fatto3, fatto4, regola_premeditazione)

# Verifica se si configura la premeditazione
ipotesi = And(base_conoscenza, Not(Premeditazione))
risultato = satisfiable(ipotesi)

if not risultato:
    print("Si configura la premeditazione.")
else:
    print("Non si configura la premeditazione.")
Si configura la premeditazione.

Aggiungi una nuova regola per distinguere tra premeditazione e dolo eventuale. Implementa l’inferenza per verificare la presenza di circostanze aggravanti

Buchanan, Bruce G., and Edward H. Shortliffe. 1984. Rule-Based Expert Systems: The MYCIN Experiments of the Stanford Heuristic Programming Project. Addison-Wesley.
DeLancey, Craig. 2017. A Concise Introduction to Logic. Open SUNY. https://open.umn.edu/opentextbooks/textbooks/452.
McDermott, John P. 1980. “RI: An Expert in the Computer Systems Domain.” In AAAI Conference on Artificial Intelligence. https://api.semanticscholar.org/CorpusID:13902711.