12.01.2015 Views

Appunti dalle lezioni Parte I: capitoli 1–3 - Vernimark

Appunti dalle lezioni Parte I: capitoli 1–3 - Vernimark

Appunti dalle lezioni Parte I: capitoli 1–3 - Vernimark

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Politecnico di Milano<br />

V Facoltà di ingegneria<br />

Corso di Ingegneria della conoscenza e sistemi esperti<br />

Anno accademico 1998/99<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong><br />

<strong>Parte</strong> I: <strong>capitoli</strong> 1–3<br />

Marco Colombetti<br />

Avvertenza<br />

Queste dispense sono disponibili sul sito web<br />

http://www.elet.polimi.it/Users/DEI/Sections/Compeng/Marco.Colombetti/ICSE.ht<br />

ml. La proprietà intellettuale è dell’autore. È consentita la riproduzione e la distribuzione con qualunque<br />

mezzo e sotto qualsiasi forma purché non a fini di lucro.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


Indice (parte I)<br />

1. Introduzione 3<br />

1.1 L’ingegneria della conoscenza<br />

1.2 Il concetto di agente<br />

1.3 Uno schema generale di agente<br />

1.4 Una tipologia degli agenti<br />

1.5 Agenti razionali<br />

2. La logica 10<br />

2.1 La validità delle argomentazioni<br />

2.2 Il linguaggio formale degli enunciati<br />

2.3 La verità<br />

2.4 La meccanizzazione della logica<br />

2.5 La logica nell’intelligenza artificiale<br />

3. La logica del primo ordine 17<br />

3.1 Il linguaggio predicativo del primo ordine<br />

3.2 La semantica formale<br />

3.3 Il calcolo: una procedura di prova per enunciati del primo ordine<br />

3.4 Teorema di deduzione e regole derivate<br />

3.5 Calcolo della validità di un’argomentazione<br />

3.6 Alcune equivalenze importanti<br />

Riferimenti bibliografici (parte I) 39<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


1 Introduzione 3<br />

1 Introduzione<br />

1.1 L’ingegneria della conoscenza e i sistemi esperti<br />

L’ingegneria della conoscenza è un’area dell’intelligenza artificiale (IA), ovvero di quel settore<br />

dell’informatica che si pone l’obiettivo di realizzare sistemi computazionali “intelligenti”.<br />

L’IA classica (detta anche IA simbolica) parte <strong>dalle</strong> seguenti ipotesi:<br />

• l’intelligenza è la capacità di utilizzare conoscenze per risolvere problemi;<br />

• le conoscenze sono rappresentate sotto forma di espressioni simboliche, ovvero di enunciati di un<br />

opportuno linguaggio formale;<br />

• nella risoluzione di problemi, le espressioni simboliche che rappresentano le conoscenze sono<br />

manipolate da algoritmi di elaborazione simbolica.<br />

Dal punto di vista dell’IA classica, quindi, un sistema intelligente possiede conoscenze rappresentate in<br />

forma simbolica ed è capace di sfruttarle con procedure algoritmiche. Sistemi di questo tipo si dicono<br />

anche sistemi basati su conoscenze (KBS, knowledge based systems). All’interno dell’IA, l’ingegneria<br />

della conoscenza si occupa in particolare dei seguenti problemi:<br />

• acquisizione delle conoscenze da rappresentare per risolvere una determinata classe di problemi;<br />

• rappresentazione delle conoscenze in una forma utilizzabile da parte di algortmi appropriati;<br />

• formulazione degli algoritmi che manipolano le conoscenze rappresentate;<br />

• realizzazione di sistemi specifici e di ambienti per lo sviluppo di KBS.<br />

La fonte delle conoscenze rappresentate è un aspetto critico nella realizzazione di un KBS: nessun sistema<br />

può avere buone prestazioni se la conoscenza che possiede è errata o eccessivamente lacunosa. In molti<br />

casi di interesse applicativo la fonte delle conoscenze è un esperto umano: si può realizzare un KBS per<br />

la diagnosi, poniamo, di certe patologie cardiache interagendo con un cardiologo e cercando di<br />

rappresentare le sue conoscenze specialistiche. Nei casi di questo genere il KBS è detto sistema esperto.<br />

Un punto di vista recente è che l’obiettivo principale dell’ingegneria della conoscenza sia progettare e<br />

realizzare “agenti intelligenti” o, per usare un termine più rigoroso, agenti razionali. Questo concetto è<br />

presentato nel prossimo paragrafo.<br />

1.2 Il concetto di agente<br />

L’informatica, come tutte le discipline scientifiche o tecniche, fa spesso appello a metafore. Un esempio<br />

noto a tutti è la metafora della scrivania sottostante le interfacce WIMP (Windows, Icons, Menus,<br />

Pointers), che mostrano il file system come il ripiano di una scrivania su cui poggiano cartellette,<br />

documenti e così via. Solo alcuni aspetti delle scrivanie reali sono riportati nella scrivania virtuale che<br />

costituisce l’interfaccia. Ma questo è ovvio, e tipico di ogni metafora: ad esempio, se diciamo che<br />

“Filippo è una lumaca” probabilmente vogliamo dire che Filippo è molto lento in qualche attività, e non<br />

che si porta la casa sulle spalle.<br />

Un’altra metafora molto nota, che ora analizzeremo più da vicino, è quella che ha portato alla definizione<br />

dei sistemi a oggetti. In un sistema a oggetti, una unità di programma è vista metaforicamente come un<br />

oggetto fisico.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


1 Introduzione 4<br />

A questo fine, degli oggetti fisici sono considerati salienti tre aspetti:<br />

• Ogni oggetto fisico ha un tipo (è una mela, un bicchiere, e così via); a loro volta, i tipi possono<br />

essere visti come sottotipi di tipi più generali (ogni mela è un frutto, ogni frutto è un oggetto<br />

fisico).<br />

• Ogni oggetto fisico ha un insieme di proprietà specifiche (ogni mela ha un colore e un sapore) e/o<br />

una struttura (un bicchiere ha un gambo e un calice).<br />

• Ogni oggetto fisico ha una dinamica propria, ovvero un modo specifico di reagire alle azioni<br />

compiute su di esso (una mela si taglia se viene premuta con un coltello; un bicchiere si rompe se<br />

lo colpisce).<br />

Questi aspetti degli oggetti fisici trovano corrispondenza negli oggetti informatici. Come è noto, infatti,<br />

gli oggetti informatici sono caratterizzati da un tipo (la classe di appartenenza diretta), e i tipi (le classi)<br />

sono inseriti in una gerarchia di sottotipi (la gerarchia delle classi); inoltre le variabili locali degli oggetti<br />

ne definiscono le proprietà possibili e la struttura, e i metodi ne definiscono la dinamica.<br />

Da alcuni anni, nell’informatica sta prendendo piede un’altra metafora. Si considera infatti importante<br />

creare programmi che possano essere considerati degli agenti. Al contrario del caso precedente, però,<br />

questo concetto non ha ancora un’interpretazione unica e universalmente condivisa. L’idea di agente<br />

informatico è piuttosto vaga, e per ora si limita a esprimere un insieme di proprietà la cui importanza<br />

viene percepita, ma che non si è ancora riusciti a tradurre in concetti chiari e univoci. Proprio per<br />

questo motivo è importante tentare di capire che cosa ci sia dietro alla metafora dell’agente.<br />

Un agente, ovviamente, è un sistema che agisce – ma questo non chiarisce nulla. Esistono in natura<br />

sistemi che agiscono, ma quali sono Il prototipo di un sistema che agisce, ovviamente, è l’essere<br />

umano. Ma anche gli organismi animali sono agenti. L’idea è che “agire” significhi interagire con<br />

l’ambiente allo scopo di realizzare una funzione o di raggiungere uno scopo. Ad esempio, un animale<br />

selvatico può abbandonare la tana allo scopo di procurarsi il cibo necessario alla sua sopravvivenza. Nel<br />

fare questo, l’animale cercherà di massimizzare il quantitativo di cibo procurato e di minimizzare il<br />

rischio di essere catturato da un predatore.<br />

Le proprietà caratteristiche degli agenti sono meno immediate di quelle degli oggetti. Tuttavia è possibile<br />

mettere a fuoco alcune caratteristiche fondamentali:<br />

• Comportamento orientato al compito. Il comportamento di un agente non è rigidamente<br />

predefinito, ma è flessibile e orientato allo svolgimento di un compito (task oriented).<br />

• Comportamento continuo. Un agente agisce in modo continuo, nel senso che è sempre disponibile<br />

ad agire per raggiungere i propri obiettivi quando se ne presenti l'opportunità.<br />

• Interazione con l’ambiente. Lo svolgimento del compito può richiedere comportamenti<br />

notevolmente diversi a seconda dello stato dell’ambiente con cui l’agente interagisce.<br />

• Ambiente parzialmente ignoto e imprevedibile. Le caratteristiche dell’ambiente sono spesso<br />

parzialmente sconosciute e difficili o impossibili da prevedere.<br />

• Reattività e proattività. Un agente non si limita a reagire agli stimoli provenienti dall'ambiente, ma<br />

pianifica le proprie attività e prende l'iniziativa per raggiungere i propri obiettivi.<br />

• Autonomia. La flessibilità del comportamento dell’agente non si basa su un’interazione con un<br />

utente esterno, ma è frutto dell’organizzazione interna dell’agente.<br />

A queste caratteristiche se ne aggiungono spesso altre che verranno discusse in seguito.<br />

Un esempio di agente potrebbe essere l’assai desiderato email assistant, ovvero un programma in grado<br />

di leggere e filtrare la posta elettronica in modo intelligente. Un buon email assistant dovrebbe essere in<br />

grado di identificare ed eliminare la posta spazzatura, di classificare i messaggi in base al contenuto, di<br />

segnalare i messaggi veramente urgenti, e così via. Un altro esempio di agente potrebbe essere un search<br />

agent, in grado di esplorare il web e di segnalare i siti il cui contenuto può interessare un certo utente di<br />

cui sono noti gli interessi e le attività. Un altro esempio ancora potrebbe essere un agente in grado di<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


1 Introduzione 5<br />

partecipare alle aste elettroniche di un certo tipo di beni e di eseguire acquisti oculati contrattando<br />

opportunamente i prezzi.<br />

Agenti di questo tipo appartengono al futuro dell’informatica, e sembrano richiedere in modo essenziali<br />

l’uso di tecniche di intelligenza artificiale (vedi Russell & Norvig, 1995; Nilsson, 1998). Oggi il termine<br />

“agente” è già utilizzato, ma di solito caratterizza sistemi software a codice mobile, in grado di trasferirsi<br />

attraverso la rete per essere eseguiti da macchine diverse. Di questo tipo di agenti non ci interesseremo<br />

qui.<br />

1.3 Uno schema generale di agente<br />

Un agente è dunque un programma progettato almeno in parte sul modello (naturalmente molto<br />

semplificato) di un essere umano o di un altro organismo animale. Possiamo quindi tracciare un primo<br />

schema di agente (fig. 1.1).<br />

Agente<br />

Ambiente<br />

Figura 1.1 Schema di agente: livello 1.<br />

La figura suggerisce che l’agente ha in ingresso informazioni sull’ambiente e a sua volta agisce<br />

sull’ambiente. In generale, l’ambiente è un sistema dinamico, pensato in tempo continuo o discreto.<br />

L’agente è anch’esso un sistema dinamico (o eventualmente algebrico, ovvero privo di stato), e viene<br />

modellato in tempo discreto. Più precisamente, penseremo che il sistema computazionale che<br />

implementa l’agente funzioni in modo ciclico, temporizzato da un opportuno clock. Se t è l’istante di<br />

tempo, il ciclo agente segue allora il seguente schema:<br />

t ← 0;<br />

loop<br />

raccogli i dati sull’ambiente;<br />

decidi che azione eseguire;<br />

esegui l’azione;<br />

t ← t + 1<br />

endloop<br />

La funzionalità principale di un agente è quindi decidere, caso per caso, che azione eseguire per svolgere<br />

il proprio compito. Spingendo un po’ più avanti la nostra analisi possiamo identificare i seguenti moduli<br />

funzionali (fig. 1.2):<br />

• il sistema sensoriale S (o percezione), che interagisce con l'ambiente e fornisce informazioni in<br />

ingresso al sistema decisionale;<br />

• il sistema decisionale D, che decide come agire sull’ambiente sulla base degli ingressi ricevuti dal<br />

sistema sensoriale;<br />

• il sistema attuativo A, che traduce le decisioni del sistema decisionale in azioni sull’ambiente.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


1 Introduzione 6<br />

A questo punto è opportuno distinguere fra agenti fisici o robotici (come i robot mobili) e agenti software<br />

(che, al contrario dei robot, non hanno un “corpo”). Nel caso degli agenti fisici l’acquisizione di<br />

informazioni sull’ambiente e l’azione sull’ambiente sono due funzionalità complesse e problematiche. Di<br />

solito questo non è vero per gli agenti software, per i quali i sistemi sensoriale e attuativo sono spesso<br />

banali.<br />

S D A<br />

Ambiente<br />

Figura 1.1 Schema di agente: livello 2.<br />

1.4 Una tipologia degli agenti<br />

Una tipologia ad alto livello degli agenti può essere tracciata sulla base della complessità del loro sistema<br />

decisionale.<br />

1.4.1 Agenti SR<br />

Il tipo più semplice di agente, detto agente stimolo-risposta o SR, realizza un legame algebrico fra<br />

l’ingresso proveniente dal sistema sensoriale e le decisioni inviate al sistema attuativo. Se s(t) è l’input<br />

proveniente dai sensori al tempo t ed a(t) è l’azione eseguita al tempo t:<br />

a(t) = f(s(t)).<br />

Molti semplici agenti, in particolare robotici, sono di questo tipo. Quando gli schemi comportamentali di<br />

un agente SR sono semplici, la sua implementazione non pone particolari problemi. Tuttavia, esistono<br />

