martedì, settembre 16, 2008

De memoris

In questo post sul blog che tengo con due miei cari amici si è sviluppata una interessante discussione sulla differenza fra la memoria procedurale e la memoria dichiarativa.

Stavo riflettendo che in matematica c'è un'interessante analogia che riguarda la definizione delle funzioni.

Cos'è una funzione? (Versione dichiarativa)

La risposta rigorosa, diciamo Bourbakistica è questa.

Definizione
Una funzione è una terna (A,B,R) dove A e B sono insiemi e R è un sottoinsieme del prodotto cartesiano A x B tale che se (a,b) e (a',b') sono in R, allora b=b'

L'idea sottesa a questa definizione è che una funzione altro non è che una lista, che accanto ad ogni valore della variabile indipendente (gli a in A) riporta uno ed un solo valore della variabile dipendente (il b in B tale che (a,b) in R).

Definire una funzione in questa maniera è rigoroso e utile. Tuttavia non corrisponde alla maniera in cui pensiamo. Quando definiamo una funzione, infatti, pensiamo a delle operazioni da eseguire, e non ad una lista di valori!

Cos'è una funzione? (Versione procedurale)

La risposta intuitiva, empirica, è quella che si dava nel 1800. Una funzione è una legge di associazione. Una funzione è definita se per ogni valore x so calcolare f(x).

Vantaggi e svantaggi

Cominciamo coi vantaggi della maniera procedurale. I vantaggi della maniera dichiarativa li sappiamo: è la maniera rigorosa con la quale si fa matematica.

Però pensiamo adesso di voler definire la funzione quadrato, cioè f(x):=x**2. Se vogliamo definirla in maniera dichiarativa, dobbiamo decidere in quali insieme tale funzione deve vivere. Dobbiamo scrivere, ad esempio, f:R-->R, f(x)=x**2 se vogliamo parlare del quadrato nei numeri reali, f:C-->C, f(x)=x**2 se vogliamo parlare del quadrato nei numeri complessi. Un po' complicato, no?

Ovviamente possiamo salvarci definendo f:A-->A, f(x)=x*x, dove A è uncampo, ma non è questo il punto. Il punto è che non possiamo dire: sia f(x)=x*x ogni qualvolta abbia senso, perchè staremmo quantificando su l'insieme totale che contiene tutte le strutture algebriche.

Fin qua è solo un problema formalistico, quasi di estesi. Un problema più grave si presenta nel caso in cui alla mia funzione definita in maniera procedurale non corrisponda nessuna funzione dichiarativa. Fissiamo una funzione continua f a valori reali. Decidiamo di definire la funzione g tramite l'operazione

g(x) = lim n(f(x+1/n)-f(x))

Ovviamente questo limite può esistere o non esistere. (O scelto di prendere il limite rispetto a n invece della definizione normale di derivata per evitare polemiche del tipo: ma guarda che non puoi definire il limite di una funzione se la funzione non è definita in maniera dichiarativa, etc...)

Il problema adesso è che non è possibile definire g in maniera dichiarativa, se non applicando una sorta di ragionamento circolare: trovo l'insieme D dove il limite esiste, e poi scrivo

g: D-->R, g(x) := lim n(f(x+1/n)-f(x))

In pratica, la definizione dichiarativa di g deve contenere la definizione procedurale di g. Poco soddisfacente.

Nessun commento: