UNIFICAZIONE E PATTERN MATCHING
In Intelligenza Artificiale (IA), la maggior parte dei sistemi basati su
conoscenza poggia sul confronto di descrizioni (simboliche), nella forma
di Unificazione o di Matching. Tali termini individuano, dunque, il
procedimento attraverso cui si confrontano 2 o più strutture (nel nostro
caso fbf della logica del prim’ordine), per scoprire le loro somiglianze o
differenze.
Tale operazione rappresenta per il calcolo simbolico quello che l’addizione e la
moltiplicazione sono per il calcolo numerico: è stato valutato che in molti sistemi di
produzione essa assorbe il 90% del tempo di calcolo complessivo. Ciò in virtù del fatto
che il confronto di descrizioni è alla base di operazioni più complesse (quali la
risoluzione e la ricerca) che a loro volta sono sfruttate da un ampio spettro di tecniche
(ad es., la programmazione logica e l’elaborazione del linguaggio naturale) sulle quali
poggiano svariate branche dell’IA (sistemi esperti, sistemi di apprendimento, ecc.).
Gli odierni computer della V generazione, dedicati all’IA, sono macchine per eseguire
linguaggi di programmazione logica, in cui la CPU è un algoritmo di unificazione (in
HW o in SW), la cui velocità è calcolata in KLIPS: (Kilo) Logical Inferences Per
Second
1
Dati due termini, s e t, il problema dell’unificazione consiste nel capire se
esistono dei termini che possono essere sostituiti alle variabili che
compaiono in s ed in t, in modo che i termini così ottenuti siano identici.
Una sostituzione σ è una funzione che ad ogni variabile associa un
termine.
Si denota con σ = {(tj/xi)} oppure σ = {xi←tj}, con xi variabili e tj temini.
L’applicazione di una sostituzione σ ad un termine o fbf t (denotata con
σ(t) oppure tσ oppure t.σ) consiste nell’applicare la sostituzione a tutte le
variabili che compaiono in t.
N.B.: Non si può sostituire una variabile con un termine in cui compare la variabile
stessa, perché porterebbe a termini infiniti. Il controllo che ciò non accada è detto
occur-in check.
Esempio. (Sostituzione ammessa)
Sia t = f(g(a,b),x,y) un termine del linguaggio e σ = {g(a)/x, c/y, y/z} una sostituzione.
Si ha:
σ(t) = f(g(a,b),g(a),c).
2
Date due sostituzioni δ e σ, la sostituzione composta da δ e σ (denotata
con σ°δ) è la sostituzione ottenuta da applicando σ agli elementi di δ e
aggiungendo il risultato a δ:
(σ°δ)(t) = σ(δ(t))
La composizione di sostituzioni è associativa:
((σ°δ)°τ) = (σ°(δ°τ))
ma (in generale) non commutativa:
(σ°δ) ≠ (δ°σ)
Definizione.
Due termini, s e t, si dicono unificabili se esiste una sostituzione σ tale che
σ (s) = σ (t)
In tal caso, σ è detto unificatore, e σ(s) (= σ(t) ) unificazione, di s e t.
Dati due termini s e t, il loro unificatore può non essere unico.
Esempio.
I termini
s = f(g(y,b),x) e
t = f(x,g(a,b)) sono unificabili.
Infatti σ = {g(a,b)/x, a/y} è un unificatore di s e t, in quanto:
σ (s) = f(g(a,b),g(a,b)) = σ(t)
Anche s = f(x,g(y))
Infatti sia
σ = {b/y}
e
t = f(x,g(b))
che
δ = {a/x, b/y} sono unificatori di s e t.
3
sono unificabili.
Si vede subito che esistono molti altri unificatori di s e t.
Sorge, pertanto, la necessità di stabilire un criterio per scegliere uno fra i
vari unificatori possibili.
Definizione.
Dati due termini s e t, un loro unificatore σ si dice che è il loro unificatore
più generale (MGU, Most General Unifier) se, per ogni altro loro
unificatore δ, esiste una sostituzione τ tale che δ = τ°σ.
In altre parole, δ è un’istanza di σ; intuitivamente, si può dire che
l’unificatore più generale è il più “semplice” fra tutti quelli dei termini
dati.
Proprietà.
• Il problema dell’unificazione è decidibile nelle Teorie del I ordine;
• Nelle teorie del prim’ordine, il MGU di due termini, se esiste, è
unico.
L’unicità viene meno in presenza di teorie contenenti simboli di funzione commutativi
e/o associativi. In particolare, la commutatività assicura la finitezza degli MGU, mentre
la sola associatività porta all’esistenza di infiniti MGU in almeno un caso.
4
Poiché le fbf possono essere rappresentate come termini, può essere usata
per esse la stessa definizione di unificazione data in precedenza. In
particolare:
• Due atomi si unificano se hanno uguali predicato ed arietà ed esiste
un’unica sostituzione che unifica ciascun termine del primo col
corrispondente termine del secondo. Se il predicato è commutativo,
è sufficiente che ciascun termine del primo unifichi con il
corrispondente termine di una permutazione dei termini del secondo.
• Due letterali si unificano se sono entrambi positivi o entrambi
negativi ed i corrispondenti atomi si unificano.
• Due congiunti di letterali si unificano se hanno lo stesso numero di
elementi ed esiste un’unica sostituzione che unifica ciascun
elemento
del
primo
col
corrispondente
elemento
di
una
permutazione del secondo.
• Due fbf in forma normale disgiuntiva si unificano se hanno lo stesso
numero di elementi ed esiste un’unica sostituzione che unifica
ciascun elemento della prima col corrispondente elemento di una
permutazione della seconda.
Le permutazioni sono considerate a causa delle proprietà associativa e commutativa di
cui godono la congiunzione e la disgiunzione.
5
N.B.: L’unificabilità di insiemi, a differenza di quella di congiunti di letterali, consente
che un elemento di uno dei due congiunti unifichi con più elementi dell’altro congiunto.
Spesso si vuole non solo sapere se esiste un unificatore, ma anche trovarlo
esplicitamente. E’, inoltre, molto sentito il problema di stabilire la
complessità computazionale dell’unificazione e di determinare gli
algoritmi di soluzione più efficienti.
Le prime esperienze con i sistemi automatici per la deduzione rivelarono chiaramente
che il calcolo dell’unificazione è il cuore della maggior parte dei sistemi che effettuano
deduzioni. La stretta relazione tra deduzione logica e computazione è tale per cui la
logica gioca un ruolo nell’informatica analogo a quello dell’analisi in fisica. La logica
dei predicati è un linguaggio di programmazione (Kowalski).
Algoritmo di unificazione (Robinson, 1971).
L’algoritmo di unificazione consiste di una funzione ricorsiva (unifica)
che ha in ingresso due termini (t1 e t2) e, rispettandone la struttura, unifica
i loro argomenti ad uno ad uno, restituendo una variabile booleana
(unifiable) che dice se i due termini sono unificabili e, in caso affermativo,
l’unificatore dei due termini (σ).
6
Essa poggia su due routine: una funzione booleana (occur) che dati una
variabile ed un termine dice se la variabile è presente nel termine, ed una
procedura (componi) che fa la composizione di due sostituzioni.
function unifica (t1,t2) → (unificabile: boolean, σ: sostituzione);
begin
if t1 o t2 è una variabile then
begin
sia x la variabile; sia t l’altro termine;
if x = t then (unificabile, σ) := (true, ∅);
else if occur(x,t) then unificabile := false;
else (unificabile,s) := (true,{t/x})
end
else
begin
sia t1 = f(x1,…,xn)e t2 = g(y1,…,ym);
if f ≠ g or m ≠ n then unificabile := false
else
begin
k := 0; unificabile := true; σ := nil;
while k<m and unificabile do
begin
k := k + 1;
(unificabile, ρ) := unifica(σ (xk), σ (yk));
if unificabile then σ := componi (ρ, σ)
end
end
end;
return (unificabile, σ)
end.
Per molte applicazioni pratiche, l’unificazione è un concetto troppo
generale. Un’importante variante è rappresentata dal Pattern matching (o,
semplicemente, Matching), in cui è lecito effettuare sostituzioni solo in
7
una delle due strutture. Nella sua forma più semplice, le strutture, anche
dette forme (patterns), vengono confrontate per stabilire se sono uguali (e
il matching è visto come funzione booleana).
Si dice che esiste un matching fra due termini, s e t, se esiste una
sostituzione µ tale che
µ(s) =t
oppure
µ(t) = s
In tal caso, µ è detto matcher, e µ (s) (risp. µ (t) ) matching, di s e t.
Spesso, inoltre, poiché le nostre operazioni di matching non sono di solito
simmetriche, si è interessati ad una definizione più debole di quella data.
Cioè, di solito si ha un modello che si vuole porre in corrispondenza con
un fatto specifico.
Si dice che il modello corrisponde (matches) ad un fatto se la formula che
descrive il modello si unifica con qualche sottocongiunzione delle formule
del fatto.
Esempio.
Fatto:
forma(c1,rettangolo) ∧ forma(c2,cerchio) ∧ forma(c3,cerchio) ∧
grandezza(c1,media) ∧ grandezza(c2,piccola) ∧ grandezza(c3,piccola).
8
Modello:
∃x∃y∃z forma(x,rettangolo) ∧ forma(y,cerchio) ∧ forma(z,cerchio).
In questo caso si vede che il modello, tramite la sostituzione{c1/x, c2/y, c3/z}, diventa
un sottoinsieme del fatto dato, che quindi gli corrisponde.
9