Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
M. Baioletti1
A.A. 2005/06
1
Queste dispense sono dedicate alla memoria del prof. Sauro Tulipani (1946–2005),
già insigne docente di questo corso, maestro e collega inestimabile
Capitolo 1
Linguaggi e logica
proposizionale
1
di simboli di A. Il numero di elementi presenti in w si chiama lunghezza della
parola.
In altri termini, una parola di lunghezza n può essere vista come una funzione
w : {1, 2, . . . , n} → A, cioè come una funzione che ad ogni intero compreso tra
1 e n associa un elemento dell’alfabeto.
E’ ammesso anche il caso n = 0, la cui unica parola si chiama parola nulla
(o vuota) e si indica con .
Ad esempio con l’alfabeto A = {a, b} si possono formare infinite parole, di
cui alcune sono: , a, b, aa, ab, ba, bb, aaa, aab, aba, abb, baa, bab, bba, bbb,
aaaa, . . . .
L’insieme di tutte le parole formate con un alfabeto A si indica con A ∗
2
Una produzione w → w 0 si può applicare ad una parola s se w è una sotto-
parola di s, cioè se esistono due parole u, v tali che s = uwv. In tal caso si dice
che w occorre in s e la posizione di w all’interno di s si chiama occorrenza. Il
risultato dell’applicazione della produzione alla parola s è la parola s 0 = uw0 v.
Ad esempio la produzione aa → b è applicabile alla parola s = baaba e il
risultato della sua applicazione è la parola s 0 = bbba.
Una produzione w → w 0 potrebbe produrre parole diverse a partire dalla
stessa parola s se w occorre in più punti di s, ad esempio da s = aababaaa si
possono formare le parole s0 = bbabaaa, s00 = aababba e s000 = aababab.
L(G) = {w ∈ A∗ : S →∗P w}
3
T →∗P1 w. Da ciò segue che L(G1 ) è l’insieme di tutte le parole di {a, b}∗ che
iniziano per a.
Un altro esempio è fornito dalla grammatica G2 = (S, {(, )}, {S}, P2 ), in cui
P2 contiene le produzioni S → SS, S → (S), S → . E’ facile vedere che L(G 2 )
è il linguaggio formato da tutte le parole di parentesi aperte e chiuse in cui ogni
parentesi aperta ha la corrispondente parentesi chiusa.
Un ulteriore esempio è la grammatica G3 = (S, {a, b}, {S}, P3 ) in cui P3
contiene le produzioni S → a, S → b, S → aSa, S → bSb. E’ un po’ più
complicato far vedere che L(G3 ) è il linguaggio formato da tutte le parole di
{a, b}∗ palindrome.
Un ultimo esempio, più complicato, è dato dalla grammatica G 4 = (S, {x, y,
+, −, ∗}, {S}, P4 ), in cui P4 contiene le produzioni S → x, S → y, S → (S +
S), S → (S − S), S → (S ∗ S). In questo caso L(G4 ) è l’insieme di tutte le
espressioni contenenti somme, sottrazioni e moltiplicazioni e le variabili x e y,
come (x + y), (x ∗ (y + x)), ((x ∗ x) − (y ∗ y)), ((x + y) ∗ (x − y)), ecc.
Si noti che in una produzione come S → (S + S), il fatto che nella parola
destra appaiano due simboli S non vuol dire che ai due simboli uguali cor-
rispondono la stessa parola: essi indicano solo che saranno sostituiti da due
parole (espressioni), anche diverse.
4
Capitolo 2
La logica proposizionale
2.1 La sintassi
Il linguaggio P della logica proposizionale è basato su un alfabeto formato da
due tipi di simboli: i connettivi logici C e le variabili proposizionali o
lettere L.
I connettivi logici sono
¬ negazione, da leggersi “non”
∨ disgiunzione, da leggersi “o” oppure “vel” oppure “or”
∧ congiunzione, da leggersi “e” oppure “et” oppure “and”
⇒ implicazione, da leggersi “implica”
⇔ doppia implicazione, da leggersi “se e solo se”
Le variabili proposizionali sono simboli esogeni del linguaggio presi da un
alfabeto L. Normalmente sono simboli, ma in teoria potrebbe essere anche
parole di un linguaggio.
5
• S → l per ogni l ∈ L.
6
2.2.2 Assegnamenti e soddisfacibilità
Per definire un significato logico di una proposizione faremo uso dei valori di
verità vero, indicato con >, e falso, indicato con ⊥; indicheremo con B l’insieme
{⊥, >}.
q r (q ∧ r) (q ∨ r) (q ⇒ r) (q ⇔ r) (¬q)
⊥ ⊥ ⊥ ⊥ > > >
⊥ > ⊥ > > ⊥ >
> ⊥ ⊥ > ⊥ ⊥ ⊥
> > > > > > ⊥
Si noti che la logica proposizionale è vero–funzionale, cioè il valore di verità
di una proposizione p dipende in modo funzionale dai valori di verità assunti
7
delle sue proposizioni componenti, ad esempio q e r. Inoltre la dipendenza è solo
sui valori e non sulle proposizioni in sè: sostituendo una qualunque proposizione,
ad esempio r, con un’altra avente lo stesso valore di verità, il valore di verità di
p non cambia.
2.2.4 Tautologie
Daremo ora alcune semplici definizioni.
• (¬(x ∧ (¬x))),
• (x ⇒ ((¬x) ⇒ y)) (detta “ex falso quodlibet”),
• (x ⇒ x)
• (x ⇒ (y ⇒ x)),
• ((x ⇒ y) ∨ (y ⇒ x)),
• (x ⇔ (¬(¬x)))
8
Ad esempio, dalla tautologia p = (x ⇒ x), sostituendo x con (a∧b) si ottiene
la tautologia ((a ∧ b) ⇒ (a ∧ b)), sostituendo invece x con ((¬c) ⇒ d) si ottiene
la tautologia (((¬c) ⇒ d) ⇒ ((¬c) ⇒ d)), ecc. La dimostrazione è semplice e si
basa sul fatto che una tautologia è vera indipendentemente dal valore di verità
assunto dalle proposizioni che la compongono, siano esse variabili proposizionali
(come nella versione originaria di p), siano esse proposizioni (come nelle altre
versioni di p).
Definizione 13 Due proposizioni p e q definite sulle stesse variabili sono (lo-
gicamente) equivalenti, in simboli p ≡ q, se per ogni assegnamento di verità
α, α |= p se e solo se α |= q.
Diamo ora un elenco delle equivalenze logiche più importanti
• (x ∧ x) ≡ x, (x ∨ x) ≡ x (idempotenza)
• (x ∧ y) ≡ (y ∧ x), (x ∨ y) ≡ (y ∨ x) (commutatività)
• (x ∧ (y ∧ z)) ≡ ((x ∧ y) ∧ z), (x ∨ (y ∨ z)) ≡ ((x ∨ y) ∨ z) (associatività)
• (x ∨ (y ∧ z)) ≡ ((x ∨ y) ∧ (x ∨ z)), (x ∧ (y ∨ z)) ≡ ((x ∧ y) ∨ (x ∧ z))
(distributività)
• (x ⇒ y) ≡ ((¬x) ∨ y), (x ⇔ y) ≡ ((x ⇒ y) ∧ (y ⇒ x)) (implicazione)
• (¬(¬x)) ≡ x (doppia negazione)
• (¬(x ∨ y)) ≡ ((¬x) ∧ (¬y)), (¬(x ∧ y)) ≡ ((¬x) ∨ (¬y)) (De Morgan)
In base a queste equivalenze potremo scrivere, con un abuso di notazione,
(x∧y ∧z) al posto delle due forme corrette equivalenti (x∧(y ∧z)) e ((x∧y)∧z).
Allo stesso modo si potrà scrivere (x ∨ y ∨ z) e estendere queste notazioni anche
al caso della congiunzione o disgiunzione di un numero arbitrario di proposizioni
con le simbologie
n
^ _n
pi pi
i=1 i=1
Vale il seguente risultato
Proposizione 3 Due proposizioni p e q sono equivalenti se e solo se (p ⇔ q) è
una tautologia, ovvero se e solo se (¬(p ⇔ q)) è insoddisfacibile.
Anche per le equivalenze vale quanto detto per le tautologie:
Proposizione 4 Date due proposizioni equivalenti p, q e data una qualsiasi pro-
posizione r, sostituendo r ad una qualsiasi variabile proposizionale di p e di q,
si ottengono ancora due proposizioni equivalenti.
Ad esempio sono equivalenti le proposizioni ((p ⇒ q) ∧ r) e (r ∧ (p ⇒ q)),
(s ∨ (t ∧ u)) e ((t ∧ u) ∨ s), ecc.
Il concetto di soddisfacibilità si può estendere ad insiemi arbitrari di propo-
sizioni. Si dirà che dato un insieme di proposizioni ∆ ed un assegnamento α, ∆
è vero in α o che α soddisfa ∆ se α |= q per ogni q ∈ ∆.
9
Definizione 14 Una proposizione q è conseguenza logica di un insieme di
proposizioni ∆, in simboli ∆ |= q, se per ogni assegnamento di verità α che
soddisfa ∆, accade che α soddisfa anche q.
Ad esempio come conseguenze logiche delle proposizioni ∆ = {a, (b ⇒
c), (a ⇒ b)} si ottengono le proposizioni b, c, oltre a quelle di ∆.
Valgono i seguenti semplici risultati
Proposizione 5 (Monotonia) Se ∆ |= q e ∆ ⊂ Γ, allora Γ |= q
Proposizione 6 Una proposizione q è conseguenza logica di un insieme finito
di proposizioni p1 , . . . , pn se e solo se ((p1 ∧ p2 ∧ . . . pn ) ⇒ q) è una tautologia,
ovvero se e solo se (p1 ∧ p2 ∧ . . . pn ∧ (¬q)) è insoddisfacibile.
10
In p3 la disgiunzione si intende estesa a tutte le quintuple i, i 0 , j, j 0 , k in cui la
cella (i, j) è nello stesso quadrante della cella (i 0 , j 0 ), cioè per
i−1 i0 − 1 j−1 j0 − 1
b c=b ceb c=b c
3 3 3 3
Bisogna inoltre aggiungere che i vincoli che in ogni cella cè uno e un sol
numero da 1 a 9 ^_ ^
p4 = (Xijk ∧ (¬Xijk0 ))
ij k k0 6=k
p = (p1 ∧ p2 ∧ p3 ∧ p4 ∧ p5 )
11
in un computer, infatti questa procedura è di gran lunga la più utilizzata nelle
applicazioni.
Innanzitutto la proposizione p si riduce in forma normale congiuntiva
(CNF). Esiste infatti una proposizione pCN F , equivalente a p, in cui
• non compaiono i connettivi logici ⇒ e ⇔
• il connettivo logico ¬ compare solo davanti a variabili proposizionali
• pCN F è della forma (c1 ∧ c2 ∧ . . . cm−1 ∧ cm )
• ogni sotto–proposizione ci , detta clausola, è della forma (li1 ∨li2 ∨. . . li,ni −1 ∨
li,ni )
• ogni lij è detto letterale ed è una variabile proposizionale o la sua nega-
zione
E’ possibile indicare un procedimento che data una proposizione p, trova una
proposizione pCN F in forma normale congiuntiva:
• Sostituire i connettivi ⇔ usando la legge (x ⇔ y) ≡ ((x ⇒ y) ∧ (y ⇒ x))
• Sostituire i connettivi ⇒ usando la legge (x ⇒ y) ≡ (¬x ∨ y)
• Utilizzando le leggi di De Morgan (¬(x∧y)) ≡ ((¬x)∨(¬y)) e (¬(x∨y)) ≡
((¬x) ∧ (¬y)) spostare tutti i connettivi ¬ davanti alle variabili
• Utilizzando le leggi distributive portare p nella forma a clausole
La proposizione pCN F viene poi rappresentata solo con i connettivi ¬: ogni
clausola viene scritta come insieme di letterali e la proposizioni come insieme di
clausole.
Ad esempio alla formula (((p ⇒ q) ∨ (t ∧ (¬r))) ∧ s) corrisponde la forma
normale congiuntiva {{¬p, q, t}, {¬p, q, ¬r}, {s}}.
Si noti che una proposizione p n forma normale congiuntiva è soddisfacibile se
e solo se ogni sua clausola è soddisfacibile, e ciò accade se esiste un assegnamento
di verità α che rende vero almeno un letterale per ogni clausola.
La procedura di Davis–Putnam quindi procede alla ricerca di un assegna-
mento che soddisfa p. Anzichè usare gli assegnamenti, la procedura gestisce un
insieme di letterali A che devono essere veri, all’inizio A è vuoto e ciò corrispon-
de al fatto che all’inizio nessuna variabile ha un valore di verità fissato. Quindi
A è in realtà corrisponde ad un assegnamento di verità parziale, che potrebbe
non assegnare un valore di verità ad alcune variabili.
Dato un letterale λ indicheremo con ¬λ il suo letterale opposto: se λ = x,
per una certa variabile proposizionale x, allora ¬λ = ¬x, se invece se λ = ¬x,
allora ¬λ = x.
L’algoritmo è descritto in un linguaggio pseudo–Pascal come funzione che
ha come argomenti p, la proposizione da verificare, e A, l’attuale assegnamento
parziale, e restituisce come risultato un assegnamento parziale che soddisfa p o
il simbolo UNSAT che sta ad indicare che p è insoddisfacibile.
12
procedure DP(p,A)
begin
if p = ∅ then DP:= A
else if ∅ ∈ p then DP:=UNSAT
else if {λ} ∈ p then DP:=DP(p[λ], A ∪ {λ})
else if λ e’ puro per p then DP:=DP(p[λ], A ∪ {λ})
else begin
scegli un letterale λ
r:=DP(p[λ], A ∪ {λ})
if r6= UNSAT then DP:= r
else DP:=DP(p[¬λ], A ∪ {¬λ})
end
end
13
Il corretto funzionamento della procedura è basato sul seguente fatto, di
facile dimostrazione: p è soddisfacibile se e solo se almeno una delle proposizioni
p[λ] e p[¬λ] è soddisfacibile, in cui λ è un qualsiasi letterale.
Facciamo a titolo di esempio vedere in funzione la procedura di Davis–
Putnam su alcuni esempi.
Come primo esempio facciamo vedere che
è soddisfacibile.
La sua forma normale congiuntiva è
Non ci sono clausole unitarie, né letterali puri, dobbiamo quindi scegliere una
variabile. Supponendo di provare a porre vero il letterale b otteniamo
che con due applicazione della regola della clausola unitaria conduce ad una
clausola vuota.
Perciò dobbiamo vedere se
14
Una regola di inferenza è una “procedura” che dati n elementi di L, che
si suppone si già dimostrati essere veri, è in grado di garantire la verità di un
nuovo elemento di L.
I teoremi del sistema formale S sono ottenuti attraverso una dimostrazio-
ne, cioè una sequenza finita di elementi di L, in cui ogni elemento della sequen-
za è un assioma o è ottenuto da elementi precedenti della sequenza mediante
l’applicazione di una delle regole di inferenza di R.
In questa sezione illustreremo perciò un calcolo proposizionale, cioè un
sistema formale costituito da un insieme di assiomi e da regole di inferenza in
grado di ottenere tutte e sole le conseguenze logiche di un insieme di proposizioni
∆. Nel caso particolare di ∆ = ∅, il calcolo proposizionale è in grado di ottenere
tutte e sole tautologie.
((p ⇒ q) ∧ (q ⇒ p))
1. (b ⇒ (c ⇒ b))
3. ((b ∧ c) ⇒ b)
4. ((b ∧ c) ⇒ c)
5. (b ⇒ (c ⇒ (b ∧ c)))
6. (b ⇒ (b ∨ c))
7. (c ⇒ (b ∨ c))
Ognuno di questi assiomi va inteso come schema di assiomi, cioè i reali as-
siomi sono quelli che si ottengono a partire da uno schema di assiomi sostituendo
una o più variabili proposizionali con proposizioni arbitrarie. Ad esempio dal-
lo schema di assiomi 1 si ottengono le proposizioni ((b ∨ c) ⇒ (c ⇒ (b ∨ c))),
((¬b) ⇒ ((¬c) ⇒ (¬b))), ((b ⇒ b) ⇒ ((b ⇒ b) ⇒ (b ⇒ b))), ecc.
Comunque continueremo a parlare di assiomi, anzichè di schemi di assiomi.
15
Questi assiomi sono alcune delle possibili tautologie del calcolo proposizio-
nale. Non tutti gli insiemi finiti di tautologie sono adatti ad essere degli assiomi
di un sistema formale per il calcolo proposizionale. Il motivo sarà chiaro alla
fine della sezione.
Nel caso specifico della logica proposizionale l’unica regola di inferenza che
utilizzeremo è il modus ponens: date due proposizioni dimostrate p e q, in cui
q = (p ⇒ r), per una certa proposizione r, allora si può dedurre la verità della
proposizione r. Si indicherà che r = M P (p, q).
• (p ⇒ (q ⇒ p)) (assioma 1)
16
Dim. Come spesso accade una delle due implicazioni è facile da dimostrare.
Se ∆ ` (p ⇒ q), allora la stessa derivazione si può utilizzare per far vedere
che ∆, p ` (p ⇒ q). A quella derivazione si possono aggiungere, nell’ordine, le
proposizioni p (perchè adesso è tra le ipotesi) e q (per modus ponens delle due
proposizioni p ⇒ q e p). Quella ottenuta è quindi una derivazione di q da ∆, p.
Per dimostrare il viceversa, supponiamo di avere una derivazione q 0 , q1 , . . . , qm =
q di q da ∆, p. Costruiamo una derivazione r1 , . . . , rn , in modo che per ogni qi
esiste un rj per cui rj = (p ⇒ qi ). Dato che qm = q, si avrà che nella deriva-
zione ri un elemento sarà proprio (p ⇒ q) e questo chiuderà la derivazione, cioè
rn = (p ⇒ q).
Per ottenere la derivazione r1 , . . . , rn di (p ⇒ q), si parta con una sequenza
inizialmente vuota e poi, per ogni proposizione q i si aggiungano alla sequenza
alcune proposizioni secondo lo schema seguente.
Se qi ∈ A, allora si aggiungano le proposizioni (qi ⇒ (p ⇒ qi )), qi e (p ⇒ qi ).
Se qi = p, allora si aggiunga (almeno la prima volta che q i = p) la dimostrazione
di (p ⇒ p). Se qi ∈ ∆, allora si aggiunga qi , (qi ⇒ (p ⇒ qi )) e (p ⇒ qi ). Se
qi = M P (qj , qk ) allora, posto ad esempio qj = (qk ⇒ qi ), si aggiungano le pro-
posizioni ((p ⇒ (qk ⇒ qi )) ⇒ ((p ⇒ qk ) ⇒ (p ⇒ qi ))), ((p ⇒ qk ) ⇒ (p ⇒ qi )),
(p ⇒ qi ).
17
Normalmente la contraddizione a cui si arriva è che partendo dall’ipotesi p,
si ottiene come risultato (¬p). Il teorema sopra dimostrato usa una definizione
(apparentemente) più generale di contraddizione, in cui si ottengono sia una
proposizione che il suo contrario.
Da un insieme inconsistente di ipotesi si può derivare qualunque proposizio-
ne:
Proposizione 8 ∆ è inconsistente se e solo se per ogni proposizione q, si ha
∆`q
Dim. Ovviamente se per ogni proposizione q, si ha ∆ ` q, allora ∆ è inconsisten-
te. Se ∆ è inconsistente, allora lo è anche ∆, q, con q una qualsiasi proposizione.
Per il teorema della dimostrazione per assurdo si ottiene ∆ ` (¬(¬q)). Tramite
l’assioma 10, si ottiene una dimostrazione anche di q.
18
Lemma 5 La tautologia ((p ⇒ q) ⇒ (((¬p) ⇒ q) ⇒ q)) è derivabile
Dim. Facciamo innanzitutto vedere che se ∆, s e ∆, (¬s) sono inconsistenti, al-
lora lo è anche ∆: infatti abbiamo che ∆ ` (¬s) e ∆ ` (¬(¬s)).
Perciò usando ∆ = {(p ⇒ q), ((¬p) ⇒ q), (¬q)} e s = p, si ottiene facilmente
l’asserto.
Supponiamo ora che il lemma valga per proposizioni con un numero di pa-
rentesi aperte minore o uguale a n e facciamo vedere che vale anche per una
proposizione p con n + 1 parentesi aperte.
Se p = (¬q), q ha al massimo n parentesi aperte. Se supponiamo che α |= q,
per ipotesi induttiva Xα ` q. Usando il lemma 4, otteniamo Xα ` (¬(¬q)), cioè
Xα ` (¬p), che corrisponde al fatto che α |= (¬p).
Se invece supponiamo che α 6|= q, per ipotesi induttiva X α ` (¬q). Ma
(¬q) = p e quindi Xα ` p, che corrisponde al fatto che α |= p.
19
Nel caso rimanente, α |= q e α 6|= r, perciò per ipotesi induttiva X α ` q e
Xα ` (¬r); da ciò si ottiene contemporaneamente X α , (q ⇒ r) ` r e Xα , (q ⇒
r) ` (¬r). Usando la dimostrazione per assurdo si ottiene che X α ` (¬(q ⇒ r)),
corrispondente al fatto che α 6|= p.
20
L’assiomatizzazione che abbiamo scelto, proposta da Kleene, ha il vantaggio
di utilizzare gli assiomi corrispondenti alle regole della deduzione naturale, che
è uno dei modelli alternativi per la teoria della dimostrazione. Infatti ogni
assioma di A può essere riletto come regola di deduzione: ad esempio l’assioma
5 (b ⇒ (c ⇒ (b ∧ c))) può essere convertito nella regola “Se ∆ ` b e ∆ ` c, allora
∆ ` (b ∧ c)”. La notazione che si usa in questo caso è la seguente
∆ ` b, ∆ ` c
∆ ` (b ∧ c)
21
Capitolo 3
• T → k per ogni k ∈ C
• T → x per ogni x ∈ V
22
Ad esempio se F = {f, g}, C = {c} e V = {x, y}, con δ(f ) = 1 e δ(g) = 2.
Allora alcuni termini sono x, c, f (c), f (x), g(x, c), g(c, c), g(f (x), c), g(c, f (c)),
ecc.
Si noti che se F 6= ∅ allora il linguaggio è infinito, infatti si possono avere
x, f (x), f (f (x)), f (f (f (x))), . . . .
Dato che il linguaggio dei termini dipende da Σ, nella logica dei predicati
si parlerà del linguaggio LP(Σ) della logica dei predicati (e non del linguaggio
tout court), proprio ad indicare la dipendenza da Σ.
Il linguaggio LP(Σ) è generato dalla grammatica (S, {S, T }, A P , PT ∪ P 0 ) in
cui AP = R ∪ AT ∪ CQ ∪ {.} e le produzioni sono quelle di PT più le seguenti
• S → r(T, T, . . . , T ) per ogni r ∈ R, in cui il numero di simboli T all’interno
delle parentesi è δ(r)
• S → (S ∨ S)
• S → (S ∧ S)
• S → (S ⇒ S)
• S → (S ⇔ S)
• S → (¬S)
• S → (∀x.S) per ogni x ∈ V
• S → (∃x.S) per ogni x ∈ V
23
Data una formula φ, una variabile x che occorre libera in φ e un termine t,
indicheremo con φ[x/t] la formula che si ottiene da φ sostituendo ogni occorrenza
libera di x con il termine t. Ad esempio se φ = ((∀x.P (x, y)) ⇒ P (y, x)) allora
φ[y/z] = ((∀x.P (x, z)) ⇒ P (z, x)) mentre φ[x/z] = ((∀x.P (x, y)) ⇒ P (y, z)).
24
• se φ è una formula atomica del tipo φ = r(t1 , . . . , tn ), allora I, µ |= φ se e
solo se (d1 , . . . , dn ) ∈ IR (r) ove [τi ]I,µ = di , per i = 1, . . . , n
Essere una formula φ valida nella logica dei predicati è un concetto corri-
spondente ad essere una tautologia nella logica proposizionale: in entrambi i
casi si tratta di una formula che è vera indipendentemente dall’interpretazione
(che nella logica proposizionale è semplicemente un assegnamento di verità).
Una tautologia della logica proposizionale può essere espressa nella logica dei
predicati come formula valida: ad esempio usando un simbolo di relazione r, un
simbolo di costante ci associato ad ogni variabile proposizionale xi e sostituendo
al posto di xi la formula atomica r(ci ). Ad esempio la tautologia (p ⇒ (q ⇒ p))
diventerebbe (r(c) ⇒ (r(d) ⇒ r(c))).
Se si prende una tautologia e al posto di ogni variabile proposizionale si
sostituisce una formula qualsiasi, si ottiene una formula valida. Ad esempio
dalla tautologia (p ∨ (¬p)) si possono ottenere le formule valide ((∀x.Q(x)) ∨
(¬(∀x.Q(x)))), ((∀x.(∃y.P (x, y))) ∨ (¬(∀x.(∃y.P (x, y))))), ecc.
Esistono però molte formule valide che non derivano da tautologie. Eccone
un paio di esempi.
25
L’enunciato α = ((∀x.P (x)) ⇒ (∃x.P (x))) è una formula valida, in quanto
presa un’interpretazione I, se I 6|= (∀x.P (x)), allora I |= α, mentre se I |=
(∀x.P (x)), allora accade che IR (P ) = D, in quanto deve verificarsi che I, µ |=
P (x) per ogni possibile valutazione µ. Da ciò segue che esiste una valutazione
µ per cui I, µ |= P (x), cioè I |= (∃x.P (x)), e quindi I |= α.
L’enunciato β = ((∀x.u(x) ⇒ m(x)) ∧ u(s)) ⇒ m(s) è una formula valida,
in quanto presa un’interpretazione I e presa I |= (∀x.u(x) ⇒ m(x)) ∧ u(s), cioè
I |= (∀x.u(x) ⇒ m(x)) e I |= u(s), si ha che IR (u) ⊂ IR (m) e che IC (s) ∈ IR (u),
da ciò segue banalmente che IC (s) ∈ IR (m), quindi I |= m(s) e perciò I |= β.
(∀x.(∀y.α)) ≡ (∀y.(∀x.α))
(∃x.(∃y.α)) ≡ (∃y.(∃x.α)),
M od(∆) ⊂ M od(γ)
26
3.3 Metodi semantici per il controllo della sod-
disfacibilità
In questa sezione descriveremo per sommi capi una procedura che è in grado di
trovare se un enunciato è insoddisfacibile o se una formula è una conseguenza
logica di un insieme finito di formule. La procedura che troveremo non è del
tutto soddisfacente, ma come sarà chiaro in seguito non ci sono speranze di
trovarne di migliori.
Supponiamo di avere un enunciato α. E’ possibile trovare una formula α 0 ,
tale che α0 è soddisfacibile se e solo se α lo è, e che è forma prenessa, cioè
espressa solo con quantificatori universali disposti solo all’inizio della formula.
Il procedimento che porta α in forma prenessa si effettua in cinque passi:
Dim. Innanzitutto si noti che γ e γs non posso essere equivalenti in quanto for-
mule di linguaggi diversi. Infatti in γs sono presenti simboli di costanti o simboli
di funzioni che potrebbero non essere presenti nel linguaggio originario di α.
Per iniziare è facile far vedere che ogni modello di γ s è un modello di γ. Infatti se,
data un intepretazione I, I |= (∀x1 .∀x2 . . . . .∀xn .φ[x/f (x1 , . . . , xn )]) allora per
ogni valutazione µ, posto d1 = µ(x1 ), . . . , dn = µ(xn ) e d = IF (f )(d1 , . . . , dn ),
la valutazione µ0 (x) = d e µ0 (y) = µ(x), per ogni y 6= x, è tale che I, µ0 |= φ e
27
quindi I |= γ.
Ad esempio A(α) = {p(c, c), p(c, d), p(d, c), p(d, d), p(f (c), c), . . . , } per α co-
me nell’esempio precedente.
per ogni r(t1 , . . . , tn ) termine di A(α). E’ facile mostrare che questo assegna-
mento soddisfa ogni proposizione ω ∈ Ω(α).
28
Sia adesso invece Ω(α) soddisfacibile tramite un assegnamento δ : A(α) →
B, allora è possibile costruire un’interpretazione I a partire da δ avente come
dominio D proprio H(α).
Definiremo, usando una tecnica che sfrutteremo di nuovo per dimostrare il
teorema di completezza, IC come la funzione identità (cioè per ogni simbolo
di costante c ∈ C IC (c) = c) e IF (f ) : D n → D, per ogni simbolo di funzione
f ∈ F con arità n, come quella funzione che ad ogni ennupla t 1 , . . . , tn di termini
di H(α) associa il termine f (t1 , . . . , tn ) (intendendo con maggiore precisione la
parola ottenuta concatenando le parole “f (”, t 1 , “,” . . . tn e infine la parola “)”).
Infine definiremo IR (r) ⊂ D n , per ogni simbolo di relazione r ∈ R con arità n,
come quel sottoinsieme di D n contenente tutte e sole quelle ennuple (t1 , . . . , tn )
di parole di H(α) tali che δ(r(t1 , . . . , tn )) = >, intendendo la parola r(t1 , . . . , tn )
costruita in modo analogo a quanto detto sopra.
E’ facile dimostrare che questa interpretazione è un modello di α.
29
Si noti che tale procedimento non termina se α è soddisfacibile. Questo pro-
cedimento è utilizzabile solo se si vuol dimostrare, già essendone a conoscenza,
che α è insoddisfacibile, ma non può essere utilizzato per scoprire se α è soddi-
sfacibile oppure no, perché in caso positivo il procedimento non darebbe alcuna
risposta.
Ma non si può fare di meglio: in base al teorema di Church, che faremo
successivamente, non è possibile trovare un procedimento che sia in grado di
stabilire se una formula è soddisfacibile oppure no.
3.3.2 Esempi
Il primo esempio è quello di verificare che (∀x.u(x) ⇒ m(x)), u(s) |= m(s).
Sia α = ((∀x.u(x) ⇒ m(x)) ∧ u(s) ∧ (¬m(s))).
La sua forma prenessa è
γ = (∃x.g(x) ∧ d(x))
30
Dobbiamo quindi dimostrare l’insoddisfacibilità di
31
Effettuando la Skolemizzazione di x3 (sostuituendolo con la costante c) e di
y1 (sostituendolo con il termine h(x1 )) si ottiene la forma prenessa finale
Si noti che l’ordine con cui i quantificatori sono stati portati all’esterno
è stato scelto per rendere minimo l’impatto della Skolemizzazione (solo una
costante e una funzione di arità uno).
A questo punto bisogna dimostrare che l’insieme Ω(α 0 ) è insoddisfacibile ove
come si può vedere dalla forma assunta di β, in quanto dopo queste sostituzioni
si può applicare la procedura di Davis–Putnam (dopo aver portato β in CNF)
e ottenere la clausola vuota, dopo alcuni passaggi.
Per concludere si noti che non sempre la situazione è cosı̀ fortunata e sovente
il sottoinsieme insoddisfacibile di H(α) sarà formato da più elementi.
32
3.4.1 Gli assiomi e le regole di inferenza
Gli assiomi del sistema formale per il calcolo dei predicati sono suddivisi in
questi quattro schemi di assiomi
AX0 tutte le tautologie della logica proposizionale in cui le variabili proposizio-
nali sono sostituite da formule arbitrarie di LP(Σ)
AX1 ((∀x.φ) ⇒ φ[x/t]), in cui φ è una formula di LP(Σ) e t è un termine
sostituibile al posto di x in φ
AX2 (φ ⇒ (∀x.φ)), in cui φ è una formula di LP(Σ) e x è una variabile che non
occorre libera in φ
AX3 ((∀x.(φ ⇒ ψ)) ⇒ ((∀x.φ) ⇒ (∀x.ψ))), in cui φ e ψ sono formule di LP(Σ)
Inoltre sono considerati assiomi validi anche tutte le generalizzazioni di altri
assiomi: se φ è un assioma anche (∀x.φ) è un assioma.
Gli assiomi del tipo AX0 formano già da soli un insieme infinito (ma ricor-
sivo). In realtà, in virtù del teorema di completezza della logica proposizionale,
sarebbe necessario solo inserire i dieci assiomi.
Negli assiomi del tipo AX1, il termine t deve essere sostituibile al posto di x in
φ, cioè non deve contenere variabili che in φ[x/t] diventano variabili legate. Ad
esempio prendendo φ = (∃y.P (x, y)), il termine y non è sostituibile al posto di x,
infatti ((∀x.φ) ⇒ φ[x/y]) corrisponderebbe a ((∀x.(∃y.P (x, y))) ⇒ (∃y.P (y, y)))
che non è valida in quanto falsa nell’interpretazione di dominio N e in cui P (x, y)
è interpretato come la relazione x < y.
Negli assiomi del tipo AX2, x non deve comparire libera in φ. Infatti la formu-
la (P (x) ⇒ (∀x.P (x))) è falsa nell’interpretazione di dominio {1, 2}, in cui la
relazione P (x) è vera solo per x = 1, e nella valutazione µ(x) = 1.
Indicheremo con AX l’insieme di tutti gli assiomi.
Come unica regola di inferenza utilizzeremo ancora il modus ponens, cioè
da φ e da (φ ⇒ ψ) si può dedurre ψ.
Definizione 28 Dati ∆ e γ, rispettivamente un insieme di formule e una for-
mula, diremo che γ è derivabile da ∆, in simboli ∆ ` γ, se esiste una se-
quenza finita detta derivazione γ1 , . . . , γn di formule tali che γn = γ e per ogni
i = 1, . . . , n accade che γi ∈ AX ∪ ∆ o γi = M P (γj , γk ), con j, k < i
Il caso ∆ = ∅ assume un ruolo particolare: ` γ vuol dire che γ è un teorema
della logica dei predicati.
Facciamo ad esempio vedere che (∀x.u(x) ⇒ m(x)), u(s) ` m(s): basta
prendere la sequenza
((∀x.u(x) ⇒ m(x)) ⇒ (u(s) ⇒ m(s))) assioma
(∀x.u(x) ⇒ m(x)) elemento di ∆
(u(s) ⇒ m(s)) modus ponens
u(s) elemento di ∆
m(s) modus ponens
33
3.4.2 Tecniche di dimostrazione
Iniziamo con il teorema di correttezza che, come il suo equivalente della logica
proposizionale, ci dice che il processo di derivazione da un insieme ∆ è in grado
di produrre solo formule che sono conseguenze logiche di ∆
34
ove φj = (φk ⇒ φi ), allora per ipotesi induttive nella sequenza esistono già le
formule (∀x.(φk ⇒ φi )) e (∀x.φk ), quindi si possono aggiungere alla sequenza le
formule ((∀x.(φk ⇒ φi )) ⇒ ((∀x.φk ) ⇒ (∀x.φi ))) (assioma dello schema AX3),
((∀x.φk ) ⇒ (∀x.φi )) (per Modus Ponens), (∀x.φi ) (per Modus Ponens).
((¬φ[x/t]) ⇒ (¬(∀x.(¬φ)))),
è un teorema.
Infatti si può usare il teorema ((φ ⇒ ψ) ⇒ ((¬ψ) ⇒ (¬φ))) che, applicato
all’assioma AX1, produce l’asserto.
35
Sia φ1 , φ2 , . . . , φn , . . . un’enumerazione di tutti e soli gli enunciati di LP(Σ 0 ).
Questa enumerazione è possibile, ad esempio, disponendo tutti gli enunciati in
ordine lessicografico (dopo aver definito un ordine sugli elementi di Σ 0 ).
Definiamo per induzione una successione crescente di insiemi di enunciati
{∆i }∞
i=0 , iniziando con ∆0 = ∆ e ponendo
36
La dimostrazione è fatta per induzione sul numero n di parentesi aperte pre-
senti in φ non contando quelle occorrenti nei termini.
Supponiamo che l’asserto sia vero per ogni n < m e dimostriamo che è vero
anche per n = m. Se φ = (¬ψ), allora per ipotesi induttiva I¯ |= ψ se e solo se
¯ Poichè si ha che φ ∈ ∆
ψ ∈ ∆. ¯ se e solo se ψ 6∈ ∆,
¯ l’asserto è vero in questo caso.
dominio non è un termine, fatta eccezione proprio per questo tipo di interpretazione sintattica
37
=, che è un simbolo di arità 2 a cui ogni interpretazione deve dare il significato
ovvio (cioè IR (=) = {(d, d) : d ∈ D}).
Si indicherà con (t 6= t0 ) un’abbreviazione per la formula ¬(t = t0 ).
A livello di sistema formale, il trattamento dell’uguaglianza è possibile me-
diante l’aggiunta di tre schemi di assiomi
AX5 ((t1 = t01 ) ∧ (t2 = t02 ) ∧ · · · ∧ (tn = t0n )) ⇒ f (t1 , . . . , tn ) = f (t01 , . . . , t0n ) per
ogni 2n–pla di termini t1 , . . . , tn , t01 , . . . , t0n e per ogni simbolo di funzione
f di arità n
AX6 ((t1 = t01 ) ∧ (t2 = t02 ) ∧ · · · ∧ (tn = t0n )) ⇒ (r(t1 , . . . , tn ) ⇔ r(t01 , . . . , t0n )) per
ogni 2n–pla di termini t1 , . . . , tn , t01 , . . . , t0n e per ogni simbolo di relazione
r di arità n
38
Capitolo 4
Le funzioni ricorsive
4.1 Introduzione
In questo capitolo e nel capitolo successivo si parlerà di calcolabilità, cioè di
formalismi mediante i quali si può stabilire se e come una funzione è calcolabile.
Il concetto intuitivo di funzione calcolabile è quello di una funzione f per cui
esiste un procedimento finito (algoritmo, programma, ecc.) mediante il quale è
possibile calcolare f (x) a partire da x con un numero finito di passi, per ogni
possibile valore di x.
Esistono molti formalismi per definire in modo rigoroso il concetto di calco-
labilità. In questo capitolo ci concentreremo sulle funzioni ricorsive, che sono
un formalismo puramente matematico che consente di definire delle funzioni in
modo costruttivo. Nel prossimo capitolo vedremo le macchine di Turing che,
pur essendo un formalismo teorico, specifica un modello di calcolo meccanico
ideale che è simili ai moderni calcolatori.
39
Il primo metodo di costruzione di nuove funzioni è la composizione.
Data una funzione g : Nk → N e k funzioni f1 , . . . , fk : Nm → N, la
composizione di g con f1 , . . . , fk è la funzione h : Nm → N definita come
h(~x) = g(f1 (~x), . . . , fm (~x)) (4.1)
Ad esempio la funzione costante 1 1 : N → N è definita come composizione
della funzione z con la funzione S
1(x) = S(z(x))
perciò in questo caso m = 1 e k = 1. In modo analogo si possono ottenere le
funzioni costanti, anche a più argomenti.
In modo simile si può ottenere la funzione S 2 : N → N, S 2 (x) = x + 2 è
definita come composizione della funzione S con sé stessa
S 2 (x) = S(S(x))
In modo analogo si possono ottenere le funzioni, anche a più argomenti, che
hanno come risultato la somma di un argomento con una costante.
In generale si può vedere che le uniche funzioni che si possono ottenere per
composizione dalle funzioni di base sono
f (~x) = k
f (~x) = xi + k
40
(m)
1. z, S, πi ∈ PR
Si è già visto che + (la funzione addizione) appartiene a PR. Ora facciamo
vedere che molte altre funzioni aritmetiche appartengono a PR.
Sia m : N2 → N la funzione prodotto m(x, y) = x · y tra interi. Essa
appartiene a PR in quanto si può definire per ricorsione
m(x, 0) = 0
m(x, y + 1) = x + m(x, y)
(3) (3)
cioè usando come g(x) = z(x) e come f (x, y, t) = a(x, t) = a(π 1 (x, y, t), π3 (x, y, t)).
A sua volta e : N2 → N la funzione di elevamento a potenza e(x, y) = x y tra
interi appartiene a PR in virtù della definizione ricorsiva
e(x, 0) = 1
e(x, y + 1) = x · e(x, y)
(3) (3)
cioè usando come g(x) = S(z(x)) e come f (x, y, t) = m(x, t) = m(π 1 (x, y, t), π3 (x, y, t)).
D’ora in avanti non verranno più indicate le funzioni g e f della definizione
ricorsiva.
La funzione fattoriale F (y) = y! è in PR. Infatti vale la seguente definizione
ricorsiva
F (0) = 1
F (y + 1) = S(y) · F (y)
che però non corrisponde esattamente allo schema 4.2 in quanto F dovrebbe
avere almeno due argomenti, cosı̀ che g ne abbia almeno uno. In realtà tale
schema è perfettamente legittimo e verrà usato in seguito in virtù del fatto che
è possibile definire una funzione fattoriale a due variabili F 2 (x, y) = y! definita
come
F2 (x, 0) = 1
F2 (x, y + 1) = S(y) · F2 (x, y)
(1) (1)
da cui si evince che F2 è in PR e poichè F (y) = F2 (y, y) = F2 (π1 (y), π1 (y)),
anche F è in PR.
41
La funzione predecessore P , vista come inversa della funzione successore S e
definita anche su 0, a cui viene attribuito il valore 0, è nella classe PR in quanto
vale la seguente definizione ricorsiva
P (0) = 0
P (y + 1) = y
Anche in questo caso g ha zero argomenti, ma si può applicare lo stesso
trucco visto per la funzione fattoriale.
La funzione differenza troncata D(x, y) = max(x − y, 0) è nella classe PR
perchè
D(x, 0) = x
D(x, y + 1) = P (D(x, y))
In seguito questa operazione verrà indicata con x −̇y.
Passiamo ora a definire dei predicati, cioè delle funzioni a valori in {0, 1},
che sono tutti nella classe PR. Un predicato è vero per x se p(x) = 1, falso se
p(x).
I seguenti predicati appartengono alla classe PR.
Il predicato segno sg(x), che è 1 se e solo se x > 0, è definito come
sg(0) = 0
sg(y + 1) = 1
Il predicato x 6= y si ottiene come sg((x−̇y) + (y −̇x)).
Gli operatori booleani ∧, ∨, ¬, ⇒ e ⇔ si ottengono rispettivamente come
x ∧ y = x · y, x ∨ y = sg(x + y), ¬x = 1−̇x.
Da ciò si ottengono i predicati x = y come ¬(x 6= y), x > y come sg(x −̇y),
x < y come sg(y −̇x), x ≥ y come ¬(x < y) e x ≤ y come ¬(x > y).
In generale qualunque predicato esprimibile con gli operatori booleani ∧, vee
e ¬ e gli operatori di confronto >, <, ≥, ≤, =, 6= applicati a variabili e costanti
intere è nella classe PR.
Se f, g : Nm → N sono funzioni di PR e p, q : Nm → {0, 1} sono predicati di
PR allora la funzione h : Nm → N definita per casi
f (~x) se p(~x) = 1
h(x1 , . . . , xm ) =
g(~x) se p(~x) = 0
è in PR in quanto vale
h(~x) = f (~x) · p(~x) + g(~x) · ¬p(~x)
Data una funzione f : Nm+1 → N, definiamo le due funzioni
y
X
Σf (~x, y) = f (~x, t)
t=0
Yy
Πf (~x, y) = f (~x, t)
t=0
42
Esse sono nella classe PR in quanto
Σf (~x, 0) = f (~x, 0)
Σf (~x, y + 1) = f (~x, S(y)) + Σf (~x, y)
Πf (~x, 0) = f (~x, 0)
Πf (~x, y + 1) = f (~x, S(y)) · Πf (~x, y)
Py
QDay
adesso si indicheranno con i loro usuali simboli matematici t=0 f (~x, t)
e t=0 f (~x, t).
Definiamo ora i quantificatori esistenziale e universali limitati (∃y) ≤z e (∀y)≤z ,
essi corrispondono ai seguenti predicati
Se p è un predicato nella classe PR, allora (∃y) ≤z p(~x, y) e (∀y)≤z p(~x, y) sono
predicati della classe PR in quanto
z
!
X
(∃y)≤z p(~x, y) = sg p(~x, y)
y=0
z
Y
(∀y)≤z p(~x, y) = p(~x, y).
y=0
43
Le funzioni x ÷ y e x mod y che sono, rispettivamente, il quoziente e il
resto della divisione di x per y, si ottengono facilmente attraverso l’uso della
minimalizzazione limitata in quanto x ÷ y = P (min{q ≤ x : q · y > x}) e
x mod y = x−̇(y · (x ÷ y)). Si noti che x ÷ 0 = x, ma ciò non crea problemi
perchè la divisione per zero non ha senso dal punto di vista matematico e quindi
si userà x ÷ y solo per y > 0.
Infine la successione {pi }∞i=0 di tutti i numeri primi è, vista come funzio-
ne dell’argomento i, una funzione di PR. Infatti vale la seguente definizione
ricorsiva
p0 = 2
pi+1 = min{y ≤ pi ! + 1 : (y > pi ) ∧ pr(y)}
Dim. Le prime tre istruzioni sono chiaramente necessarie a calcolare le tre fun-
zioni elementari. La composizione di due funzioni Pascal è calcolabile senza
nessuna istruzione aggiuntiva, a parte la chiamata delle funzioni stesse. Per
quanto riguarda uno schema di ricorsione del tipo
h(~x, 0) = g(~x)
h(~x, y + 1) = f (~x, y, h(~x, y))
44
function h(x1,...,xm,y:integer):integer;
var z,t:integer;
begin
z:=g(x1,...,xm);
for t:=0 to y-1 do
z:=f(x1,...,xm,t,z);
h:=z;
end;
A(0, y) = y+1
A(x + 1, 0) = A(x, 1)
A(x + 1, y + 1) = A(x, A(x + 1, y))
45
E’ quindi necessario trovare un’estensione della classe delle funzioni ricor-
sive primitive in modo che la funzione di Ackermann (con tutte le sue infinite
varianti) possa trovarvi posto.
L’idea è quella di definire un terzo modo di creare nuove funzioni. Dato un
predicato p : Nm+1 → {0, 1}, sia µ̄p (~x) la funzione che restituisce il più piccolo
valore di y per cui p(~x, y) = 1. Se invece accade che per ogni y p(~x, y) = 0,
allora µ̄p (~x) non è definito.
Questa operazione si chiama minimalizzazione non limitata e general-
mente non è in PR anche sotto l’ovvia ipotesi che p lo sia.
Usando al posto di µ̄ l’usuale simbolo matematico, si dirà che dato un predi-
cato p : Nm+1 → {0, 1}, la funzione h : Nm → N è definita per minimalizzazione
(non limitata) di p se vale
e indicheremo con
h(~x) = ⊥
se per (~x) il minimo non esiste.
Si noti che l’utilizzo dell’operatore di minimalizzazione può avvenire sotto
tre accezioni.
1. La minimalizzazione è applicata solo a predicati ricorsivi primitivi p tali
che il minimo esiste sempre. In tal caso la funzione h è sempre definita su
tutto Nm .
2. La minimalizzazione è applicata a un qualsiasi predicato ricorsivo primi-
tivo, anche se non ci sono garanzie sull’esistenza del minimo. In tal caso
h è definita su un sottoinsieme di Nm , che potrebbe essere proprio.
3. La minimalizzazione è applicata solo a predicati ottenuti a loro volta da
operazioni di minimalizzazione. In tal caso non si è nemmeno certi il
predicato sia sempre definito. In particolare h(~x) = ⊥ se esiste un valore
di y per cui p(~x, y) = ⊥ e per ogni z < y accade che p(~x, z) = 0.
Il comportamento nel secondo e nel terzo caso si spiega facilmente perchè,
dati ~x, il minimo valore di y viene calcolato per tentativi a partire da 0 e
calcolando uno ad uno tutti i possibili valori di p(~x, y) per y = 0, 1, . . . fino ad
arrivare ad un valore di y per cui p(~x, y) = 1.
E’ chiaro che se il minimo non esiste, il procedimento non termina e quindi
ciò spiega perchè h(~x) non è definita (anzichè poter assumere un valore prefissato
come avviene in quella limitata). E’ altresı̀ chiaro perchè h(~x) non è definita
nemmeno se durante la ricerca del minimo ci si imbatte in un valore di ȳ per cui
p(~x, ȳ) non è definito, anche nei casi di esistenza del minimo (che ovviamente
sarà un valore maggiore di ȳ).
La classe delle funzioni ricorsive (generali), indicata con R, è la più piccola
classe di funzioni intere che contiene le funzioni elementari ed è chiusa per
composizione, ricorsione e minimalizzazione, intesa nella terza accezione. Detto
in altri termini, valgono le seguenti condizioni
46
(m)
1. z, S, πi ∈R
2. se g : D0 → N, con D0 ⊂ Nk , e fi : Di → N, con Di ⊂ Nm per i =
1, . . . , k, appartengono a R, la funzione h : Dk+1 → N, con Dk+1 ⊂ Nm ,
composizione di g e f1 , . . . , fk appartiene a R
3. se g : D0 → N, con D0 ⊂ Nm , e f : D1 → N, con D1 ⊂ Nm+2 , apparten-
gono a R, la funzione h : D2 → N con D2 ⊂ Nm+1 definita per ricorsione
a partire da g e f appartiene a R
4. se p : D0 → N con D0 ⊂ Nm+1 appartiene a R, la funzione h : D1 → N
con D1 ⊂ Nm definita per minimalizzazione a partire da p appartiene a R
5. per ogni classe C di funzioni che rispetti le condizioni 1, 2, 3 e 4, R ⊂ C
Si noti che i domini di h nei punti 2 e 3 dipendono dai domini delle funzioni
con cui è stata definita per composizione o ricorsione. In particolare per la
composizione si ha
47
y:=y+1;
z:=not p(x1,...,xm,y);
end;
h:=y
end;
mentre tutto il resto si calcola nel modo già visto nella proposizione 10.
48
Capitolo 5
Le macchine di Turing
5.1 Introduzione
Una macchina di Turing1 M è una macchina di calcolo ideale formata dalle
seguenti componenti
Per la descrizione di una MdT si usano quindi due alfabeti diversi: A, detto
alfabeto del nastro, e Q, detto alfabeto dello stato. S e Q sono usalmente
disgiunti.
Il programma di una MdT è un insieme finito di quintuple del tipo (q, s, q 0 , s0 , d),
in cui q, q 0 ∈ Q, s, s0 ∈ A e d ∈ {<, >}, tali che non esistono due quintuple con
gli stessi valori per q e s.
1 in seguito si userà l’abbreviazione MdT
49
I I I I $ I I I I I $ ...
• scrive sulla cella puntata dalla testina il simbolo s 0 , ciò può corrispondere al
fatto che la cella viene svuotata, se s0 è lo spazio, o a mantenere inalterata
la cella, se s0 = s;
• la testina viene spostata di una cella verso sinistra se d è < o verso destra
se d è >
E’ chiaro che se una funzione è calcolabile, allora esistono infinite MdT che
la calcolano (basta aggiungere delle quintuple inutili).
Una macchina di Turing è equivalente ad un usuale computer con una quan-
tità illimitata di memoria. Quindi è teoricamente più potente di un computer
reale, cioè è in grado di calcolare funzioni che un calcolatore reale non può cal-
colare (almeno per grandi valori di ingresso). E’ possibile simulare una MdT
50
con un semplice programma in un normale computer, anche se la simulazione
potrebbe non essere in grado di funzionare correttamente se la MdT richiede
più memoria di quanta ne abbia il computer.
5.2 Esempi
Per creare delle funzioni numeriche f : Nn → N, come si è già fatto per le fun-
zioni ricorsive, useremo come alfabeto del nastro l’insieme {I, $, }, ove denota
lo spazio. Ogni numero intero n verrà rappresentato con la parola composta
da n simboli I e un simbolo $; quest’ultimo simbolo serve a indicare la fine
della rappresentazione del numero e serve a distinguere il numero 0 dallo spazio
vuoto. Siamo in grado di rappresentare una n–upla di numeri, concatenando
una dopo l’altra le rappresentazione dei vari numeri.
Gli stati della macchina saranno indicati con numeri naturali, in cui 1 è
lo stato iniziale, si userà invece H come stato finale della MdT. Dato che nei
programmi le quintuple non iniziano mai con H, se in un passo lo stato interno
della MdT diventa H, la macchina si ferma.
Iniziamo con un esempio molto semplice: la funzione successore S : N → N,
S(n) = n + 1. Una MdT che calcola S parte con il numero n rappresentato sul
nastro e deve fermarsi con il numero n + 1 scritto sul nastro: per ottenere ciò
serve solo scrivere un ulteriore I al posto del $ finale e infine scrivere il nuovo
$ sulla cella successiva. A tal scopo sono sufficienti tre stati interni {1, 2, H} e
tre quintuple (1, I, 1, I, >), (1, $, 2, I, >), (2, , H, I, >).
La prima quintupla fa avanzare la MdT verso destra fintantoché ci sono dei
I, la seconda quintupla fa sostituire il $ con un altro I e avanzare di una cella
verso destra, la terza fa scrivere il $ e fa terminare la MdT. Si noti che la MdT
restituisce il risultato anche per n = 0, infatti sul nastro ci sarebbe solo il $, che
verrebbe sostituito dalla parola I$.
Nel secondo esempio si vede una MdT che tratta una funzione di due argo-
menti: la funzione somma a : N × N → N, a(m, n) = m + n. Questa MdT
sfrutta in modo abile la rappresentazione dei numeri interi: ad esempio per
sommare 3 e 4, la MdT deve formare partendo dalla parola III$IIII$ la parola
IIIIIII$. La MdT in questione avrà 4 stati interni e 5 quintuple (1, I, 1, I, >),
(1, $, 2, I, >), (2, I, 2, I, >), (2, $, 3, , <) e (3, I, H, $, >).
51
La MdT che crea due copie di n ha 9 stati interni e 17 quintuple (1, I, 2, C, >),
(1, $, 8, $, >), (2, I, 2, I, >), (2, $, 3, $, >), (3, , 4, I, >), (3, I, 3, I, >), (3, $, 4, I, >
), (4, , 5, $, <), (5, I, 5, I, <) (5, $, 5, $, <), (5, C, 6, I, >), (6, I, 2, C, >), (6, $, 7, $, >
), (7, I, 7, I, <), (7, , H, , >) e (8, , H, $, <).
Si noti che per ricordare quale barretta di n sta copiando, la MdT la sosti-
tuisce momentaneamente con il simbolo C. Inoltre alla fine la MdT ha la testina
posizionata sulla prima cella della prima copia di n.
Per comporre le due macchine, bisogna riunire le quintuple della prima e
della seconda macchina, rinominando tutti gli stati della seconda macchina (in
modo che siano diversi da quelli usati nella prima macchina) e sostituendo nelle
quintuple della prima macchina lo stato H con lo stato iniziale della seconda.
In pratica avremo nella quintuple provenienti dalla prima macchina 9 al po-
sto di H e nella quintuple seconda macchina gli stati 9, 10, 11 al posto di 1, 2, 3.
Come ultimo esempio diamo una descrizione sommaria di una MdT che cal-
cola il prodotto tra due numeri m e n. L’idea è quella che partendo dalla
configurazione m$n$, la MdT crea la configurazione m$n$p$, in cui il numero
p all’inizio è zero. Poi effettua il seguente ciclo
(ii) copia, con una versione leggermente modificata della macchina per copiare,
n dopo p, perciò la configurazione del nastro diventa m$n$p$n$
(iii) si posiziona la testina sul primo degli ultimi due numeri e li si somma con
la macchina per sommare
(iv) si riposiziona la testina sul primo simbolo non vuoto di m e si riparte con
il primo passo
52
Teorema 14 Esiste una MdT universale, indicata con MTU che ricevendo la
coppia (m, x̄), in cui m è la descrizione di una MdT M e x̄ è una rappresenta-
zione opportuna di una parola x dell’alfabeto del nastro di M, calcola in tempo
finito la rappresentazione della parola f (x), in cui f è la funzione calcolata da
M. Nel caso in cui M diverge su x, allora anche MTU divergerà su (m, x̄).
Dim. L’idea di definire una MTU è già presente nel lavoro iniziale di Turing.
Noi non scenderemo nei dettagli, perchè seppur concettualmente semplice, tale
MdT ha un numero molto alto di stati interni e di quintuple.
Ogni stato q e ogni simbolo s del nastro di M saranno rappresentati con
numeri interi indicati, rispettivamente, con ]q e ]s. Questi numeri saranno inol-
tre rappresentati in notazione unaria a lunghezza fissa N , cioè con abbastanza
spazi aggiuntivi in modo tale che la rappresentazione di ogni stato e di simbo-
lo abbia esattamente la stessa lunghezza N . Ad esempio se M ha tre stati e
quattro simboli, gli stati saranno rappresentati con le parole $, I $ e II $.
Rappresenteremo lo stato finale e il simbolo vuoto con il numero 0.
Una quintupla Qi = (qi , si , qi0 , s0i , di ) sarà rappresentata con la parola ]Qi =
(]qi ]si ]qi0 ]s0i di ) e il programma di M sarà rappresentato con la parola m ottenuta
come concatenazione delle parole rappresentanti le quintuple.
Infine il contenuto del nastro t viene ovviamente rappresentato come parola
contenente tutte le parole i codici dei simboli delle celle. All’inizio il nastro
conterrà la rappresentazione x̄ della parola x.
La MTU riceverà sul nastro m e x̄ e costituirà la seguente situazione iniziale
sul nastro:
• il programma m
(ii) Se non esiste tale quintupla, MTU si ferma dopo aver cancellato m e q,
in modo da lasciare solo la rappresentazione del nastro (sostituendo il
simbolo T con il $).
53
(iii) Se invece tale quintupla esiste, allora viene modificato lo stato interno con
q 0 e il contenuto della cella corrente con s0 , usando due volte le quintuple
di C, anch’esse opportunamente adattate.
(iv) Infine il simbolo T viene spostato alla cella immediatamente sulla sinistra
(o sulla destra), a seconda di d, ripristinando il simbolo $ nella posizione
corrente di T . Se la testina dovesse essere spostata sulla cella oltre l’ultima
rappresentata in t, allora viene aggiunta in fondo a t una nuova cella
contenente il simbolo vuoto.
E’ facile capire che MTU si ferma sull’input (m, x̄) se e solo se M si ferma
sull’input x e, in tal caso, MTU ha scritto sul nastro proprio la rappresentazione
di f (x), in quanto alla fine di ogni gruppo di operazioni (i)–(iv) MTU ha nel
nastro una configurazione (q, t) esattamente corrispondente a quella di M dopo
l’esecuzione del passo corrispondente.
Teorema 15 (della fermata) Non può esistere una MdT H che, ricevendo
come input la coppia (m, x̄), in cui m è la descrizione di una MdT M e x è
la rappresentazione di una parola x dell’alfabeto del nastro di M, decide, ad
esempio scrivendo sul nastro il simbolo S o il simbolo N , se M si fermerà o no
partendo dall’input x.
Dim. Supponiamo per assurdo che H esista. Costruiamo allora la MdT D cosı̀
definita. D riceve come input una parola m definita sull’alfabeto del nastro di
H, manda in esecuzione H sull’input (m, m). Se H dà risposta positiva, D entra
in un loop infinito (ad esempio spostandosi indefinitivamente verso destra). Se
H dà risposta negativa, D si ferma.
Si noti che la risposta di H sull’input (m, m) corrisponde al fatto se una
MdT la cui descrizione è m si ferma ricevendo come input la descrizione di sè
stessa.
54
Sia d la descrizione del programma di D. Cosa succede se a D si dà come
input proprio la parola d ? Si fermerà ?
Supponiamo che D si ferma sull’input d. Ciò accade se H dà risposta negativa
sull’input (d, d), ma ciò significa che la MdT con rappresentazione d, cioè D,
non si ferma sull’input d, in contraddizione con l’ipotesi.
Allora supponiamo che D non si ferma sull’input d. Ciò accade se H dà rispo-
sta positiva sull’input (d, d), ma ciò significa che la MdT con rappresentazione
d, cioè D, si ferma sull’input d, di nuovo in contraddizione con l’ipotesi.
Quindi possiamo dire che l’ipotesi iniziale è falsa e quindi una MdT siffatta
non può esistere.
2x = a
55
ammette soluzioni se e solo se il parametro a è un numero pari, l’equazione
diofantea
x2 = a
ammette soluzioni se e solo se il parametro a è un quadrato, infine l’equazione
diofantea
(x + 2)(y + 2) = a
ammette soluzioni se e solo se il parametro a non è primo.
Una risposta negativa al decimo problema di Hilbert fu fornita da Matiya-
sevich nel 1970, utilizzando tutta una serie di risultati ottenuti da M. Davis, H.
Putnam e altri, dimostrando che è possibile esprimere le funzioni calcolabili dal-
le macchine di Turing attraverso una famiglia di equazioni diofantee, per cui è
ovviamente indecidibile sapere se quella famiglia di equazioni ammette soluzioni
in quanto si può mostrare che ciò risolverebbe il problema della fermata.
Come effetto collaterale di questo risultato si è trovato un’equazione diofan-
tea ad un parametro a che ammette soluzione solo e quando a è un numero
primo.
Il secondo esempio è il problema di corrispondenza di Post [1].
Sia I = {(u1 , v1 ), . . . , (un , vn )} un insieme finito di coppie di parole di un
alfabeto finito A. Si può immaginare che ogni coppia di parole rappresenti la
tessera di un gioco, simile al domino, in cui ui è la parola che compare nella
parte superiore della tessera e vi quella della parte inferiore della tessera. Il
gioco è quello di affiancare un numero finito di copie di alcune tessere 2 tentando
di comporre la stessa parola sia congiungendo le parole della parti superiori, sia
quelle delle parti inferiori.
Date le tessere I, il gioco ammette soluzione se è possibile formare la stessa
parola.
Ad esempio se I = {(b, ab), (ba, a), (a, ab)} ammette la soluzione (a, ab), (ba, a).
Se invece I = {(b, bb), (a, bab)} ammette la soluzione (b, bb), (a, bab), (b, bb).
Infine se I = {(b, bb), (a, aa)} non ammette soluzione.
Si può dimostrare che è possibile creare un insieme di tessere I che ammette
soluzione se e solo se una data MdT si ferma su un determinato input x e quindi
stabilire se I ammette soluzione è indecidibile.
2 quindi a differenza di un gioco reale ogni tessera può essere utilizzata più volte
56
E’ facile vedere che le tre funzioni iniziali sono Turing–calcolabili: la funzione
zero z(x) è calcolabile da una MdT che cancella x e scrive un $, che rappresenta
lo zero; la MdT che calcola la funzione successore è già stata illustrata come
(m)
esempio; per calcolare la funzione proiezione π i è sufficiente che la MdT can-
celli tutti i propri argomenti, tranne xi .
57
(v) se le quintuple di M1 arrivano allo stato finale e producono sul nastro il
corrispondente del valore 0, M incrementa di uno y e torna al terzo passo
58
Lemma 7 La funzione N (p, c) che dati p, la codifica del programma di M, e
c la codifica di una configurazione di M, calcola la codifica della configurazione
successiva, ovvero dopo l’esecuzione di un passo, è ricorsiva primitiva
q = c[0]
i = c[1]
t = c[2]
L(z, a, b) = min{i ≤ z[0] : (i >= 1) ∧ (z[i][0] = a) ∧ (z[i][1] = b)}
j = L(p, q, t[i])
q0 = z[j][2]
s0 = z[j][3]
d = z[j][4]
U (z, a, b) = (z ÷ paz[a] ) · pba
M (a, b) = (a − 1) · (¬b) + (a + 1) · b
Allora
[q 0 , M (i, d), U (t, i, s0 )] se j ≤ p[0]
N (p, c) =
[0, i, t] altrimenti
che, come composizione di funzioni ricorsive primitive, lo è a sua volta.
N (0) (p, c) = c
N (t+1) (p, c) = N (p, N (t) (p, c))
Dim. Innanzitutto definiamo una funzione ricorsiva primitiva che ci dice quan-
do una configurazione rappresenta la situazione in cui M si è fermata; basta
controllare che lo stato interno sia q0
E(c) = (c[0] = 0)
59
Perciò
T (p, c, t) = E(N (t) (p, c))
Si noti che per come è definito N e in virtù del fatto che non ci sono quintuple
che si riferiscono a q0 , allora se M si ferma ad un istante t, ogni successiva appli-
cazione della funzione N non cambia la configurazione e quindi se T (p, c, t) = 1
per un certo t, allora T (p, c, t0 ) = 1 per ogni t0 ≥ t.
ove O estrae il contenuto del nastro dalla configurazione finale O(c) = c[2]
60
Dim. Se f è ricorsiva, allora per il teorema 16 è Turing–calcolabile. Quindi
applicando il teorema 17 si ottiene facilmente l’asserto.
61
L’esistenza di tutti questi formalismi esattamente equivalenti ci porta ad
affermare la celeberrima tesi di Church–Turing “Una funzione è calcolabile se e
solo è Turing–calcolabile”.
Questa tesi non può essere dimostrata perchè non è formalizzabile in modo
matematico il concetto di funzione calcolabile. Il concetto intuitivo è che una
funzione f è calcolabile se esiste un procedimento finito e ragionevole che per-
mette ad uno strumento di calcolo “meccanico” (cioè in grado solo di eseguire
in modo autonomo gli ordini del procedimento, senza perciò richiedere abilità
che vanno al di là della mera esecuzione) di arrivare a determinare il valore di
f (x) in un numero finito di passi partendo da x.
Il problema fondamentale risiede nella ragionevolezza del procedimento e
delle capacità richieste dallo strumento di calcolo. E’ infatti possibile ideare
dei modelli di calcolo irrealistici e puramente teorici, ad esempio le MdT con
oracolo, che sono in grado di calcolare funzioni non ricorsivi. Però tutti i mo-
delli ragionevoli fino ad adesso studiati sono al massimo equivalenti alle MdT.
Pertanto la tesi di Church–Turing è solo confutabile, cioè potrebbe essere in
linea teorica negata dalla scoperta di un formalismo di calcolo ragionevole che
sia superiore alle MdT.
La comunità scientifica, tranne casi eccezionali, è concorde nel ritenere vera
la tesi di Church–Turing. I motivi principali sono i seguenti.
• In quasi settanta anni di studi non sono mai stati trovati controesempi,
ma sempre e solo nuovi risultati in perfetto accordo con la tesi di Church–
Turing.
• Le MdT sono state modellate secondo l’analisi fatta da Turing sui pro-
cedimenti umani di calcolo: la testina equivale all’occhio e alla penna,
la memoria interna equivale al cervello (che contiene anche le quintuple),
il nastro equivale alla carta, ai libri e a tutte le sorgenti di informazioni
esterne. Questa analisi può anche essere estesa ad un calcolatore moderno:
la testina equivale alla tastiera, al monitor e alla testina del disco fisso,
la memoria interna equivale alla RAM, le quintuple sono memorizzate in
una ROM, il nastro equivale al disco fisso, allo schermo e tutte a tutte le
possibili periferiche. Per cui sembra implausibile che si possa concepire un
sistema di calcolo reale non equivalente ad una MdT.
62
Capitolo 6
Un insieme ricorsivo molto utile è l’insieme M dei codici dei programmi di tutte
le macchine di Turing. Infatti non tutti i numeri interi x corrispondono a codici
validi per il programma di una MdT: il numero x deve soddisfare alle seguenti
condizioni
63
Si indicherà inoltre con Φi (x) il risultato, interpretato come numero, prodotto
dalla MdT Mi a partire dall’input numerico x.
In base ai teoremi 17 e 16, si ha che
Proposizione 12 Una funzione f di una sola variabile è ricorsiva se e solo se
f (x) = Φi (x) per ogni x ∈ N, per un certo i ∈ N detto indice di f .
Quindi M può anche essere visto come l’insieme di tutti i codici delle funzioni
ricorsive a una sola variabile.
E’ facile far vedere che
Proposizione 13 L’unione e l’intersezione di due insiemi ricorsivi A e B e il
complementare di un insieme ricorsivo A sono ancora insiemi ricorsivi
Ad esempio se fA è la funzione caratteristica di A e fB è la funzione carat-
teristica di B, allora la funzione caratteristica di A ∩ B è f A · fB , la funzione
caratteristica di A ∪ B è sg(fA + fB ) e la funzione caratteristica di Ā è 1 − fA .
Il concetto di insieme ricorsivo si può estendere in modo immediato anche
a sottoinsiemi di Nk , per k > 1. In tal caso avremo che se A e B sono insiemi
ricorsivi anche A × B è un insieme ricorsivo.
Inoltre vale il seguente risultato
Proposizione 14 A è un insieme ricorsivo se e solo è possibile definire una
funzione ricorsiva gA totale che è in grado di elencare ad uno ad uno tutti gli
elementi senza ripetizione e in ordine crescente.
Dim. Se A è ricorsivo, allora la funzione ricorsiva g A è
k
X
gA (n) = min{k : fA (i) = n + 1}.
i=0
64
converge e dà una risposta positiva se n ∈ A, ma non converge se n 6∈ A: ad
esempio
hA (n) = min{k : gA (k) = n}
Questo procedimento si differenzia da una funzione caratteristica proprio perchè
mentre quest’ultima è una funzione totale e quindi è in grado di dare sia risposte
positive che negative, la prima è in grado di dare solo risposte positive.
Per cui definiremo
Definizione 31 Un insieme A ⊂ N è ricorsivamente enumerabile (in se-
guito r.e.) se esiste una funzione ricorsiva gA che lo enumera ricorsivamente,
cioè una funzione ricorsiva gA gA : N → A suriettiva, cioè tale che per ogni
a ∈ A esiste n ∈ N per cui gA (n) = a, ovvero per cui Im(gA ) = A.
Si noti che gA potrebbe non essere iniettiva e quindi produrre più volte lo
stesso elemento di A. Questo fatto comunque non crea problemi in quanto si
può in linea teorica pensare a scartare gli elementi già prodotti.
In base alla proposizione 14 vale ovviamente
Proposizione 15 Se A è ricorsivo allora è r.e.
Vale inoltre il seguente risultato
Proposizione 16 Un sottoinsieme A ⊂ N è r.e. se e solo è il dominio di una
funzione hA ricorsiva parziale.
Dim. Se A è r.e., sia gA la funzione che lo enumera. Definendo
hA (x) = min{y : gA (y) = x}
si vede facilmente hA è definito su x se e solo se x ∈ E.
Se invece A è il dominio di una funzione ricorsiva h A , allora è anche il dominio
di una MdT M (inteso come l’insieme di tutti i numeri interi x per cui M si
ferma partendo con il nastro contenente il numero x).
Per cui possiamo scrivere che
x ∈ A se e solo se per qualche t ∈ N T (p, k(x), t) = 1
ove p è il codice del programma di M e k(x) è il codice della configurazione
iniziale per M in cui il nastro contiene la rappresentazione unaria di x. Per cui,
scelto un elemento arbitrario x̄ ∈ A (ad esempio il minimo elemento), A sarà
enumerato dalla funzione
y[0] se T (p, k(y[0]), y[1]) = 1
g(y) =
x̄ altrimenti
Infatti se x ∈ A, allora T (p, k(x), t) = 1 per un certo valore di t e quindi per
y = [x, t] si ha che g(y) = x. Se invece x 6∈ A, allora per ogni valore di y per
cui y[0] = x, si ha che T (p, k(y[0]), y[1]) = 0 e quindi g(y) = x̄ 6= x, mentre se
y[0] 6= x, allora in ogni caso g(y) 6= x.
65
Proposizione 17 Se due insiemi A e B sono r.e., allora anche la loro inter-
sezione e la loro unione sono insiemi r.e.
Dim. Far vedere che C = A ∩ B è r.e. è banale, in quanto se A è il dominio di
hA e B è il dominio di hB , allora C è il dominio di hA + hB . Invece per quanto
riguarda l’unione D = A ∪ B, siano gA e gB le funzioni ricorsive che enumerano
A e B, rispettivamente. Allora posto
gA (y ÷ 2) se y è pari
gD (y) =
gB (y ÷ 2) se y è dispari
A = {x ∈ N : ∃y.Q(x, y)}
A = {x ∈ N : ∃y.g(y) = x}
66
si ottiene l’asserto.
Se invece A = {x ∈ N : ∃y.Q(x, y)}, allora A è il dominio della funzione
ricorsiva parziale hA (x) = min{y : Q(x, y)}
Ora siamo in grado di enunciare che il concetto di insieme r.e. è più generale
del concetto di insieme ricorsivo in quanto
Proposizione 20 L’insieme
K = {n ∈ N : n ∈ Wn }
Dim. Supponiamo per assurdo che T OT sia r.e. Allora esiste una funzione
ricorsiva g che enumera T OT .
Definiamo la seguente funzione ricorsiva totale
67
6.3 Due esempi importanti di insiemi r.e.
Il primo esempio è tratto dalla teoria dei linguaggi formali. Fissato un alfabeto
finito A, sia ] : A → N \ {0} una codifica degli elementi di A (ovvero una
funzione iniettiva), ad esempio preso un ordinamento degli elementi di A, ] :
A → {1, 2, . . . , n}, ove n è il numero di elementi di A.
Ad ogni parola w = a0 a1 . . . aL di A∗ si può associare il numero intero
• Presa una produzione Pi = wi → wi0 , il predicato DDPi (x, y), che dati
x = ]u e y = ]v, è vero se e solo se v discende direttamente da u usando
la produzione Pi . Infatti
DPi (x, y) = (∃z)≤x (∃t)≤x ((C(z, C(k, t)) = x) ∧ (C(z, C(k 0 , t)) = y)),
68
Proposizione 22 Data una grammatica G, avente P come insieme di produ-
zioni e S come simbolo iniziale, l’insieme dei codici delle parole del linguaggio
generato da G
C(G) = {]w : S →∗P w}
è un insieme r.e.
Dim. L’insieme C(G) si può scrivere come
C(G) = {x : ∃y.Der(x, y)}
in cui il predicato Der è definito da
Der(x, y) ⇔ (y[0] = ]S)∧(y[L(y)−1] = x)∧(∀i)<L(y) ((i = 0)∨DP (y[i−1], y[i]))
in cui y è il numero di Gödel di una sequenza finita di m + 1 numeri, ognuno dei
quali è sua volta il codice di una parola wi (i = 0, . . . , m). Queste parole sono
tali che
• w0 = S
• wm = u, ove u è la parola di codice x
• wi discende direttamente da wi−1 tramite le produzioni P
Poichè tale sequenza esiste se e solo se u ∈ L(G) (per definizione di L(G))
e poichè Der è un predicato ricorsivo (primitivo), si ha l’asserto in virtù della
proposizione 18.
Si noti che molti linguaggi formali sono in realtà ricorsivi: ad esempio tutti i
linguaggi descritti nel capitolo introduttivo, i linguaggi della logica proposizio-
nale e quello della logica dei predicati, tutti i linguaggi di programmazione (ad
esempio il Pascal).
Esistono però linguaggi r.e. ma non ricorsivi. Infatti in [1] è descritto come
creare una grammatica che genera come linguaggio il dominio di una data MdT;
poichè esiste una MdT che ha come dominio un insieme K r.e. ma non ricorsivo,
K è il linguaggio con tale proprietà.
Il secondo esempio è molto importante e ci servirà nel prossimo capitolo.
Innanzitutto se L è un linguaggio della logica dei predicati, cioè L = LP(Σ)
per un certo Σ finito o ricorsivo, ad ogni formula φ di L è possibile associare in
modo univoco un numero ]φ, detto codice o numero di Gödel della formula,
dato che φ è una parola del linguaggio LP(Σ).
Inoltre l’insieme {]φ : φ ∈ L} è un insieme ricorsivo.
Infine l’insieme A dei codici degli assiomi della logica dei predicati è un
insieme ricorsivo.
Proposizione 23 Sia L un linugaggio della logica dei predicati e sia T un insie-
me ricorsivo di formule di L. Allora l’insieme dei codici dei teoremi dimostrabili
da T
T hm(T ) = {]φ : T ` φ}
è un insieme r.e.
69
Dim. L’insieme T hm(T ) si può scrivere come
70
Capitolo 7
7.1 Introduzione
Introduciamo ora il concetto di teoria, che è il concetto chiave di questo capitolo.
71
7.2 L’aritmetica formale
In questa sezione definiamo un linguaggio AF della logica dei predicati atto a
formalizzare i numeri naturali con le operazioni di addizione e moltiplicazione.
Si tratterà di un linguaggio dotato di
• il predicato di uguaglianza =
AF1 (∀x.S(x) 6= 0)
AF3 (∀x.x + 0 = x)
AF5 (∀x.x · 0 = 0)
AF7 (α[x/0] ∧ (∀x.α ⇒ α[x/S(x)])) ⇒ (∀x.α) per ogni formula α avente come
variabile libera x
Come si può notare, gli assiomi propri AF1 e AF2 richiedono che S sia
una funzione iniettiva e che 0 non è il successore di nessun elemento; AF3
e AF4 formalizzano l’addizione, AF5 e AF6 formalizzano la moltiplicazione e
infine le formule dello schema AF7 rappresentano la cosiddetta dimostrazione
per induzione di una generica formula α. Gli assiomi AF1, AF2 e AF3 sono
derivati dai celeberrimi assiomi di Peano.
La teoria AF è chiamata teoria dell’aritmetica formale perchè com-
prende un insieme di proprietà elementari dell’aritmetica elementare (appunto
i numeri naturali con l’addizione e la moltiplicazione).
Innanzitutto vale il seguente risultato, di ovvia dimostrazione
72
In AF è possibile riferirsi a numeri maggiori di zero usando i cosiddetti
numerali, cioè termini chiusi del tipo
0 = 0
n+1 = S(n)
S(0) + 0 = S(0)
0 + S(x) = S(0 + x)
73
7.3 Introduzione al primo teorema di Gödel
Queste note danno una breve idea della dimostrazione del famosissimo (primo)
teorema di incompletezza di Gödel. Questo teorema è stato dimostrato da Gödel
in suo famoso articolo pubblicato nel 1931 e da allora sono stati scritti “fiumi
di inchiostro” su questo risultato.
Non si entrerà in merito alle questioni filosofiche e alle varie implicazioni di
carattere non prettamente matematico che sono state discusse in modo anche
esasperato (si può citare ad esempio che qualcuno scrisse che con il teorema di
Gödel la matematica non ha più senso). Per un’introduzione ai vari problemi
connessi con il teorema di Gödel si rimanda all’amplissima letteratura esistente
in merito.
Essenzialmente il primo teorema di incompletezza ci dice che nell’aritmetica
(e in tutti i sistemi formali sufficientemente potenti) esistono degli enunciati
indecidibili G, cioè in cui non si può dimostrare né G né ¬G.
La dimostrazione di Gödel si basa sul paradosso del mentitore. Una frase del
tipo “questa affermazione è falsa” (oppure “io sto mentendo”, ecc.) costituisce
un esempio di proposizione a cui non si può attribuire alcun valore di verità.
Infatti se la frase fosse vera, allora non potrebbe essere vero quello che afferma,
cioè sarebbe falsa. D’altro canto se la frase fosse falsa, allora non sarebbe vero
ciò che afferma e quindi dovrebbe essere vera.
Per ricreare una situazione simile all’interno di AF bisogna definire un enun-
ciato G che afferma la propria indimostrabilità (che è l’equivalente sintattico del-
la falsità). Esistono molti dettagli tecnici per arrivare alla definizione di questo
enunciato.
Innanzitutto deve essere definito un processo di “aritmetizzazione della sin-
tassi”: le formule e le dimostrazioni devono essere rappresentate tramite numeri
in modo da consentire la definizione di formule che “parlano” di altre formule o
di dimostrazioni.
Un secondo passo è quello di rappresentare all’interno di AF le funzioni che
servono a verificare se una sequenza di formule è una dimostrazione e quindi a
effettuare manipolazioni simboliche di formule. In pratica per ottenere questo
risultato si devono rappresentare molte funzioni ricorsive.
Tramite i primi due passi si è in grado di definire formule che parlano della
dimostrabilità di altre formule. E’ quindi necessario un terzo passo in cui una
formula possa citare sè stessa: la cosa non è del tutto ovvia. Infatti per creare
una formula G di AF che cita sé stessa, ad esempio affermando di avere una
certa proprietà, è necessario conoscere il codice di G e inserirlo all’interno di
G. Chiaramente queste due operazioni andrebbero fatte contemporaneamente,
perché prima della sostituzione non si sa quant’è il codice di G, mentre dopo la
sostituzione G non è più la stessa e quindi il suo codice è diverso da quello di
partenza.
Un esempio che può chiarire questo problema è il seguente. Si trovi un
numero intero n per cui l’affermazione “questa frase ha n sillabe” (sostituendo
a n il suo valore scritto in lettere) è corretta. Il numero n in questione è soluzione
74
dell’equazione
n = 8 + s(n)
in cui s(n) è il numero di sillabe del numero n espresso in italiano. La solu-
zione più piccola è 10, perché l’affermazione ”questa frase ha dieci sillabe” ha
realmente 10 sillabe, mentre per ogni n < 10 sarebbe falsa.
Cambiando l’affermazione in “questa affermazione in lingua italiana è com-
posta da n lettere” si capisce che non è del tutto ovvio trovare il valore di n
corretto o dimostrare almeno che tale numero esiste.
Si noti infine che i tre passi sono svolti all’interno di AF senza che sia
necessario aggiungere nuovi assiomi o ampliare il linguaggio. Inoltre il primo
passo è già stato affrontato nel capitolo precedente a proposito della proposizione
23 e in quanto tale sarà ritenuto come acquisito.
7.4 Rappresentabilità
Sia K una qualsiasi teoria del primo ordine ricorsiva, il cui linguaggio sia un’e-
stensione di AF e i cui assiomi comprendano quelli di AF. In particolare negli
esempi si userà solo AF, ma poiché i risultati valgono anche per teorie più ricche
di AF, tutti gli esempi si possono rileggere in una teoria K.
Inoltre se Q è una formula che ha come variabili libere x 1 , . . . , xn e t1 , . . . , tn
sono termini, allora si indicherà con Q(t1 , . . . , tn ) la formula che si ottiene
da Q sostituendo, per ogni i = 1, . . . , n, la variabile x i con il termine ti ,
cioè Q[x1 /t1 , . . . , xn /tn ]. Inoltre la formula originaria Q verrà denotata con
Q(x1 , . . . , xn ), mettendo in evidenza le sue variabili libere.
p(r1 , . . . , rm ) = 1 ⇒ K ` Qp (r1 , . . . , rm )
p(r1 , . . . , rm ) = 0 ⇒ K ` ¬Qp (r1 , . . . , rm )
75
Definizione 34 Una funzione f : D → N, ove D ⊂ Nm , è rappresentabile
in K se esiste una formula Qf di K avente m + 1 variabili libere x1 , . . . , xm , y
tale che per ogni r1 , . . . , rm , s ∈ N
f (r1 , . . . , rm ) = s ⇒ K ` Qf (r1 , . . . , rm , s)
e
K ` (∃!y.Qf (r1 , . . . , rm , y))
√
Ad esempio la funzione r(x) = d xe é rappresentabile in AF mediante la for-
mula Q(x, y) ≡ (y · y ≤ x) ∧ (S(y) · S(y) > x) ove il predicato > é ovviamente
anch’esso rappresentabile in AF.
Teorema 20 Tutte le funzioni ricorsive f : Nm → N, sono rappresentabili
in AF
Dim. Daremo alcuni cenni della dimostrazione. Per avere maggiori dettagli il
lettore puó consultare [3].
Innanzitutto é banale dimostrare che le funzioni di base sono rappresenta-
bili in AF. Infatti la funzione z(x) = 0 é rappresentabile con Q(x, y) ≡ (x =
x) ∧ (y = 0), in cui la sottoformula x = x serve solo perché Q deve avere x
come variabile libera. La funzione successore é rappresentabile con la formula
(m)
y = S(x). Infine la funzione proiezione πi é rappresentabile dalla formula
(x1 = x1 ) ∧ (x2 = x2 ) ∧ · · · ∧ (y = xi ) · · · ∧ (xm = xm ).
Per quanto riguarda le funzioni definite per ricorsione si deve usare la cosiddetta
funzione β di Gödel che é in grado di rappresentare sequenze arbitrariamente
lunghe di numeri interi con due numeri interi, in modo simile alla funzione
[x0 , x1 , . . . , xm ] ma senza la necessitá di utilizzare l’elevamento a potenza (che
è definito anch’esso come funzione ricorsiva).
76
7.5 Il primo teorema di Gödel
Innanzitutto, data una formula B, indicheremo con pBq il numerale ]B.
Il punto cruciale per soddisfare il terzo punto é il seguente risultato.
Teorema 21 (del punto fisso) Sia K una teoria in cui tutte le funzioni ri-
corsive siano rappresentabili. Per ogni formula E(x) esiste un enunciato C tale
che
K ` (C ⇔ E(pCq))
Dim. Sia d la funzione diagonale che, dato il codice di una formula B(x), resti-
tuisce il codice della formula B(pBq). Essendo d una funzione ricorsiva, esiste
per il teorema 20 una formula D(x, y) che rappresenta d in K.
Sia L(x) la formula (∀y.D(x, y) ⇒ E(y)) e sia m = ]L. Infine sia C = L(m).
Con alcuni semplici passaggi, che qui non vengono riportati, é possibile vedere
che in K si puó dimostrare C ⇔ E(pCq)
K`φ K ` ¬φ
Dim. Sia E(x) una formula con una variabile libera x e sia H = (E ∧ (¬E)).
Per ogni n ∈ N l’enunciato
Le ipotesi sulle teorie K per cui il teorema di Gödel è vero sono le seguenti
77
Prendiamo adesso il predicato P rf (x, y). Essendo ricorsivo esiste una for-
mula P con due variabili libere x e y tale che per ogni r, s, ∈ N accade che
P rf (r, s) = 1 ⇒ K ` P (r, s)
P rf (r, s) = 0 ⇒ K ` ¬P (r, s)
Sia E la formula (∀y.(¬P (x, y))). Per il teorema del punto fisso esiste un
enunciato G tale che
K ` G ⇔ (∀y.¬P (pGq, y))
Questo enunciato G afferma in pratica che “G non è dimostrabile”.
K ` ¬P (pGq, d)
K ` ¬P (g, n)
e per la ω–consistenza in K non si dovrebbe poter dimostrare (∃y.P (g, y)), con-
trariamente a quanto mostrato prima.
78
Per quanto riguarda AF, che ovviamente soddisfa le ipotesi del teorema di
Gödel, si noti che la formula G é vera in N e quindi AF non é in grado di
modellare adeguatamente il mondo dei numeri naturali.
Inoltre se ad AF si aggiungesse G come ulteriore assioma proprio si otter-
rebbe una nuova teoria AF 1 a cui si potrebbe riapplicare ancora il teorema di
incompletezza di Gödel, trovando un nuovo enunciato G 0 indecidibile, ma vero
in N. Ovviamente questo processo si puó svolgere un numero illimitato di volte,
creando una successione infinita di teorie AF i ognuna delle quali ammette N
come modello, ma per cui esiste un enunciato vero in N ed indecidibile.
Il teorema di Gödel si puó dimostrare, utilizzando una modifica dovuta a
Rosser, senza l’ipotesi di ω–consistenza, ma solo con l’ipotesi di consistenza.
Dim. Forniamo qui una dimostrazione non del tutto rigorosa di questo teorema.
Si prenda l’enunciato
W ≡ ConK ⇒ G
in cui G é l’enunciato di Gödel: W afferma che se K é consistente, allora G
non é dimostrabile. Essendo W proprio la implicazione (i) del primo teorema
di Gödel, si ha che K ` W in quanto è possibile riscrivere la dimostrazione di
questa implicazione all’interno di K stesso.
Se per assurdo fosse K ` ConK , si avrebbe per modus ponens K ` G, con-
trariamente alla stessa implicazione del primo teorema di Gödel.
79
sulla dimostrabilità di Hilbert–Bernays, per maggiori chiarimenti si veda a tal
proposito [3].
80
Proposizione 29 Se K é una teoria di AF consistente in cui ogni funzione
ricorsiva é rappresentabile e in cui K ` 0 6= 1, allora T hm(K) non é ricorsivo
Teorema 24 (di Church) L’insieme (dei codici) dei teoremi T del calcolo dei
predicati non è ricorsivo
7.8 Conclusioni
Innanzitutto i teoremi di Gödel si applicano non solo alla teoria dell’aritmetica
formalizzata, ma a qualunque teoria “sufficientemente potente”. Ad esempio
per il primo teorema di incompletezza bastano le condizioni 1,2 e 3. Molte
teorie soddisfano queste condizioni, tra queste la più importante è la teoria
degli insiemi di Zermelo–Fraenkel, su cui originariamente era stato formulato il
teorema di Gödel.
La teoria degli insiemi era stata proposta come linguaggio di base di tutta
la matematica ed è tuttora utilizzata come strumento per la definizione dei
concetti elementari (insiemi e loro operazioni, relazioni, funzioni, ecc.).
La scuola formalista, il cui rappresentante massimo fu Hilbert, proponeva
di formalizzare tutta la matematica allora conosciuta all’interno della teoria S
degli insiemi in modo che ogni teoria matematica fosse descritta in modo as-
siomatico attraverso il semplice linguaggio degli insiemi. La teoria S doveva
essere dotata di un procedimento meccanico che, dato un enunciato φ, poteva
decidere con un numero finito di passi se φ è vero o falso. La ricerca di questa
procedura, il cosiddetto Entscheidungsproblem, era di estrema importanza per-
ché questa procedura sarebbe stata in grado, almeno dal punto di vista teorico,
di risolvere qualsiasi problema matematico. Ovviamente il lavoro del matema-
tico non sarebbe finito (ad esempio avrebbe comunque dovuto definire nuovi
concetti e teorie, proporre delle congetture e magari tentare di dimostrarle), ma
ogni disputa, ogni dubbio poteva essere fugato teoricamente attraverso questo
meccanismo.
81
Infine il programma della scuola formalista richiedeva che si doveva dimostra-
re la consistenza della teoria S in modo da evitare che fosse possibile ottenere
risultati contraddittori; per essere sicuri della fondatezza di questo risultato,
questa dimostrazione doveva essere svolta direttamente all’interno di S stessa.
I teoremi di Gödel e i risultati di Turing e di Church mostrano che il program-
ma di Hilbert era troppo ambizioso. Infatti il primo teorema di incompletezza e
il teorema della fermata di Turing danno una risposta negativa all’Entscheidung-
sproblem: esistono proposizioni indecidibili all’interno della teoria degli insiemi
(e all’interno dell’aritmetica) ed esistono problemi che non possono essere ri-
solti mediante procedimenti meccanici, come le macchine di Turing. Il secondo
teorema di incompletezza di Gödel invece mostra come non sia possibile dimo-
strare la consistenza di una teoria all’interno della teoria stessa, se tale teoria è
sufficientemente potente, come ad esempio la teoria degli insiemi.
82
Bibliografia
83