Algoritmo di Stålmarck

Formula con congiunzioni ed equivalenze

Possiamo esprimere tutte le formule in termini dei soli connettori ¬, ∧, ≡:
x∨y equivalente a ¬(¬x∧¬y)
x⇒y equivalente a ¬(x∧¬y)

Esempi

Tradurre la formula ((v1⇒v2)∧(v3⇒v4))⇒((v1∧v3)⇒(v2∧v4)):
Espandere le implicazioni: ¬((¬(v1∧¬v2)∧¬(v3∧¬v4))∧((v1∧v3)∧¬(v2∧v4)))

Esercizi

D1 Scrivere una funzione transform che cambia le disgiunzioni e le implicazioni con le formule equivalenti.

Tripla

Una formula può essere rappresentata sotto forma di albero:

Ad ogni nodo binario dell'albero si può associare una nuova variabile:

Cosí ogni nuova variabile forma una tripla:

  1. v11=v7∧v10
  2. v10=v8∧¬v9
  3. v9=v2∧v4
  4. v8=v1∧v3
  5. v7=¬v5∧¬v6
  6. v6=v3∧¬v4
  7. v5=v1∧¬v2
Il valore della formula iniziale è quello di ¬v11.

Esercizi

D2 Scrivere una funzione make_triplets che trasforma una formula in una lista di triple.

Propagazione

Conoscendo i valori relativi di alcune variabili di una tripla, si possono dedurre nuovi fatti sui valori di altre variabili.

Tripla congiuntiva

Abbiamo v1= v2 ∧ v3:
  1. Se v1=true allora v2=v3=true.
  2. Se v2=true allora v1=v3.
  3. Se v2=false allora v1=false.
  4. Se v3=true allora v1=v2.
  5. Se v3=false allora v1=false.
  6. Se v1=¬v2 allora v1=v3=false.
  7. Se v1=¬v3 allora v1=v2=false.
  8. Se v2=v3 allora v1=v2.
  9. Se v2=¬v3 allora v1=false.

Tripla equivalente

Abbiamo v1= v2 ≡ v3:
  1. Se v1=true allora v2=v3.
  2. Se v1=false allora v2=¬v3.
  3. Se v2=true allora v1=v3.
  4. Se v2=false allora v1=¬v3.
  5. Se v3=true allora v1=v2.
  6. Se v3=false allora v1=¬v2.
  7. Se v1=v2 allora v3=true.
  8. Se v1=¬v2 allora v3=false.
  9. Se v1=v3 allora v2=true.
  10. Se v1=¬v3 allora v2=false.
  11. Se v2=v3 allora v1=true.
  12. Se v2=¬v3 allora v1=false.

Propagazione

Le regole delle triple permettono di aggiungere nuove equazioni che possono essere utilizzate a loro volta. Questo meccanismo ricorsivo si chiama propagazione.

Refutazione

Nel processo di propagazione si parte da un ambiente iniziale (una collezione di equazioni) e si aggiungono nuove equazioni. Può capitare che una nuova equazione sia in contraddizione con il suo ambiente. Per esempio, la regola 1 della tripla equivalente dice di aggiungere l'equazione v1=v2 ma forse abbiamo già nell'ambiente che v1=¬v2. Il fatto di avere una contraddizione vuole semplicemente dire che l'ambiente iniziale era impossibile.

Il fatto che le contraddizioni siano possibili dà un metodo per provare le tautologie. Si può assumere nell'ambiente iniziale che la formula è falsa e se usando la propagazione risulta una contraddizione, si può concludere che la formula è una tautologia.

Questo metodo è sufficiente per provare che il nostro esempio è una tautologia. Neghiamo la variabile che rappresenta la formula ¬v11=false

Esercizi

D3. Definire un tipo di dato per rappresentare l'ambiente (la collezione di equazioni). Su tale tipo, definire le funzioni:

D4. Scrivere una funzione propagate che prende un ambiente e due variabili v1 e v2 e fa la propagazione dell'equazione v1=v2.

Dilemma

Regola del dilemma

La vera originalità dell'algoritmo di Stålmarck consiste nel non fare un'esplorazione esponenziale. Si creano due rami sui quali si fa la propagazione. A questo punto non si itera ma si calcola semplicemente l'intersezione:

Sappiamo che S3 contiene S ed S4 contiene S. Dunque l'intersezione contiene almeno S: si può solo guadagnare informazione.

Se S3 è una contraddizione, allora l'intersezione è S4.

Se S4 è una contraddizione, allora l'intersezione è S3.

Se S3 e S4 sono contraddizioni, allora l'intersezione è una contraddizione.

Iterazione

Si può fare un'iterazione dell'applicazione della regola del dilemma su tutte le variabili possibili fino a quando non vi sia una nuova informazione da guadagnare:

Ricorsione

Finalmente si può usare l'iterazione precedente in maniera ricorsiva usando un livello di profondità n. Dopo la creazione dei rami, se n vale 1, usiamo la propagazione (come descritta nella regola del dilemma). Se n non vale 1, usiamo la stessa iterazione ma questa volta al livello n-1. Per esempio per n=2 abbiamo:

La proprietà interessante è che n=2 è normalmente sufficiente per sapere se la formula è una tautologia. Se usiamo n=numero di variabili, questo algoritmo è equivalente a quello di Davis.

Esempio

Prendiamo la formula

(v1 ∧ v2) ∨ ((v1 ∧ ¬v2) ∨ ((¬v1 ∧ v2) ∨ ((¬v1 ∧ ¬v2))))

Espandiamo le congiunzioni:

¬(¬(v1 ∧ v2) ∧ (¬(v1 ∧ ¬v2) ∧ (¬(¬v1 ∧ v2) ∧ ¬(¬v1 ∧ ¬v2))))

La lista delle triple è:

  1. v9=¬v3∧v8
  2. v8=¬v4∧v7
  3. v7=¬v5∧¬v6
  4. v6=¬v1∧¬v2
  5. v5=¬v1∧v2
  6. v4=v1∧¬v2
  7. v3=v1∧v2
Il valore della formula iniziale è quello di ¬v9. Partiamo di ¬v9=false. La propagazione non permette di concludere: Alla fine sappiamo che

v9=v8=v7=true e v6=v5=v4=v3=false. Per concludere bisogna fare una dilemma su v1.

Caso v1=true

Caso v1=false

L'intersezione di una contraddizione e una contraddizione è una contraddizione. Abbiamo una contraddizione. Dunque la formula initiale è una tautologia.

Esercizi

D5. Scrivere una funzione get_intersect che calcola l'intersezione di due ambienti.

D6, Scrivere una funzione stal che, dati un livello d'iterazione ed una formula, utilizza l'algoritmo di Stålmarck per sapere se la formula è una tautologia.


Laurent Théry

Last modified: Tue Apr 30 01:38:21 MEST 2002