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