molti casi d’interesse pratico che rendono la realizzazione di un agente SR un problema interessante. Ciò<br />

avviene quando:<br />

• L’input sensoriale e il repertorio delle risposte possibili sono così complessi da creare conflitti fra<br />

risposte alternative (ad esempio, un robot può percepire contemporaneamente due oggetti vicini<br />

fra loro, uno da cui dovrebbe allontanarsi e uno a cui dovrebbe avvicinarsi).<br />

• Il comportamento dell’agente non può essere completamente definito a priori, ma deve essere<br />

appreso almeno in parte dall’esperienza.<br />

Di questi problemi ci occuperemo in un’altra parte del corso.<br />

1.4.2 Agenti SXR<br />

Un secondo tipo di agente, appena più complesso degli agenti SR, è l’agente stimolo-stato-risposta o SXR.<br />

In questo caso l’agente può essere modellato come un sistema dinamico:<br />

a(t) = f(x(t),s(t)),<br />

x(t+1) = g(x(t),s(t)).<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


1 Introduzione 7<br />

Lo stato x(t) può essere visto come una memoria di eventi passati, o come una credenza sullo stato<br />

dell’ambiente, o ancora come una motivazione a eseguire certe azioni anziché certe altre. Ecco alcuni<br />

esempi intuitivi:<br />

Lo stato come memoria<br />

Un document processor ha n+1 stati 0, 1, ..., n. Gli stati 1, ..., n corrispondono ad altrettante modalità di<br />

salvataggio di un documento (text only, formattato, ecc.). Alla creazione di un nuovo documento lo stato<br />

è inizializzato a 0. Il document processor “percepisce” i comandi dell’utente. Al comando di save, il<br />

document processor reagisce salvando il documento secondo la modalità memorizzata nello stato se<br />

questo è diverso da 0, o chiedendo all’utente in che modalità intenda salvare il documento se lo stato è 0.<br />

Lo stato come credenza<br />

Nei sistemi SR si assume che tutte le conseguenze delle azioni dell’agente che possono influenzare le<br />

azioni future siano a loro volta percepibili dall’agente. Ad esempio, un agente può inserire un alimento<br />

surgelato nel forno a microonde; in seguito l’agente vede che il forno contiene qualcosa (attraverso lo<br />

sportello trasparente) e quindi accende il forno.<br />

A volte, però, certi fatti importanti relativi all’ambiente non sono percepibili: ad esempio, se lo sportello<br />

del forno a microonde non è trasparente, l’agente non può vedere se il forno contiene qualcosa.<br />

L’assenza di percezione reale può però essere aggirata tramite una specie di “sensore fittizio”, ovvero uno<br />

stato dell’agente che varia concordemente con gli stati non percepibili dell’ambiente (detti anche stati<br />

nascosti). Ad esempio, lo stato dell’agente-cuoco può essere inizialmente 0, ed essere mutato in 1<br />

quando l’agente inserisce un alimento nel forno. In tal caso, l’agente “sa” che il forno contiene qualcosa<br />

anche se non lo vede, e può quindi agire di conseguenza.<br />

La concordanza fra lo stato dell’agente e lo stato dell’ambiente può venire a mancare, ad esempio a causa<br />

di un malfunzionamento. Per ritornare all’esempio, è quindi più corretto dire che l’agente “crede” che il<br />

forno contenga qualcosa; pertanto, gli stati utilizzati come sensori virtuali sono da considerare come<br />

credenze dell’agente intorno all’ambiente.<br />

La differenza fra stato-memoria e stato-credenza non è oggettiva, bensì relativa all’osservatore (ovvero,<br />

dipende dal punto di vista del progettista dell’agente). In altre parole, è perfettamente possibile<br />

reinterpretare la memoria del document processor come credenza (il document processore crede che<br />

l’utente voglia salvare il documento con una data modalità), e la credenza dell’agente-cuoco come<br />

memoria (l’agente si ricorda di aver inserito un alimento nel forno).<br />

Lo stato come motivazione<br />

Ambedue gli esempi precedenti ammettono un’ulteriore interpretazione (anch’essa relativa<br />

all’osservatore). Possiamo infatti vedere gli stati come motivazioni. Nel caso del document processor, si<br />

tratta della motivazione a salvare i documenti in un certo modo; nel caso dell’agente-cuoco, si tratta della<br />

motivazione ad accendere il forno che nasce non appena il forno viene riempito. Dato che le diverse<br />

interpretazioni degli stati non hanno nulla di oggettivo (si tratta, ancora una volta, di metafore), il<br />

progettista può assumere il punto di vista che gli sembra più intuitivo e conveniente.<br />

Stati mentali e stati fisici<br />

Consideriamo un robot elettrico di sorveglianza che esplora un ambiente alla ricerca di intrusi. Quando<br />

identifica un intruso il robot interrompe l’esplorazione, dà l’allarme e lo insegue. Quando poi la carica<br />

delle batterie scende sotto una certa soglia, il robot interrompe l’esplorazione e si dirige verso la stazione<br />

di ricarica; se dirigendosi verso la stazione identifica un intruso, il robot dà comunque l’allarme ma<br />

rinuncia all’inseguimento.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


1 Introduzione 8<br />

Può sembrare che questo comportamento richieda un agente SXR, ma ciò non è vero: è sufficiente un<br />

agente SR. Infatti, il comportamento del robot è completamente determinato, istante per istante, <strong>dalle</strong><br />

sue percezioni: la percezione di un intruso e la percezione del livello di carica della batteria. Occorre<br />

evitare di confondere lo stato dell’agente, di cui si è parlato in precedenza, con le percezioni provenienti<br />

dall’interno del “corpo” dell’agente (in questo caso, dalla batteria). A tutti gli effetti, il corpo dell’agente<br />

è parte integrante dell’ambiente da cui provengono le percezioni; per distinguere il corpo del robot<br />

dall’ambiente esterno, esso viene spesso denominato ambiente interno.<br />

Sempre in via di metafora, dobbiamo quindi distinguere fra gli stati fisici di un agente robotico (ovvero,<br />

gli stati del suo ambiente interno) e i suoi stati mentali (gli stati del sistema decisionale visti<br />

precedentemente). Al contrario degli agenti SR, quindi, gli agenti SXR hanno stati mentali.<br />

1.4.3 Agenti reattivi e agenti deliberativi<br />

Gli agenti SR e gli agenti SXR hanno un’importante caratteristica in comune: non appena è disponibile<br />

un dato percettivo, essi possono reagire immediatamente generando una risposta comportamentale sulla<br />

base della funzione f; per questo motivo, essi vengono collettivamente denominati agenti reattivi. Nella<br />

terminologia adottata in questo corso, quindi, gli agenti SR sono un caso particolare degli agenti reattivi<br />

(in altri testi, il termine “agente reattivo” denota gli agenti che qui chiamiamo SR).<br />

In molte situazioni non è possibile agire in questo modo. A volte un’azione va decisa sulla base di una<br />

valutazione dei suoi effetti: l’agente considera la situazione in cui si trova, elenca le azioni possibili, si<br />

forma delle aspettative sugli effetti di ogni azione, valuta la convenienza delle varie alternative. Ad<br />

esempio, un agente scacchista non può limitarsi a reagire alla disposizione dei pezzi sulla scacchiera, ma<br />

deve anche proiettare nel futuro gli effetti delle mosse possibili. Gli agenti che operano in questo modo<br />

sono detti deliberativi. Anche nella categoria degli agenti deliberativi è possibile identificare sottocasi<br />

particolarmente semplici, come gli agenti guidati da obiettivi di cui parleremo più avanti.<br />

1.1 Agenti razionali<br />

Un termine spesso utilizzato è “agente razionale” (vedi ad esempio Russell & Norvig, 1995; Wooldridge,<br />

2000). Un agente razionale si definisce, com’è ovvio, come un agente capace di condurre azioni<br />

razionali. A sua volta un’azione razionale può essere definita come un’azione sostenuta da ragioni. Nel<br />

caso dell’azione umana, le ragioni dell’azione possono essere svariatissime: si può agire per tener fede a<br />

un impegno, per rispettare un obbligo, per ottenere un guadagno, per soddisfazione personale. Nel<br />

modello più classico e immediato della razionalità (che riprenderemo in seguito) si assume che un agente<br />

abbia sia conoscenze che desideri; agire razionalmente significa allora agire in base alle proprie<br />

conoscenze in modo da realizzare i propri desideri.<br />

Ci sono sostanzialmente due approcci agli agenti razionali. Nell’approccio simbolico si assume le<br />

conoscenze e i desideri degli agenti siano rappresentate come un sistema logico-formale. Di questo ci<br />

occuperemo nei prossimi <strong>capitoli</strong>. Un diverso approccio modella la razionalità come un problema di<br />

ottimizzazione, o meglio di controllo ottimo: agire razionalmente significa agire in modo tale da<br />

massimizzare l’utile atteso. Nel campo degli agenti (e in particolare degli agenti robotici) vengono<br />

utilizzati diversi modelli di questo genere, spesso ispirati ai metodi della programmazione dinamica.<br />

Questo aspetto verrà approfondito nelle esercitazioni del corso.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


2 La logica 9<br />

2 La logica<br />

Questo capitolo costituisce un’introduzione informale ed intuitiva ad alcuni aspetti della logica. Nel<br />

capitolo successivo affronteremo l’argomento in modo più approfondito, limitatamente alla logica<br />

predicativa del primo ordine.<br />

2.1 La validità delle argomentazioni<br />

Nella storia del pensiero occidentale la logica, intesa come disciplina autonoma, è nata nell’ambito della<br />

filosofia greca con l’obiettivo di formulare regole che consentano di stabilire se un’argomentazione è<br />

valida.<br />

Che cosa si intende per argomentazione valida Vediamo alcuni esempi. L’argomentazione:<br />

(2.1) I banchieri sono ricchi. Aldo è povero. Quindi Aldo non è un banchiere.<br />

sembra intuitivamente valida. Al contrario, la seguente argomentazione è palesemente scorretta:<br />

(2.2) I banchieri sono ricchi. Aldo è ricco. Quindi Aldo è un banchiere.<br />

La validità di un’argomentazione non dipendere soltanto dalla verità delle conclusioni. Infatti, la<br />

seguente argomentazione è logicamente scorretta, anche se la sua conclusione è vera:<br />

(2.3) I banchieri sono biondi. I biondi sono ricchi. Quindi i banchieri sono ricchi.<br />

La prossima argomentazione, invece, è valida benché la conclusione sia falsa:<br />

(2.4) I banchieri sono ricchi. I ricchi sono sempre felici. Quindi i banchieri sono sempre felici.<br />

Possiamo dire che un’argomentazione è valida non quando le conclusioni sono vere in assoluto, ma<br />

quando le conclusioni sono vere sotto l’ipotesi che lo siano le premesse. Se le premesse di<br />

un’argomentazione sono false, non è possibile dire nulla in generale sulla verità delle conclusioni: a<br />

seconda dei casi, potranno essere vere o false.<br />

Gli esempi precedenti sono argomentazioni, per così dire, di senso comune. Tradizionalmente, però, la<br />

logica è stata studiata sotto la spinta delle discipline in cui le argomentazioni sono molto complesse: la<br />

filosofia, il diritto, la matematica. Per quanto riguarda la matematica, in particolare, va sottolineato che<br />

la dimostrazione di un teorema non è altro che un’argomentazione, condotta tipicamente in un’estensione<br />

del linguaggio naturale che comprende espressioni simboliche di vario genere. Non è quindi strano che<br />

la logica moderna sia stata studiata soprattutto dai matematici, e che prenda anche il nome di logica<br />

matematica.<br />

Negli ultimi decenni si è aggiunto un altro grande motivo d’interesse per la logica: le applicazioni<br />

all’informatica e in particolare all’intelligenza artificiale. Come vedremo, infatti, uno degli scopi della<br />

logica è di formulare procedimenti puramente algoritmici per argomentare correttamente. È chiaro che<br />

un tentativo di questo genere è di enorme interesse per chi ha l’obiettivo di costruire macchine<br />

“intelligenti”.<br />

Cerchiamo ora di chiarire il concetto di argomentazione. Un’argomentazione può essere vista come una<br />

successione di enunciati linguistici di tipo descrittivo (ovvero, frasi di una lingua naturale che descrivono<br />

stati di cose, e che sono o veri o falsi). Un insieme di enunciati, Γ, sono assunti come premesse (perché<br />

“evidenti”, o perché già condivisi <strong>dalle</strong> parti interessate all’argomentazione, o semplicemente per<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


2 La logica 10<br />

analizzarne le conseguenze); un enunciato, ϕ, è invece derivato come conclusione. L’argomentazione è<br />

valida se la conclusione (ϕ) è certamente vera sotto l’ipotesi che lo siano le premesse (Γ). In tal caso, si<br />

dice anche che la conclusione è conseguenza logica delle premesse o che le premesse comportano (in<br />

inglese: entail) la conclusione e si scrive:<br />

Γ |= ϕ.<br />

Come dicevamo, ci interessa formulare un insieme di regole per argomentare correttamente. Fino al<br />

diciannovesimo secolo, i logici studiavano argomentazioni espresse in una lingua naturale, come il greco,<br />

il latino o l’arabo. Nella logica moderna, che prende le mosse dai lavori di George Boole (1854) e<br />

Gottlob Frege (1879), si utilizzano invece linguaggi formali. Le fasi essenziali nella costruzione di un<br />

sistema logico saranno allora:<br />

• definire la sintassi di un linguaggio formale adatto a rappresentare le argomentazioni di cui ci si<br />

vuole occupare; le espressioni di questo linguaggio saranno dette enunciati;<br />

• definire una semantica degli enunciati, che consenta di dire sotto quali condizioni gli enunciati<br />

sono veri;<br />

• definire un sistema deduttivo che permetta di ricavare conclusioni da premesse in modo tale da<br />

conservare la verità (ovvero: se le premesse sono vere, lo sono certamente anche le conclusioni);<br />

