È migliore dell’applicazione indiscriminata degli assiomi di Armstrong per calcolare , ha complessità polinomiale.
Input: una schema di relazione , un insieme di dipendenze funzionali su , un sottoinsieme di .
Output: la chiusura di rispetto ad (restituita nella variabile )
- Inizialmente assegniamo stesso all’accumulatore di che useremo nel ciclo.
- Scegliamo in modo che sia determinata da un insieme di attributi appartenenti alla chiusura di come calcolata fino a questo momento; poi assegniamola a .
while: Fermiamoci quando non si può scegliere un attributo in modo che non sia già nella chiusura di .- Aggiungiamo alla chiusura di .
return
Nota: Estendere la variabile da cui prendiamo i determinanti nei cicli while successivi equivale ad applicare gli assiomi di Armstrong.
Dimostrazione che l’algoritmo è corretto
Teorema: l’algoritmo calcola correttamente la chiusura di un insieme di attributi rispetto ad un insieme di dipendenze funzionali.
Dimostrazione:
- valore iniziale di ();
- valore di dopo l’i-esima iterazione;
- valore di dopo l’i-esima iterazione.
Per la natura dell’algoritmo, è evidente che ; non eliminiamo mai nessun attributo.
Scegliamo tale che sia il valore di quando il ciclo si interrompe, terminando l’algoritmo: .
La proposizione da dimostrare diventa quindi:
Cioè (l’algoritmo fa effettivamente quello che dice di fare, calcolando tramite la variabile ).
Per induzione,
Vogliamo dimostrare per induzione su che , quindi in particolare .
Caso base
Passo induttivo: ipotesi induttiva
Sia un attributo aggiunto all’i-esima iterazione, cioè .
Sicuramente, per come è definito l’algoritmo, esiste una dipendenza tale che .
Per ipotesi induttiva, , quindi per il Lemma vale .
Per l’assioma della transitività , quindi sempre per il Lemma, .
Dato che allora . Da ciò segue per ipotesi induttiva che (Gli attributi in sono già in per ipotesi induttiva, abbiamo mostrato che ci vanno anche quelli inseriti in all’i-esima iterazione del ciclo).
Per dimostrazione diretta,
Sia . Dobbiamo dimostrare che .
Per il Lemma vale che e per l’uguaglianza tra e vale che , quindi deve essere soddisfatta da ogni istanza legale di , in particolare da definita come segue:
è un’istanza legale di
è un’istanza legale se soddisfa ogni :
- se , allora le due tuple sono diverse su perché c’è almeno un attributo di contenuto in , quindi la dipendenza è soddisfatta.
- se i valori delle due tuple sono uguali. Se le due tuple avessero valori diversi su (e quindi se la dipendenza non fosse soddisfatta), si avrebbe e quindi non sarebbe il valore finale di . Questo perché se e avesse degli attributi in allora l’algoritmo non sarebbe ancora finito, perché questi attributi si potrebbero ancora raccogliere in : ciò vorrebbe dire che non è il valore finale di , ma ciò è un assurdo in contraddizione con la costruzione dell’istanza .
Abbiamo dimostrato che è un’istanza legale di .
Considerazione finale
Dato che è legale, deve soddisfare .
Per costruzione, ovviamente esistono due tuple uguali su (perché , parte a destra dello schema con tutti 1): dato che le due tuple sono uguali su tutti gli attributi in , allora devono essere uguali anche su , quindi .