I problemi del linguaggio naturale

Il linguaggio natiurale contiene una serie di ambiguita’ che gli elaboratori non sono in grado di risolvere in maniera corretta. In alcuni casi i programmatori possono incorrere in errori di interpretazione: secondo me il 90% degli errori di programmzione in programmi “seri” dipende proprio da questa difficolta’ di tradurre il linguaggio naturale in linguaggio logicamente corretto.

Supponiamo di avere da tradurre la seguente frase in una espressione logica:
“La sirena di allarme si deve attivare quando c’e’ l’allarme incendio e quando non c’e’ l’allarme incendio ma c’e’ quello di allagamento”.
Sicuramente non e’ una frase correttissima ma e’ sicuramente comprensibile, ci indica che ci sono due condizioni di attivazione della sirena e ce le spiega, anche se in un modo un po’ tortuoso.
Una possibile traduzione deve partire prima dall’individuazione dei “dati” e del “risultato”: nel nostro caso abbiamo come dati due sensori di allarme, quello per l’incendio (che indicheremo con AI) e quello per l’allagamento (AA). Come risultato avremo l’attivazione della sirena (S).
In tutti e tre i casi si tratta di grandezze booleane (cioe’ che possono essere solo vere o false).
La nostra espressione logica sara’ quindi qualcosa del tipo:

S = “una espressione logica con AI e AA”

Proviamo, a partire dalla frase iniziale, a scrivere l’espressione logica:

S = AI and ( (not AI) and AA)

Abbiamo indicato con and, not e di nuovo and i connettivi logici che sembrano legare i diversi argomenti.
Ai fini di verificare se l’espressione rappresenta davvero quello che vogliamo ottenere scriviamo la Tabella di Verita’.
Con un po’ di pazienza otterremo:

AI AA not AI (not AI) and AA S
F F V F F
F V V V F
V F F F F
V V F F F

Come si vede la sirena, qualunque siano le condizioni degli allarmi, rimane spenta!

Il motivo di questo problema e’ che la frase inziale, pur comprensibile nel nostro modo di parlare corrente, con e’ corretta logicamente: in particolare, la prima congiunzione “e” vorrebbe far intendere che ci sono due condizioni di attivazione della sirena, ma deve essere invece interpretata come una “o”, intendendo che la sirena si deve attivare sia nel primo che nel secondo caso.
Se sostituiamo la and con la or otteniamo l’espressione corretta:

S = AI or ( (not AI) and AA)

Se ora facciamo lo stesso procedimento otteniamo una nuova tabella di verita’:

AI AA not AI (not AI) and AA S
F F V F F
F V V V V
V F F F V
V V F F V

Come si vede la sirena ha come tabella di verita’ quella di una or, quindi possiamo semplificare l’espressione togliendo i termini che, nella frase inziale, ci avevavo fuorviato:

S = AI or AA

Riepilogando, abbiamo visto:

  1. che a volte il linguaggio naturale e’ ambiguo (la prima e era in realta’ una o logica) e ridondante (nella seconda parte l’allarme incendio non attivo e’ inutile);
  2. che per verificare il funzionamento e ottimizzare le espressioni logiche occorre realizzare la tabella di verita’ e verificare che il comportamento sia quello che ci aspettiamo.

Nella pratica chi svolge i programmi non e’ spesso consapevole del dettaglio del “sistema” su cui il programma dovra’ operare: sara’ cura della prima fase di analisi, svolta insieme al cliente, a cercare di togliere le ambiguita’ nella descrizione delle fuinzioni richieste e sara’ cura di chi esegue il test finale verificare che il comportamento del programma sia quello che ci si aspetta.
La stragrande maggioranza dei malfunzionamenti software sono errori nella scrittura di espressioni logiche. E non c’e’ calcolatore al mondo che possa individuarle da solo!

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...