la sequenza di passi che consentono di ricavare le conclusioni è detta derivazione o deduzione o<br />

prova.<br />

Vediamo ora separatamente i tre aspetti.<br />

2.2 Il linguaggio formale degli enunciati<br />

Non esiste un unico linguaggio logico; diverse applicazioni, infatti, possono richiedere linguaggi<br />

differenti. Di volta in volta è necessario trovare un buon equilibrio fra due esigenze contrastanti:<br />

l’espressività del linguaggio, che deve consentire la rappresentazione degli enunciati che interessano; e la<br />

semplicità del sistema deduttivo. Un linguaggio poco espressivo può essere insufficiente, ma un<br />

linguaggio molto espressivo può essere troppo complesso da trattare.<br />

Più di un secolo di studi logici hanno portato a identificare alcune famiglie di linguaggi formali adeguati<br />

a diversi tipi di applicazione: il linguaggio proposizionale, il linguaggio predicativo del primo ordine, i<br />

linguaggi predicativi di ordine superiore, i linguaggi modali (che a loro volta possono essere<br />

proposizionali o predicativi).<br />

I linguaggi proposizionali consentono di analizzare le argomentazioni la cui validità dipende dall’uso<br />

corretto dei connettivi booleani (negazione, congiunzione, disgiunzione, condizionale, bicondizionale).<br />

Ad esempio:<br />

(2.1) D’inverno piove o nevica. È inverno e non piove. Quindi nevica.<br />

Nei linguaggi predicativi, invece, ci si occupa delle argomentazioni la cui validità dipende<br />

dall’articolazione interna degli enunciati in termini di riferimento e predicazione. Consideriamo ad<br />

esempio la seguente argomentazione:<br />

(2.2) Le banane sono gialle. Questa cosa non è gialla. Quindi questa cosa non è una banana.<br />

In questo caso, la validità dell’argomentazione può essere stabilita solo scomponendo gli enunciati al<br />

livello dei predicati (banana, giallo) e dei riferimenti (questa cosaß).<br />

I predicati che si applicano agli oggetti individuali (come quelli precedenti) si dicono del primo ordine.<br />

Del secondo ordine sono invece i predicati che si applicano ad altri predicati, come “essere un pregio”<br />

nell’argomentazione:<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


2 La logica 11<br />

(2.3) Quest’oggetto è robusto, mentre quell’altro non lo è. Essere robusto è un pregio. Quindi<br />

quest’oggetto ha un pregio che quell’altro non ha.<br />

I linguaggi predicativi di ordine superiore al primo presentano notevoli difficoltà tecniche e sono poco<br />

utilizzati nell’informatica.<br />

Altri linguaggi interessanti sono i linguaggi modali, in cui si prendono in considerazione “operatori”<br />

come necessario, possibile, obbligatorio, vietato, passato, futuro, eccetera. Ad esempio:<br />

(2.4) Pagare le tasse è senz’altro permesso, dato che è obbligatorio.<br />

Dal punto di vista formale, tutti i linguaggi logici sono comunque di tipo 2 nella gerarchia chomskyana;<br />

ovvero, sono definiti da una grammatica non contestuale. La ragione di questa scelta è, ancora una<br />

volta, la ricerca di un adeguato compromesso fra espressività e semplicità. Perché un linguaggio<br />

sufficientemente espressivo deve essere almeno di tipo 2 Ricordiamoci che lo scopo di un linguaggio<br />

logico è di formalizzare un frammento del linguaggio naturale. Per preservare almeno in parte<br />

l’espressività del linguaggio naturale è essenziale che le espressioni del linguaggio formale abbiano<br />

struttura ricorsiva; un linguaggio di tipo 3, definibile con una grammatica regolare, non sarebbe quindi<br />

sufficiente. D’altra parte, un linguaggio di tipo 1 (definibile con una grammatica contestuale)<br />

presenterebbe vantaggi limitati rispetto a un linguaggio di tipo 2 e sarebbe molto più difficile da trattare:<br />

le regole di deduzione sarebbero troppo complesse.<br />

Vediamo ora brevemente come le argomentazioni 2.1–2.4 verrebbero rappresentate in modo formale. La<br />

2.1 è, come si è già detto, un’argomentazione di livello proposizionale. Utilizzeremo i seguenti simboli<br />

proposizionali o enunciativi:<br />

• I sta per l’enunciato elementare “è inverno”;<br />

• P sta per l’enunciato elementare “piove”;<br />

• N sta per l’enunciato elementare “nevica”.<br />

Inoltre introduciamo i seguenti connettivi booleani:<br />

• ¬ per “non” (negazione);<br />

• ∧ per “e” (congiunzione);<br />

• ∨ per “o” (disgiunzione);<br />

• → per “se ... allora” (condizionale);<br />

• ↔ per “se e solo se” (bicondizionale).<br />

A questo punto, la 2.1 si può esprimere come:<br />

I → (P ∨ N), I ∧ ¬P |= N,<br />

dove il simbolo |= indica che l’enunciato N è conseguenza logica dell’insieme di enunciati<br />

{I → (P ∨ N), I ∧ ¬P}.<br />

Per l’argomentazione 2.2 introduciamo la costante a per “questa cosa” nonché i seguenti simboli<br />

predicativi:<br />

• B(–) per “– è una banana”;<br />

• G(–) per “– è giallo”.<br />

Inoltre introduciamo i due quantificatori:<br />

• ∀ per “tutti” (quantificatore universale);<br />

• ∃ per “alcuni” (quantificatore esistenziale).<br />

La 2.2 diventa allora:<br />

∀x(B(x) → G(x)), ¬G(a) |= ¬B(a).<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


2 La logica 12<br />

Si noti l’uso della variabile individuale x utilizzata come supporto alla quantificazione. Per la 2.3<br />

introduciamo la costante a per “quest’oggetto”, la costante b per “quell’altro”, il predicato del primo<br />

ordine R(–) per “– è robusto” e il predicato del secondo ordine P(–) per “– è un pregio”. Abbiamo:<br />

R(a) ∧ ¬R(b), P(R) |= ∃X(P(X) ∧ X(a) ∧ ¬X(b)).<br />

In questo caso abbiamo usato una variabile predicativa X per esprimere la quantificazione su predicati<br />

implicita in “ha un pregio”.<br />

Infine, per formalizzare l’argomentazione 2.4 introduciamo il simbolo proposizionale PagareLeTasse per<br />

“pagare le tasse”, nonché i seguenti operatori modali di tipo deontico:<br />

• O per “vietato”;<br />

• P per “possibile”.<br />

L’argomentazione 2.4 diventa allora:<br />

O PagareLeTasse |= P PagareLeTasse.<br />

La validità di quest’argomentazione dipende da una proprietà generale dell’obbligo che esprime una<br />

specifica di coerenza per i sistemi normativi (non si può coerentemente obbligare qualcuno a eseguire<br />

un’azione vietata).<br />

2.3 La verità<br />

Come abbiamo già visto, un’argomentazione è valida se conserva la verità delle premesse; dobbiamo<br />

quindi precisare che cosa sia il valore di verità di un enunciato. In effetti, il concetto di valore di verità è<br />

in qualche modo implicito nel concetto stesso di enunciato; un enunciato, infatti, è un’espressione<br />

linguistica che abbia un valore di verità definito.<br />

Nella logica classica (o booleana) si assume che ogni enunciato abbia esattamente un valore di verità, o<br />

vero (1) o falso (0): non c’è una terza possibilità (tertium non datur, per dirla con i logici classici). Nel<br />

corso di questo secolo sono stati proposti molti approcci alla logica che superano questa limitazione. Si<br />

hanno così le logiche polivalenti (in cui i valori di verità ammissibili sono più di due) e le logiche parziali<br />

(in cui si ammette che un enunciato possa non avere un valore di verità definito). Negli ultimi anni, poi,<br />

ha avuto molto successo la logica sfumata (inglese: fuzzy logic), in cui si ammette che il valore di verità di<br />

un enunciato possa essere un qualsiasi numero reale compreso nell’intervallo chiuso [0,1]. In questi<br />

appunti, però, ci manterremo nei confini della logica classica.<br />

Il problema ora è: come si assegna un valore di verità (1 o 0) a un enunciato formale Ciò che ci occorre<br />

è una semantica formale. A partire dai lavori in materia di Gottlob Frege (1879) la risposta è la seguente:<br />

il valore di verità di un enunciato complesso è definito ricorsivamente in funzione del valore di verità dei<br />

suoi componenti. Ad esempio, il valore di verità di ¬(P ∨ Q) è la negazione del valore di verità di P ∨<br />

Q, e questo a sua volta è la disgiunzione dei valori di verità di P e di Q. È chiaro che in questo modo il<br />

valore di verità di un enunciato complesso viene calcolato a partire dai valori di verità delle sue<br />

componenti elementari (nel nostro caso, gli enunciati P e Q). A questo punto il meccanismo si ferma: ai<br />

componenti elementari è necessario attribuire un valore di verità direttamente, per così dire dall’esterno.<br />

Ad esempio, se P significa “piove” il valore di verità di P non può essere stabilito su basi logiche, ma<br />

deve essere assegnato su basi fattuali: ad esempio guardando fuori dalla finestra.<br />

In generale, quindi, il valore di verità di un enunciato logico dipende da fattori extralogici. Questo non è<br />

però un problema perché, come si è già detto e come vedremo meglio in seguito, la logica non ha lo<br />

scopo di stabilire la verità di enunciati specifici, ma piuttosto di appurare se un’argomentazione è<br />

corretta, nel senso che conserva l’eventuale verità delle premesse.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


2 La logica 13<br />

Vediamo ad esempio come si potrebbe ragionare per stabilire che l’argomentazione 2.2 è valida. In<br />

forma simbolica, l’argomentazione è:<br />

∀x(B(x) → G(x)), ¬G(a) |= ¬B(a).<br />

Ragioniamo come segue. L’argomentazione riguarda certe categorie di oggetti fisici, le banane e gli<br />

oggetti gialli. Consideriamo l’insieme D, costituito da tutti gli oggetti fisici esistenti. Il predicato B(–)<br />

denota allora un ben preciso sottoinsieme di D, ovvero l’insieme di quegli oggetti che sono banane.<br />

Questo insieme, detto l’estensione del predicato B(–), sarà indicato con i(B) (la funzione i è detta funzione<br />

d’interpretazione). Analogamente, il predicato G(–) denota l’insieme i(G) ⊆ D degli oggetti gialli.<br />

La premessa ∀x(B(x) → G(x)) dice che ogni oggetto che sia una banana è giallo. Affinché tale premessa<br />

sia vera occorre che sia:<br />

(2.5) i(B) ⊆ i(G).<br />

La seconda premessa dell’argomentazione, ¬G(a), riguarda un oggetto specifico, cui faremo riferimento<br />

con la costante a. Quest’oggetto, detto la denotazione di a, sarà indicato con ∗a; dato che D è l’insieme<br />

di tutti gli oggetti, sarà naturalmente ∗a ∈ D. Affinché la premessa ¬G(a) sia vera dev’essere allora<br />

(2.6) ∗a ∉ i(G).<br />

Ragionando in termini insiemistici, dalla 2.5 e dalla 2.6 ricaviamo che<br />

(2.6) ∗a ∉ i(B).<br />

Ma questo ci dice che la conclusione, ¬B(a), è vera. Dunque, sotto l’ipotesi che le due premesse siano<br />

vere è certamente vera anche la conclusione, e l’argomentazione è valida.<br />

La cosa più importante da notare è che il nostro ragionamento vale anche se i predicati B e G sono<br />

interpretati non come “banana” e “giallo”, ma in qualunque altro modo (ad esempio come “lombardo” e<br />

“italiano”, o come “pinguino” e “parla”). Dunque la validità dell’argomentazione non dipende<br />

dall’interpretazione specifica dei predicati, ma solo dall’interpretazione che abbiamo attribuito ai simboli<br />

logici, come ∀, → e ¬. Questo fatto viene solitamente espresso dicendo che la validità di<br />

un’argomentazione dipende dalla forma degli enunciati, non dal loro contenuto.<br />

Un caso molto particolare è costituito <strong>dalle</strong> argomentazioni prive di premesse. Un’argomentazione di<br />

questo genere è corretta se e solo se la conclusione è sempre e comunque vera, qualunque sia lo stato<br />

effettivo delle cose. Ecco alcuni esempi:<br />

O Alberto è l’assassino oppure non lo è.<br />

Non può essere che Alberto sia l’assassino e contemporaneamente non lo sia.<br />

Un enunciato che non possa risultare falso, qualunque sia lo stato delle cose, si dice valido. Se ϕ è un<br />

enunciato valido, scriviamo:<br />

|= ϕ.<br />

2.4 La meccanizzazione della logica<br />

Abbiamo già detto che la logica ha l’obiettivo di formulare regole che consentano di stabilire se<br />

un’argomentazione è valida, ovvero se le conclusioni dell’argomentazione sono conseguenze logiche<br />

delle premesse. Ci resta da vedere che cosa si debba intendere con il termine “regola”.<br />

Nel corso del novecento, l’idea di regola si è venuta precisando sulla base dell’apparato concettuale della<br />

teoria della computabilità. Quando parliamo di regole per stabilire la validità di un’argomentazione<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


2 La logica 14<br />

intendiamo oggi una procedura effettivamente computabile, che prenda in ingresso l’insieme delle<br />

premesse e deduca o derivi la conclusione operando esclusivamente trasformazioni formali degli<br />

enunciati. Una procedura del genere viene denominata procedura di prova o calcolo logico o<br />

semplicemente calcolo. Se un calcolo C è in grado di derivare l’enunciato ϕ partendo da Γ scriviamo<br />

Γ |– C ϕ,<br />

o più semplicemente<br />

Γ |– ϕ.<br />

Gli enunciati appartenenti a Γ sono dette premesse, ϕ è detto conclusione e la derivazione formale di ϕ da<br />

Γ è detta dimostrazione o deduzione o derivazione o prova della conclusione a partire <strong>dalle</strong> premesse. Si<br />

dice anche che la conclusione deriva o è deducibile <strong>dalle</strong> premesse.<br />

Un calcolo può essere formulato (anzi: deve essere formulato) senza fare nessun riferimento alla<br />

semantica (e quindi alla verità degli enunciati). Naturalmente, però, lo scopo del calcolo è di derivare<br />

formalmente proprio le conseguenze logiche di un insieme di assiomi. Quindi la relazione che sussiste<br />

fra derivazione e conseguenza logica è molto importante.<br />

Diremo che un calcolo è corretto (inglese: sound) quando gli enunciati derivati da Γ sono effettivamente<br />

conseguenze logiche di Γ:<br />

se Γ |– ϕ, allora Γ |= ϕ.<br />

Viceversa, si dice completo un calcolo in grado di derivare tutte le conseguenze logiche delle premesse:<br />

se Γ |= ϕ, allora Γ |– ϕ.<br />

Attenzione però: nulla si dice sul comportamento del calcolo quando siano in ballo un insieme di<br />

premesse e un enunciato che non è conseguenza logica delle premesse: anche un calcolo completo<br />

potrebbe non essere in grado di stabilirlo in tempo finito. Per alcune logiche particolarmente semplici,<br />

tuttavia, sono disponibili algoritmi di decisione, ovvero procedure che terminano in tempo finito con una<br />

risposta positiva (ϕ deriva da Γ) o negativa (ϕ non deriva da Γ).<br />

A seconda della particolare logica considerata si possono così verificare le situazioni seguenti:<br />

• La logica è decidibile. Ovvero, esiste una procedura che termina in tempo finito con una risposta<br />

positiva (ϕ deriva da Γ) o negativa (ϕ non deriva da Γ). Come si è già detto, una procedura del<br />

genere viene chiamata algoritmo di decisione.<br />

• La logica è indecidibile, ma comunque semidecidibile. Ovvero, esiste una procedura che termina in<br />

tempo finito con una risposta positiva quando ϕ deriva da Γ, ma può non terminare quando ϕ non<br />

deriva da Γ. Una procedura del genere viene denominata procedura di semidecisione.<br />

• La logica è indecidibile e non semidecidibile. Ovvero, non esiste né un algoritmo di decisione né<br />

una procedura di semidecisione.<br />

La logica proposizionale, ad esempio, è decidibile, e lo sono pure alcuni frammenti interessanti della<br />

logica predicativa del primo ordine (come ad esempio la logica monadica del primo ordine, che ammette<br />

predicati con al più un argomento). La logica predicativa del primo ordine nella sua totalità è invece<br />

soltanto semidecidibile, e le logiche predicative di ordine superiore al primo sono indecidibili e non<br />

semidecidibili.<br />

A questo punto è interessante vedere come si presenta un calcolo logico. L’idea di base è che il calcolo<br />

si limita ad analizzare le argomentazioni dal punto di vista formale, senza fare mai appello al significato<br />

delle costanti, dei predicati e così via. In altre parole, i calcoli sono algoritmi di elaborazione simbolica<br />

che operano su espressioni formali (gli enunciati del linguaggio logico prescelto).<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


2 La logica 15<br />

Nel corso degli anni sono stati proposti diversi tipi di calcoli logici. Il motivo di questa proliferazione è<br />

che calcoli diversi rispondono a differenti esigenze. Ad esempio, un logico matematico è interessato non<br />

tanto a utilizzare un calcolo per dimostrare teoremi d’interesse matematico, quanto a studiare le proprietà<br />

matematiche della logica stessa; per questo non è importante che calcolare sia semplice e naturale, quanto<br />

piuttosto che le proprietà del calcolo siano facili da analizzare. Al contrario, un informatico sarà<br />

interessato all’utilizzo di un calcolo proprio per produrre automaticamente deduzioni, e quindi prenderà<br />

in considerazione l’efficienza del calcolo. Chi insegna la logica o la usa senza il supporto di strumenti<br />

automatici, infine, è interessato al fatto che le regole del calcolo siano intuitive e si possano facilmente<br />

applicare “a mano”.<br />

La maggior parte dei calcoli proposti nella letteratura cadono nelle seguenti categorie:<br />

• Calcoli di Hilbert. Sono adatti all’analisi dei sistemi logici, ma difficili da utilizzare a mano e<br />

inadatti all’implementazione informatica.<br />

• Calcoli della deduzione naturale. Sono abbastanza naturali da utilizzare a mano, ma richiedono<br />

una certa esperienza e non si prestano all’implementazione informatica.<br />

• Calcoli semantici e calcoli delle sequenze. Sono abbastanza semplici e naturali da utilizzare a mano<br />

e si prestano anche all’implementazione informatica.<br />

• Calcoli basati sul principio di risoluzione. Possono essere molto innaturali per l’uomo, ma si<br />

prestano molto bene all’implementazione informatica.<br />

Nel prossimo capitolo vedremo in dettaglio un calcolo di tipo semantico.<br />

2.5 La logica nell’intelligenza artificiale<br />

Ci resta ora da capire perché mai i concetti visti finora siano così importanti nell’intelligenza artificiale e<br />

in particolare nell’ingegneria della conoscenza. Un sistema intelligente può essere visto come un sistema<br />

in grado di ragionare a partire da un insieme di conoscenze. Nell’approccio “simbolico” all’intelligenza<br />

artificiale si identifica il ragionamento con una deduzione formale e un insieme di conoscenze con le<br />

premesse della deduzione. La logica simbolica fornisce quindi le basi teoriche per lo sviluppo di sistemi<br />

computazionali intelligenti.<br />

Sarebbe prematuro tentare di approfondire la questione a questo punto. Nei prossimi <strong>capitoli</strong> presenterò<br />

in modo un po’ più approfondito la logica dei predicati del primo ordine e cercherò di mostrare come<br />

possa essere utilizzata per risolvere problemi d’intelligenza artificiale.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 16<br />

3 La logica del primo ordine<br />

Questo capitolo è una breve introduzione alla logica dei predicati del primo ordine. Come abbiamo visto<br />

nel capitolo precedente, per definire una logica occorre presentarne il linguaggio formale, la semantica e<br />

il sistema deduttivo. I tre aspetti sono trattati separatamente nei prossimi paragrafi.<br />

3.1 Il linguaggio predicativo del primo ordine<br />

Il linguaggio predicativo del primo ordine è detto anche linguaggio predicativo elementare perché consente<br />

di predicare proprietà e relazioni concernenti gli elementi di un “universo del discorso”, detto<br />

comunemente dominio. Come si è già detto, questo linguaggio può essere visto come l’idealizzazione di<br />

un frammento del linguaggio umano. Come nelle lingue naturali, esistono due tipi di espressioni:<br />

• i termini, utilizzati per fare riferimento a individui del dominio;<br />

• le formule, e più in particolare gli enunciati, utilizzate per descrivere stati di cose riguardanti gli<br />

individui del dominio.<br />

Vediamo separatamente i due tipi di espressioni.<br />

3.1.1 I termini<br />

Il modo più semplice per fare riferimento a un individuo è l’uso di un “identificatore” che funzioni come<br />

un nome proprio. A questo scopo il linguaggio del primo ordine prevede l’uso di un insieme<br />

(eventualmente vuoto, al più numerabile) di identificatori, chiamati costanti individuali o più<br />

semplicemente costanti. Nel seguito le costanti saranno denotate con le lettere a, b, c, ..., eventualmente<br />

corredate da un indice numerico.<br />

A un individuo si può fare riferimento non solo con una costante, ma anche con un’espressione di tipo<br />

funzionale, come “il padre di ...”, dove “padre di” è vista come una funzione definita sugli individui del<br />

dominio. Il linguaggio prevede un insieme (eventualmente vuoto, al più numerabile) di funtori (o<br />

simboli di funzione). Per i funtori adotteremo le lettere f, g, h, ..., eventualmente corredate da un indice<br />

numerico. Ogni funtore f ha un numero prefissato n di argomenti; questo numero è detto l’arità del<br />

funtore. Si noti che è possibile ammettere anche funtori con arità zero. Questi coincidono peraltro con<br />

le costanti individuali; infatti, una funzione priva di argomenti è necessariamente costante, e quindi<br />

restituisce sempre lo stesso individuo come valore.<br />

Inoltre, nel linguaggio del primo ordine (anche se questo non ha un riscontro immediato nel linguaggio<br />

naturale) si può fare riferimento a un individuo tramite una variabile individuale (o semplicemente<br />

variabile). Le variabili disponibili, che indicheremo con le lettere x, y, z, ... (eventualmente corredate da<br />

un indice numerico), sono un’infinità numerabile. Intuitivamente, possiamo pensare che una variabile<br />

faccia riferimento a un individuo generico (anziché specifico) del dominio; di fatto, le variabili vengono<br />

introdotte come supporto per la quantificazione (vedi oltre).<br />

A questo punto è possibile dare la definizione ricorsiva di termine:<br />

• ogni costante individuale è un termine;<br />

• ogni variabile individuale è un termine;<br />

• ogni espressione della forma f(t 1 ,...,t n ) è un termine se f è un funtore di arità n e i t k sono termini.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 17<br />

Ecco alcuni esempi di termini (assumiamo che f e g siano funtori di arità uno e h sia un funtore di arità<br />

due):<br />

a x f(a) g(x) h(a,b) h(f(a),g(f(x))<br />

3.1.2 Le formule<br />

Il modo più immediato di descrivere uno stato di cose consiste nel dire che fra certi individui sussiste<br />

una data relazione, come quando diciamo “Alessandro è fratello di Barbara”. Come simboli di relazione<br />

utilizzeremo un insieme (non vuoto, al più numerabile) di predicati, per i quali adotteremo le lettere P, Q,<br />

R, ..., eventualmente corredate da un indice numerico. Ogni predicato P ha un numero prefissato n di<br />

argomenti; questo numero è detto l’arità del predicato.<br />

I predicati di arità due (o “a due posti”) sono utilizzati per rappresentare relazioni binarie. Così, se ad<br />

Alessandro e Barbara si fa riferimento rispettivamente con le costanti a e b, e la relazione “fratello” è<br />

rappresentata dal predicato P, la frase “Alessandro è fratello di Barbara” si rappresenta come P(a,b).<br />

Utilizzando predicati di arità adeguata, è possibile rappresentare relazioni anche fra terne, quaterne,<br />

eccetera, di individui.<br />

I predicati a un posto rappresentano proprietà di individui. Ad esempio, se il predicato Q rappresenta la<br />

proprietà “giovane”, la frase “Alessandro è giovane” si rappresenta come Q(a). Inoltre, è possibile<br />

utilizzare predicati a zero posti, che descrivono stati di cose in cui non interessi mettere in evidenza degli<br />

individui. Ad esempio, un predicato R di arità 0 può essere utilizzato per rappresentare la proposizione<br />

“piove”.<br />

Una relazione n-aria fra individui può essere vista anche come una funzione dall’insieme delle n-ple di<br />

individui nell’insieme booleano {0,1}. Ovvero, una relazione associa a ogni n-pla di individui un valore<br />

di verità (1 o 0) a seconda che la relazione sussista o non sussista fra gli individui dati. Allora, un<br />

predicato a zero argomenti rappresenta una funzione a zero argomenti (e quindi costante) nell’insieme<br />

dei valori di verità; ne segue che un predicato a zero argomenti rappresenta semplicemente un valore di<br />

verità.<br />

A questo punto siamo in grado di definire il tipo più semplice di formule, ovvero le formule atomiche:<br />

• ogni espressione della forma P(t 1,...,t n) è una formula atomica se P è un predicato di arità n e i t k<br />

sono termini.<br />

A partire <strong>dalle</strong> formule atomiche si possono costruire formule più complesse utilizzando i simboli logici,<br />

ovvero i connettivi booleani e i quantificatori. I connettivi e i quantificatori normalmente utilizzati sono i<br />

seguenti:<br />

• un connettivo unario (ovvero, con un solo argomento): la negazione (¬);<br />

• quattro connettivi binari: la congiunzione (∧), la disgiunzione (∨), il condizionale (→) e il<br />

bicondizionale (↔);<br />

• due quantificatori: universale (∀) ed esistenziale (∃).<br />

Ecco allora la definizione ricorsiva di formula:<br />

• ogni formula atomica è una formula;<br />

• ogni espressione della forma ¬ϕ se ϕ è una formula;<br />

• ogni espressione della forma (ϕ ∧ ψ), (ϕ ∨ ψ), (ϕ → ψ) e (ϕ ↔ ψ) è una formula se ϕ e ψ sono<br />

formule;<br />

• ogni espressione della forma ∀xϕ e ∃xϕ è una formula se x è una variabile e ϕ è una formula.<br />

Per quanto riguarda l’ultima clausola, si noti che ϕ è del tutto arbitraria: non si richiede né che ϕ<br />

contenga la variabile x, né che non contenga altre variabili.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 18<br />

Come si può notare, le regole di formazione connesse con l’uso di connettivi booleani binari (∧, ∨, →,<br />

↔) prescrivono l’uso di parentesi. Tuttavia, per evitare l’eccesso di parentesi si introducono le seguenti<br />

convenzioni:<br />

• si possono tralasciare le eventuali parentesi esterne di una formula; ad esempio:<br />

(((¬P ∧ Q) ∧ R) → S) ⎯⎯→ ((¬P ∧ Q) ∧ R) → S;<br />

• quando un connettivo binario viene ripetuto, possono essere eliminate le parentesi se il<br />

raggruppamento delle sottoformule è da sinistra verso destra:<br />

((¬P ∧ Q) ∧ R) → S ⎯⎯→ (¬P ∧ Q ∧ R) → S;<br />

• fra i simboli logici (connettivi e quantificatori) esiste la seguente gerarchia di precedenza:<br />

{¬, ∀, ∃} > {∧} > {∨} > {→} > {↔};<br />

ad esempio:<br />

(¬P ∧ Q ∧ R) → S ⎯⎯→ ¬P ∧ Q ∧ R → S,<br />

((P → Q) ↔ (Q → P)) ⎯⎯→ (P → Q) ↔ (Q → P) ⎯⎯→ P → Q ↔ Q → P,<br />

(∀xP(x) → Q(x)) ⎯⎯→<br />

3.1.3 Variabili libere e variabili vincolate<br />

∀xP(x) → Q(x).<br />

Una formula che non contenga variabili si dice fondamentale (inglese: ground). Se una formula contiene<br />

variabili ne può contenere più d’una, ognuna con una o più occorrenze. Ad esempio, la formula<br />

∀xP(x,y) ∧ Q(x) contiene tre occorrenze della variabile x (compresa l’occorrenza che segue<br />

immediatamente il quantificatore) e una occorrenza della variabile y.<br />

Ogni quantificatore ha un ambito o campo di applicazione (inglese: scope). Ad esempio, nella formula<br />

∀xP(x,y) ∧ Q(x) l’ambito di ∀x è la formula P(x,y); nella formula ∀x(P(x,y) ∧ Q(x)), invece, l’ambito di<br />

∀x è la formula P(x,y) ∧ Q(x). Un’occorrenza di una variabile x si dice vincolata se è l’occorrenza che<br />

segue immediatamente il simbolo del quantificatore oppure se sta nell’ambito di un quantificatore ∀x o<br />

∃x; ogni altra occorrenza si dice invece libera. Ad esempio, nella formula ∀xP(x,y) ∧ Q(x) le prime due<br />

occorrenze di x sono vincolate, la terza è libera, e l’unica occorrenza di y è libera.<br />

Le variabili delle formule logiche si comportano in modo analogo alle variabili locali dei linguaggi di<br />

programmazione (in questo senso, il quantificatore assomiglia alla dichiarazione di una variabile locale):<br />

si può sostituire una variabile vincolata con un’altra variabile in modo sistematico senza cambiare il<br />

senso di una formula, purché in questo modo non si alterino i vincoli di altre variabili. Ad esempio, le<br />

formule ∀xP(x,y) e ∀zP(z,y) sono sostanzialmente la stessa formula, e si dicono variante alfabetica l’una<br />

dell’altra; la formula ∀yP(y,y) è invece sostanzialmente diversa, perché la seconda occorrenza di y, prima<br />

libera, è ora vincolata.<br />

Le formule contenenti variabili libere non sono facili da interpretare in modo intuitivo: mentre P(a)<br />

significa che l’individuo a ha la proprietà P, e ∀xP(x) significa che tutti gli individui hanno la proprietà P,<br />

non è ovvio come vada interpretata la formula P(x). Supponiamo ad esempio che a denoti Alessandro e<br />

P la proprietà “giovane”. Allora P(a) significa che Alessandro è giovane, e ∀xP(x) che tutti sono giovani;<br />

ma che cosa significa P(x) Per questo motivo, si usa distinguere fra le formule aperte, che presentano<br />

occorrenze libere di variabili e la cui interpretazione è in qualche modo incompleta, e le formule chiuse,<br />

che non contengono occorrenze libere di variabili e che sono quindi completamente interpretate.<br />

Un’altra anomalia è costituita <strong>dalle</strong> formule che, per così dire, sono “troppo quantificate”. Ad esempio,<br />

è difficile assegnare un’interpretazione intuitiva alle formule ∃xP(a) o ∃x∀xP(x). Il quantificatore ∃x,<br />

infatti, è ridondante in ambedue le formule perché non ci sono nel suo ambito occorrenze libere (e<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 19<br />

quindi quantificabili) di x. Nel seguito riserveremo il termine “enunciato” a un sottoinsieme delle<br />

formule. Più precisamente, chiameremo enunciato ogni formula che sia chiusa (e quindi non abbia<br />

occorrenze libere di variabili) e priva di quantificatori ridondanti (ovvero, ogni quantificatore applicato a<br />

una variabile x deve avere nel suo ambito almeno un’occorrenza libera di x).<br />

Infine, se ϕ è una formula, x è una variabile e t un termine qualsiasi, con ϕ(t/x) indicheremo la formula<br />

che si ottiene partendo da ϕ e sostituendo ogni occorrenza libera di x con il termine t. Ad esempio, se ϕ<br />

è la formula P(x) ∧ ∀xQ(x), allora ϕ(a/x) è la formula P(a) ∧ ∀xQ(x).<br />

3.1.4 Linguaggio o linguaggi<br />

Nei paragrafi precedenti abbiamo sempre parlato di linguaggio del primo ordine, al singolare. In realtà<br />

abbiamo definito non un linguaggio singolo, ma una famiglia di linguaggi. Si ottengono linguaggi<br />

diversi, infatti, modificando l’insieme delle costanti individuali, o l’insieme dei funtori, o l’insieme dei<br />

predicati. Fisso è invece l’insieme dei simboli logici (connettivi e quantificatori) nonché l’insieme delle<br />

variabili (le variabili sono comunque un’infinità numerabile, e non importa quali simboli vengano scelti<br />

per indicarle).<br />

Effettivamente, un linguaggio del primo ordine è completamente definito solo quando gli insiemi delle<br />

costanti, dei funtori e dei predicati sono stati fissati. Ma questo è possibile solo quando sia noto<br />

l’universo del discorso, che cambia da applicazione ad applicazione. Ad esempio, se voglio parlare della<br />

mia famiglia avrò bisogno di costanti individuali per denominare i miei familiari, di funtori come<br />

padre(–) e madre(–), e di predicati come Fratello(–,–), Zio(–,–) eccetera. Per parlare dei numeri naturali<br />

avrò invece bisogno della costante 0 e del funtore successore(–). E così via.<br />

C’è però un predicato binario particolarmente significativo, che può essere introdotto indipendentemente<br />

dall’applicazione: si tratta del predicato di uguaglianza, =. Si parla allora di linguaggio del primo ordine<br />

con l’uguaglianza. In generale, per rappresentare l’uguaglianza fra due individui si preferisce la scrittura<br />

infissa,<br />

t 1 = t 2,<br />

più tradizionale della scrittura prefissa =(t 1 ,t 2 ). Inoltre scriveremo t 1 ≠ t 2 anziché ¬(t 1 = t 2 ).<br />

3.2 La semantica formale<br />

3.2.1 Modelli, verità e validità<br />

Per interpretare i simboli non logici fissiamo un insieme D di individui, detto dominio<br />

dell’interpretazione. Il dominio non può essere vuoto, ma per il resto è un insieme arbitrario. L’idea è<br />

che D contenga tutti gli individui (di qualunque natura) che costituiscono l’universo del discorso di una<br />

certa applicazione. Ad esempio, D potrebbe coincidere con l’insieme dei numeri naturali, o con<br />

l’insieme dei punti di uno spazio euclideo, o con l’insieme di tutti gli oggetti fisici contenuti in una<br />

stanza, o con l’insieme di tutte le aziende europee. Quando sarà necessario, denoteremo gli elementi del<br />

dominio con le lettere a, b, c, ..., eventualmente corredate da un indice numerico. Attenzione: è<br />

importante non confondere i simboli (come a, b, c, ...) utilizzati nel testo per denotare gli elementi del<br />

dominio con i simboli (a, b, c, ...) che costituiscono le costanti del linguaggio formale.<br />

Una volta fissato D, interpretiamo ogni costante come il nome di un individuo di D, ogni funtore come il<br />

nome di una funzione fra elementi di D e ogni predicato come il nome di una relazione fra elementi di D.<br />

Definiamo allora la funzione d’interpretazione i(–) nel modo seguente:<br />

• per ogni costante a, l’interpretazione i(a) è un elemento di D;<br />

• per ogni funtore f di arità n, l’interpretazione i(f) è una funzione D n → D;<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 20<br />

• per ogni predicato P di arità n, l’interpretazione i(P) è una funzione D n → {0,1}, ovvero la<br />

funzione caratteristica di una relazione n-aria su D.<br />

Come si vede, l’interpretazione i(–) non assegna un valore alle variabili, benché anche queste denotino<br />

individui di D. Il motivo è che le variabili, al contrario delle costanti, servono come supporto alla<br />

quantificazione e quindi vanno trattate in modo diverso. Introduciamo allora un secondo concetto,<br />

quello di assegnamento di valore alle variabili. Si tratta di un’ulteriore funzione e(–) tale che:<br />

• per ogni variabile x, l’assegnamento e(x) è un elemento di D.<br />

Vedremo più avanti come la funzione e(–) ci permetta di assegnare un significato ai quantificatori.<br />

Siamo ora in grado di definire che cosa denotino i termini del linguaggio, dati un assegnamento e(–) ed<br />

un modello<br />

M = 〈D,i(–)〉,<br />

dove D è un dominio e i(–) è una funzione d’interpretazione. La definizione è data per ricorsione<br />

strutturale; ovvero, abbiamo una definizione che ricalca la struttura ricorsiva dei termini funzionali. La<br />

denotazione ∗t di un termine t è l’elemento del dominio così definito:<br />

• ∗a = i(a) per ogni costante a del linguaggio;<br />

• ∗x = e(x) per ogni variabile x del linguaggio;<br />

• ∗f(t 1,...,t n(f)) = i(f)(∗t 1,...,∗t n) per ogni termine funzionale del linguaggio.<br />

A questo punto possiamo definire il concetto di verità di un enunciato in un modello. Per prima cosa<br />

definiamo il concetto di valore di verità v(ϕ,M,e) di un enunciato ϕ in un modello M rispetto un<br />

assegnamento e. Come nel caso della denotazione, la definizione è data per ricorsione strutturale, ovvero<br />

ricalcando la struttura ricorsiva delle formule. Ecco la definizione di v:<br />

v(P(t 1 ,...,t n ),M,e) = 1 se i(P)(∗t 1 ,...,∗t n ) = 1,<br />

= 0 altrimenti;<br />

v(¬ϕ,M,e) = 1 se v(ϕ,M,e) = 0,<br />

= 0 altrimenti;<br />

v(ϕ ∧ ψ,M,e) = 1 se v(ϕ,M,e) = v(ψ,M,e) = 1,<br />

= 0 altrimenti;<br />

v(ϕ ∨ ψ,M,e) = 0 se v(ϕ,M,e) = v(ψ,M,e) = 0,<br />

= 1 altrimenti;<br />

v(ϕ → ψ,M,e) = 1 se v(ϕ,M,e) ≤ v(ψ,M,e),<br />

= 0 altrimenti;<br />

v(ϕ ↔ ψ,M,e) = 1 se v(ϕ,M,e) = v(ψ,M,e),<br />

= 0 altrimenti.<br />

Prima di definire il valore di verità delle formula quantificate, introduciamo una particolare relazione di<br />

equivalenza fra assegnamenti di valori alle variabili. Se x è una variabile qualsiasi, due assegnamenti e<br />

ed e’ si dicono x-equivalenti, in simboli<br />

e ≈ x e’,<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 21<br />

se e solo se i due assegnamenti sono identici tranne al più il valore assegnato alla variabile x, ovvero:<br />

e(y) = e’(y) per ogni variabile y distinta da x.<br />

Si può verificare facilmente che la relazione è effettivamente una relazione di equivalenza fra<br />

assegnamenti, in quanto gode delle proprietà riflessiva, simmetrica e transitiva. Definiamo ora il valore<br />

di verità delle formule quantificate:<br />

v(∀xϕ,M,e) = 1 se per ogni assegnamento e’ ≈ x e si ha v(ϕ,M,e’) = 1,<br />

= 0 altrimenti;<br />

v(∃xϕ,M,e) = 1 se c’è almeno un assegnamento e’ ≈ x e tale che v(ϕ,M,e’) = 1,<br />

= 0 altrimenti.<br />

Nel caso sia presente nel linguaggio il predicato di uguaglianza, aggiungiamo la clausola:<br />

v(t 1 = t 2 ,M,e) = 1 se ∗t 1 = ∗t 2 ,<br />

= 0 altrimenti.<br />

Diciamo poi che una formula è vera in un modello M, e scriviamo<br />

|= M ϕ,<br />

se e solo se per ogni possibile assegnamento e si ha<br />

v(ϕ,M,e) = 1.<br />

Questa definizione si estende facilmente a un insieme arbitrario Γ di formule (eventualmente vuoto o<br />

infinito):<br />

|= M Γ se e solo se per ogni formula γ∈Γ si ha |= M γ.<br />

Possiamo finalmente definire il concetto di conseguenza logica:<br />

Γ |= ϕ se e solo se per ogni modello M tale che |= M Γ si ha |= M ϕ.<br />

In altre parole: ϕ (la conclusione) è conseguenza logica di Γ (le premesse) se e solo se ogni modello che<br />

renda vere tutte le formule di Γ rende vera anche ϕ. Nel caso particolare in cui Γ sia un insieme vuoto,<br />

|= ϕ,<br />

si ha che ϕ è vera sempre, in qualunque modello M. La formula ϕ si dice allora valida.<br />

Occorre distinguere nettamente fra la verità di una formula in un modello sotto un determinato<br />

assegnamento e la verità di una formula in un modello. Ad esempio, è possibile che sotto un determinato<br />

assegnamento la formula P(x) sia vera e la formula ∀xP(x) sia falsa; al contrario, la formula P(x) è vera<br />

in un modello M se e solo se la formula ∀xP(x) è anch’essa vera nel modello M. Per mostrare che P(x)<br />

può essere vera quando ∀xP(x) è falsa, consideriamo:<br />

M = 〈D,i(–)〉,<br />

con<br />

D = {a,b},<br />

i(P)(a) = 1,<br />

i(P)(b) = 0,<br />

e(x) = a.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 22<br />

Dalla definizione di verità abbiamo allora:<br />

v(P(x),M,e) = 1,<br />

perché i(P)(∗x) = i(P)(e(x)) = i(P)(a) = 1. Invece abbiamo<br />

v(∀xP(x),M,e) = 0,<br />

perché c’è un assegnamento e’, x-equivalente a e, tale che non vale v(P(x),M,e) = 0. L’assegnamento e’<br />

è definito da:<br />

e’(x) = b.<br />

Per quanto riguarda il fatto che P(x) è invece vera in un modello se e solo se lo è ∀xP(x), si consideri che<br />

se P(x) è vera in un modello per ogni possibile assegnamento e, allora non può esistere un assegnamento<br />

che renda P(x) falsa, e viceversa. Quindi:<br />

|= M P(x) se e solo se |= M ∀xP(x).<br />

3.2.2 Condizionale e implicazione<br />

La semantica del condizionale può risultare poco intuitiva. In particolare, sembra curioso che un<br />

enunciato italiano come<br />

“se Sean Connery è un ingegnere, allora Tokio è la capitale dell’Italia”<br />

risulti vera, una volta formalizzata come<br />

P → Q,<br />

dato che sia l’antecedente P (se Sean Connery è un ingegnere) sia il conseguente Q (Tokio è la capitale<br />

dell’Italia) sono entrambe false. La prima osservazione è che in realtà frasi di questo tipo vengono<br />

davvero utilizzate, se non altro in modo idiomatico. Ad esempio, qualcuno potrebbe dire<br />

“se Sean Connery è un ingegnere, allora io sono un pesce rosso”<br />

senza suscitare stupore. L’idea è che dato che il conseguente è palesemente falso, allora affinché il<br />

condizionale sia vero anche l’antecedente dev’essere falso. L’affermazione comporta quindi che<br />

“Sean Connery non è un ingegnere”.<br />

ed è proprio per comunicare questo che viene. Un altro caso in cui si utilizzano condizionali del genere è<br />

quando non è ancora possibile stabilire se l’antecedente è vero o falso. Ad esempio, posso dire<br />

“se mi inviti a cena, porto una bottiglia di champagne”.<br />

Supponiamo che alla fine il mio interlocutore non mi inviti lo stesso a cena (antecedente falso). A<br />

questo punto posso benissimo non portare la bottiglia di champagne (conseguente falso) senza per<br />

questo mancare all’impegno (condizionale vero).<br />

Uno dei motivi per cui la semantica del condizionale è percepita come controintuitiva deriva dalla<br />

frequente confusione fra condizionale e implicazione. Mentre un condizionale è semplicemente una<br />

formula di forma ϕ → ψ, un’implicazione è per definizione un condizionale valido:<br />

|= ϕ → ψ.<br />

Ad esempio, è corretto dire che l’enunciato P ∧ Q implica (in particolare) l’enunciato P, perché si ha:<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 23<br />

|= P ∧ Q → P.<br />

Considerazioni analoghe valgono per il connettivo ↔: mentre un bicondizionale è una formula di forma<br />

ϕ ↔ ψ, un’equivalenza è per definizione un bicondizionale valido:<br />

|= ϕ ↔ ψ.<br />

Ad esempio, è corretto dire che l’enunciato P ∧ Q è equivalente all’enunciato Q ∧ P, perché si ha:<br />

|= P ∧ Q ↔ Q ∧ P.<br />

3.3 Una procedura di prova per enunciati del primo ordine<br />

Presenterò ora una procedura di prova per la logica del primo ordine, che chiamerò calcolo degli alberi<br />

semantici, ispirato a un metodo proposto da Beth (1955). La definizione del calcolo è qui limitata a un<br />

linguaggio del primo ordine privo di funtori, ma potrebbe essere esteso al caso generale. Per semplicità,<br />

il calcolo richiede che tutte le formule utilizzate siano formule chiuse (in particolare enunciati). Questo<br />

vincolo non è però limitativo dal punto di vista delle applicazioni.<br />

L’idea è la seguente. Consideriamo un insieme Γ di enunciati e un ulteriore enuciato ϕ. Dire che<br />

(5.1) Γ |= ϕ<br />

equivale a dire che ϕ è vero in ogni modello di Γ o, in altre parole, che non esiste un modello che renda<br />

vere tutte le premesse di Γ e renda falsa la conclusione ϕ. Il calcolo tenta di dimostrare la 5.1 per<br />

assurdo. Ovvero: si tenta sistematicamente di costruire un modello di Γ che falsifichi ϕ (cioè un modello<br />

in cui tutte le premesse siano vere e la conclusione sia falsa); se il tentativo porta inevitabilmente a una<br />

contraddizione, se ne deduce che un simile modello non può esistere, e quindi che la conclusione è<br />

conseguenza logica delle premesse. Quando il calcolo termina in un numero finito di passi portando<br />

inevitabilmente a una contraddizione scriviamo:<br />

Γ |– ϕ<br />

e diciamo che ϕ deriva da Γ. Se poi ϕ deriva da un insieme vuoto di premesse scriviamo<br />

|– ϕ<br />

e diciamo che ϕ è un teorema.<br />

Il calcolo dà luogo a una procedura di prova corretta e completa. Infatti adattando la dimostrazione<br />

originale di Beth è possibile provare che:<br />

• Il calcolo degli alberi semantici è corretto, ovvero: se la procedura termina con un albero in cui<br />

tutti i rami contengono il falsum, la conclusione è conseguenza logica delle premesse:<br />

se Γ |– ϕ, allora Γ |= ϕ.<br />

• Il calcolo degli alberi semantici è completo, ovvero: se la conclusione è conseguenza logica delle<br />

premesse, la procedura termina con un albero in cui tutti i rami contengono il falsum:<br />

se Γ |= ϕ, allora Γ |– ϕ.<br />

La prova vale anche nel caso in cui Γ contenga infinite premesse (vedi Beth, 1955).<br />

Occorre notare che la completezza non garantisce la decidibilità. Infatti, se ϕ non è conseguenza logica<br />

di Γ, la procedura può terminare fornendo la descrizione di un controesempio (ovvero di un modello di Γ<br />

che falsifica ϕ) oppure non terminare. Ci si può chiedere se la procedura possa essere modificata in<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 24<br />

modo da terminare sempre con una risposta univoca, positiva o negativa. Si sa però che ciò non è<br />

possibile, perché in questo modo avremmo un algoritmo di decisione per la logica del primo ordine, ed è<br />

stato dimostrato da Church (1936) che un simile algoritmo non esiste. Tuttavia, il calcolo degli alberi<br />

semantici si comporta come un algoritmo di decisione (in quanto termina sempre) se gli enunciati presi<br />

in considerazione sono proposizionali (ovvero non contengono variabili né quantificatori).<br />

3.3.1 Il calcolo degli alberi semantici: esempi introduttivi<br />

Come si è già detto, il calcolo degli alberi semantici tenta di dimostrare che la conclusione, ϕ, può essere<br />

falsa anche se le premesse, Γ, sono tutte vere. A questo scopo si costruisce un albero, detto albero<br />

semantico. L’albero è costituito da un certo numero di nodi, ognuno dei quali è una “struttura dati” con<br />

quattro campi (tre se le formule sono esclusivamente proposizionali), che scriveremo su un’unica riga. I<br />

campi sono nell’ordine:<br />

• il numero d’identificazione del nodo;<br />

• un enunciato;<br />

• una giustificazione;<br />

• una lista di costanti introdotte (presente solo se compaiono i quantificatori).<br />

Ad esempio, supponiamo di voler verificare se<br />

P → Q, P |= Q.<br />

Iniziamo con i primi tre nodi dell’albero:<br />

num enunciato giustificazione (costanti)<br />

1. P → Q premessa<br />

2. P premessa<br />

3. ¬Q ¬conclusione<br />

Ovvero:<br />

• il nodo numero 1 contiene l’enunciato P → Q, assunto come premessa;<br />

• il nodo numero 2 contiene l’enunciato P, anch’esso assunto come premessa;<br />

• coerentemente con la strategia di dimostrare la conseguenza logica per assurdo, il nodo numero 3<br />

contiene l’enunciato ¬Q, assunto come negazione della conclusione.<br />

La dimostrazione prosegue cercando di dimostrare che esiste un modello M che può soddisfare gli<br />

enunciati dei nodi 1, 2 e 3; ovvero, che esiste un modello M che verifica le premesse e falsifica la<br />

conclusione. Il sistema deduttivo utilizza 14 regole deduttive: 7 per la negazione, 6 per le altre costanti<br />

logiche (congiunzione, disgiunzione, condizionale, bicondizionale, quantificatore universale,<br />

quantificatore esistenziale) e 1 per l’introduzione del falsum (che rappresenta l’esistenza di una<br />

contraddizione).<br />

Il sistema di deduzione procede in questo modo:<br />

• per ogni regola applicabile a un enunciato viene inserita in un’attivazione in un’agenda;<br />

• se l’agenda è vuota il processo deduttivo termina;<br />

• se l’agenda invece contiene delle attivazioni, sei sceglie un’attivazione in base a criteri che<br />

vedremo in seguito, la si rimuove dall’agenda e la si esegue.<br />

Nel nostro caso, l’unica regola applicabile è:<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 25<br />

rule →<br />

if ϕ → ψ<br />

then ¬ϕ | ψ.<br />

La regola si legge così:<br />

• il nome della regola (rule →) coincide con la costante logica trattata dalla regola;<br />

• la condizione di applicazione della regola (if ϕ → ψ) identifica il tipo di enunciato che può attivare<br />

la regola;<br />

• l’azione (then ¬ϕ | ψ) indica ciò che va fatto quando un’attivazione della regola è eseguita.<br />

Nel nostro caso, l’azione ¬ϕ | ψ indica che nell’albero della dimostrazione deve essere introdotta una<br />

biforcazione: nel ramo sinistro viene inserito un nodo con l’enunciato ¬ϕ, nel ramo destro un nodo con<br />

l’enunciato ψ. Questa azione è giustificata dal fatto che se il modello M che stiamo cercando di costruire<br />

verifica ϕ → ψ, allora in M dev’essere vera ¬ϕ oppure vera ψ.<br />

La regola “→” è applicabile all’enunciato del nodo 1; viene quindi generata un’attivazione della regola,<br />

che descriviamo come →(1), ovvero: la regola “→” applicata al nodo 1. L’attivazione viene inserita<br />

nell’agenda, inizialmente vuota, che diventa quindi {→(1)}. Nessun’altra regola è applicabile ai nodi 1,<br />

2 e 3.<br />

A questo punto dobbiamo scegliere un’attivazione da eseguire. Dato che l’agenda contiene solo →(1),<br />

quest’attivazione viene scelta, rimossa dall’agenda ed eseguita. Eseguire l’attivazione significa effettuare<br />

l’azione della regola corrispondente.<br />

L’albero diventa quindi:<br />

1. P → Q premessa<br />

2. P premessa<br />

3. ¬Q ¬conclusione<br />

4. ¬P →(1) 4’. Q →(1)<br />

Ora consideriamo la regola, che consente di introdurre il falsum (⊥), che indica la presenza di una<br />

contrazzizione in un ramo dell’albero. La regola ha due condizioni (ϕ e ¬ϕ) e un’azione:<br />

rule ⊥<br />

if ϕ , ¬ϕ<br />

then ⊥.<br />

Sull’albero mostrato sopra, questa regola genera due attivazioni: ⊥(2,4) nel ramo sinistro e ⊥(4’,3) nel<br />

ramo destro.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 26<br />

Dopo aver eseguito entrambe le attivazioni abbiamo:<br />

1. P → Q premessa<br />

2. P premessa<br />

3. ¬Q ¬conclusione<br />

4. ¬P →(1) 4’. Q →(1)<br />

5. ⊥ ⊥(2,4) 5’. ⊥ ⊥(4’,3)<br />

Ai nostri fini, ogni ramo che contiene il falsum può essere scartato perché nessun modello M può<br />

rendere vera una contraddizione. In altre parole, ogni ramo dell’albero che contiene il falsum indica un<br />

tentativo fallito di costruire un modello che renda vere le premesse e falsa la conclusione. Nel nostro<br />

caso soltanto due tentativi erano giustificati (i due rami dell’albero), e sono ambuedue falliti. Ne segue<br />

che non esiste nessun modello che renda le due premesse vere e la conclusione falsa. Ciò significa, per<br />

definizione, che la conclusione è conseguenza logica delle premesse.<br />

Occorre chiarire bene un punto essenziale. Nell’esecuzione manuale della procedura ci siamo<br />

abbondantemente basati sulla nostra intuizione di che cosa significhi che un enunciato è vero o falso, e<br />

di che cosa siano un condizionale e una contraddizione. Tuttavia, il metodo è completamente<br />

algoritmico; ovvero, può essere eseguito da un calcolatore come puro processo di manipolazione di<br />

espressioni simboliche, senza la minima comprensione del significato dei simboli. Si tratta quindi di un<br />

vero e proprio calcolo. Abbiamo quindi dimostrato che:<br />

P → Q, P |− Q.<br />

Poiché, come vedremo, il calcolo degli alberi semantici è corretto ne ricaviamo anche che:<br />

P → Q, P |= Q.<br />

Come secondo esempio, proviamo a verificare se<br />

P → Q, Q |= P.<br />

Iniziamo da:<br />

Proseguendo come prima arriviamo a:<br />

1. P → Q premessa<br />

2. Q premessa<br />

3. ¬P ¬conclusione<br />

1. P → Q premessa<br />

2. Q premessa<br />

3. ¬P ¬conclusione<br />

4. ¬P →(1) 4’. Q →(1)<br />

Ora però non è possibile introdurre il falsum in nessuno dei due rami. Poiché nessuna regola nuova è<br />

applicabile all’albero, l’agenda delle attivazioni è vuota e la procedura termina. Ogni ramo dell’albero<br />

che dopo la terminazione non contenga il falsum ci descrive un possibile controesempio all’ipotesi<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 27<br />

iniziale (ovvero, un modello che rende vere le premesse e falsa la conclusione). Nel nostro caso<br />

ambedue i rami descrivono lo stesso controesempio: un modello che renda P falso (¬P) e Q vero (Q).<br />

In conclusione abbiamo<br />

P → Q, Q |-/- P.<br />

Dato che, come vedremo, il calcolo degli alberi semantici è completo ne ricaviamo che<br />

P → Q, Q |≠ P.<br />

Lo stesso metodo si applica in assenza di premesse. Ad esempio, verifichiamo se<br />

|= P ∧ Q → P.<br />

Iniziamo con:<br />

1. ¬(P ∧ Q → P) ¬conclusione<br />

Ora possiamo applicare una delle regole della negazione, e più precisamente:<br />

rule ¬→<br />

if ¬(ϕ → ψ)<br />

then ϕ , ¬ψ.<br />

In questo caso non ci sarà nessuna biforcazione, perché l’azione (then ϕ , ¬ψ) aggiunge due nodi allo<br />

stesso ramo dell’albero:<br />

1. ¬(P ∧ Q → P) ¬conclusione<br />

2. P ∧ Q ¬→(1)<br />

3. ¬P ¬→(1)<br />

Ora possiamo applicare la regola della congiunzione:<br />

rule ∧<br />

if ϕ ∧ ψ<br />

then ϕ , ψ.<br />

Anche questa regola non introduce biforcazioni:<br />

1. ¬(P ∧ Q → P) ¬conclusione<br />

2. P ∧ Q ¬→(1)<br />

3. ¬P ¬→(1)<br />

4. P ∧(2)<br />

5. Q ∧(2)<br />

Ora è applicabile la regola per l’introduzione del falsum:<br />

1. ¬(P ∧ Q → P) ¬conclusione<br />

2. P ∧ Q ¬→(1)<br />

3. ¬P ¬→(1)<br />

4. P ∧(2)<br />

5. Q ∧(2)<br />

6. ⊥ ⊥(4,3)<br />

Poiché l’unico ramo dell’albero fallisce, ne ricaviamo:<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 28<br />

|− P ∧ Q → P.<br />

3.3.2 Il calcolo degli alberi semantici: le regole per i connettivi booleani<br />

Di seguito sono elencate le nove regole per i connettivi booleani; il lettore è invitato a verificarne la<br />

correttezza in base alla semantica formale del linguaggio logico.<br />

Quattro regole riguardano i connettivi booleani binari:<br />

rule ∧ rule ∨<br />

if ϕ ∧ ψ if ϕ ∨ ψ<br />

then ϕ , ψ. then ϕ | ψ.<br />

rule → rule ↔<br />

if ϕ → ψ if ϕ ↔ ψ<br />

then ¬ϕ | ψ.<br />

then ϕ , ψ | ¬ϕ , ¬ψ.<br />

Cinque regole concernono i cinque connettivi booleani quando compaiono nell’ambito di una negazione:<br />

rule ¬¬<br />

if ¬¬ϕ<br />

then ϕ.<br />

rule ¬∧ rule ¬∨<br />

if ¬(ϕ ∧ ψ) if ¬(ϕ ∨ ψ)<br />

then ¬ϕ | ¬ψ.<br />

then ¬ϕ , ¬ψ.<br />

rule ¬→ rule ¬↔<br />

if ¬(ϕ → ψ) if ¬(ϕ ↔ ψ)<br />

then ϕ , ¬ψ. then ϕ , ¬ψ | ¬ϕ , ψ.<br />

A queste va aggiunta la regola per l’introduzione del falsum:<br />

rule ⊥<br />

if ϕ , ¬ϕ<br />

then ⊥.<br />

Se ci si limita a considerare insiemi finiti di enunciati proposizionali, è facile mostrare che il calcolo<br />

termina sempre. Anzi, adattando una dimostrazione di Beth (1955) si può mostrare che la terminazione è<br />

assicurata anche nel caso di insiemi numerabili di enunciati proposizionali. Ciò non è più vero se<br />

utilizziamo i quantificatori.<br />

3.3.3 Il calcolo degli alberi semantici: regole per i quantificatori<br />

Il calcolo prevede quatto regole per la manipolazione dei quantificatori, di cui due relative alla<br />

negazione. Cominceremo con alcuni esempi. Nel seguito si fa l’ipotesi che il linguaggio offra un’infinità<br />

numerabile di costanti individuali, che chiameremo a 0 , a 1 , ..., a n , ...<br />

Come primo esempio ci chiediamo se:<br />

∀xP(x) |= P(a 0 ).<br />

Primi due nodi dell’albero:<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 29<br />

1. ∀xP(x) premessa<br />

2. ¬P(a 0) ¬conclusione a 0<br />

Qui abbiamo messo in evidenza, nell’ultimo campo del nodo, il fatto che l’enunciato introduce una<br />

costante (a 0 ). Ora, il fatto che ∀xP(x) sia vero in M ci autorizza ad aggiungere un enunciato atomica<br />

P(c), dove c è una costante qualsiasi. D’altra parte, non dobbiamo dimenticarci che il nostro obiettivo è<br />

generare una contraddizione. Sarebbe inutile, quindi, aggiungere a un ramo dell’albero un enunciato<br />

della forma P(c) se la costante c non compare altrove nel ramo: un enunciato del genere non potrebbe<br />

comunque dar luogo a una contraddizione. Possiamo quindi formulare la seguente regola per il<br />

quantificatore universale:<br />

rule ∀<br />

if ∀xϕ<br />

then ϕ(c/x),<br />

Eseguiamo l’azione con c = a 0:<br />

Ma ora possiamo introdurre il falsum:<br />

Pertanto:<br />

∀xP(x) |− P(a 0 ).<br />

per ogni costante c introdotta nel ramo dell’albero<br />

cui viene aggiunto il nodo.<br />

1. ∀xP(x) premessa<br />

2. ¬P(a 0 ) ¬conclusione a 0<br />

3. P(a 0) ∀(1/a 0 )<br />

1. ∀xP(x) premessa<br />

2. ¬P(a 0 ) ¬conclusione a 0<br />

3. P(a 0 ) ∀(1/a 0 )<br />

4. ⊥ ⊥(3,2)<br />

Come si vede, un enunciato del tipo ∀xϕ si comporta come un generatore di enunciati della forma<br />

ϕ(a n /x), per ogni costante a n introdotta. Va precisato subito che la lista delle costanti introdotte non è<br />

fisso: oltre alle costanti presenti inizialmente, altre costanti possono essere aggiunte dalla regola per il<br />

quantificatore esistenziale (vedi oltre). Il generatore ∀xϕ si deve quindi “risvegliare” ogni volta che<br />

viene introdotta una nuova costante, per poter generare nuovi enunciati della forma ϕ(a n /x).<br />

Proviamo ora a verificare se<br />

P(a 0 ) |= ∀xP(x).<br />

Primi due nodi dell’albero:<br />

1. P(a 0 ) premessa a 0<br />

2. ¬∀xP(x) ¬conclusione<br />

La regola per la negazione del quantificatore universale si limita a riflettere la dualità fra i due<br />

quantificatori:<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 30<br />

rule ¬∀<br />

if ¬∀xϕ<br />

then ∃x¬ϕ.<br />

Eseguiamo l’azione:<br />

1. P(a 0 ) premessa a 0<br />

2. ¬∀xP(x) ¬conclusione<br />

3. ∃x¬P(x) ¬∀(2)<br />

A questo punto ragioniamo nel modo seguente. Se ∃xP(x) è vero in M, esisterà un individuo nel<br />

dominio, chiamiamolo genericamente c, per cui si ha P(c). Nulla ci consente di assumere che tale<br />

individuo sia uno di quelli cui fanno riferimento le costanti già introdotte; quindi dobbiamo introdurre<br />

una nuova costante. Ecco quindi la regola per il quantificatore esistenziale:<br />

rule ∃<br />

if ∃xϕ<br />

then ϕ(c/x), dove c è una costante nuova per il ramo cui viene aggiunto il nodo.<br />

Come si vede, un enunciato del tipo ∃xϕ si comporta come generatore di una nuova costante. Al<br />

contrario della regola per il quantificatore universale, però, la regola una volta applicata non ha più<br />

bisogno di essere “risvegliata”.<br />

Applichiamo la regola:<br />

1. P(a 0) premessa a 0<br />

2. ¬∀xP(x) ¬conclusione<br />

3. ∃x¬P(x) ¬∀(2)<br />

4. ¬P(a 1 ) ∃(3) a 1<br />

Non ci sono altre regole applicabili, e la procedura termina senza generare il falsum. Abbiamo quindi:<br />

P(a 0 ) |-/- ∀xP(x).<br />

Anche qui l’albero ci mostra un controesempio: è sufficiente introdurre un modello con due individui,<br />

da utilizzare come le denotazioni di a 0 e a 1 . Poi fissiamo l’estensione di P in modo tale che P sia vero di<br />

a 0 (il che verifica P(a 0 )) e falso di a 1 (il che verifica ¬P(a 1 )).<br />

Proviamo ora con<br />

∀xP(x) |= ∃xP(x).<br />

Ecco la dimostrazione completa:<br />

1. ∀xP(x) premessa<br />

2. ¬∃xP(x) ¬conclusione<br />

3. ∀x¬P(x) ¬∃(2)<br />

4. P(a 0 ) ∀(1/a 0 ) a 0<br />

5. ¬P(a 0) ∀(3/a 0)<br />

4. ⊥ ⊥(4,5)<br />

Qui abbiamo dovuto introdurre una costante in occasione della prima applicazione della regola ∀, perché<br />

non esistevano nel ramo costanti già introdotte. Ciò è consentito in quanto sappiamo che il dominio del<br />

modello deve contenere almeno un individuo. In conclusione:<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 31<br />

∀xP(x) |− ∃xP(x).<br />

Per completare il quadro manca solo l’ultima regola:<br />

rule ¬∃<br />

if ¬∃xϕ<br />

then ∀x¬ϕ.<br />

Vediamo ancora due esempi. Verifichiamo se:<br />

∃x∀yP(x,y) |= ∀y∃xP(x,y).<br />

Ecco la dimostrazione completa:<br />

Quindi:<br />

∃x∀yP(x,y) |− ∀y∃xP(x,y).<br />

Veniamo ora all’ultimo esempio e verifichiamo se:<br />

∀y∃xP(x,y) |= ∃x∀yP(x,y).<br />

1. ∃x∀yP(x,y) premessa<br />

2. ¬∀y∃xP(x,y) ¬conclusione<br />

3. ∃y¬∃xP(x,y) ¬∀(2)<br />

4. ∀yP(a 0 ,y) ∃(1) a 0<br />

5. ¬∃xP(x,a 1) ∃(3) a 1<br />

6. ∀x¬P(x,a 1 ) ¬∃(5)<br />

7. P(a 0 ,a 0 ) ∀(4/a 0 )<br />

8. P(a 0,a 1) ∀(4/a 1)<br />

9. ¬P(a 0 ,a 1 ) ∀(6/a 0 )<br />

10. ¬P(a 1 ,a 1 ) ∀(6/a 1 )<br />

11. ⊥ ⊥(8,9)<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 32<br />

Ecco i primi passi della dimostrazione:<br />

1. ∀y∃xP(x,y) premessa<br />

2. ¬∃x∀yP(x,y) ¬conclusione<br />

3. ∀x¬∀yP(x,y) ¬∃(2)<br />

4. ∃xP(x,a 0 ) ∀(1/a 0 ) a 0<br />

5. ¬∀yP(a 0 ,y) ∀(3/a 0 )<br />

6. ∃y¬P(a 0,y) ¬∀(5)<br />

7. P(a 1 ,a 0 ) ∃(4) a 1<br />

8. ¬P(a 0 ,a 2 ) ∃(6) a 2<br />

9. ∃xP(x,a 1 ) ∀(1/a 1 )<br />

10. ∃xP(x,a 2) ∀(1/a 2)<br />

11. ¬∀yP(a 1 ,y) ∀(3/a 1 )<br />

12. ¬∀yP(a 2 ,y) ∀(3/a 2 )<br />

13. ∃y¬P(a 1 ,y) ¬∀(11)<br />

14. ∃y¬P(a 2 ,y) ¬∀(12)<br />

15. P(a 3 ,a 1 ) ∃(9) a 3<br />

16. P(a 4 ,a 2 ) ∃(10) a 4<br />

17. ¬P(a 1,a 5) ∃(13) a 5<br />

18. ¬P(a 2 ,a 6 ) ∃(13) a 6<br />

... ... ...<br />

Dovrebbe essere facile convincersi che il procedimento è entrato in un ciclo senza fine. In effetti,<br />

quando il calcolo viene applicato ad argomentazioni o enunciati predicativi non validi è possibile che la<br />

procedura “vada in ciclo” e quindi non termini. Per evidenziare meglio la cosa, l’albero è stato diviso in<br />

blocchi. Come si può notare, dopo l’introduzione della prima costante (a 0 ), 2 n nuove costanti sono<br />

introdotte all’n-esimo blocco, e la successione di nuovi blocchi non ha termine. Ciò non è strano, dato<br />

che il calcolo non è un algoritmo di decisione. D’altra parte, è interessante vedere perché la procedura va<br />

in ciclo: ciò è dovuto a un circolo vizioso che si crea fra la regola ∃, che introduce una nuova costante, e<br />

la regola ∀, che si risveglia ogni volta che viene introdotta una nuova costante.<br />

3.3.4 Il calcolo con l’uguaglianza<br />

Il calcolo degli alberi semantici può essere esteso al trattamento dell’uguaglianza. Per questo è<br />

sufficiente introdurre due nuove regole. La prima regola consente di introdurre il falsum quando<br />

compare nell’albero un enunciato del tipo c ≠ c (con c costante arbitraria):<br />

rule ≠<br />

if c ≠ c (dove c è una costante qualsiasi)<br />

then ⊥.<br />

La seconda regola, detta regola di sostituzione, consente di sostituire ovunque lo si desideri una costante<br />

c 1 a una costante c 2 quando c 1 = c 2 :<br />

rule Sost<br />

if ϕ , c 1 = c 2<br />

then ϕ(c 1 /c 2).<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 33<br />

Utilizziamo il calcolo così esteso per dimostrare un paio di proprietà molto semplici ma utili. La prima:<br />

P(a), a = b |= P(b),<br />

ovvero: se a ha una proprietà P e b è uguale ad a, allora anche b ha la proprietà P. Dimostrazione:<br />

La seconda:<br />

P(a), ¬P(b) |= a ≠ b,<br />

1. P(a) premessa<br />

2. a = b premessa<br />

3. ¬P(b) ¬conclusione<br />

4. ¬P(a) Sost(3,2)<br />

5. ⊥ ⊥(1,4)<br />

ovvero: se due individui differiscono per qualche proprietà, allora sono diversi. Dimostrazione:<br />

1. P(a) premessa<br />

2. ¬P(b) premessa<br />

3. a = b ¬conclusione<br />

4. ¬P(a) Sost(2,3)<br />

5. ⊥ ⊥(1,4)<br />

Dimostriamo ora le tre proprietà fondamentali dell’uguaglianza. Proprietà riflessiva:<br />

|= ∀x (x = x).<br />

Dimostrazione:<br />

Proprietà simmetrica:<br />

|= ∀x ∀y (x = y → y = x).<br />

Dimostrazione (abbreviata):<br />

Proprietà transitiva:<br />

1. ¬∀x (x = x) ¬conclusione<br />

2. ∃x (x ≠ x) ¬∀(1)<br />

3. a ≠ a ∃(2) a<br />

4. ⊥ ≠(3)<br />

1. ¬∀x ∀y (x = y → y = x) ¬conclusione<br />

2. ∃x ∃y ¬(x = y → y = x) ¬∀ ¬∀(1)<br />

3. ¬(a = b → b = a) ∃ ∃(2) a, b<br />

4. a = b ¬→(3)<br />

5. b ≠ a ¬→(3)<br />

6. a ≠ a Sost(5,4)<br />

7. ⊥ ≠(6)<br />

|= ∀x ∀y ∀z (x = y ∧ y = z → x = z).<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 34<br />

Dimostrazione (abbreviata):<br />

3.3.5 Criteri di gestione dell’agenda<br />

1. ¬∀x ∀y ∀z (x = y ∧ y = z → x = z) ¬conclusione<br />

2. ∃x ∃y ∃z ¬(x = y ∧ y = z → x = z) ¬∀ ¬∀ ¬∀(1)<br />

3. ¬(a = b ∧ b = c → a = c) ∃ ∃ ∃(2) a, b, c<br />

4. a = b ∧ ¬→(3)<br />

5. b = c ∧ ¬→(3)<br />

6. a ≠ c ¬→(3)<br />

7. a = c Sost(5,4)<br />

8. ⊥ ⊥(7,6)<br />

In un istante generico della costruzione di un albero semantico sono in genere presenti nell’agenda<br />

diverse attivazioni. Se la scelta della prossima attivazione da eseguire non è oculata, è possibile che<br />

l’albero costruito non sia ottimale (ovvero, che presenti più nodi e più biforcazioni del necessario).<br />

Non è possibile formulare un insieme di criteri che assicurino in ogni caso la costruzione di un albero<br />

ottimale. Tuttavia, è possibile formulare alcuni criteri euristici (ovvero, criteri che in genere portano a<br />

produrre un albero ottimale o quasi).<br />

I criteri più importanti sono:<br />

• dare la massima priorità alle attivazioni delle regole che introducono il falsum (perché permetteno<br />

di chiudere un ramo dell’albero);<br />

• in subordine, preferire le attivazioni di regole che non producono biforcazioni (così l’albero si<br />

mantiene più semplice);<br />

• preferire le attivazioni della regola ∃ alle attivazioni della regola ∀ (è meglio generare subito le<br />

costanti da utilizzare in seguito per altre inferenze);<br />

• preferire le attivazioni applicate a enunciati che hanno più predicati in comune con altri enunciati<br />

dell’albero (in questo modo si massimizzano le opportunità di creare contraddizioni e derivare il<br />

falsum).<br />

3.4 Teorema di deduzione e regole derivate<br />

Ci si può chiedere che differenza ci sia fra affermare che P(a 0 ) è conseguenza logica di ∀xP(x),<br />

∀xP(x) |= P(a 0 )<br />

e affermare che la formula ∀xP(x) → P(a 0 ) è valida,<br />

|= ∀xP(x) → P(a 0).<br />

È facile verificare che le due affermazioni sono equivalenti. Più in generale abbiamo che<br />

Γ |= ϕ → ψ se e solo se Γ, ϕ |= ψ.<br />

Questo è l’enunciato del teorema semantico di deduzione, che vale in particolare sotto l’ipotesi che gli<br />

elementi di Γ , ϕ e ψ siano formule chiuse 1 . Dato che il calcolo è corretto e completo, ricaviamo<br />

immediatamente il teorema (sintattico) di deduzione:<br />

Γ |− ϕ → ψ se e solo se Γ, ϕ |− ψ.<br />

1<br />

Per l’enunciato generale del teorema si veda qualunque testo introduttivo di logica.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 35<br />

Nel caso in cui Γ sia finito, è facile dimostrare il teorema di deduzione direttamente. Infatti, una<br />

dimostrazione di Γ, ϕ |− ψ con Γ = {γ 1 , ..., γ n } avrà la forma:<br />

1. γ 1 premessa<br />

... ... ...<br />

n. γ n premessa<br />

n+1. ϕ premessa<br />

n+2. ¬ψ ¬conclusione<br />

n+3. ... ...<br />

Da questa dimostrazione aggiungendo un nodo (n’) si può ricavare una dimostrazione di Γ |− ϕ → ψ:<br />

1. γ 1 premessa<br />

... ... ...<br />

n. γ n premessa<br />

n’. ¬(ϕ → ψ) ¬conclusione<br />

n+1. ϕ →(n’)<br />

n+2. ¬ψ →(n’)<br />

n+3. ... ...<br />

L’operazione inversa consente di passare da una prova di Γ |− ϕ → ψ a una prova di Γ, ϕ |− ψ.<br />

Notiamo infine che è possibile rendere le dimostrazioni più brevi introducendo ulteriori regole deduttive,<br />

dette regole derivate, che non aumentano la potenza del calcolo ma consentono di riutilizzare<br />

dimostrazioni già eseguite. Consideriamo ad esempio la derivazione<br />

∃x∀yP(x,y) |− ∀y∃xP(x,y),<br />

vista precedentemente. È facile rendersi conto che la derivazione può essere generalizzata come:<br />

∃x∀yϕ |− ∀y∃xψ.<br />

A questo punto, sappiamo che se l’enunciato ∃x∀yϕ compare in una dimostrazione, possiamo senz’altro<br />

aggiungere l’enunciato ∀y∃xψ. Possiamo quindi formulare la regola derivata<br />

rule ∃∀−∀∃<br />

if ∃x∀yϕ<br />

then ∀y∃xψ.<br />

Utilizzando questa regola possiamo rendere più concise molte dimostrazioni.<br />

Ogni teorema già dimostrato si può convertire in una regola derivata. Anche se l’uso di un numero<br />

eccessivo di regole derivate può avere effetti negativi sull’efficienza di un dimostratore automatico di<br />

teoremi, alcune regole derivate sono molto utili. Nel seguito ne introduciamo due; la dimostrazione per<br />

esteso della loro validità è lasciata al lettore.<br />

La due regole che consideriamo qui, dette rispettivamente modus pones e modus tollens, concernono il<br />

connettivo condizionale:<br />

rule MP<br />

if ϕ → ψ , ϕ<br />

then ψ.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 36<br />

rule MT<br />

if ϕ → ψ , ¬ψ<br />

then ¬ϕ.<br />

Un esempio di utilizzo di MP è dato nel prossimo sottoparagrafo.<br />

3.5 Calcolo della validità di un’argomentazione<br />

A questo punto possiamo ritornare all’idea iniziale di stabilire la validità di un’argomentazione.<br />

Consideriamo ad esempio l’argomentazione seguente:<br />

Chi non beve in compagnia, o è un ladro o è una spia.<br />

Filippo non beve in compagnia.<br />

Filippo non è una spia.<br />

Quindi Filippo è un ladro.<br />

Il primo passo consiste nel formalizzare l’argomentazione. Ogni enunciato italiano viene tradotto in un<br />

enunciato logico-predicativo cercando di rendere il significato dell’enunciato originario nel modo più<br />

fedele possibile. A questo scopo introduciamo tre predicati:<br />

B(x)<br />

L(x)<br />

S(x)<br />

e una costante individuale:<br />

a<br />

x beve in compagnia,<br />

x è un ladro,<br />

x è una spia,<br />

Filippo.<br />

L’argomentazione si formalizza allora così:<br />

∀x (¬B(x) → L(x) ∨ S(x)),<br />

¬B(a),<br />

¬S(a),<br />

∴ L(a)<br />

dove il simbolo metalinguistico “∴” si legge “quindi” o “in conclusione”. L’argomentazione è valida se<br />

e solo se:<br />

∀x (¬B(x) → L(x) ∨ S(x)), ¬B(a), ¬S(a) |= L(a).<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 37<br />

Ecco una prova che sfrutta la regola derivata MP::<br />

1. ∀x (¬B(x) → L(x) ∨ S(x)) ipotesi<br />

2. ¬B(a) ipotesi a<br />

3. ¬S(a) ipotesi<br />

4. ¬L(a) ¬conclusione<br />

5. ¬B(a) → L(a) ∨ S(a) ∀(1/a)<br />

6. L(a) ∨ S(a) MP(5,2)<br />

Ovvero:<br />

7. L(a) ∨(6) 7’. S(a) ∨(6)<br />

8. ⊥ ⊥(7,4) 8’. ⊥ ⊥(7’,3)<br />

∀x (¬B(x) → L(x) ∨ S(x)), ¬B(a), ¬S(a) |− L(a),<br />

e quindi l’argomentazione è valida.<br />

3.6 Alcune equivalenze importanti<br />

Così come nell’algebra hanno un ruolo essenziale equazioni come a2 – b2 = (a + b)(a – b), nella logica<br />

esistono molte equivalenze importanti. Alcune di queste hanno corrispondenze ben note nell’algebra<br />

booleana. Ad esempio:<br />

|= ¬¬ϕ ↔ ϕ,<br />

|= ¬(ϕ ∧ ψ) ↔ (¬ϕ ∨ ¬ψ),<br />

|= ¬(ϕ ∨ ψ) ↔ (¬ϕ ∧ ¬ψ),<br />

|= (ϕ → ψ) ↔ (¬ϕ ∨ ψ).<br />

Altre equivalenze riguardano la dualità fra i due quantificatori:<br />

|= ∀xϕ ↔ ¬∃x¬ϕ,<br />

|= ∃xϕ ↔ ¬∀x¬ϕ.<br />

Alcune equivalenze sono poco intuitive, e vanno quindi esaminate con attenzione. Consideriamo un<br />

enunciato come “una rondine fa primavera” (più che per un eccesso di ottimismo, il noto proverbio è<br />

stato modificato per non confondere le idee con una negazione che non è del tutto banale rappresentare<br />

correttamente). La forma dell’enunciato è:<br />

∃xP(x) → Q,<br />

dove P sta per “è una rondine” e Q sta per “è primavera”. Valgono le seguenti equivalenze:<br />

∃xP(x) → Q<br />

↔ ¬∃xP(x) ∨ Q<br />

↔ ∀x¬P(x) ∨ Q<br />

↔ ∀x (¬P(x) ∨ Q) 2<br />

2<br />

Il passaggio da ∀x¬P(x)ϕ ∨ Q a ∀x (¬P(x)ϕ ∨ Q) può risultare poco intuitivo. Si consiglia il lettore<br />

sospettoso di verificare l’equivalenza utilizzando direttamente la semantica formale o applicando il calcolo.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


3 La logica del primo ordine 38<br />

↔ ∀x (P(x) → Q).<br />

Con le convenzioni introdotte, questo enunciato si può leggere come “per ogni cosa, se questa è una<br />

rondine allora è primavera”. In generale si ha:<br />

|= (∃xϕ → ψ) ↔ ∀x(ϕ → ψ)<br />

purché ψ non contenga occorrenze libere di x.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001


Riferimenti bibliografici (parte I) 39<br />

4 Riferimenti bibliografici (parte I)<br />

Beth, E.W. (1955). Semantic entailment and formal derivability. Mededelingen van de Koninklijke Nederlandse<br />

Akademie van Wetenschappen, Afdeling Letterkunde, 18 (13), 309–342. Ristampato in J. Hintikka, ed. (1969), The<br />

philosophy of mathematics, Oxford University Press, 9–41.<br />

Boole, G. (1854). An investigation of the laws of thought, on which are founded the mathematical theories of logic and<br />

probabilities.<br />

Church, A. (1936). A note on the Entscheidungsproblem, Journal of Symbolic Logic, 1, 40–41. Correction, ibidem,<br />

101–102.<br />

Frege, G. (1879). Begriffsschrift – Eine der arithmetischen nachgedildete Formelsprache des reinen Denkens.<br />

McCarthy, J., and P. Hayes (1969). Some philosophical problems from the standpoint of artificial intelligence. In B.<br />

Meltzer and D. Michie, eds., Machine Intelligence 4, Edinburgh University Press, Edinburgh, UK.<br />

Nilsson, N. J. (1998). Artificial intelligence: A new synthesis, Morgan Kaufmann, San Francisco, CA.<br />

Russell, S., and P. Norvig (1995). Artificial intelligence: A modern approach, Prentice Hall, Englewood Cliffs, NJ.<br />

Wooldridge, M. (2000). Reasoning about rational agents, MIT Press, Cambridge, MA.<br />

Marco Colombetti<br />

<strong>Appunti</strong> <strong>dalle</strong> <strong>lezioni</strong> di Ingegneria della conoscenza e sistemi esperti<br />

Politecnico di Milano Anno accademico 2000/2001 – Versione 2 aprile 2001

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!