BIOINFORMATICA
BIOINFORMATICA
Elementi di informatica applicata
OBO-edit
AmiGO
Protein2GO
DAVID
gian franco greppi
1
BIOINFORMATICA
I diritti di traduzione, memorizzazione elettronica, riproduzione e di adattamento totale o
parziale con qualsiasi mezzo sono riservati in tutti i paesi.
L’editore potrà concedere a pagamento l’autorizzazione a riprodurre un numero di pagine
non superiore al 15% delle pagine del presente volume. Le richieste vanno inoltrate a
Associazione Italiana per i Diritti di Riproduzione delle Opere dell’Ingegno (AIDRO).
Via delle Erbe 2, 20121 Milano Tel. e Fax 02-809506
Quando, ai sensi dell’art. 181 ter 1.633/1941, acquisterà efficacia il nuovo testo dell’art. 68,
co. 41. 633/1941 introdotto dall’art. 2 1 248/2000, la riproduzione a mezzo di fotocopia
potrà essere effettuata per uso personale (cioè privato ed individuale) con pagamento da
parte del responsabile del punto (o centro) di fotocopia a SIAE del compenso di legge.
L’editore, per quanto di propria spettanza, considera rare le opere fuori dal proprio catalogo
editoriale. La riproduzione a mezzo di fotocopia degli esemplari esistenti nelle biblioteche di
tali opere è pertanto consentita, senza limitazioni di quantitativi. Non possono considerarsi
rare le opere di cui esiste, nel catalogo dell’editore una successiva edizione, le opere
presenti in cataloghi di altri editori o le opere antologiche.
Edizione in Stampa Digitale Global Print ottobre 2010
Ristampa
La realizzazione di un libro scientifico è un’operazione complessa, che richiede numerosi
controlli: sul testo, sui caratteri, sulle immagini e sulle relazioni che si stabiliscono tra essi.
L’esperienza ci insegna che è praticamente impossibile pubblicare un libro privo di errori.
Saremo grati ai lettori che vorranno segnalarceli. Nell’eventualità che passi, citazioni o
illustrazioni di competenza altrui siano riprodotti in questo volume, l’editore è a disposizione
degli aventi diritto non potuti reperire.
2
BIOINFORMATICA
INDICE
3
BIOINFORMATICA
4
BIOINFORMATICA
INTRODUZIONE
Il testo si propone di introdurre lo studente ad un recente settore di applicazione
dell'Informatica noto come Bioinformatica o Biologia Computazionale: questa nuova
disciplina è nata dalla recente necessità di sviluppare adeguati strumenti computazionale per
la soluzione dei molteplici problemi della biologia. L'obiettivo del testo è quello di fornire allo
studente le conoscenze di base e algoritmiche per poter affrontare alcuni problemi classici in
ambito delle produzioni animali.
Cos'è la Bioinformatica? Partiamo considerando il termine "Biocomputing" è un termine di
difficile traduzione, anche perché la tradizione scientifica anglosassone in questa area di
ricerca si discosta notevolmente da quella italiana. "Biocomputing" viene spesso utilizzato in
alternativa ad altri termini quali "Computational Biology" e "Biological Informatics", il cui
significato è per certi versi largamente sovrapponibile. Il termine italiano che meglio lo
traduce è "Bioinformatica". La Bioinformatica può essere definita come l'insieme degli
strumenti e algoritmi informatici, delle relative applicazioni e delle ricerche di base e
applicate che possono essere sviluppate tramite di essi nei diversi settori della biologia e
della medicina. La ricerca nel comparto biomedico, da come ci appare attraverso la lettura
delle grandi riviste scientifiche, si trova associata in modo quasi irreversibile alle Scienze
dell’Informazione. L’analisi dei dati raccolti, su popolazioni animali, umane o vegetali non è
pensabile senza il ricorso massiccio agli strumenti informatici. La ricerca di base in biologia
rimane fondamentale; basti citare la modellizzazione molecolare, l’analisi e la costruzione
delle banche dati gnomiche o proteomiche, le previsioni epidemiologiche… Il ruolo centrale
della bioinformatica nelle scienze della vita implica delle esigenze simili a quelle che si
ritrovano negli altri campi del sapere. Sono ad esempio oggetto della Bioinformatica le
banche dati utilizzate per l'archiviazione di dati utili alla ricerca biomedica, così come i
software necessari per la loro interrogazione. Sono soprattutto le applicazioni che
consentono di analizzare questi dati, confrontandoli tra loro o individuando ed estraendo
informazioni originali in maniera automatica sulla base delle nuove teorie biologiche. Le
finalità possono essere diverse, ad esempio classificazione tra soggetti normali e patologici,
ricerca di valori fuori norma, creazione di modelli esplicativi, fino alle analisi statistiche più
complesse. La realtà è complessa e per questo appare strutturata in livelli di organizzazione
che presentano proprietà particolari rappresentate da uno specifico linguaggio con proprie
regole sintattiche e semantiche. La distinzione dei livelli è chiaramente arbitraria ed è stata
"creata" dalla comunità degli scienziati della disciplina pertinente. La realtà dei linguaggi
delle scienze è largamente convenzionale, con l'evolversi delle conoscenze possono nascere
nuove discipline scientifiche e possono crearsi nuovi livelli di conoscenza e di linguaggio tra
due livelli preesistenti (Biologia molecolare si inserisce tra la chimica e la biologia cellulare).
Possiamo chiederci come siano in generale questi linguaggi e come si articolino tra loro.
Dobbiamo dichiarare come i linguaggi superiori non siano interamente riconducibili a quelli
inferiori. I linguaggi sono tra loro compatibili (esistono evidentemente dei vincoli reciproci da
rispettare sostanzialmente per intendersi) ma le preposizioni del linguaggio che spiega le
proprietà degli oggetti di un dato livello non possono essere sostituite da proposizioni del
linguaggio che spiegano le proprietà degli elementi del livello inferiore. Ad esempio le
proposizioni della biologia molecolare non possono essere espresse mediante il formalismo
della meccanica quantistica.
BIOINFORMATICA & BIOLOGIA. L'informatica ha dato un contributo fondamentale allo
sviluppo delle discipline biologiche. Le tecnologie e le innovazioni usate hanno fornito degli
strumenti di indagine clinica completamente nuovi. 3D reconstruction, multimodal and
5
BIOINFORMATICA
image matching, decision supporting system ed intelligent data analysis sono soltanto alcuni
dei campi di applicazione dell'informatica nel comparto scientifico. Non c'è tecnologia
informatica o approccio informatico alla risoluzione di problemi, anche apparentemente
astratti, che non abbia avuto una ricaduta notevole nel campo medico. L'elenco è senza fine,
dall'image processing alla grafica virtuale, dall'elaborazione in tempo reale di segnali al
riconoscimento automatico di patologie, dalla ricostruzione di immagini 3D ai problemi di
archiviazione di dati ed immagini, dai problemi di sicurezza e riservatezza agli algoritmi di
analisi, visualizzazione e compressione di dati fino ai metodi di classificazione e
discriminazione, per arrivare all'intelligenza artificiale, ai sistemi di decision supporting
system ed al data mining.
Ruolo dell'informatica. La base di partenza di tutti i sistemi informatici applicati al campo
biologico sono i dati che vengono trattati. I dati o segnali sono un mezzo per convogliare
delle informazioni provenienti da diversi tipi di sorgente. Su tali informazioni vi sono poi due
livelli distinti di trattamento, uno prettamente di elaborazione e l'altro, a più alto livello, di
gestione, comunicazione e memorizzazione. Si possono quindi distinguere due grandi settori
di applicazione dell'informatica applicata, ovvero, elaborazione e sistemi informativi. Nel
settore dell'elaborazione le aree di interesse comune fra informatica e medicina sono tante e
possono essere raggruppate in modi diversi. In particolare, suddividendo queste aree
secondo un criterio legato al tipo di dati che vengono trattati, si possono individuare tre
filoni principali:
elaborazione immagini
elaborazione dati
elaborazione biosegnali
In genere, i settori dediti all'elaborazione trattano i metodi per l'acquisizione, l'analisi e
l'interpretazione diretta delle informazioni contenute nei dati. Questo tipo di analisi, viene di
norma eseguita immediatamente dopo il momento dell'acquisizione e generalmente nello
stesso luogo in cui avviene l'acquisizione. Coniugare una scienza sperimentale come la
biologia e le metodiche, le tecnologie razionali derivanti dall'informatica è stata una delle più
grandi rivoluzioni silenziose dei nostri tempi. Molti informatici, consapevolmente o meno,
stanno contribuendo attivamente a questa rivoluzione.
gian franco greppi
6
BIOINFORMATICA
BIOINFORMATICA
La bioinformatica è una disciplina scientifica dedicata alla risoluzione di problemi biologici a
livello molecolare con metodi informatici. Essa costituisce un tentativo di descrivere dal
punto di vista numerico e statistico i fenomeni biologici: storicamente ed
epistemologicamente la biologia ha fatto minor ricorso ad un approccio matematico rispetto
ad altre discipline scientifiche (quali fisica e chimica). La bioinformatica quindi tenta di
supplire a questa lacuna fornendo ai risultati tipici della biochimica e della biologia
molecolare un corredo di strumenti analitici e numerici. Vengono coinvolte, oltre
all'informatica, la matematica applicata, la statistica, chimica e biochimica e nozioni di
intelligenza artificiale.
La bioinformatica principalmente si occupa di:
fornire modelli statistici validi per l'interpretazione dei dati provenienti da
esperimenti di biologia molecolare e biochimica al fine di identificare tendenze e
leggi numeriche
generare nuovi modelli e strumenti matematici per l'analisi di sequenze di DNA,
RNA e proteine al fine di creare un corpus di conoscenze relative alla frequenza di
sequenze rilevanti, la loro evoluzione ed eventuale funzione.
organizzare le conoscenze acquisite a livello globale su genoma e proteoma in basi
di dati al fine di rendere tali dati accessibili a tutti, e ottimizzare gli algoritmi di
ricerca dei dati stessi per migliorarne l'accessibilità.
L'evoluzione storica della bioinformatica, che inizialmente si occupava principalmente dello
studio del DNA e RNA, ha portato ad un così vasto uso dell'informatica in molti settori della
biologia che è stato coniato il nuovo termine, ormai universalmente accettato, di Biologia
Computazionale che esplicita con maggior chiarezza e precisione i reali e più vasti contenuti
scientifici e disciplinari del connubio tra informatica e biologia nel XXI secolo
In questo ambito la Bioinformatica si occupa dell’acquisizione, memorizzazione,
distribuzione, analisi e interpretazione dei dati prevalentemente nell’ambito della biologia
molecolare, della genetica e della biochimica con collegamenti sempre più importanti con la
medicina.
Scopi della Bioinformatica sono quelli di fornire in tempi rapidi le informazioni e le
metodologie d’indagine, che consentano ad esempio di fornire alla scienza medica le
necessarie informazioni per comprendere i meccanismi alla base di tutte le possibili
disfunzioni. In quest’ottica, i metodi e gli strumenti messi a disposizione dalla Bioinformatica
giocano un ruolo fondamentale nello sviluppo delle biotecnologie.
L’investimento di Stati Uniti, Canada, Giappone e Russia nella Bioinformatica è mirato
soprattutto alla creazione di centri, reali o virtuali, che provvedano servizi e conoscenza alla
comunità mentre, allo stesso tempo, spingono in nuove direzioni grazie ad attività di ricerca
avanzate.
Lo sviluppo di piccole e medie aziende con finalità bioinformatiche in Europa è, come ci si
può aspettare, proporzionale all’investimento in ricerca dei vari Stati e quindi molto attivo in
Inghilterra, Francia, Germania, in crescita in Spagna, Olanda e paesi nordici.
L’Italia è ben collocata nel panorama europeo dal punto di vista scientifico, anche se le
risorse limitate rispetto soprattutto a Germania e Regno Unito hanno finora reso difficile
l’implementazione di progetti indipendenti a grande respiro e di risonanza internazionale.
Oggi si è creata un’enorme attesa, soprattutto negli Stati Uniti, in Canada e in Giappone per
un impatto economico crescente della bioinformatica. Stime conservative fanno assumere
che la Bioinformatica solo negli Stati Uniti permetterà di generare almeno 7 miliardi di dollari
nei prossimi tre anni e che il mercato crescerà del 20% entro il 2006.
7
BIOINFORMATICA
L’Italia per poter mantenere il passo in un settore altamente strategico deve prevedere
misure di potenziamento della bioinformatica nel settore biotecnologico, biomedico e
sanitario operando sui seguenti piani distinti:
• la ricerca,
• lo sviluppo dei sistemi,
• l’infrastruttura operativa,
• le applicazioni bioinformatiche nella clinica quotidiana,
• la formazione.
L’obiettivo è quello di creare le condizioni per uno sviluppo omogeneo del settore della
bioinformatica ed è quindi necessario che le azioni che si intraprendono su questi piani siano
a ricaduta immediata.
Bioinformatica. La biologia e la medicina hanno da sempre cercato di studiare l’organismo
umano a tutti i livelli sia morfologico e sia funzionale per il miglioramento della salute
umana.. Con l’introduzione delle più moderne tecnologie di biologia molecolare si sono
iniziati a comprendere meglio le regole d’espressione genetica ed i vari passaggi metabolici e
sia la struttura del DNA, RNA e delle proteine.
Questa enorme complesso d’informazioni, consentirà di comprendere il flusso delle
informazioni che governano il passaggio dal Genoma al Fenotipo di un organismo. Un utilizzo
appropriato di questi dati associate ad appositi programmi d’analisi, porterà nuove
possibilità per la comprensione dell’espressione dei geni, la loro regolazione e le malattie
genetiche a loro correlate in caso di mutazioni o disfunzioni metaboliche. La disciplina che si
occupa di queste problematiche per trattamento dell’informazione biologica a tutti i livelli è
la Bioinformatica.
La Bioinformatica si occupa, quindi, dell’acquisizione, memorizzazione, distribuzione, analisi
e interpretazione dei dati prevalentemente nell’ambito della biologia molecolare con
collegamenti sempre più importanti con la medicina. Questa nuova disciplina scientifica
utilizza metodi di matematica, informatica, biologia, medicina, fisica allo scopo di migliorare
la comprensione dei fenomeni biologici. Di seguito, si elenca a titolo alcuni dei principali
obiettivi della Bioinformatica:
• Sviluppo di strumenti per la generazione ed il mantenimento dell’informazione proveniente
alle varie fonti: mappa fisica, mappa genetica, mappa cromosomica, mappa citogenetica,
polimorfismi, e l’informazione relativa alle sequenze genomiche e proteiche etc.;
• Raccolta e organizzazione delle informazioni genetiche associate alle patologie mediche;
• Sviluppo di programmi di calcolo per l'analisi delle sequenze;
• Sviluppo d’interfacce grafiche in grado di visualizzare in maniera efficace l’informazione
richiesta;
• Sviluppo di metodi software che consentano di agevolare tutte le fasi dei progetti;
• Sviluppo di strutture per database specializzate ed integrate;
• Sviluppo di strumenti informatici, includendo software e hardware e algoritmi per
l’organizzazione e l’analisi dei dati;
• Realizzazione di standard per lo scambio e la descrizione dei dati;
• Realizzazione di una rete dati per la raccolta la distribuzione e l’aggiornamento costante di
tutta ’informazione prodotta;
• Raccolta della bibliografia, brevetti e altri database di supporto all’informazione specifica;
• Predizione dei geni nelle sequenze di DNA;
• Predizione delle strutture tridimensionali delle proteine partendo dalle sequenze primarie;
• Predizione delle funzioni biologiche e biofisiche sia dalle sequenze e sia dalle strutture;
• Simulazione dei processi metabolici e cellulari basati su queste funzioni.
• Realizzazioni di sistemi per la correlazione dell’informazione in sistemi biologici complessi.
Da questo elenco risulta evidente che uno dei principali scopi della Bioinformatica è di fornire
in tempi rapidi le informazioni e le metodologie d’indagine, che consentano ad esempio di
fornire alla scienza medica le necessarie informazioni per comprendere i meccanismi alla
base di tutte le possibili disfunzioni d’origine genetica. Dalle mutazioni in regioni funzionali
del DNA, alla ancata produzione di una certa proteina a causa di un anomalo funzionamento
dei fattori di trascrizione, fino a comprendere il funzionamento d’ogni singolo gene in
8
BIOINFORMATICA
relazione con gli altri geni nei diversi processi metabolici che continuamente avvengono nel
corso dell’intera vita.
L’industria farmaceutica utilizza queste informazioni e metodologie e conoscenze al fine di
produrre medicine, proteine specifiche e terapie geniche in grado di intervenire in maniera
selettiva per risolvere le possibili cause di malattie.
Inoltre la gran parte dei prodotti genici del genoma umano ha più di una funzione, in alcuni
casi addirittura in antagonismo con altre. È per questo necessario identificare i modelli
quantitativi che stanno alla base di questi processi. In quest’ottica i metodi e i programmi
messi a disposizione dalla Bioinformatica giocano un ruolo fondamentale nello sviluppo delle
biotecnologie.
Stato dell’arte - Cenni storici. Già alla fine degli anni Settanta risultava chiaro che non ci
poteva più affidare alla capacità dei singoli gruppi di ricerca per immagazzinare e
organizzare i dati biologici e che occorreva uno sforzo informatico per sfruttarne le
potenzialità.
L’Europa coglie quest’occasione con grande tempismo e per prima: la banca dati dell’EMBL
nasce nel 1980, mentre gli Stati Uniti dovranno attendere il 1986 per fondare il National
Center for Biotechnology Information, depositario della banca dati GenBank.
Negli anni immediatamente successivi, anche il primo Dipartimento di Ricerca in
Bioinformatica, il Biocomputing Group dell’EMBL, nasce in Europa. Il programma di cui fanno
parte Arthur Lesk, Chris Sander e Pat Argos sfocerà nel 1996 nella fondazione dell’EBI
(European Bioinformatics Institute di Hinxton, Cambridge) che è oggi tra i punti di
riferimento più importanti della bioinformatica mondiale, ma soprattutto addestra giovani
ricercatori in questa nuova disciplina. Al Biocomputing dell’EMBL e ai gruppi di
Bioinformatica strutturale di Cambridge, guidati, tra gli altri, da Sir Tom Blundell, Janet
Thornton e Cyrus Chothia, devono il loro ingresso alla bioinformatica molti, se non tutti, i
gruppi di riferimento europei.
Le competenze dei gruppi pionieri di questa disciplina sono oggi affiancate da scuole più
“informatiche” che le completano e rendono la bioinformatica un punto di forza della ricerca
Europea che va assolutamente coltivata e incoraggiata.
Situazione Internazionale. L’investimento di Stati Uniti, Canada e Giappone nella
Bioinformatica è mirato soprattutto alla creazione di centri, reali o virtuali, che provvedano
servizi e conoscenza alla comunità mentre, allo stesso tempo, spingono in nuove direzioni
grazie ad attività di ricerca avanzate. Gli Stati Uniti riconoscono che anche solo il
mantenimento dei sistemi attualmente in uso richiede aumenti di investimenti. L’NCBI
(National Center for Biotechnology Information) è un esempio eclatante, un incremento degli
investimenti di circa il 10% annuo è necessario solo per mantenere l’attuale livello di servizi
e ricerca. Il personale ad oggi impiegato presso l’NCBI è vicino alle 400 unità.
Negli Stati Uniti soltanto, l’investimento economico nel settore della bioinformatica è
valutato intorno ai 500 milioni di dollari all’anno (la metà circa di quello mondiale) di cui i
due terzi sono delle grandi industrie farmaceutiche che si aspettano di ridurre i costi e i
tempi di sviluppo di un farmaco di circa il 30% grazie alle tecniche bioinformatiche. Questo
ha evidentemente aperto la strada ad un gran numero di società che forniscono software e
servizi alle grandi industrie farmaceutiche, tra cui per esempio Accelerys, Applied
Biosystems, DNAStar, Informax, Genamix, Rosetta (poi acquisita dalla Merck), ecc.
Situazione Europea. L’EBI European Bioinformatics Institute rimane oggi un punto focale
della bioinformatica europea, ma gruppi di dimensioni e impatto notevole sono presenti in
praticamente tutti i paesi dell’Unione.
Il Regno Unito ha per esempio tenuto alto il suo livello negli aspetti strutturali, con gruppi
di grande competenza e fama all’MRC di Cambridge, al King’s College e allo University
College di Londra, affiancati da gruppi che si occupano di analisi genomiche non solo in
Inghilterra ma anche in Scozia ed Irlanda. Alcuni dei più noti gruppi di ricerca hanno dato
vita a vari spin-off (vedi Inpharamatica). Lo sviluppo della bioinformatica in Inghilterra
9
BIOINFORMATICA
avviene anche grazie al regolare interesse dell’agenzia di finanziamento Wellcome Trust per
la genomica che si traduce in sostanziali investimenti in bioinformatica ad esempio presso il
Sanger Centre a Cambridge.
La Germania sta dando vita ad un aggressivo programma di training con lauree di primo e
secondo livello in Bioinformatica in varie città. Ad oggi sono stati attivati 34 nuovi cattedre
universitari in Bioinformatica. Ci si aspetta che questo dia un grande impulso alla ricerca
che, in questo paese, si sta concentrando sull’analisi genomica, sulla genomica funzionale e
sulla biologia dei sistemi. Esistono Max Planck Institut e grandi dipartimenti interamente
dedicati alla Bioinformatica, per esempio il Max Planck di Berlino, Monaco e il Centro di
Bioinformatica di Saarbrueken.
In Spagna vi sono alcuni gruppi estremamente interessanti, soprattutto all’interno del
Consiglio Nazionale delle ricerche a Madrid e del Genome Informatics Research Laboratory di
Barcellona, centro che si sta affermando come uno dei punti cardine per la ricerca e
caratterizzazione dei geni umani per via bioinformatica. In Spagna è stato istituito un
“Istituto Virtuale di Bioinformatica” che coinvolge la maggior parte dei gruppi spagnoli.
L’Istituto, pur essendo virtuale dal punto di vista logistico, è organizzato con Dipartimenti,
direttori, progetti, ecc. e rappresenta un interessante esempio di cooperazione nazionale
strutturata e gestita managerialmente.
Anche il Portogallo ha iniziato un programma educativo in Bioinformatica, ancora agli inizi
ma che sta coinvolgendo docenti da tutta Europa.
In Francia, presso l’Istituto Pasteur ed il CNRS, sono attivi diversi gruppi dedicati alla
Bioinformatica.
La Svizzera si è conquistata un posto centrale nel panorama bioinformatico grazie al SIB Swiss Institute for Bioinformatics, iniziatore della lodevole iniziativa della banca dati
SwissProt, e che oggi è un partner essenziale dell’EBI nell’area della banche dati nell’area
della proteomica.
In Olanda, Svezia, Finlandia, Belgio operano gruppi di bioinformatica di ottimo livello
scientifico, generalmente derivanti da quell’iniziale gruppo dell’EMBL di cui si è discusso
precedentemente. Un discorso a parte merita la Danimarca che, avendo dato il via al
“Centre for Biological Sequence Analysis”, è riuscita a conquistarsi un ruolo centrale nella
bioinformatica europea partecipando alla maggior parte dei progetti di finanziamento
comunitari nella disciplina, ancora una volta dimostrando l’importanza di una sinergia di
sforzi coordinati. Va inoltre menzionato quanto sta accadendo nei paesi dell’est europeo
(specialmente Polonia ma anche Lituania) il rientro di alcuni ricercatori formatisi negli
Stati Uniti ha permesso di organizzare gruppi di ricerca che, nell’arco di qualche anno, sono
già entrati a far parte dell’establishment scientifico in bioinformatica.
Lo sviluppo di piccole e medie aziende con finalità bioinformatiche in Europa è, come ci si
può aspettare, proporzionale all’investimento in ricerca dei vari Stati e quindi molto attivo in
Inghilterra e in Germania, e in crescita in Spagna.
L’Unione Europea con il VI e poi VII PQ dell’UE, nella linea Scienze della Vita, Genomica e
Biotecnologie per la Salute - Genomica Avanzata e sue Applicazione per la Salute, ha come
obiettivo migliorare la comprensione e la decifrazione delle informazioni genomiche,
individuandone la funzione, la struttura e la relazione con la salute umana. In tale ambito,
uno dei risultati più attesi è creare gli strumenti informatici che permettano alla comunità
medico-scientifica e al mondo industriale di analizzare e utilizzare i dati sui genomi per lo
sviluppo di nuove terapie, medicinali e diagnosi sanitarie sempre più accurate. Ciò rientra in
un orientamento generale, che parla oramai di strumenti necessari a supportare la
cosiddetta medicina personalizzata (personalized healthcare).
Pertanto l’Unione Europea sta attuando un programma di finanziamento della bioinformatica
sia nel campo dello sviluppo di metodi (BioSapiens, IntAct, EMSD, ORIEL, EBIOSCIENCE,
ecc. ), sia delle tecnologie di supporto (BIOINFOGRID, EMBRACE, EGEE), sia
dell’applicazione della bionformatica all’area medica (INFOBIOMED, SYMBIOMATICS).
Situazione Nazionale. L’Italia è ben collocata nel panorama europeo dal punto di vista
scientifico, anche se le risorse limitate rispetto soprattutto a Germania e Regno Unito hanno
10
BIOINFORMATICA
finora reso difficile l’implementazione di progetti indipendenti a grande respiro e di risonanza
internazionale.
Poli molto attivi sia nella ricerca sia nello sviluppo in bioinformatica in Italia sono, per
esempio, Napoli, Roma, Milano, Bologna, Genova, Bari, Palermo, Padova, Treno, Trieste e
Cagliari.
L’aspetto forse più interessante del panorama italiano è che esso copre un largo spettro di
attività bioinformatiche, che vanno dall’analisi genomica alla genomica funzionale, dalla
predizione di strutture tridimensionali, dall’assegnazione funzionale alla predizione di
proprietà di prodotti genici, dai sistemi basati su GRID a metodi di intelligenza artificiale,
etc. In altre parole, dal punto di vista delle competenze, la bioinformatica italiana costituisce
un’opportunità forse unica per lo sviluppo di ricerca e tecnologia.
Molti dei gruppi italiani sono coinvolti in iniziative internazionali di vasto respiro, come
società internazionali, gruppi di lavoro, commissioni di valutazioni scientifiche, progetti
europei, iniziative educative. Sarebbe impossibile elencarle tutte, e soprattutto difficile
tenere traccia di tutte le attività in cui i bioinformatici italiani vengono coinvolti
continuamente. Il MIUR ha investito negli ultimi tre anni risorse finanziarie per un valore
complessivo di 32 Meuro destinate a iniziative scientifiche in ambito nazionale e
internazionale strettamente connesse all’area “Bioinformatica”.
Queste iniziative attualmente in corso possono essere così strutturate:
• Realizzazione di due laboratori nazionali in Bioinformatica pubblico-privato (FIRB 20032004) ai quali sono collegate unità di ricerca dislocate in varie località italiane. Il
finanziamento pubblico per queste iniziative programmate per un quinquennio d’attività è
pari a 8, 404 Meuro.
• Il MIUR, nell’ambito degli interventi CIPE per il Mezzogiorno ha destinato 10 Meuro per la
realizzazione di Laboratori pubblico-privati.
- Finanziamento di progetti di ricerca congiunti con centri e/o istituti di eccellenza di altri
Paesi (USA, Canada, UK, India, Cina, Russia, Israele), con una previsione di finanziamento
dell’ordine di 8 Meuro.
• Realizzazione del laboratorio di Bioinformatica previsto dall’accordo tra MIUR, Ministro per
l’Innovazione Tecnologica, Università degli Studi di Trento, Provincia di Trento e Microsoft.
Per tale iniziativa si prevede un impegno finanziario del FIRB pari a circa 4 Meuro.
Nonostante questo panorama interessante, le iniziative di trasferimento tecnologiche sono
rimaste eccessivamente ristrette e non si è finora sfruttato appieno questo patrimonio per
mancanza, a nostro parere, delle appropriate infrastrutture, di coordinazione e di adeguate
risorse. Il patrimonio di conoscenze accumulato da questi gruppi di ricerca e i giovani
ricercatori che sono impiegati e formati nei vari progetti, corre il rischio di essere
completamente vanificato nel giro di poco tempo, in mancanza di un programma a medio
lungo periodo. Le società che svolgono attività bioinformatiche in Italia sono infatti
pochissime, fra cui:
• SharDNA a Cagliari (che si occupa principalmente di genomica e quindi necessita di un
supporto bioinformatica per la gestione e l’analisi dei dati provenienti dallo studio di
popolazioni isolate).
• ProteoGenBio a Pisa.
• BioDec a Bologna.
Alcune industrie e centri di eccellenza universitaria hanno poi sviluppato al loro interno delle
competenze in Bioinformatica, tra queste la Chiron, l’IRBM (Laboratorio Merck in Italia), la
Glaxo, centri di eccellenza di ricerca CNR, Università, CISI, e poche altre realtà.
L’impatto economico prevedibile. C’è un’enorme attesa, soprattutto negli Stati Uniti, in
Canada, Giappone e Europa per un impatto economico crescente della bioinformatica, per
esempio grazie all’individuazione di nuovi agenti terapeutici e farmacologici ci si aspetta che
la bioinformatica sia in grado di aumentare il numero di bersagli terapeutici da circa 400 a
circa 4000 nei prossimi vent’anni e quindi, già solo grazie a questo, ci si aspetta che i
proventi dell’industria farmaceutica aumentino di un fattore mille. Stime conservative fanno
assumere che la Bioinformatica solo negli Stati Uniti permetterà di generare almeno 7
miliardi di dollari nei prossimi tre anni e che il mercato crescerà del 20% entro il 2009. E
questa è solo una della possibili applicazioni della bioinformatica che ci si aspetta abbia un
11
BIOINFORMATICA
impatto anche sullo sviluppo di vaccini, nuove biotecnologie, nanotecnologie, etc.. Gli
investimenti industriale in bioinformatica saranno almeno triplicati entro il 2010,
prevalentemente nel settore che cresce più velocemente, cioè quello del software di analisi e
banche dati specializzate.
Le necessità italiane nel campo della bioinformatica. Il mondo della bioinformatica
italiana ha le seguenti necessità:
• rafforzare il collegamento dell’industria con il mondo della ricerca sia universitaria che
degli Enti Pubblici di Ricerca come il CNR;
• sviluppare nuove metodologie per la gestione delle biobanche fra loro integrate;
• consentire un costante aggiornamento delle conoscenze in un settore altamente innovativo
come quello della System Biology applicata all’analisi dei dati generati dalla Genomica e
Proteomica di vari organismi;
• stimolare la crescita di nuove imprese nel settore della Bioinformatica applicata al settore
Biomedicale e Biotecnologico;
• offrire una base strategica per agevolare la formazione interdisciplinare di nuovi profili,
bioinformatici, biotecnologici e biomedici;
• stimolare l’interazione e l’integrazione delle iniziative già finanziate con i laboratori
pubblico-privati finanziati dal FIRB, FAR e dalle infrastrutture finanziate ad hoc per la
Bioinformatica;
• integrare le infrastrutture di calcolo adeguate alle esigenze che si stanno profilando nel
campo della Biologia, delle Biotecnologie, della Genetica e della Medicina;
• finanziare l’adesione dell’Italia a iniziative internazionali;
• finanziare un progetto congiunto per l'accessibilità di banche dati bibliografiche di interesse
internazionale;
• favorire l’interazione dei laboratori pubblico-privati con iniziative per lo sviluppo delle
applicazioni di GRID computing e calcolo avanzato nell’ambito Biomedico e ospedaliero in
Italia;
Per ottenere i precedenti obbiettivi il mondo della bioinformatica italiana ha necessità di
reperire personale giovane con un’adeguata formazione scientifica. Si riscontra, infatti, un
gap in biologia e informatica; la creazione di un percorso di studi che istruisca in entrambi
gli aspetti darebbe una risposta concreta alle esigenze del comparto industriale.
Le industrie operanti nel comparto delle biotecnologie hanno una forte dipendenza dalla
ricerca e ed il settore della bioinformatica e l’informatica medica non fanno eccezione. Un
importante vantaggio competitivo sarebbe rappresentato dalla possibilità di incrementare in
maniera sostanziale le collaborazioni sia a livello di ricerca di base che applicata. Aree di
interesse sono, ad esempio, la ricerca di nuovi sistemi ed algoritmi per l’identificazione
funzionale di geni e proteine, l’adozione di tecniche e strumenti per l’estrazione automatica
dell’informazione da basi di dati testuali quali ad esempio letteratura scientifica,
classificazione automatica delle proteine, sviluppo di strumenti per la definizione esecuzioni
di esperimenti “in silico” e la gestione automatica di flussi di lavoro soprattutto in
collegamento a sistemi di calcolo distribuiti.
Pertanto l’industria ha necessità di luoghi dove imprese, laboratori universitari, istituzioni
economiche e di ricerca operano a stretto contatto al fine di:
• Sviluppare ricerca fondamentale e a carattere applicativo;
• Mettere a punto nuove tecnologie, prodotti e processi;
• Valorizzare i risultati della ricerca e trasferire tecnologie e innovazioni al mondo
produttivo;
• Creare reti di cooperazione nazionali e internazionali;
• Sviluppare attività economiche e imprenditoriali ad alta intensità di conoscenza.
• In parole povere, occorrono centri di eccellenza capillarmente distribuiti sul territorio con
una serie di servizi (cataloghi del know-how e delle tecnologie pronte all’uso, panel di esperti
e consulenti, seminari e workshop, etc.) per estendere e sviluppare i cosiddetti CLUSTER e
Reti tematiche.
Il sempre maggior costo per lo sviluppo di nuovi farmaci e le barriere economiche all’accesso
a tali prodotti per i paesi poveri stanno forzando la ricerca di nuove vie per risolvere questi
12
BIOINFORMATICA
problemi. Ad esempio, l’adozione dei concetti alla base della “Translational Medicine”, dove
tutti i processi industriali di ricerca, sviluppo, test e produzione sono orientati al
paziente/gruppo/etnia oggetto del prodotto, necessitano in sempre maggior misura della
integrazione fra dati genomici, proteomici e le informazioni contenute nelle biobanche.
Inoltre sviluppare ed adottare considerazioni etiche volte a minimizzare ed ottimizzare l’uso
della sperimentazione sia sulla gestione dei dati sensibili nell’uomo e sia nell’utilizzo della
sperimentazione animale.
La presenza di infrastrutture operative di riferimento e l’adozione di standard internazionali
sono fondamentali sia per la ricerca che per l’industria. Un ambiente di riferimento permette
una pianificazione degli investimenti più precisa, facilita le collaborazioni sia tra industrie che
con il mondo della ricerca accademica, assicura i necessari livelli di sicurezza nel trattamento
ed accesso ai dati garantendo la sicurezza della Proprietà Intellettuale delle singole aziende.
Infatti per mantenersi al livello presente non basta però più il lavoro di gruppi indipendenti:
l’aumento enorme dei dati disponibili rende oggi essenziale la presenza di infrastrutture e,
soprattutto di risorse che oggi sono più carenti in Europa rispetto agli Stati Uniti e al
Giappone. L’industria ha necessità di reperire personale giovane con un’adeguata formazione
scientifica. Si riscontra, infatti, un gap tra biologia ed informatica; la creazione di un
percorso di studi che cumuli entrambi gli aspetti darebbe una risposta concreta alle esigenze
del comparto industriale.
Nell’ambito di una sanità “Informata e Formata” sulle specifiche ricerche di Bioinformatica
è doveroso sensibilizzare i medici di medicina generale, biologi e altri operatori interessati
alla materia, su argomenti che possano essere applicati alla pratica clinica.
Da qui nasce la necessità di sviluppare un adeguato programma di formazione per gli
operatori del Servizio Sanitario, che potrebbe essere collegata al sistema dell’ECM
Educazione Continua in Medicina programma voluto dal Ministero della Salute.
Le possibili linee d’intervento. Al fine di potenziare il ruolo dell’informatica nelle
biotecnologie della salute occorre operare sui seguenti piani distinti:
• la ricerca,
• lo sviluppo dei sistemi,
• l’infrastruttura operativa,
• le biotecnologie nella clinica quotidiana,
• la formazione.
L’obiettivo è quello di creare le condizioni per uno sviluppo omogeneo del settore della
bioinformatica ed è quindi necessario che le azioni su questi piani siano quelle che abbiano
una ricaduta immediata. Pertanto i temi prioritari riguardano:
• Stabilire un’effettiva cooperazione pubblico-privato fra la comunità di ricercatori in ambito
nazionale ed internazionale;
• La ricerca vista sia come sviluppo di sistemi software per la biologia computazionale che
come messa a punto di metodologie innovative per l’analisi e la ricerca di correlazioni tra i
dati biologici.
• Lo studio di applicazioni legate alle metodologie per la realizzazione delle biobanche.
• La creazione di una infrastruttura per favorire la collaborazione e il coordinamento tra i
vari centri.
• Favorire la realizzazione di ricerche basate su accordi internazionali al fine di agevolare lo
scambio di ricercatori (Research HUB), e la creazione di laboratori congiunti (Joint Research
LAB);
• Introdurre della Bioinformatica e le biotecnologie nella pratica clinica quotidiana.
• La formazione estesa all’aggiornamento professionale.
Va tenuto conto che le ricadute economiche di un investimento congruo nel comparto
dovranno devono valutate in termini di profitti provenienti non solo dalla diretta
commercializzazione dell’invenzione, ma anche da una maglie posizionamento del sistema
paese nel contesto internazionale.
La ricerca in Bioinformatica. È in atto una progressiva raccolta, organica, in basi di dati,
di informazioni genetiche e mappature del Genoma Umano, prodotte dai tanti gruppi di
13
BIOINFORMATICA
ricerca che, in regime di autonomia, cooperano al progredire dell’analisi e dello sviluppo
della Genomica.
Obiettivo di tale raccolta è migliorare la comprensione e la decifrazione delle informazioni
genomiche, individuandone la funzione, la struttura e la relazione con la salute umana.
Pertanto si mira a creare strumenti informatici che permettano alla comunità medicoscientifica e al mondo industriale di:
• analizzare e utilizzare i dati sui genomi per lo sviluppo di nuove terapie, medicinali e
diagnosi sanitarie sempre più accurate;
• raccogliere le informazioni al fine di analizzare e utilizzare i dati sui genomi per lo sviluppo
di nuove terapie, medicinali e diagnosi sanitarie sempre più accurate.
Sul piano della ricerca è necessario lo sviluppo di sistemi software per la Bioinformatica,
diretti ad esempio:
• alla modellizzazione della struttura tridimensionale a livello atomico delle molecole
biologiche;
• all’analisi, lo studio e la predizione dei modi di interazione delle molecole biologiche;
• alla classificazione di dati basati su metodi di intelligenza artificiale quali le reti neurali, gli
Hidden Markov Models, le Support Vector machines, etc. mirati all’assegnazione di funzione
o di caratteristiche funzionali ai prodotti genici di interesse;
• alla visualizzazione, l’analisi, il confronto e la ricerca in banche dati di interazioni tra
molecole biologiche e di pathway metabolici;
• alla correlazione dei dati di interazione con dati disponibili sulle basi genetiche di patologie
complesse;
• all’identificazione di elementi regolativi della trascrizione all'interno e nell'intorno di geni;
• all’identificazione delle reti di regolazione genetica a partire da dati di espressione dalla
conoscenza degli elementi regolativi. Questi algoritmi permetteranno di capire come i geni
agiscono in maniera concertata e pertanto di ricostruire i pathway biologici in cui essi sono
coinvolti e quindi capire la loro funzione.
• all'identificazione di siti di legame di fattori di trascrizione ha lo scopo di fornire un insieme
di strumenti flessibili per prelevare i dati da sorgenti multiple.
• all’identificazione di reti di regolazione genetica. Una rete genetica può essere
rappresentata matematicamente utilizzando equazione differenziali ordinarie i cui parametri
sono incognite che bisogna stimare utilizzando i dati sperimentali quali profili di espressione
genetica per identificare le interazioni tra geni.
• all’interpretazione automatica di letteratura scientifica e di divulgazione delle più note
riviste internazionali.
• alla modellistica biomedica e all’apprendimento automatico nella systems biology. A tal
fine occorre impiegare metodologie innovative per la generazione di ipotesi su reti di
regolazione genica e per lo studio e la simulazione di particolari processi cellulari.
• allo sviluppo di metodi basati su modelli qualitativi e metodi probabilistici, in grado di tener
conto di informazioni incerte e conoscenza imperfetta sul dominio allo studio.
• allo sviluppo di sistemi informativi sanitari correlati a dati genetici. In questa attività
verranno utilizzati ed adattati metodi ed approcci sviluppati nell’ambito dei sistemi
nformativi sanitari per tener conto delle esigenze specifiche delle applicazioni che trattano
dati genetici, genomici e di proteomica.
• allo sviluppo di cartelle cliniche elettroniche orientate alla gestione ed all’integrazione dei
dati clinici con dati genetici, di genomica funzionale e di proteomica.
• alla progettazione di sistemi informativi per la conduzione di studi di caratterizzazione
cinetiche-clinica
• alla gestione di dati e database orientati agli aspetti di privacy e sicurezza informatica.
• a costruire workflow per il design e lo sviluppo di applicazioni di supporto al lavoro
collaborativi in bioinformatica.
• a sviluppare metodologie basate sul GRID computing e calcolo avanzato specifiche per la
bioinformatica per fare fronte a calcoli di notevole complessità algoritmica.
Lo sviluppo dei sistemi. Oggi si è in presenza di una situazione dove il rapido
avanzamento della ricerca e delle tecnologie applicate alla medicina ha portato ad un
14
BIOINFORMATICA
considerevole aumento di interesse verso le collezioni di materiali biologici umani. Le
raccolte di campioni di tessuti e linee cellulari, da cui si ottengono acidi nucleici e proteine,
sono definite biobanche e rappresentano un’importante fonte di risorse per la diagnosi e per
la ricerca da quella di base fino alla sperimentazione di terapie per le malattie genetiche. Il
successo delle ricerche per l’identificazione dei geni malattia, dei geni di suscettibilità e delle
possibili applicazioni terapeutiche, compreso lo sviluppo di nuovi e specifici farmaci, si avvale
della possibilità di disporre di campioni biologici di persone affette o portatrici o predisposte
a patologie su base genetica, o che manifestano variabilità alla risposta dei farmaci.
Il materiale biologico è diventato una risorsa molto preziosa e deve essere quindi favorito lo
sviluppo e la organizzazione di tale attività e regolamentato l’utilizzo, il mantenimento e
l’interazione tra varie biobanche.
Queste collezioni sono numerose e di diversa entità ed è quasi impossibile quantificarle e
avere informazioni sul loro stato di conservazione e sulla loro gestione. Pertanto di fronte al
crescente aumento delle biobanche genetiche e degli interessi ad esse collegati, si ritiene
necessario che in Italia si giunga rapidamente ad una regolamentazione per la loro
istituzione ed utilizzo, e venga realizzato un censimento di quelle già esistenti.
È da potenziare il coordinamento delle biobanche secondo le indicazioni fornite dall’OCSE,
provvedendo alle autorizzazioni e alle certificazioni.
Sul piano dello sviluppo dei sistemi occorre studiare:
• Metodologie di progetto di una biobanca;
• Linee guida per la progettazione di una biobanca, interoperabile con le altre biobanche;
• Valutazione della qualità di una biobanca.
Infatti, uno degli obiettivi perseguibili è la definizione del protocollo e delle modalità di
popolamento delle biobanche e le specifiche per una progettazione orientata alla efficienza
dell’utilizzo. Occorre difatti, grazie all’informatica, affrontare la multidisciplinarietà:
• in modo da rappresentare tutte le numerose tipologie di dati per la definizione del profilo
genomico di un individuo che richiede spesso l'analisi simultanea di molti geni e lo studio
della loro attività in modo parallelo (e.g. nell'uomo numerosi geni possono avere decine o
centinaia di mutazioni diverse responsabili della stessa malattia);
• lo studio di queste mutazioni in parallelo sottolinea proprio la capacità di fornire
informazioni su numerose alterazioni o stato di attività di geni nel medesimo istante.
La tipologia dei dati deve permettere di modellare i seguenti dati:
• sequenze di DNA;
• SNP (Single Nuleotide Polymorphism), ovvero variazioni di singole basi di DNA
(consentono di studiare a livello molecolare le differenze individuali tra individui e sviluppare
profili genetici caratteristici per ogni persona o gruppi di persone);
• annotazioni manuali o automatiche (e.g. SNPs );
• livelli di espressione genica, mappe proteomiche;
• interazioni tra geni e proteine;
• pathway metabolici;
L’infrastruttura operativa. Lo sviluppo tecnologico ha reso sempre più semplice e rapida
la possibilità di sequenziale genomi di organismi viventi, dai più semplici come i virus a quelli
più complessi come l’uomo. Nei prossimi anni sarà possibile ottenere sequenze genomiche in
modo molto rapido e preciso. Questo fa nascere la necessità di definire i modi in cui
memorizzare, trattare e sfruttare questa immensa quantità di dati. In analogia ad altri campi
della scienza, come ad esempio la fisica delle particelle o l’astronomia, la genomica e le
biotecnologie dovranno affrontare il problema del sovraccarico di informazione. Diventa
quindi essenziale la creazione di schemi logici e di modalità di scambio tra le molteplici
entità per sviluppare le basi di dati appropriate.
Il primo passo è necessariamente costituito dalla definizione della semantica dei dati, ossia
la definizione del significato delle entità che definiscono il “dominio” sotto osservazione e le
relazioni che le legano. La definizione delle modalità di scambio delle informazioni
rappresentano il secondo passo, infatti è fondamentale poter trasferire l’informazione tra le
varie entità che la trattano in maniera precisa e sicura. La crescita esponenziale della
quantità di dati da trattare sta inoltre creando un problema di capacità di elaborazione.
15
BIOINFORMATICA
Saranno sempre di più necessari sistemi di calcolo potenti e veloci e quindi sarà sempre più
indispensabile l’impiego di sistemi distribuiti capaci di mettere assieme le risorse necessarie
ovunque si trovino nel mondo, il tutto in maniera semplice e sicura.
Tutto questo potrà permettere, ad esempio lo studio delle ragioni alla base della diversa
efficacia di un farmaco nei vari pazienti o di capire le basi genetiche di malattie molto
importanti. Oppure sarà più semplice studiare il comportamento dei microrganismi e
comprenderne a pieno la loro interazione le cellule. Altrettanto importante è l’osservanza e
l’adesione agli standard internazionali già definiti o in via di definizione in modo da facilitare
sempre più l’integrazione della bioinformatica italiana con il resto delle comunità scientifiche
ed industriali.
L’infrastruttura informatica. La quantità di dati attualmente disponibile non è che una
minima parte di quella che è lecito attendersi nel prossimo futuro. Questo pone un problema
di capacità di elaborazione e di gestione non banale che implica necessariamente l’uso di
sistemi distribuiti. Nel campo dell’infrastruttura informatica per il supporto di attività
scientifiche che richiedono accesso a grosse potenze di calcolo ed a risorse geograficamente
distribuite si parla sempre più spesso della GRID. Questo termine è stato coniato in USA alla
fine degli anni 90 [ref. The Grid a Blue print for a new computing infrastructure. Foster and
Kesselman ed.] per analogia con la rete di distribuzione elettrica che è un ottimo esempio di
un infrastruttura pervasiva ed altamente distribuita che ha generato a suo tempo una
rivoluzione nei metodi di produzione industriale e nella società. Per GRID s’intende
un’infrastruttura informatica, formata da risorse di calcolo (in genere centri di calcolo di
piccole, medie e grosse dimensioni), altre risorse di tipo vario, banche dati, strumenti
scientifici (sensori, satelliti, acceleratori di particelle), sistemi di visualizzazione e strumenti
per il supporto di lavoro condiviso come video conferenze e librerie digitali interconnesse da
una rete di comunicazione ad alte prestazioni ed alta affidabilità come in effetti Internet sta
sempre più diventando ed un software adeguato a creare con tutti questi elementi un centro
di calcolo virtuale che dia l’impressione all’utente finale in fronte del suo calcolatore
personale di avere accesso alle stesse facilità e risorse come se si trattasse di un centro
locale. Le funzioni di questo software si possono riassumere ad un sistema di identificazione
dell’utente che permetta un accesso a risorse distribuite senza il bisogno per l’utente di
essere riconosciuto ed autorizzato in tutte le risorse remote. Dietro queste funzioni c’è un
sistema molto complesso e distribuito implementato sempre più spesso sotto forma di
servizi Web (altra analogia con il Web) che permette di localizzare le risorse necessarie per
l’elaborazione del programma richiesto, ottimizzare il carico dei vari sistemi di calcolo
coinvolti ed assicurare il buon funzionamento di tutta l’infrastruttura di Grid.
La bioinformatica ha molto in comune con altre scienze come la Fisica delle particelle
elementari che hanno già da qualche anno fatto ricorso ad un infrastruttura di Grid per il loro
bisogni informatici. Gli elementi più importanti per consigliare l’adozione di questo approccio
informatico sono i seguenti: grandi mole di dati distribuite geograficamente e non
necessariamente di tipo ed accesso uniforme; possibilità di parallellizzare il calcolo e
distribuirlo in unità di elaborazione indipendenti; esistenza di collaborazioni organizzate a
livello internazionale.
Innumerevoli esempi di progetti che prevedono o stanno già utilizzando tecnologia di Grid
per applicazioni di bioinformatica sono disponibili tramite organizzazioni come Healthgrid. Il
progetto europeo di e-Infrastructure EGEE e BIOINFOGRID consentirà di supportare un
notevole numero di applicazioni di biomedicina e bioinformatica.
Pertanto la bioinformatica è l’area dove le tecnologie Grid possono dare il maggiore
contributo. L’obiettivo della bioinformatica è lo sviluppo ed il mantenimento di una
infrastruttura per la conservazione, l’accesso, il trasferimento e la simulazione di processi ed
informazioni biomediche; gli attuali sforzi di estesa computazione su dati biologici rientrano,
quindi, negli propositi generali delle tecnologie Grid.
L’infrastruttura concettuale. Nei prossimi anni analizzando il corredo genetico di ogni
individuo, si attendono passi in avanti nella ricerca sul perché alcuni si ammalano, altri sono
suscettibili ad ammalarsi o a resistere a una infezione virale o batterica o, ancora, a reagire
16
BIOINFORMATICA
in un determinato modo a un preciso farmaco. Questo significa che i ricercatori sono
chiamati a lavorare su un insieme vasto ed eterogeneo di dati disponibili in differenti basi di
dati accessibili in rete.
Tutto ciò implica la possibilità di vedere tutti questi dati in un unico ambiente, sfruttando al
massimo le possibilità offerte dall’interoperabilità’.
I motivi sono tanti alla base dello sviluppo armonioso ed interoperabile delle basi di dati,
legati principalmente all’esigenza sempre sentita:
• da un lato di una normalizzazione concettuale e coerente di questi Repository (usare la
stessa rappresentazione),
• dall’altra di strumenti informatici pensati per consentire le indispensabili Modalità di
Scambio e Cooperazione (parlare la stessa lingua).
In tale situazione, è evidente la necessità di tool informatici in grado di:
• incrociare efficacemente in una Cooperazione Integrata le principali caratteristiche
genetiche, epidemiologiche, etniche e sociali per identificare i geni-malattia (unico
strumento di raccolta dati),
• attribuire a ciascuna sequenza genica uno score di Rischio Genomico Individuale (analisi
statistiche).
Questo implica enormi sforzi nell’integrazione di informazioni cliniche e genomiche distribuite
a livello geografico. Inoltre lo sviluppo di vocabolari standard facilità la condivisione di dati e
risorse.
Sul piano di questa infrastruttura gli aspetti da studiare riguardano:
• Il modello semantico dei processi associato ad analisi biomediche.
• Il modello di standardizzazione delle biobanche.
• Lo sviluppo dei sistemi informativi sanitari per tener conto delle esigenze specifiche delle
applicazioni che trattano dati genetici, genomici e di proteomica.
• Lo sviluppo di Cartelle cliniche elettroniche orientate alla gestione ed all’integrazione di
dati clinici con dati genetici, di genomica funzionale e di proteomica.
• Il progetto di sistemi informativi per la conduzione di studi di caratterizzazione genetico
clinica di particolari sottopopolazioni, anche in riferimento agli aspetti di privacy e sicurezza
informatica.
• Utilizzo di sistemi formali di workflow per il design e lo sviluppo di applicazioni di supporto
al lavoro collaborativi in bioinformatica.
Semantica dei dati. Il primo passo nello studio di un particolare dominio della conoscenza
dovrebbe essere la definizione del significato stesso dei dati, delle entità che costituiscono il
dominio in questione e delle relazioni che intercorrono tra esse. Questo consiste nella
definizione di una “normalizzazione concettuale” delle banche dati, la definizione di ontologie
che definiscano le entità (oggetti) e le relazioni tra esse basate su vocabolari condivisi e
controllati, la definizione degli schemi delle basi dati derivati dagli schemi concettuali che
rappresentano il dominio in esame.
Il risultato di questo lavoro di definizione semantica è la possibilità di definire in maniera
chiara e precisa il significato degli oggetti e dei dati che rappresentano l’informazione
eliminando alla base gli errori dovuti alla loro sbagliata interpretazione ovvero ad una
rappresentazione incoerente tra le varie basi dati. In questo ambito dovranno essere definiti
gli standard di rappresentazione dei dati utilizzando il linguaggio di marcatura XML e sulla
base di questo gli standard di descrizione dei dati quali BSML, MAGE-ML, ecc.
Protocolli di scambio informazioni. La definizione dei metodi di scambio
dell’informazione e di collaborazione tra diversi soggetti rappresenta il secondo passo
fondamentale. È necessaria la definizione di protocolli di comunicazione che permettano la
trasmissione dei dati in maniera definita e sicura. Sulla base di questi protocolli sarà quindi
possibile definire servizi aggiuntivi quali ad esempio la sincronizzazione delle basi dati, la
creazione di indici comuni delle basi dati disponibili e la loro ricerca, la pubblicazione delle
caratteristiche delle singole basi dati e le modalità di accesso ed utilizzo, ecc.
17
BIOINFORMATICA
Tutti questi servizi devono avere il preciso obiettivo di facilitare la collaborazione e
l’integrazione sia tra le basi dati che tra i soggetti che vi operano. Un’analogia nel mondo
informatico che ben si adatta a questo aspetto è rappresentata dall’utilizzo dei “Web
Services”. Basandosi su un protocollo di comunicazione ben definito come l’HTTP, alla base
del World Wide Web, sono state definite le modalità di pubblicazione, indicizzazione, ricerca,
accesso ed utilizzo di servizi disponibili sulla rete Internet.
Nell’ambito dello sviluppo di standard in bioinformatica, si stanno perseguendo i seguenti
obbiettivi:
• Creare un Domain Information Model (concetti, vocabolari, tipi di dato, etc.) per il dominio
Clinical-Genomics;
• Derivare un R-MIM (modello concettuale informativo da cui costruire lo schema fisico del
database della biobanca), ovvero un modello dal RIM (Reference Information Model) di HL7,
un meta-modello astratto per rappresentare la semantica delle informazioni sanitarie;
• Specificare le tipologie di messaggi ed i documenti Clinical-Genomic (HL7 CDA di livello
3) per lo scambio e la condivisione di informazioni genetiche tra centri di ricerca;
• Rivisitare/utilizzare i seguenti standard emergenti in bio-informatica (XML) BSML
(Bioinformatic Sequence Markup Language), MAGE-ML (Microarray and GeneExpression
Markup Language).
L’adozione di tali metodologie consentirà una migliore integrazione fra i dati bioinformatici e
i modelli adottati per scopi ospedalieri (dati medici, clinici, amministrativi, etc.);
Bibliografia
R. Maceratini, F.L. Ricci. Il Medico On-Line – Manuale di Informatica Medica. Verduci Editore, Roma,
2000.
F. Martin-Sanchez, V. Maojo e G. Lopez-Campos - 2002 “Integrating Genomics into Health Information
Systems”, Methods of Information in Medicine. Progetto europeo di e-Infrastructure EGEE disponiile su
www.eu-egee.org.
L:M: Arthur. Introduzione alla Bioinformatica . Mcgraw-Hill Italia, 2004
Linee guida per la definizione di una strategia sopra riportate, per lo sviluppo del settore
della bioinformatica in Italia con particolare attenzione all’ambito biomedico, sono il frutto
del lavoro della Commissione
Maria Teresa ANNECCA Ufficio del Garante per la protezione dei dati personali
Francesco BELTRAME Dipartimento di Bioingegneria, Università degli Studi di Genova
Giovanni BELTRAMI Chiron Vaccines
Giovanni BRIGANTI Ministero degli Affari Esteri
Fabrizio GAGLIARDI CERN
Giovanni GIOVANNINI Osservatorio Tuttimedia, Media duemila
Luciano MILANESI Istituto Tecnologie Biomediche, Consiglio Nazionale delle Ricerche
Giovanni PAOLELLA CEINGE, Università degli Studi di Napoli “Federico II”
Anna Maria RAVIOLA Marconi, Selenia Communications
Fabrizio RICCI Istituto di Ricerca sulla Popolazione e le Politiche Sociali, Consiglio
Nazionale delle Ricerche
Leonardo SANTI Comitato Nazionale Biosicurezza e Biotecnologie
Lorenzo SILENGO Dipartimento di Biologia Università degli Studi di Torino
Anna TRAMONTANO Dipartimento di Scienze Biochimiche "Rossi Fanelli", Università degli
Studi di Roma "La Sapienza"
Settimio VINTI Dipartimento Innovazione Tecnologica, Presidenza del Consiglio dei Ministri
18
BIOINFORMATICA
CALCOLATORI
Il computer è un termine di origine latina sinonimo nel nostro caso di calcolatore, mutuato
attraverso la lingua inglese. In Italiano, il termine computare, assolutamente affine e proprio
della capacità di elaborazione in quanto a potenza di calcolo dei computer stessi, viene
indicato etimologicamente come derivante dalla composizione dei termini com, cum, insieme
e putare, che assumono il significato di render netto, da cui potare nella lingua in uso,
divenne in seguito l’espressione tirare il conto. Vi sono state frequenti, periodiche diatribe
anche sulla eventuale opportunità di migrare al meno usato e per molti più corretto termine
calcolatore, od elaboratore, visto un certo uso esterofilo nell'italiano recente. Nelle altre
lingue europee, infatti, spesso si usano termini più appropriati. In lingua francese ordinateur
e in spagnolo computadora ad esempio. Nel dizionario, come sinonimo troviamo elaboratore,
processore, calcolatore e i desueti cervello elettronico e cervellone, mentre la proposta
formulata dal professor Arrigo Castellani, accademico della crusca e fondatore degli Studi
Linguistici Italiani, di utilizzare computiere non ha assolutamente trovato applicazione. In
questo testo vogliamo percorrere una analisi storica dello sviluppo dei sistemi di calcolo e di
come si sia giunti alle diverse specializzazioni della bioinformatica.
EVOLUZIONE STORICA DEL CALCOLO. Il primo computer usato dall'uomo è stato senza
dubbio la mano. Grazie alle mani gli egiziani riuscirono a rappresentare tutti i numeri sino a
9999 ed erano in grado di eseguire addizioni, sottrazioni, moltiplicazioni e anche calcoli più
complessi. Il termine inglese "digit" ("cifra"), oggi tanto usato, deriva proprio dalla parola
latina digitus ("dito"). Il Codex Vigilanus, viene considerato il più antico testo europeo
contenente le nostre cifre decimali (risale al 976 d.C.). Si nota che ancora non compare un
simbolo per rappresentare lo zero. Il nostro sistema di numerazione è un sistema di tipo
posizionale in quanto il valore numerico associato ad ogni cifra varia secondo la posizione
che essa occupa nella scrittura del numero. Le origini dell'attuale sistema di numerazione, il
sistema posizionale decimale, non sono del tutto chiare. Gli studiosi concordano comunque
sul fatto che furono gli indiani, forse nel VI sec. d.C., ad ideare il sistema di numerazione
decimale posizionale, che fu trasmesso in Europa dagli arabi.
L’abaco rappresenta il capostipite degli strumenti di calcolo e ha
costituito per molto tempo l’unico ausilio per la risoluzione delle
operazioni aritmetiche elementari. L'abaco è il progenitore del
più moderno pallottoliere. La parola deriva dal semitico abq, che
significa "polvere", "sabbia". Non si sa quale popolo abbia
inventato questa potente macchina calcolatrice, forse i babilonesi:
gli esemplari a nostra disposizione (e che appartennero ai Maya,
Egiziani, Cinesi, Romani...) hanno più di 2000 anni. Alcuni storici
sostengono che l'abaco abbia più di 5000 anni. Un abaco, nella
sua forma più comune, è costituito da una serie di guide (fili,
scanalature, ...) parallele, che convenzionalmente indicano le
unità, le decine, le centinaia e così via. Lungo ogni guida possono essere spostate delle
pietruzze (dette calcoli, da cui il termine moderno di accezione matematica) o altri oggetti
mobili per eseguire le operazioni aritmetiche. I materiali usati per la costruzione degli abachi
e la loro foggia costruttiva variano moltissimo a seconda del luogo e dell'epoca storica ibn
cui vennero utilizzati.
Il funzionamento si basa sempre sul principio fondamentale di ogni sistema di Sistema
Posizionale a base tre (simboli: 0, 1, 2) la numerazione posizionale, significa che il valore di
una cifra dipende dal posto che occupa. Nel Medioevo in Europa al termine abaco si
attribuiva solitamente il significato di aritmetica in senso generale: a riprova di questo vi è il
titolo di una opera di Fibonacci: Liber abbaci, pubblicato nel 1202. Le scoperte matematiche
19
BIOINFORMATICA
del XVI e XVII secolo permisero di affrontare il problema della ricerca di strumenti di calcolo
più idonei. Nel 1614 comparvero i famosi Bastoncini di Nepero, detti anche "ossi di Napier",
dal nome del matematico scozzese. Essi servivano per semplificare moltiplicazioni e
divisioni e rimasero in uso per circa un secolo. Il nome di Napier fu molto noto negli
ambienti accademici anche per aver inventato i logaritmi. Nel 1650 il matematico inglese E.
Gunter, oltre a pubblicare le tavole logaritmico-trigonometriche (con 7 decimali), inventò il
regolo calcolatore, per calcolare potenze, radici quadrate e cubiche.
Geometri, ingegneri e tecnici
cominciarono a sostituirlo con la
calcolatrice tascabile a partire
dalla fine degli anni '60. Nel 1642
Blaise Pascal concepì è costruì una
macchina (pascalina) che eseguiva
in modo meccanico le addizioni e
le sottrazioni. La macchina, a
livello di principio si basava, come
Abaco
Blaise Pascal
l'abaco, sul valore di posizione.
Infatti essa era formata da una
serie di ingranaggi dentati con sopra scritti i numeri da 0 a 9. Il primo ingranaggio indicava
le unità; ad ogni suo giro completo corrispondeva lo spostamento di un numero del secondo,
che indicava le decine, e così via, fino alle centinaia di migliaia (logica del "riporto
automatico"). Per farla funzionare bastava una manovella. Il suo limite stava nel fatto che
permetteva solo addizioni e sottrazioni. Dopo quasi un secolo Leibnitz ne costruì una che era
in grado di effettuare anche le moltiplicazioni e le divisioni, a lui si deve il termine funzione
(coniato nel 1694) che egli usò per individuare una quantità la cui variazione è fornita da
una curva e per individuare la pendenza di tale curva e un suo punto particolare. Leibniz
viene generalmente accreditato, assieme a Isaac Newton, come uno dei maggiori ricercatori
che si è dedicato allo sviluppo del calcolo infinitesimale moderno, con particolare accento sul
calcolo integrale. Nel 1673 Leibniz presenta alla Royal Society di Londra la prima calcolatrice
meccanica in grado di moltiplicare e dividere. L'innovazione principale rispetto alla pascalina,
che era una semplice addizionatrice, fu l'introduzione del traspositore. L'invenzione gli fruttò
l'ammissione alla Royal Society, ma non ebbe immediata applicazione per le difficoltà
costruttive, all'epoca erano insormontabili. Solo nel 1820 Xavier Thomas de Colmar riuscì a
produrre l'Aritmometro (la prima calcolatrice commerciale) basato su un progetto quasi
identico. Queste macchine vennero costruite in pochi esemplari e le operazioni erano
eseguite una alla volta e non era possibile realizzare un insieme di operazioni senza
l’intervento umano. Il primo calcolatore per applicazioni generali fu una calcolatrice
meccanica progettata dal matematico C. Babbage ai primi del '800. Concettualmente tale
macchina (macchina analitica) aveva la struttura dei moderni calcolatori, una unità di
calcolo, una memoria, un dispositivo di ingresso e uscita. Charles Babbage può essere
considerato il vero padre del computer; la sua idea iniziale era quella di risolvere il problema
della stesura delle tavole dei logaritmi, con dispositivi meccanici. Il lavoro venne finanziato
dal governo Inglese che mise a disposizione di Babbage ingenti somme di denaro
considerando che tali sistemi si sarebbero potuti applicare utilmente al calcolo delle rotte
delle navi. Babbage in pratica progettò una macchina dotata di 5.000 ruote dentate, 200
accumulatori di dati (le "memorie") composti di 25 ruote collegate tra loro, in grado di
svolgere un’addizione al secondo. Un nastro perforato (anche questa era una novità) doveva
guidare la macchina nelle operazioni secondo un programma predefinito. Il problema era
però tecnologico, infatti era molto difficile realizzare la miriade di ingranaggi e di rotelle
necessarie al dispositivo. Il programma era decodificato su un nastro perforato, vi era inoltre
una unità di calcolo chiamata "mill" (mulino) dove venivano eseguiti i calcoli, e la memoria
centrale chiamata "store" (magazzino). Tale macchina era però in grado di svolgere un solo
compito, quello di poter risolvere equazioni polinimiali. Babbage comprese però che un
dispositivo così congegnato poteva essere adottato per risolvere molti altri calcoli cambiando
solo il programma. La calcolatrice era in grado di eseguire istruzioni di un programma
20
BIOINFORMATICA
preventivamente registrate su un nastro di carta perforato, prevedendo la possibilità di
eseguire istruzioni in modo anche non sequenziale. Nel 1804, l'imprenditore francese J.M.
Jacquard pensò d'introdurre nei telai di legno della sua azienda di Lione, che produceva
stoffe, delle lunghe schede di cartone forato: ad ogni scheda corrispondeva un preciso
disegno, formato da forellini. Sembrava si potesse finalmente dare ordini a una macchina
perché eseguisse da sola un lavoro ripetitivo. Il dispositivo di lettura delle schede era
costituito da file di aghi che potevano attraversare solo dove c'erano i fori: i fili venivano così
alzati automaticamente permettendo il passaggio della trama e il lavoro procedeva molto più
in fretta, aumentando la produzione.
Verso la fine del XIX secolo lo statistico americano H. Hollerith riprese il principio della
scheda perforata ed attuò un sistema elettromeccanico che poteva interpretare ed elaborare
i dati codificati con una perforazione del cartoncino della scheda. Questa invenzione permise
di costruire le macchine meccanografiche per il censimento americano del 1890. Il risultato
venne considerato strabiliante, in soli due anni si elaborarono tutti i dati di 62 milioni di
abitanti americani. Il successo fu immediato: la macchina poteva esaminare fino a 800
schede al minuto (una velocità favolosa per quei tempi e impossibile agli uomini). I conti del
censimento del 1890 furono ultimati in 50 giorni (Hollerith fonda IBM). Il principio di
Hollerith venne usato anche per il calcolo delle traiettorie delle navi da guerra fino alla fine
della II guerra mondiale. Dal 1936 al 1944 le richieste del settore militare tedesco e
americano, di strumenti più perfezionati per la balistica, per il calcolo delle traiettorie dei
siluri e per la nascente missilistica, si erano fatte pressanti. Nel 1940, nei laboratori Bell, G.
Stibnitz e S.B. Williams erano già in grado di produrre un elaboratore elettromeccanico a
relè, regolabile in modo remoto. Il tedesco Zuse realizzò il primo computer elettromeccanico
a numerazione binaria che venne distrutto nel 1944 dai bombardamenti. Zuse aveva
praticamente ideato il primo computer elettromeccanico moderno, in grado di unire il
linguaggio binario di Boole con le schede perforate di Hollerith.
Le istruzioni venivano inserite con un
nastro perforato. I risultati erano
annunciati
dall'accensione
di
un
tabellone formato da lampadine.
Contemporaneamente
però
in
America
anche
si
iniziarono
a
costruire i primi computer. Questi
calcolatori avevano scopi militari
essendo utilizzati per calcolare le
traiettorie delle bombe volanti che i
tedeschi lanciavano su Londra. Con
ENIAC
C. Babbage
l’E.N.I.A.C.
(Electronic
Numeric
Integrator And Calculator) per la prima volta si parla di calcolatore elettronico. Nel 1940
Stibbitz fece funzionare una calcolatrice meccanica al Dormouth College; il primo calcolatore
elettronico che rispondeva alle specifiche del progetto di Babbage. Infatti tale dispositivo
impiegava circa 18000 valvole elettroniche. Le dimensioni erano notevoli: 18 metri di
lunghezza e 2 di altezza; le operazioni venivano svolte con alte velocità per quei tempi (dieci
operazioni al secondo), le valvole avevano sostituito i mezzi meccanici, però il principio di
funzionamento era ancora quello della macchina di Babbage. Questi computer verranno
utilizzati inizialmente per scopi spaziali. Nel 1944 Aiken costruì una calcolatrice
elettromeccanica ad Harvard. Dopo la seconda Guerra mondiale comparvero i primi
calcolatori a valvole (ENIAC). Il capostipite dei calcolatori di prima generazione richiedeva
per il suo funzionamento un consumo di energia corrispondente a quello di una città di
medie dimensioni. Si deve inoltre a Von Neumann il concetto di programma memorizzato.
Sulla base di questo approccio il calcolatore tipico degli anni ’50 disponeva di una memoria
centrale composta da valvole termoioniche e relè, collegata a memorie ausiliarie. Una
valvola termoionica può funzionare da interruttore e, poiché non ha parti meccaniche in
movimento, diventa decine di migliaia di volte più veloce del relè. Questo fu un fatto
21
BIOINFORMATICA
straordinario, nasce l’epoca dell’elaborazione automatica. Infatti fino a quel momento i dati
si immettevano da una parte della macchina, mentre il programma si metteva dall’altra.
Questo complicava molto le cose, infatti volendo cambiare il programma bisognava andare,
fisicamente, a cambiare i collegamenti della macchina. Viene iniziata la costruzione
dell'Electronic Discrete Variable Automatic Computer, primo elaboratore dotato di programmi
memorizzati. Infatti una delle innovazioni introdotte fu la RAM (Random Access Memory),
che permette non solo di ridurre il numero delle valvole necessarie per costruire un
elaboratore, ma anche di recuperare rapidamente i dati necessari. Con l'EDVAC nasce anche
il software. Il computer, col nome UNIVAC 1 (Universal Automatic Computer), viene
prodotto in serie nel 1951. Pesava 8 tonnellate, aveva un volume di circa 3 mq, costava
moltissimo e impiegava tantissima energia (le valvole erano 5.400). Venenro costruiti 12
esemplari che lavorarono senza sosta per 12 anni e 6 mesi, elaborando 30.000 informazioni
al minuto. Tuttavia, il pubblico cominciò a capire cosa significhi un calcolatore solo quando
l'UNIVAC riuscì a predire il successo di Eisenhower alle elezioni presidenziali.
Oggi, invece, dati e programmi si
pongono entrambi nella memoria centrale
della macchina. Inoltre con Von Neumann
nel 1949, nascono i sistemi operativi,
serie di comandi programmati per il
funzionamento della macchina e residenti
nella memoria del computer, utili sia per
le operazioni di avvio della macchina, che
per le fasi operative di trasferimento delle
informazioni. La struttura di base di
questi primi calcolatori è nota come
Von Neumann
Valvole termoioniche
macchina di Von Neumann ed è
rappresenta da 5 componenti: una unità logico-aritmetica, una memoria, una unità di
controllo del programma, una unità di ingresso e una di uscita. Inoltre si caratterizza:
Tutti i dati e tutte le istruzioni sono rappresentate mediante un codice binario e
sono registrati assieme nella memoria centrale.
L’elaboratore non fa distinzione tra dati e istruzioni.
Nasce la seconda generazione (1958-1964) che è caratterizzata dall’impiego dei transistor
nelle unità di elaborazione che portarono innumerevoli vantaggi:
Non si ha riscaldamento.
Le informazioni vengono registrate in modo veloce.
Le dimensioni dei calcolatori sono molto ridotte.
Nella terza generazione (1964-1971) vengono impiegati i micro-circuiti miniaturizzati e per
la prima volta vengono adottati i circuiti integrati. I circuiti integrati vengono realizzati con
delle tecniche di fotoincisioni su piastrine di silicio e permettano di raggiungere velocità di
elaborazione prossime a quelle dei neuroni cerebrali. Intorno al 1960 a due ricercatori della
IBM venne in mente di "incidere" su una piastrina di silicio (chiamata chip) una decina di
elementi (transistor e altri) già collegati a un computer: nacque così il circuito integrato.
Otto anni dopo, Gilbert Hyatt inventerà il microprocessore. Uno dei più grandi fisici del
Novecento, Richard Feynman, in uno straordinario discorso tenuto nel 1959, aveva delineato
le incredibili prospettive del processo di miniaturizzazione in atto nella tecnologia,
ipotizzando che fosse possibile arrivare a costruire dispositivi di varia natura utilizzando
persino gli stessi atomi. Erano gli anni in cui l'industria dei semiconduttori muoveva i primi
passi e le dimensioni dei transistor erano ancora dell'ordine di frazioni di centimetro. I
transistor avevano appena iniziato a sostituire le valvole termoioniche nella costruzione dei
computer e nessuno poteva ancora immaginare con quanta rapidità si sarebbe evoluta la
tecnica fotolitografica con la quale interi circuiti sarebbero stati disegnati sulle piastre di
silicio. Nel 1965 Gordon Moore, uno dei fondatori della Intel, osservò empiricamente che la
potenza dei processori, ovvero il numero di transistor in un chip, raddoppiava ogni diciotto
mesi circa e di conseguenza la velocità di calcolo. Oggi, quasi quaranta anni più tardi, la
22
BIOINFORMATICA
cosiddetta “legge di Moore” viene confermata ogni anno, e nel 2014 verrà raggiunto il limite
fisico di miniaturizzazione dei transistor. Nel 1964 la IBM presenta il sistema 360, primo
computer di terza generazione: è un elaboratore in grado di svolgere qualsiasi applicazione
scientifica o commerciale con un qualsiasi volume di dati. Molto più piccolo dei suoi
predecessori il 360, è in grado di svolgere, anche per questa ragione, 2 milioni di operazioni
al secondo.
La quarta e la quinta generazione iniziano nel 1971 con la comparsa del primo
microprocessore capace di elaborare dati sotto forma di sequenze costituite da 4 bit (parole
dati di 4 bit) a cui fecero seguito i microprocessori a 8 bit immessi sul mercato nel 1980, nel
1990 vennero prodotti e si diffusero quelli a 32 bit. Nel 1971, l’ingegnere italiano F. Faggin e
gli americani T. Hoff e S. Mazer producono il nuovo microprocessore della INTEL (4004),
cioè il primo circuito integrato che in una piastrina di silicio di 4 x 3 cm può condensare,
grazie a 2250 transistor, una completa unità logica di un computer (chip), che riduce il
volume dell’apparecchio, i tempi di calcolo e i costi finanziari. Era il primo oggetto a poter
essere prodotto in serie, sempre identico e con gli stessi macchinari, ma che poteva
funzionare, con una riprogrammazione, per migliaia di scopi diversi. Nello stesso anno G.
Kindall inventa il programma operativo universale per computer (CP/M), che consente la
produzione di software commerciale. Fino al 1974 ogni computer aveva il suo sistema
operativo, cioè la traduzione nel linguaggio-macchina delle istruzioni formulate dall’utente.
Nel 1976 l’americano R. Kurzweil realizza un computer in grado di leggere e riconoscere
qualunque carattere stampato (sistema OCR: Omnifont Character Recognition). Nello stesso
anno nasce il primo supercomputer CRAY 1, in grado di eseguire 180 milioni di operazioni al
secondo, grazie a 200 mila circuiti integrati montati su 3400 schede e collegati con 100 km
di cavi. Costa 17 milioni di dollari. Già nel 1990 queste macchine erano in grado di
compiere 100 miliardi di operazioni al secondo. (Oggi gli scienziati, dopo l’unità di misura in
microsecondi -un milionesimo di secondo-, preferiscono parlare di nanosecondo -un
miliardesimo di secondo-, e già si comincia a contare in psicosecondi - un millesimo di
miliardesimo di secondo). Sempre nel 1976 nasce il primo personal computer della APPLE
(fondata nel 1975). Nel 1978 la HAYES lancia sul mercato il primo modem (modulatoredemodulatore), che trasforma i segnali digitali dei computer in segnali analogici, trasmessi e
ricevuti attraverso il telefono. L’utente si può così collegare con qualsiasi altro computer al
mondo. Nello stesso anno la APPLE e la TANDY mettono in commercio i primi floppy disk
(dischi magnetici) che sostituiscono i nastri magnetici, permettendo la ricerca dei files in
tempo reale. Intanto il chip 8086 passa nel 1978 a 29.000 transistor. Nel 1981 l'IBM lancia il
suo primo PC col sistema MS/DOS: s'impone come lo standard mondiale di riferimento. Nel
1982 il chip 80286 possiede 134 mila transistor. Nel 1983 lo studente USA F. Cohen realizza
il primo virus per computer, che consisteva in un insieme di istruzioni apparentemente
invisibili, capaci di penetrare in un computer via modem o floppy disk, provocando
distruzioni di files, di memoria ecc. Nel 1985 il chip 80386 possiede 275 mila transistor. Nel
1988 la PHILIPS e la SONY in Giappone lanciano il primo compact disk audio-video
interattivo, nel senso che l'utente può interagire con dati, suoni, immagini ferme o in
movimento, nell'ambito di un programma multimediale. Esso riunisce gli impieghi dei CD
musicali (nati nell'82) con i dischi ottici usati in campo editoriale (CD-ROM) e informatico. In
un disco a 8 cm possono essere contenute 100.000 pagine.
Attualmente sono in commercio microprocessori a 64 bit (Digital) dotati di una velocità di
esecuzione molto elevata. La quinta generazione inizia con la possibilità di disporre di
computer basati su una struttura multiprocessore ad architettura parallela, ovvero su più
processori connessi tra di loro al fine di consentire l’elaborazione simultanea di più istruzioni
del programma. Nel 1994 nasce il sistema RISC (Reduced Instruction Set Computer), che
può eseguire 200 milioni di istruzioni al secondo, con un insieme ridotto di istruzioni di base,
tutte della stessa lunghezza. Il RISC 6000 si pone come avversario del Pentium, ed è frutto
di un accordo tra IBM-APPLE-MOTOROLA.
23
BIOINFORMATICA
Le tendenze attuali di sviluppo dell’informatica sono basate sull’evoluzione dell’architettura
degli elaboratori elettronici e delle reti telematiche per la loro connessione, l’altra fonte di
sviluppo è rappresentata dall’Intelligenza Artificiale (I.A.).
L’elaboratore può essere definito come una macchina elettronica per il trattamento
delle informazioni. Dobbiamo quindi in via preliminare procedere alla definizione dei
termini e alla caratterizzazione di un elaboratore o computer.
Macchina. Indica che gli elaboratori appartengono alla stessa categoria generale
delle lavatrici, delle locomotive, dei rasoi elettrici….
Elettronica. Significa che il funzionamento è basato su un certo numero di
componenti elettronici definiti come circuiti integrati.
Automatica. Indica che un elaboratore è in grado di eseguire in modo autonomo
tutte le fasi per lo svolgimento di un compito.
Trattamento delle informazioni. Indica genericamente la tipologia del lavoro che
un computer è in grado di eseguire.
Le operazioni che i calcolatori sono in grado di eseguire possono essere suddivise in sette
classi.
Ingresso (input) corrisponde all’introduzione di informazioni provenienti dall’esterno.
Queste operazioni si realizzano solitamente tramite tastiera.
Uscita (output) permettono di prelevare le informazioni dal calcolatore, il modo più comune
per visualizzare le informazioni è il video o la tastiera.
Memorizzazione (storage) comporta la creazione di copie permanenti delle informazioni
utilizzabili in un secondo momento dal calcolatore.
Recupero (retrieval) consiste nella rilettura di informazioni precedentemente memorizzate.
Trasmissione (sending) consiste nella possibilità di trasmettere le informazioni da un
elaboratore ad un altro per mezzo di una rete di comunicazione.
Ricezione (receiving) consiste nel ricevere informazioni inviate da un altro calcolatore.
Elaborazione (processing) comprende l’ordinamento, la selezione, la combinazione e la
riorganizzazione delle informazioni oltre che al calcolo. In generale, escludendo l’intelligenza
artificiale, un calcolatore non può prendere iniziative, fronteggiare circostanze impreviste o
dare giudizi morali.
Le informazioni: il concetto di informazione, non si deve confondere con quello di
conoscenza che assume nel linguaggio comune. Le informazioni possono essere importanti,
banali, vere o false; per noi questo non assume rilevanza. I dati al contrario hanno un
significato molto preciso, sono informazioni codificate adatte per essere immesse e trattate
da un sistema di elaborazione. Caratteristiche dell’informazione, qualunque informazione è
definita tramite tre caratteristiche fondamentali:
-Valore indica il particolare elemento assunto dall’informazione
-Tipo indica l’insieme degli elementi entro cui è stato scelto il valore attribuito
all’informazione.
Valore
Tipo
Attributo
3.5
reale
soluzione dell’equazione
5.0
reale
soluzione dell’equazione
5
intero
lunghezza del lato
5
intero
numero tentativi
Luigi Rossi
stringa di caratteri
impiegato
Attributo indica il significato associato all’informazione nel contesto in cui questa viene
utilizzata. In altre parole i dati sono una rappresentazione dell’informazione. Si ottiene una
informazione completa quando un attributo assume un valore di un determinato tipo.
Una variabile è un ente, appartenente ad un certo tipo, che può assumere uno qualunque
dei valori appartenenti al tipo. Una variabile è identificata da un nome, che riflette il ruolo
che questa assume all’interno del programma.
24
BIOINFORMATICA
Costante è un oggetto, appartenente ad un certo tipo, il cui valore rimane immodificato
durante l’esecuzione del programma. Ad una costante può essere attribuito un nome.
Espressione è una sequenza di operandi, operatori e parentesi, dove gli operandi possono
essere variabili o costanti. Il tipo dell’espressione complessiva dipende dai tipi degli operandi
coinvolti nell’espressione. Il numero dei valori distinti che appartengono ad un tipo T viene
detto cardinalità di T.
La cardinalità fornisce una misura dell’informazione associata al tipo e, quindi, della
quantità di memoria necessaria per ospitare un oggetto del tipo. Un tipo si dice ordinato se è
definita una relazione d’ordine tra i suoi elementi. Grazie ai tipi di dato, le informazioni di
interesse per il programma possono essere trattate in maniera astratta, senza tener conto,
cioè, del modo effettivo con cui esse sono rappresentate all’interno del calcolatore. Per ogni
variabile o costante dichiarata, è possibile: determinare a priori l’insieme dei valori e
l’insieme delle operazioni ammissibili e quindi rilevare eventuali errori in fase di traduzione
determinare a priori la quantità di memoria necessaria per rappresentare tutte le
informazioni di interesse.
I dati non hanno alcun significato, lo assumono solo quando vengono interpretati. Si avrà in
questo caso una informazione significativa.
INFORMAZIONE SIGNIFICATIVA = DATI + INTERPRETAZIONE
Il termine sistema di elaborazione definisce semplicemente un insieme di parti interagenti
tra di loro. Questo tipo di approccio si applica allo studio di un elaboratore che può essere
descritto come un sistema complesso costituito da un insieme di diversi sottoinsiemi. Per
rappresentare le interazioni di un sistema tra le sue componenti ed il mondo esterno
possiamo ricorrere ad un modello di linguaggio: esistono al riguardo diversi modelli e vari
modi di classificarli.
Modello analogico. È un modello fisico, nel senso che utilizza le proprietà di un certo
sistema (reale) per rappresentarne un altro. In particolare, in un modello analogico è
possibile fare corrispondere ad una caratteristica del sistema originario espressa in una certa
grandezza una caratteristica espressa in una grandezza diversa (es: descrivere un circuito
elettrico ricorrendo alle proprietà di un circuito idraulico).
Modeli
Modelli
FiscSmbol
AnalogicIGrfMtemL
Fisici
Analogici
Simbolici
Iconici
Grafici
Matematici
Logici
Modello iconico. Fa sempre parte della classe dei modelli fisici, riproduce le caratteristiche
di un sistema in una scala diversa mantenendo un rapporto di proporzionalità con l’originale
(es:plastico di edifici).
Modello simbolico. Rappresenta le relazioni tra le parti del sistema e il mondo esterno
ricorrendo a simboli, cioè ad un linguaggio simbolico (es. linguaggio matematico). A seconda
della scelta dei simboli si parla, in particolare, di modelli grafici, matematici o logici.
25
BIOINFORMATICA
26
BIOINFORMATICA
LOGICA
Rappresentazione, ragionamento e logica. L’obiettivo ambizioso eppure caratteristico
della scienza, formulato dall’uomo occidentale sin dagli albori del pensiero scientifico, è di
arrivare al massimo grado di conoscenza possibile dell’oggetto investigato e delle relazioni di
causa ed effetto di questo con la realtà (Wittgenstein). Le parole sono indefinibili perché
ogni volta assumono un aspetto diverso a seconda dell'accordo e non accordo di altre
parole. Invece fidandoci dell'identità grafica delle parole il linguaggio costruisce analogie
fuorvianti. Per esempio le espressioni "A ha un dente d'oro" e "A ha un mal di denti"
sembrano analoghe ma sono invece differenti perché si può dire io sento o vedo il dente
d'oro di A ma non si può dire che io sento il mal di denti di A. È questa la teoria dei giochi
linguistici, poi tema centrale di molte sue successive riflessioni.
La logica classica è la scienza che tratta tutta la validità e le articolazioni di un discorso in
termini di nessi inferenziali - in particolare deduttivi - relativamente alle proposizioni che lo
compongono. Le logiche descrittive (in inglese, description logics) sono una famiglia di
formalismi utilizzati per rappresentare la conoscenza in un dominio di applicazione detto
mondo. In primo luogo sono definiti i concetti rilevanti per quel dominio e, di seguito,
utilizzando questi concetti si specificano le proprietà degli oggetti e degli individui
appartenenti al dominio. Gli studi riguardanti le logiche descrittive si focalizzano sulla ricerca
di metodi che descrivano in modo sempre più specifico il dominio di interesse tale da essere
utilizzato per costruire applicazioni intelligenti. In questo contesto il termine intelligente è
riferito all'abilità di un sistema di trovare delle conseguenze implicite rispetto a quelle
esplicite rappresentate dalla conoscenza. Sistemi così caratterizzati sono definiti sistemi
basati sulla conoscenza (knowledge based system).
Una delle caratteristiche dei linguaggi utilizzati per la rappresentazione della conoscenza è
quella di essere dotati di semantiche basate sulla logica, con una enfasi particolare al
cosiddetto ragionatore. Il ragionatore permette di rappresentare la conoscenza implicita
ricavandola da quella esplicita presente in una ontologia. In informatica, un'ontologia è una
rappresentazione formale, condivisa ed esplicita di una concettualizzazione di un dominio di
interesse. Più nel dettaglio, si tratta di una teoria assiomatica del primo ordine esprimibile in
una logica descrittiva. Il termine ontologia (formale) è entrato in uso nel campo
dell'intelligenza artificiale e della rappresentazione della conoscenza, per descrivere il modo
in cui diversi schemi vengono combinati in una struttura dati contenente tutte le entità
rilevanti e le loro relazioni in un dominio. I programmi informatici possono poi usare
l'ontologia per una varietà di scopi, tra cui il ragionamento induttivo, la classificazione, e
svariate tecniche per la risoluzione di problemi.
Dal punto di vista della conoscenza umana una logica descrittiva permette all’individuo
uomo di strutturare e capire il mondo che lo circonda attraverso la classificazione degli
individui e dei concetti. La classificazione dei concetti permette di determinare le relazioni
tra i sottoconcetti e/o i superconcetti che a loro volta permettono di strutturare la
tassonomia in modo gerarchico. La gerarchia è utile per ricavare informazioni circa le
connessioni logiche tra concetti differenti. La classificazione degli individui e/o degli oggetti
determina se uno specifico individuo è sempre una istanza di un determinato concetto.
Si deve ad Aristotele - che esaminò i concetti, le categorie, le proposizioni, i termini e i
sillogismi - la prima formulazione della logica come scienza propedeutica a ogni possibile
conoscenza. La logica ha avuto origine nella antica Grecia dallo studio dei filosofi e
matematici, i principi logici che collegano la scrittura sintattica delle frasi con la loro
contenuto in verità e falsità possono essere ampliamente trovati in Platone (428-348 a.C.).
Il primo studio sistematico della logica è noto come il trattato di Organon, scritto dagli allievi
di Aristotele. La scuola di Megera e quella stoica pongono le basi per lo studio sistematico
delle implicazioni, mentre lo studio di un linguaggio formale artificiale basato sulla notazione
27
BIOINFORMATICA
matematica per chiarire le relazioni logiche e ridurre l’inferenza logica ad un processo
meccanico e formale si deve a Leibniz. Solo con Boole nella metà dell’ottocento si ha un
sistema logico ragionevolmente completo; il sistema includeva le parti principali della logica
aristotelica ed un sistema analogo alla logica proposizionale moderna. Le tavole della verità
come metodo per la verifica della validità delle formule nel linguaggio proposizionale sono
state introdotte simultaneamente ed indipendentemente da Wittgenstein (1922) e da Emil
Post (1921) che in seguito nel 1936 espose la teoria della computabilità. La nozione di
computabilità traduce rigorosamente, tramite la nozione di funzione e la nozione di
algoritmo, la possibilità di svolgere un certo tipo di compito ovvero risolvere un certo tipo di
problema applicando un procedimento meccanico pre-stabilito.
Aristotele
Leibniz
Wittgenstein
È molto importante sapere se un dato lavoro può essere svolto da una macchina, ovvero da
una persona non in grado di prendere decisioni autonome, oppure è richiesta la presenza di
una persona chiamata a decidere caso per caso, o almeno nei casi più difficili, correndo
anche il rischio di sbagliare. Molti problemi possono essere risolti dalle macchine, ma ne
sono noti alcuni non risolubili da nessuna macchina. Nel 1982 Quine descrive un metodo per
l’analisi dei valori della verità che risulta molto efficiente basato su alberi di decisione.
La base di conoscenza o KB (Knowledge Base) è un insieme di rappresentazioni del mondo,
ogni singola rappresentazione viene denominata formula, le formule a loro volta sono
espresse in un linguaggio denominato linguaggio di rappresentazione della conoscenza.
I primi studi sulla rappresentazione della conoscenza iniziarono negli anni '70 e possono
essere divisi in maniera sommaria in due categorie: formalismi basati sulla logica che si
sono sviluppati partendo dalla convinzione che il calcolo dei predicati poteva essere usato in
modo non ambiguo per descrivere l’ambiente circostante e, rappresentazioni basate su una
non logica sviluppate tenendo conto di nozioni più cognitive come le strutture di reti e
rappresentazioni basate su compiti specifici derivate da esperimenti riguardanti la capacità
della mente umana di ricordare concetti o di eseguire compiti come la risoluzione di puzzle
matematici. Negli approcci basati sulla logica, il linguaggio utilizzato per la rappresentazione
della conoscenza è una variante del calcolo dei predicati del primo ordine dove il compito del
ragionatore è quello di verificare la consequenzialità logica dei costrutti.
Al contrario in un approccio non logico, spesso basato sull'utilizzo di interfacce grafiche, la
conoscenza è rappresentata per mezzo di una struttura dati ad hoc e il ragionatore ha il
compito di eseguire delle procedure ad hoc utili a manipolare queste strutture. Tra queste
rappresentazioni ricordiamo le reti semantiche e i frame. Le reti semantiche sono dei
formalismi per rappresentare la conoscenza aventi una struttura a grafo. Solitamente i nodi
rappresentano oggetti, concetti, stati, mentre gli archi, eventualmente etichettati,
rappresentano le relazioni tra i nodi. Esse condividono l’idea di base che strutture complesse
possano essere descritte come una collezione di attributi, e valori associati, e che il
ragionamento è, nella sua forma più astratta, una realizzazione di collegamenti, la cui
giustificazione è riconducibile al ‘buon senso’: esperienza, somiglianza, dipendenza, tipicità.
Sono state spesso proposte come modello della memoria umana, e largamente utilizzate per
la comprensione del linguaggio naturale. Le "Reti Semantiche" sono state inizialmente
28
BIOINFORMATICA
sviluppate per i calcolatori da Richard H. Richens del Cambridge Language Research Unit nel
1956 come un'interlingua per la traduzione automatica dei linguaggi naturali. Dagli anni ‘60
agli ‘80, l'idea di un collegamento semantico è stato sviluppato all'interno di ipertesti come
la principale unità di base, o vertici, in una rete semantica. Queste idee sono state
estremamente influenti, e ci sono stati molti tentativi di aggiungere link per la semantica a
pagine HTML e XML.
Le reti semantiche sono state sviluppate con l’apporto del lavoro di Quillian (1967) con
l’obiettivo di caratterizzare, per mezzo di strutture di reti cognitive, sia la conoscenza che il
ragionatore in determinati sistemi. Quillian era dell’opinione che la comprensione del
linguaggio naturale non potesse avvenire semplicemente attraverso regole e orientò i propri
studi sulla semantica del linguaggio naturale, diversamente da Chomsky, che ne studiò la
sintassi. Sebbene esistano delle differenze significative tra le reti semantiche e i frame
entrambi hanno delle basi comuni. Infatti sono considerate delle strutture di rete dove la
struttura ha lo scopo di rappresentare un insieme di individui e le loro relazioni.
La ricerca nell'ambito delle logiche descrittive iniziò con lo studio dei sistemi terminologici
per enfatizzare che il linguaggio utilizzato per la rappresentazione della conoscenza doveva
caratterizzare la terminologia di base adottata nella modellazione del dominio di interesse.
Più tardi l’enfasi fu spostata sui costrutti ammessi dal linguaggio che descrivevano i concetti,
da cui il nome di linguaggi di concetto. In anni più recenti dopo che l’attenzione degli esperti
è stata rivolta verso le proprietà dei sistemi logici, ha preso sempre più piede nella
terminologia comune il concetto di logica descrittiva.
L’oggetto della rappresentazione della conoscenza è l’espressione della conoscenza espressa
in forma trattabile automaticamente. Un linguaggio di rappresentazione della conoscenza è
definito da due aspetti:
La sintassi del linguaggio che descrive le possibili configurazioni che costituiscono le
formule. La sintassi (dal greco συν-, «insieme», e τάξις, «sequenza, ordine») è la branca
della linguistica che studia le regole o le relazioni modulari che stabiliscono il posto che le
parole occupano all'interno di una frase, come i sintagmi si compongano in frasi, e come le
frasi si dispongano a formare un periodo. Di solito rappresentiamo la sintassi in termini di
formule per la carta stampata, in realtà la vera rappresentazione è all’interno di un
computer: ogni formula è implementata da una configurazione fisica. Nel linguaggio
informatico, si indica con sintassi la correttezza formale dei comandi impartiti al computer.
La semantica determina le realtà del mondo a cui si riferiscono le formule. Con la
semantica ogni formula asserisce qualcosa al mondo. Il termine semantica (dal greco
semantikos, "significato", derivato da sema, "segno") è usato in molte diverse accezioni,
tutte attinenti al concetto di "significato" di un "messaggio" in senso ampio. In alcuni casi,
esso viene contrapposto a sintassi, intesa in senso ampio come "forma esteriore" del
"messaggio". Nella programmazione, la semantica di un linguaggio di programmazione (o di
un programma) indica il significato (operativo) delle istruzioni e dei costrutti del linguaggio.
Ogni linguaggio, così come ogni lingua umana, è formato da parole che devono essere
messe insieme secondo determinate regole (sintassi) al fine di ottenere un significato
(semantica). Disporre le parole rispettando una regola non è sufficiente per dare loro un
significato:
regola: soggetto + verbo + complemento
es. 1: Il mio cane corre nel giardino (sintassi corretta, significato valido)
es. 2: Il tuo gatto salta sulla macchina (sintassi corretta, significato valido)
es. 3: Il fiume beve sul mio cane (sintassi corretta ma priva di significato)
es. 4: Il giardino corre nella mia macchina (sintassi corretta ma priva di significato)
In ambito più strettamente linguistico si intende per significato il contenuto semantico o
senso di un segno linguistico. Il termine semantica (che indicava anticamente, in medicina,
la scienza che valuta i sintomi delle malattie) fu introdotto da Locke in filosofia per indicare
lo studio dei segni linguistici. Morris (1938 e 1946) ha introdotto la distinzione in: sintattica
che studia le relazioni dei segni tra di loro; semantica, che studia le relazioni dei segni con
gli oggetti cui sono applicabili.
29
BIOINFORMATICA
Alla base di tutta l’informatica vi sono due concetti fondamentali, che risultano strettamente
interconnessi tra loro: quello di automa e quello di linguaggio.
Il concetto di automa può essere introdotto come segue: per automa si intende un
dispositivo che stabilisce una precisa relazione tra un dato di ingresso e un dato di uscita,
soddisfacendo ai seguenti vincoli di realizzabilità fisica: se l'automa è fatto di parti, queste
sono in numero finito; l'ingresso e l'uscita sono denotabili attraverso un insieme finito di
simboli. L'automa potrebbe essere realizzato da un insieme di dispositivi elettronici digitali,
oppure da dispositivi meccanici o biologici. L'obiettivo è di astrarre dai singoli, specifici casi
concreti enucleando le caratteristiche ritenute essenziali.
Il risultato di questo processo di astrazione consiste nella definizione di opportuni modelli
matematici, cioè di sistemi formali che definiscono di fatto il concetto stesso di
computabilità, cioè costituiscono l'ossatura portante della teoria della computabilità.
Tra i più noti di questi sistemi formali vi è una gerarchia di macchine astratte (la gerarchia
caratterizza la capacità di risolvere classi diverse di problemi) che parte dagli automi a stati
finiti e termina alla macchina di Turing. Un punto di svolta della materia si ha con un famoso
articolo di Alan Turing sulla rivista Mind nel 1950. Nell'articolo viene indicata la possibilità di
creare un programma al fine di far comportare un computer in maniera intelligente. Quindi
la progettazione di macchine intelligenti dipende fortemente dalle possibilità di
rappresentazione simbolica del problema. Il test di Turing -così viene chiamata la condizione
che la macchina dovrebbe superare per essere considerata intelligente- è stato più volte
superato da programmi e più volte riformulato, tanto che queste teorie hanno ricevuto
diverse confutazioni. Il filosofo Searle ne espose una famosa, chiamata "la stanza cinese".
Nello stesso anno dell'articolo di Turing sull'omonimo test per le macchine pensanti, Arthur
Samuel presenta il primo programma capace di giocare a Dama, un risultato molto
importante perché dimostra la possibilità di superare i limiti tecnici (il programma era scritto
in Assembly e girava su un IBM 704) per realizzare sistemi capaci di risolvere problemi
tradizionalmente legati all'intelligenza umana. Per di più, l'abilità di gioco viene appresa dal
programma scontrandosi con avversari umani.
Le macchine di Turing sono macchine a stati finiti in grado di simulare altre macchine a stati
discreti. Una macchina per sostenere il test deve essere programmata considerando la
descrizione di un uomo in termini discreti (stati interni, segnali, simboli). Dalla complessità
del software, emergeranno le funzioni intellettuali. Su questa aspettativa si fonda una
disciplina nota come intelligenza artificiale il cui scopo è la costruzione di una macchina in
grado di riprodurre le funzioni cognitive umane. Sebbene le previsioni di Turing fossero che
entro il 2000 sarebbe stata realizzata una macchina intelligente, finora nessuna ha superato
il test. Questo tipo di sistemi formali cattura il concetto di "macchina" intesa come un
dispositivo che dispone di un proprio stato interno utilizzabile come memoria e caratterizzato
da un insieme di mosse elementari. Altri formalismi partono invece da concetti
completamente diversi. Ad esempio, l'approccio funzionale di Hilbert, Church, Kleene è
fondato sul concetto di funzione matematica e ha come obiettivo caratterizzare il concetto di
funzione computabile. I sistemi di produzione di Thue, Post, Markov partono invece dall'idea
di automa come insieme di regole di riscrittura (dette anche produzioni o regole di
inferenza) che trasformano frasi (insiemi di simboli) in altre frasi. I diversi formalismi si
differenziano invece radicalmente per il modo con cui giungono ad esprimere la soluzione ad
un problema.
Verso la fine degli anni ‘30, Claude Shannon dimostrò che utilizzando un circuito elettrico
dotato di un interruttore era possibile definire le condizioni VERO per il circuito aperto e
FALSO per circuito chiuso. Era possibile dunque effettuare delle operazioni logiche
associando il numero 1 a VERO e il numero 0 a FALSO. Questo linguaggio venne chiamato
linguaggio BINARIO. Il linguaggio binario è dunque il linguaggio che consente il
funzionamento dei computer. Il bit significa binary digit, vale a dire 0 o 1. Quindi la più
piccola unità informativa manipolabile. Possiamo associare sempre o quasi sempre le
informazioni ad un codice binario ad esempio per la nascita di un vitello, possiamo associare
0 se nasce maschio, 1 se nasce femmina. Con un solo bit possiamo avere sia 1 che 0. Con
due bit possiamo avere una combinazione di (2*2). Con tre bit 3 bits possiamo avere otto
30
BIOINFORMATICA
combinazioni differenti (2*2*2). Un ottetto è una unità di informazione composta da 8 bits,
e permette di rappresentare caratteri, intesi come numeri o lettere. La Teoria
dell'informazione è quel settore dell'informatica e delle telecomunicazioni che si occupa di
definire le basi teoriche su cui si fonda la scienza dell'informazione. La sua nascita è
relativamente recente: essa viene solitamente fatta risalire al 1948, anno in cui Claude
Shannon pubblicò Una teoria matematica della comunicazione in cui introduceva per la
prima volta in modo sistematico lo studio dell'informazione e della comunicazione.
Quando nacquero gli elaboratori, l'unico modo di far comprendere loro un programma era
quello di specificarlo nel loro stesso linguaggio, cioè il "linguaggio macchina": un linguaggio
fatto solo di bit e di byte, in cui ogni operazione aveva un codice binario di identificazione e
in cui ogni quantità, numerica o alfabetica, doveva essere caratterizzata dall'indirizzo dei
byte di memoria centrale che la contenevano.
Questo rendeva la programmazione un lavoro da specialisti. Il linguaggio macchina è il
linguaggio programmativo della 1a generazione. Ben presto si passò ai linguaggi della 2a
generazione, cioè ai cosiddetti "linguaggi simbolici". Ai byte si sostituirono dei codici
convenzionali, diversi a seconda del ruolo svolto: ad esempio se il byte {01010101}
denotava la somma, esso si indicò con il codice ADD, facile da ricordare. I linguaggi simbolici
snellirono di molto la programmazione ed in effetti sono talvolta usati ancora oggi; di solito
sono detti "linguaggi assemblatori" ed essendo analoghi al linguaggio macchina permettono
una programmazione particolarmente efficiente.
Anche questi linguaggi sono comunque linguaggi da specialisti mentre gli elaboratori
avevano sempre più l'esigenza di rivolgersi anche a persone non specialiste del settore. Si
arrivò così ai linguaggi della terza generazione, detti "linguaggi algebrici", che possono
essere utilizzati anche da persone senza una profonda conoscenza dell'informatica. Il nome
di questi linguaggi deriva dal fatto che
con questi linguaggi è possibile scrivere
un'espressione quasi come si scrive in algebra e che l'elaboratore è in grado di riconoscere e
tradurre nel proprio linguaggio macchina. Le regole per la costruzione delle frasi di un
linguaggio sono espresse come produzioni di un sistema formale denominato grammatica.
Le regole grammaticali descrivono solo come sono fatte le frasi di un linguaggio, cioè la
sintassi, e di norma non descrivono il significato delle frasi. Le regole grammaticali devono
essere concepite in modo da garantire la decidibilità del linguaggio.
Chomsky
Questo problema, essenziale per poter costruire traduttori ed
interpreti, è oggi risolto attraverso l'uso di grammatiche generative
libere da contesto. Per comprendere il significato di questa
espressione, occorre caratterizzare formalmente il concetto di
linguaggio ed introdurre la classificazione delle grammatiche data
da Chomsky. Per quanto riguarda la caratterizzazione della
semantica di un linguaggio di programmazione, il metodo che viene
spontaneo alla mente è quello operazionale. Visto che un linguaggio
di programmazione serve per descrivere azioni eseguibili da una
macchina, la semantica del linguaggio può venire definita
mostrando come si comporta un automa prescelto in
corrispondenza di ogni classe di frasi del linguaggio.
Ma le azioni dell'automa devono venire espresse a loro volta in modo formale, usando un
linguaggio. Dunque come stabilire la semantica del linguaggio con cui descriviamo l'automa?
Per evitare un regresso all'infinito si deve assumere un livello di formalizzazione primitivo il
cui significato è lasciato all'accordo "intuitivo" (ammesso che ciò sia possibile) tra chi legge e
chi scrive, facilitato dalla semplicità delle mosse dell'automa prescelto.
L'approccio operazionale è tuttavia da molti criticato in quanto troppo di "basso livello",
poiché consente di pervenire alla comprensione di un costrutto linguistico solo dopo una
analisi spesso assai dettagliata e complicata. Molti preferiscono definire il significato di un
31
BIOINFORMATICA
costrutto stabilendo una funzione di interpretazione che associ a quel costrutto una funzione
matematica che denota una specifica relazione ingresso-uscita.
Questo approccio, detto denotazionale, consente di caratterizzare la semantica con un
maggior livello di astrazione rispetto all'approccio operazionale in quanto astrae dalla
nozione di stato. Una prospettiva ancora diversa è quella che imposta la semantica di un
linguaggio in termini di una teoria dei programmi scritti in quel linguaggio. Questo
approccio, detto assiomatico, eleva ancora più il livello di astrazione in quanto si prefigge di
costruire una teoria matematica per quel linguaggio, cioè un sistema formale nel quale è
possibile esprimere fatti interessanti intorno ai programmi e dimostrarne o confutarne
formalmente la verità. Il metodo assiomatico risulta particolarmente attraente dal punto di
vista dell'ingegneria del software in quanto il programmatore non è tanto interessato ad
avere un modello formale dei programmi che scrive, quanto a ragionare sui programmi e
provarne proprietà.
32
BIOINFORMATICA
Linguaggio e alfabeto
Per poter elaborare le informazioni, ovvero per eseguire tutte le operazioni che possono
essere effettuate sulle informazioni (inserimento, archiviazione, modifica, ordinamento,
calcolo, ecc.) è necessario definire un linguaggio, ossia uno strumento che sostituisca dei
simboli particolari agli oggetti ed ai concetti.
- NATURALI
linguaggi
- FORMALI
Un modo più tecnico per definire il concetto di linguaggio è introdurre un insieme di simboli
(detto alfabeto) e dire che "un linguaggio è un particolare insieme di frasi formate dai
simboli dell’alfabeto".
Questa definizione sembra chiara, se non altro perché fa riferimento al concetto matematico
di insieme. Tuttavia questa definizione contiene in sé un problema. Come si fa a descrivere
un insieme? Se questo insieme è finito, la risposta è semplice: per denotare l'insieme basta
scrivere (in modo più o meno ordinato) le frasi che lo compongono. Ma se il nostro intento è
definire un linguaggio con un numero infinito di frasi, allora come si fa ad esprimere
l'insieme in modo finito e non ambiguo?.
Poiché stiamo già usando un linguaggio (l'italiano) possiamo pensare di usare il linguaggio
naturale. Ad esempio, detto A l'insieme {0,1}, diciamo che L1 è il linguaggio le cui frasi sono
formate da n simboli 0 seguiti da n simboli 1, con n che denota un qualunque numero intero
positivo. In base a questa definizione,
sono frasi di L1: 0011, 01, 000111
non appartengono a L1: 011, cane, a+b, etc.
Ma questo modo di procedere si scontra subito con l'ambiguità tipica dei linguaggi naturali,
che può facilmente portare a definizioni a prima vista chiare, ma a una lettura più attenta
non complete o addirittura contraddittorie. Per ottenere definizioni non ambigue, occorre
definire un dispositivo, un automa capace di produrre in modo sistematico e determinato le
frasi del linguaggio.
Certo questa "macchina" non potrà essere un dispositivo fisico, ma solo qualcosa di ancora
puramente simbolico. Sarà dunque un altro linguaggio. Ma così facendo, sembra di cadere in
un ciclo senza fine: per definire un linguaggio abbiamo bisogno di un linguaggio. Per evitare
un regresso all'infinito si deve assumere un livello di formalizzazione primitivo il cui
significato è lasciato all'accordo "intuitivo" tra chi legge e chi scrive, facilitato dalla semplicità
delle mosse dell'automa prescelto. Un modo per definire un automa generatore delle frasi di
un linguaggio è introdurre un insieme di regole "immediatamente comprensibili" a un lettore
umano per comporre tra loro i simboli appartenenti ad un insieme finito prefissato detto
alfabeto. L’esistenza di regole di generazione permette di dare risposta alla domanda: quali
sono le frasi lecite di un linguaggio? Le frasi lecite di un linguaggio sono tutte e sole quelle
frasi che possono essere prodotte usando le regole di generazione stabilite. Ma dare risposta
a questa domanda non basta. Occorre anche rispondere a questi altri due quesiti: data una
frase è possibile stabilire se essa appartiene a un linguaggio? come stabilire il significato di
una frase?
33
BIOINFORMATICA
I linguaggi naturali sono quelli utilizzati quotidianamente dagli uomini per comunicare tra
loro (italiano, inglese, francese, ecc.); sono dotati in una notevole ricchezza espressiva e
semantica, ma possono dar luogo ad ambiguità, imprecisione e difficoltà di interpretazione.
I linguaggi formali sono quelli artificiali, creati dall’uomo secondo regole ben definite e
prive di eccezioni e di ambiguità (Pascal, Cobol, ecc.); sono dedicati a scopi precisi e
circoscritti.
Ogni tipo di linguaggio, in ogni caso, è costruito su un alfabeto.
Un alfabeto è definito come un insieme finito e non vuoto di simboli convenzionali.
Una stringa è rappresentata da una sequenza qualsiasi di simboli.
La stringa vuota è una stringa priva di simboli, indicata con
La lunghezza di una stringa è il numero di simboli nella stringa, per esempio |abc| = 3.
Un linguaggio su un alfabeto I è un insieme di stringhe costruite su I.
Con I* si indica l’insieme di tutte le stringhe su I, inclusa la stringa vuota.
Con I+ si indica l’insieme di tutte le stringhe su I, esclusa la stringa vuota.
Per esempio, se I = {0,1}, allora I+ = {0,1,00,10,01,11,000,111,..}.
Esempi di alfabeti per i linguaggi naturali possono essere:
italiano, composto da 21 lettere;
inglese, composto da 26 lettere.
Esempi di alfabeti per i linguaggi artificiali possono essere:
insieme {linea, punto} del linguaggio telegrafico;
insieme dei colori {rosso,giallo,verde} del linguaggio semaforico;
insieme delle cifre {0,1} utilizzato per il sistema di numerazione binaria.
Dopo aver definito un linguaggio L su un alfabeto I, il primo problema che bisogna risolvere
è la rappresentazione del linguaggio.
Se L è finito, allora basta elencare le stringhe che compongono il linguaggio.
Se L è infinito, allora bisogna trovare altre soluzioni:
un primo metodo consiste nell’introduzione di un sistema generativo, denominato
grammatica. In pratica, ogni stringa del linguaggio viene costruita e strutturata in
modo preciso e non ambiguo utilizzando le regole di una grammatica. Il linguaggio
generato dalla grammatica G si indica con L(G) e rappresenta l’insieme delle
stringhe generabili da G;
un secondo metodo consiste nell’utilizzo di un sistema di riconoscimento, detto
automa. In pratica, l’automa accetta in input una qualsiasi stringa e risponde “SI”
se la stringa appartiene al linguaggio associato, “NO” altrimenti. Il linguaggio
riconosciuto dall’automa A si indica con L(A) e rappresenta l’insieme delle stringhe
riconosciute da A.
In generale, un automa è un dispositivo in grado di eseguire da solo, cioè in modo
automatico, senza l’intervento di una persona, una sequenza di azioni stabilite in
precedenza. È dotato di particolari meccanismi per acquisire elementi in input e produrre
elementi in output: durante il suo funzionamento, può assumere al suo interno stati diversi
tra loro.
Gli aspetti che caratterizzano il funzionamento di un automa sono:
i simboli forniti dall’esterno, che l’automa sa riconoscere nel loro significato;
i simboli prodotti all’esterno come risultato del lavoro svolto;
l’insieme di tutti i possibili stati che l’automa può assumere;
l’insieme di tutte le possibili transizioni di uno stato all’altro.
Il comportamento di un automa può essere descritto da un algoritmo che specifica le azioni
da compiere e del quale l’automa è l’esecutore. Intuitivamente, un algoritmo si può definire
come un procedimento che consente di ottenere un risultato atteso eseguendo, in un
determinato ordine, un insieme di passi semplici corrispondenti ad azioni scelte solitamente
da un insieme finito. Il termine deriva dal nome del matematico persiano Muhammad ibn
Mūsa 'l-Khwārizmī, che si ritiene essere uno dei primi autori ad aver fatto riferimento
esplicitamente a questo concetto, nel libro Kitāb al-djabr wa 'l-muqābala (Libro sulla
ricomposizione e sulla riduzione), dal quale tra l'altro prende anche le origini la parola
algebra. Tuttavia gli algoritmi erano presenti anche nelle antiche tradizioni matematiche, ad
34
BIOINFORMATICA
esempio la matematica babilonese, quella cinese o del Kerala (è uno stato dell'India
meridionale), trasmettevano le conoscenze in forma algoritmica.
Il concetto di algoritmo ha una grande rilevanza in matematica e in informatica, in cui esso
viene generalmente descritto come "procedimento di risoluzione di un problema". In questo
contesto, i "problemi" che si considerano sono quasi sempre caratterizzati da dati di ingresso
variabili. Per esempio, il calcolo del massimo comune divisore fra due numeri è un esempio
di "problema", e i suoi dati di ingresso, variabili di volta in volta, sono i due numeri in
questione. A un non matematico questa potrebbe apparire come una "famiglia di problemi"
(il problema di calcolare il massimo comune divisore fra 10 e 15, il problema di calcolarlo fra
40 e 60, fra 35 e 95, e così via). Il matematico e l'informatico identificano con la parola
"problema" l'intera famiglia e con "istanza" o "caso particolare" ciascuno dei quesiti specifici
ottenuti fissando due particolari valori. Data questa premessa, un algoritmo risolve un
problema se è costituito da una sequenza finita di passi che, applicata indifferentemente a
qualunque istanza del problema, produce in un tempo finito la soluzione desiderata. Se
questa idea aveva una certa importanza per il calcolo matematico, l'avvento dell'informatica
l'ha arricchita di una nuova importanza (ed è infatti con l'informatica che il termine
"algoritmo" ha iniziato a diffondersi). Infatti, se per ottenere un certo risultato (risolvere un
certo problema) esiste un procedimento infallibile, che può essere descritto in modo non
ambiguo fino ai dettagli, e conduce sempre all'obiettivo desiderato in un tempo finito, allora
esistono le condizioni per affidare questo compito a un computer, semplicemente
descrivendo l'algoritmo in questione in un programma scritto in un opportuno linguaggio
comprensibile alla macchina. La complessità di un algoritmo si misura asintoticamente.
Vi sono tre metodi per calcolare la complessità di un algoritmo:
metodo di sostituzione
metodo dell'albero di ricorsione
metodo dell'esperto
Si definisce asintotica per due motivi:
poiché ogni calcolatore può implementare algoritmi in modo differente, non si può
stimare il tempo preciso
si vuole dare un'idea quantitativa di come l'algoritmo possa crescere in consumo di
tempo all'aumentare dell'input, per valori sempre maggiori.
Un automa è definito come una quintupla di elementi A = (I,S,s0,F,T):
1. alfabeto dei simboli input I = (i1, i2,…,in), cioè l’insieme finito dei simboli che l’automa
è in grado di ricevere dall’esterno, riconoscendoli;
2. insieme dei possibili stati S = (s1, s2,…,sn) che l’automa può assumere durante il suo
funzionamento;
3. stato iniziale s0
4. insieme degli stati finali
5. funzione di transizione T: (it, st-1) → (st,ot) cioè la funzione che indica lo stato
successivo di transizione all’istante t e il simbolo che viene emesso verso l’esterno, in
relazione di un determinato stato precedente all’istante t-1 e di un determinato simbolo
input.
In generale, il funzionamento di un automa consiste nell’accettare un simbolo
dall’esterno ed emettere un simbolo in uscita, producendo un cambiamento di stato.
L’automa non ha memoria, quindi la funzione di transizione T dipende solo dallo stato in cui
si trova l’automa e dal simbolo input in lettura in quel momento.
Una stringa sarà riconosciuta dall’automa se, partendo dallo stato iniziale s0 e avendo
come input la stringa, esso dopo un certo numero di transizioni di stato si troverà in uno
stato finale di F; se alla fine l’automa non si trova in uno stato finale, allora la stringa sarà
rifiutata.
Il funzionamento di un automa può essere descritto mediante un algoritmo, con un grafo di
transizione oppure mediante la tabella della sua funzione.
35
BIOINFORMATICA
Esempio di automa che accetta tutte e solo le stringhe binarie con almeno due zeri
consecutivi (accetta 10010 e rifiuta 10110).
A = (I,S,s0,F,T), dove:
I={0,1}
S={p,q,r}
p è lo stato iniziale
F={r}
T è definita dalla seguente tabella
T
p
Q
R
0
q
r
r
1
p
p
r
Lo stato iniziale è p. Lo stato p significa che due zeri consecutivi non sono ancora apparsi e il
simbolo precedente non è uno 0. Lo stato q significa che due zeri consecutivi non sono
ancora apparsi e il simbolo precedente era 0.
Lo stato r significa che sono apparsi due zeri consecutivi. Quando A entra nello stato finale r,
non ne esce più e rimane su questo stato sino alla fine dei simboli input.
Supponiamo di avere in input la stringa 01001. L’automa effettua le seguenti transizioni:
(p,01001) → (q,1001) → (p,001) → (q,01) → (r,1) →
01001 viene accettata
dall’automa.
DAL PROBLEMA ALL’ALGORITMO
Problema. Qualunque problema che ci troviamo a dover risolvere genera delle domande a
cui dobbiamo trovare una risposta. Per la risoluzione di un problema si devono affrontare
alcune fasi: la prima fase consiste nell’individuare con precisione la domanda a cui
rispondere e le rispose da ottenere (dati del problema). La seconda fase consiste nella
costruzione di uno schema che tenga conto solo degli aspetti importanti al fine della
risoluzione del problema (modello del problema). La terza fase è quella più creativa e
consiste nell’individuare le operazioni da compiere per raggiungere il risultato stabilito del
problema (algoritmo).
Dati e Azioni. Nella descrizione del problema occorre anzitutto definire i dati iniziali (dati di
input) sui quali basare la soluzione del problema; essi non devono essere né
sovrabbondanti né troppo ridotti. Poi bisogna definire i risultati che si vogliono ottenere (dati
di output). In un problema i dati possono essere di tipo diverso: numerico (solo cifre:
stipendio, importo, ecc.), alfabetico (solo lettere: nome, cognome, ecc.) o alfanumerico
(insieme di cifre e lettere: codice fiscale, targa, ecc.).
Le azioni rappresentano le attività che si compiono in un intervallo di tempo finito e che,
mettendo i dati in relazione tra loro, consentono di ottenere il risultato del problema. Esse
possono essere operazioni di tipo aritmetico quali i calcoli (somma, IVA 20%, ecc.) o di
tipo logico (confronto tra due valori A>B, controllo per stabilire se è stata raggiunta la fine
di un elenco, ecc.). Per descrivere le azioni è necessario disporre di un linguaggio; le
descrizioni delle azioni sono dette istruzioni.
Una regola pratica per individuare quali sono i dati e quali le azioni di un problema, consiste
nel trattare i sostantivi come dati e i verbi come azioni.
Modello: è una forma semplificata di rappresentazione della realtà che tiene conto di tutti e
solo gli elementi determinanti per la risoluzione di un problema (per esempio, la carta
stradale per la risoluzione del problema della determinazione del percorso più breve tra varie
città).
36
BIOINFORMATICA
Algoritmo: successione ordinata e finita di tutte le operazioni che devono essere eseguite
per raggiungere il risultato del problema stabilito in precedenza.
Implementazione. Per implementazione di un problema si intende il suo trasferimento su
un sistema di elaborazione.
Risolutore. Il risolutore è colui che progetta prima il percorso di risoluzione di un problema
e successivamente l’algoritmo.
Esecutore. L’esecutore è l’ente, nel senso generico di umano o automatico, che esegue le
azioni secondo le istruzioni dell’algoritmo.
Rappresentazione degli algoritmi. Per rappresentare un algoritmo occorre seguire delle
modalità e regole precise. Per quanto riguarda le modalità, possiamo dividere la sua
rappresentazione in tre parti:
1) riga di intestazione: la prima riga contenente il nome che il risolutore decide di
dare all’algoritmo per ricordare l’obiettivo del problema (Algoritmo Media, Algoritmo
Ordina, ecc.);
2) sezione dichiarativa: una o più righe contenente la descrizione degli oggetti che
vengono usati dall’algoritmo, cioè nome e tipo di dati (base, altezza: numeri reali;
pigreco:costante 3,14; ecc.);
3) sezione esecutiva: inizia con la parola begin (o inizio) e termina con end (o fine), e
contiene l’elenco ordinato delle istruzioni dell’algoritmo che l’esecutore deve
eseguire.
Vi sono poi delle regole per comunicare le istruzioni all’esecutore:
a) per indicare l’istruzione di acquisizione di dati si usa il comando input (o leggi) seguito
dal nome della variabile da leggere, messo fra parentesi; se le istruzioni di lettura sono
più di una, si può utilizzare un elenco di variabili separandole con una virgola:
input (base)
input (altezza)
oppure
input (base, altezza);
b) per indicare l’istruzione di comunicazione di dati si usa il comando output (o scrivi);
output (A)
output (B)
oppure
output (A, B);
c) per indicare l’attribuzione di un valore ad una variabile si usa l’istruzione di
assegnamento:
A := B+C oppure
.
In generale, si utilizza la regola dell’indentazione, ovvero si scrivono alcune righe più a
destra per meglio evidenziare gruppi di istruzione.
Sempre per una maggiore chiarezza espositiva, si indicano per convenzione in maiuscolo i
nomi delle variabili e delle costanti, in minuscolo le parole proprie e riservate di ciascuna
sezione, in modo da non confondere le due cose. La tecnica è basata sull'idea di usare gli
spazi bianchi (in genere ignorati da compilatori e interpreti) allo scopo di separare più
chiaramente le istruzioni e, in particolare, di rappresentare esplicitamente le relazioni di
annidamento. In genere, l'indentazione segue la cosiddetta off-side rule, che consiste
nell'anteporre a ogni istruzione una quantità di spazio bianco (spazi, tabulatori)
proporzionale al numero di strutture di controllo o blocchi a cui tale istruzione appartiene.
L’esecuzione di un algoritmo può essere simulata mediante una tabella di simulazione
contenente i valori assunti dalle variabili, man mano che l’algoritmo procede; ogni nuova
attribuzione cancella quella precedente.
Esempio 1. Calcoliamo la media di tre numeri reali assegnati.
algoritmo MEDIA;
variabili
A,B,C,M : numeri reali;
begin
37
BIOINFORMATICA
end
input (A,B,C);
M
(A+B+C) / 3;
output (M)
Esempio 2. Dato un numero intero, calcolare il precedente e il successivo.
algoritmo PREC_SUCC;
variabili
N,P,S : numeri interi;
begin
input (N);
P
N – 1;
S
N + 1;
output (P,S)
end
Esempio 3. Calcolare il punteggio totale attribuito da una giuria di 10 elementi ad un
iscritto ad una competizione.
algoritmo SOMMA;
variabili
C,S,N : numeri interi;
begin
C
0;
S
0;
repeat
input (N);
S
S + N;
C
C + 1;
until C <= 10
output (S)
end
C
S
N
Valori
iniziali
0
0
Tabella di simulazione
Primo
Secondo
passaggio
passaggio
1
2
8
14
8
6
Terzo
passaggio
3
24
10
....
...
...
...
Uno dei risultati della teoria della computabilità è che un insieme è riconoscibile se e solo se
sia per esso sia per il suo
complemento
esiste
un
automa
Rappresentazione
generatore. Tecnicamente, un insieme
FRASI
FRASE
(infinito) i cui elementi sono generabili
Deriva
da un automa si dice ricorsivamente
enumerabile (r.e.). Quando anche il
complemento di un insieme r.e. è r.e.,
Mondo
allora l'insieme si dice ricorsivo. Un
insieme ricorsivo è dunque decidibile,
FATTI
Segue
FATTO
cioè esiste un automa che, data una
qualunque frase, può dare in un
tempo finito risposta "si" se la frase
appartiene al linguaggio oppure risposta "no" se non vi appartiene. La descrizione dei
linguaggi viene effettuata introducendo sistemi formali diversi per la descrizione della
38
BIOINFORMATICA
struttura superficiale delle frasi (sintassi) e per la descrizione del significato di una frase
(semantica).
Ad esempio la sintassi del linguaggio delle espressioni aritmetiche dice che x e y sono
espr
Se la semantica e la
sintassi sono definite con precisione possiamo derivare un meccanismo di inferenza. La
connessione fra formule e fatti è fornita dalla semantica del linguaggio. La proprietà che un
fatto segue altri fatti è rispecchiata dalla proprietà di una formula di essere derivata da
un’altra formula. L’inferenza logica genera nuove formule che sono derivate da formule
esistenti.
La proprietà che un fatto segue altri fatti è rispecchiata dalla proprietà di una formula di
essere derivata da un’altra formula. L’inferenza logica genera nuove formule che sono
derivate da formule esistenti. A noi in generale interessa generare nuove formule che siano
necessariamente vere, nel caso in cui le vecchie formule siano vere; questa relazione viene
chiamata implicazione. Il termine di ragionamento ed inferenza sono solitamente sinonimi
se usati per descrivere un procedimento che porta al raggiungimento di conclusioni.
L’inferenza logica è quindi un processo che realizza la relazione di implicazione fra formule.
Una formula è valida o necessariamente vera se e solo se è vera secondo tutte le possibili
interpretazioni in tutti i mondi possibili. C’è un muro davanti a me e non c’è un muro
davanti a me“ è una formula insoddisfacibile.
Un sistema formale di logica per la descrizione di cose consiste quindi in:
sintassi
semantica
una teoria della dimostrazione.
Esistono due tipi di logica
-logica proposizionale o logica booleana
-logica del primo ordine.
Nella logica proposizionale i simboli rappresentano intere proposizioni e le proposizioni
possono essere combinate usando i connettivi booleani. La logica di primo ordine affida la
rappresentazione dei mondi in termini di oggetti e predicati su oggetti, cioè proprietà degli
oggetti o relazione tra oggetti. Si utilizzano connettivi e quantificatori che consentono di
scrivere in una unica formula asserzioni riguardanti tutti gli elementi dell’universo.
Dobbiamo ora considerare le logiche alla luce delle assunzioni che possono essere
ontologiche o epistemologiche. L'ontologia è lo studio del fondamento di ciò che esiste,
del come esiste, se è solo pensabile, se è costante, universale, accertabile, implica anche la
ricerca del senso profondo di ogni essere reale. Ciò è anche attinente all'antropologia
filosofica e quindi alla domanda circa il senso dell'esistenza dell'uomo che pensa e che si
pensa. Ogni domanda intorno al "soggetto", all'"oggetto" e la loro "relazione", dunque tra
"io" e "mondo", è anche una domanda ontologica. Recentemente il termine 'ontologia'
(formale) è entrato in uso nel campo dell'intelligenza artificiale e della rappresentazione
della conoscenza, per descrivere il modo in cui diversi schemi vengono combinati in una
struttura dati contenente tutte le entità rilevanti e le loro relazioni in un dominio. I
programmi informatici possono poi usare l'ontologia per una varietà di scopi, tra cui il
ragionamento induttivo, la classificazione, e svariate tecniche per la risoluzione di problemi.
Tipicamente, le ontologie informatiche sono strettamente legate a vocabolari controllati repertori di concetti classificati in un'ontologia fondamentale - in base ai quali tutto il resto
deve essere descritto (entro il modello utilizzato). Dal 2001 il termine è stato reso piuttosto
popolare grazie all'intensa attività e alla forte crescita della comunità di ricercatori impegnati
sul tema del Web Semantico. Per estensione si è iniziato ad usare il termine per definire
generici modelli di dati. Comunque nonostante la varietà con cui il termine viene utilizzato,
nella letteratura specialistica sembra consolidata l'idea che in informatica, il termine
ontologia debba riferirsi specificamente ad un tentativo di formulare una
concettualizzazione esaustiva e rigorosa nell'ambito di un dato dominio. Si tratta
generalmente di una struttura dati gerarchica che contiene tutte le entità rilevanti, le
relazioni esistenti fra di esse, le regole, gli assiomi ed i vincoli specifici del dominio. Tale
struttura viene normalmente formalizzata per mezzo di linguaggi semantici che devono
39
BIOINFORMATICA
rispondere alle leggi della logica formale (per questo si parla anche di ontologia formale).
Le assunzioni ontologiche hanno a che fare con la natura della realtà. I fatti della natura
possono essere VERO o FALSO.
La logica del primo ordine assume che il mondo consiste di oggetti con certe relazioni tra
loro che possono essere vere o false. Logiche speciali assumono assunzioni logiche superiori,
ad esempio la logica temporale considera che il mondo sia ordinato da un insieme di punti di
tempo.
L’assunzione epistemologica tratta i possibili stati della conoscenza, l'epistemologia è
quella branca della filosofia che si occupa delle condizioni sotto le quali si può avere
conoscenza scientifica e dei metodi per raggiungere tale conoscenza, come suggerisce
peraltro l'etimologia del termine, il quale deriva dall'unione delle parole greche episteme
("conoscenza certa", ossia "scienza") e logos (discorso). In un'accezione più ristretta
l'epistemologia può essere identificata con la filosofia della scienza, la disciplina che si
occupa dei fondamenti delle diverse discipline scientifiche. È bene precisare che nell'ambito
della cultura anglosassone il concetto di epistemologia viene invece usato come sinonimo di
gnoseologia o teoria della conoscenza, la disciplina che si occupa dello studio della
conoscenza in generale.
i sistemi che usano la teoria della probabilità possono avere gradi di credenza che possono
variare da 0 (credenza nulla) a 1 (certezza). I sistemi basati sulla logica fuzzy possono avere
gradi di credenza secondo gradi di verità. Un fatto non deve essere vero o falso, ma può
essere vero fino ad un certo grado. Ad esempio l’affermazione “La Juventus è una grande
squadra” può essere vera con un certo grado di verità.
Linguaggi formali e assunzioni ontologiche ed epistemologiche
LINGUAGGIO
Assunzioni Ontologiche
Assunzioni Epistemologiche
Logica preposizionale
Fatti
vero/falso/ignoto
Logica del primo ordine Fatti, oggetti, relazioni
vero/falso/ignoto
Logica temporale
Fatti, oggetti, relazioni, tempo
vero/falso/ignoto
Teoria della probabilità
Fatti
gradi di credenza (0….1)
Logica fuzzy
Gradi di verità
gradi di credenza (0….1)
LA LOGICA PROPOSIZIONALE. La sintassi della logica è molto semplice in quanto utilizza
le costanti logiche, vero-falso, i simboli preposizionali P e Q e i connettivi logici. Tutte le
formule sono costruite utilizzando i simboli secondo alcune regole
Le costanti logiche Vero o Falso sono formule
Un simbolo preposizionale come P o Q è una formula
Mettere delle parentesi determina una formula
Una formula può essere ottenuta combinando formule semplici con i connettivi logici.
(and). Una frase in cui il connettivo principale è
(P Q) è chiamata
congiunzione
(or). Una formula che usa
A
(P Q) è una disgiunzione dei
disgiunti (il simbolo
deriva dal latino vel che significa o).
(implica). Una formula come (P Q) R è chiamata implicazione. La
parte (P Q) rappresenta la premessa o antecedente, mentre R costituisce la
conclusione.
(equivalenza). La formula (P Q) (Q P) è una equivalenza
chiamata anche bicondizionale.
(not). Una formula come P è chiamata negazione.
La logica preposizionale ha una ontologia molto limitata, con il solo vincolo che il mondo sia
costituito da fatti.
La semantica nella logica preposizionale è molto semplice quando tratta le costanti logiche;
la formula vero, ha sempre come interpretazione un fatto vero. Una formula complessa ha
un significato derivato delle sue parti. La somma è una funzione che prende due numeri
come interi e restituisce un numero, anche il termine and è una funzione che prende due
valori di verità e restituisce un valore di verità.
40
BIOINFORMATICA
Date due proposizioni P e Q, si può creare una tabella della verità con i connettivi logici.
P
Falso
Falso
Vero
Vero
Q
Falso
Vero
Falso
Vero
P
P Q
V
V
F
F
F
F
F
V
P
Q
F
V
V
V
P
Q
P
V
V
F
V
Q
V
F
F
V
connettivo di implicazione è il più importante, ma anche il più complicato in quanto possono
presentarsi casi lontani dalla nostra intuizione. In molti casi la logica preposizionale non
necessita di alcuna relazione per la rilevanza tra P e Q. Ad esempio la frase “5 è dispari
implica Parigi è una capitale” è un poco strana, ma corretta. Una confusione inoltre deriva
dal fatto che qualsiasi implicazione è vera quando il suo antecedente è falso. Ad esempio
posso avere “5 è pari (Falso) Giovanni è stupido” (vero). In realtà dovrei dire P Q se P
è vero, allora Q è vero, altrimenti non sostengo nulla. Qualsiasi mondo in cui una formula sia
vera secondo una particolare interpretazione è chiamato modello. Infatti potremo definire il
significato di una formula in termini di un insieme di operazioni su un insieme di modelli. Ad
l’intersezione dei modelli P e dei modelli di Q.
Le grammatiche. Il mondo è costituito da oggetti, cioè identità individuali con proprietà e
relazioni, se le relazioni sono tali per cui esiste un solo ingresso si parla di funzioni.
Un linguaggio formale è definito come un insieme di stringhe in cui ogni stringa è una
sequenza di simboli. Tutti i linguaggi sono quindi un insieme infinito di simboli che ha
bisogno di un modo conciso di rappresentazione che è dato dalla grammatica.
OGGETTI
Persone, animali, numeri ……
RELAZIONI
Fratello di, più piccolo di, possiede..
PROPRIETÀ
Rosso, primo, quadrato
FUNZIONI
Padre di, secondo tempo di, uno più di
Esistono diversi formalismi per definire una grammatica, i più diffusi sono certamente la
notazione estesa BNF (proposta da Backus et Naur) e i diagrammi sintattici.
Nella grammatica BNF ci sono quattro componenti
SIMBOLI TERMINALI: sono i simboli o le
parole che compongono le stringhe del
E
L
E
M
E
N
T
IT
E
R
M
IN
A
L
ID
E
LL
IN
G
U
A
G
G
IO
linguaggio. (esempio le lettere dell’alfabeto,
i numeri …)
SIMBOLI NON TERMINALI: consentono la
E
L
E
M
E
N
T
IC
O
N
S
IM
B
O
L
IN
O
N
T
E
R
M
IN
A
L
I
classificazione
delle
sottofrasi
del
linguaggio. Per esempio, il simbolo non
terminale NounPhrase per l’inglese denota
P
E
R
C
O
R
S
O
un insieme infinito di stringhe che
Elementi del diagramma sintattico
comprende “you” e “the big slobbery dog”
A
A
(cane bavoso).
SIMBOLO INIZIALE: è il simbolo non
B
B
terminale che denota l’insieme delle stringhe
del linguaggio. In aritmetica potrebbe essere
c
c
Exp.
REGOLE DI SCRITTURA O PRODUZIONE:
consentono di classificare le stringhe Ad
Equivale ad una
Alternativa B o C
alternativa A, o B o C
o niente
esempio Cifra 7, significa che ogni volta
che incontra il simbolo 7 lo classifica come cifra.
Per leggere un diagramma sintattico si devono seguire alcune regole:
Si legge il diagramma da sinistra.
Si opera una scelta quando si trova una biforcazione.
Se si trova un elemento terminale lo si inserisce nella frase e si prosegue.
41
BIOINFORMATICA
Se si incontra un simbolo non terminale lo si sostituisce con il suo diagramma sintattico.
Grazie alla sua espressività questo tipo di rappresentazione si è largamente diffusa
soppiantando,
in
alcuni
casi,
la
IN
T
E
R
O
S
E
N
Z
A
rappresentazione classica del BNF.
S
E
G
N
O
La conoscenza e la comprensione di
fenomeni complessi in ambito della ricerca
C
IF
R
A
sono rappresentate come modello. Il
metodo scientifico è basato sulla creazione,
verifica,
modifica
del
modello
di
rappresentazione del mondo. La finalità del
Diagramma sintattico di intero senza segno
modello è quella di semplificare e di
spiegare
la
complessità
dei
diversi
fenomeni. Le scienze applicate usano i modelli per predire, controllare e comprendere la
realtà del mondo. Il modello è una rappresentazione che contiene gli elementi essenziali
degli oggetti o degli eventi che si realizzano nel mondo reale.
La rappresentazione di un modello può avvenire secondo due modalità.
FISICA. Come un modello di aeroplano o il modello di una costruzione.
SIMBOLICA. Come nel linguaggio naturale, un programma al computer o una serie
di equazioni matematiche.
I modelli possono essere facilmente cambiati o manipolati: il cambiamento di un modello
simbolico è certamente più facile rispetto al cambiamento in un modello fisico. I valori che si
modificano in un modello sono chiamati parametri.
La costruzione del modello passa attraverso quattro fasi:
SEMPLIFICAZIONE e IDEALIZZAZIONE si identificano gli elementi essenziali della
struttura (oggetti ed eventi).
MANIPOLAZIONE e TRASFORMAZIONE rappresentano le implicazioni derivate dal
modello.
RAPPRESENTAZIONE e MISURA sono il formalismo che descrive gli oggetti, gli
eventi e le loro relazioni. Questo è il processo di traduzione dalle parole
all’espressione algebrica; in statistica utilizziamo i simboli dell’algebra (misure) per
dare significato al processo chiamato misura.
VERIFICA. Le implicazioni derivate sono confrontate con i risultati o le osservazioni
nel mondo reale.
I modelli a nostra disposizione sono in numero ragguardevole e dipendono dalla tipologia dei
dati a nostra disposizione. Il modello per rappresentare la distribuzione di frequenza è ad
esempio una espressione algebrica che descrive la frequenza relativa (altezza della curva). I
modelli più utilizzati in ambito statistico sono quelli chiamati modelli di distribuzione
probabilistica, generati dai processi stocastici che sia rappresentativo della POPOLAZIONE.
Finalmente vogliamo confrontare gli effetti o la causa di interesse in relazione ad altre
condizioni.
Questo è un momento chiave perché dobbiamo individuare una strategia operativa o meglio
pianificare un disegno sperimentale. ll ricercatore deve fornire una informazione di tipo
sintetico sulla base dei dati di cui dispone; i dati quindi possono essere di diverso tipo e
possono essere trattati secondo diverse modalità. La raccolta sistematica di osservazioni e
misure rappresenta la base dell'attività di ricerca: dall'analisi delle osservazioni e delle
misure effettuate il ricercatore cerca di trarre conclusioni che egli spera abbiano una più
ampia validità. Il primo passo da compiere per effettuare una verifica sperimentale è la
progettazione un'indagine definita attraverso la costruzione del "disegno sperimentale". Il
disegno sperimentale consiste nella raccolta dei dati in modo tale che il rumore di fondo sia
ridotto al minimo e che l'informazione sia ottenuta con precisione sufficiente per saggiare
l'ipotesi di interesse sperimentale. Partendo da un'ipotesi generale, possiamo ricavare una
"ipotesi di lavoro o di ricerca", che deve essere ripetibile e verificabile da altri
sperimentatori. Con essa ci poniamo un quesito su un evento futuro, o in ogni modo, su un
avvenimento del quale possiamo solo supporre il risultato.
42
BIOINFORMATICA
interpreta
Mondo reale
Modello
osservazione
modifica
verifica
Mondo reale
Modello
Rappresentazione attraverso un modello generico
COSA SI VEDE
Causa
Effetto
TEORIA
Programma
Osservazioni
Si crede
Si vede
COSA SI CREDE
Rappresentazione di un modello statistico
Nell'ipotesi di lavoro i cardini fondamentali sono dati dall'espressione: "se .... allora ....". In
termini statistici dopo il "se" si indica la variabile indipendente, e dopo "allora" quella
dipendente. L’informazione finale ottenuta sarà tanto più valida quanto maggiore e precisa
sarà la definizione del disegno sperimentale. Una volta terminata la sperimentazione,
l'ipotesi di lavoro potrà essere:
verificata e confermata: quando è possibile affermare che il suo contenuto
risponde effettivamente ai dati raccolti;
verificata e respinta: quando i dati raccolti nella sperimentazione non sono in
accordo con la previsione;
non verificata: quando i risultati della ricerca non permettono né di confermare né
di respingere l'ipotesi di lavoro.
I diagrammi a blocchi (detti anche diagrammi di flusso, flow chart) sono un linguaggio
di modellazione grafico per rappresentare algoritmi (in senso lato).
Esso consente di descrivere le differenti operazioni sotto forma di uno schema in cui le
diverse fasi del processo e le differenti condizioni che devono essere rispettate vengono
rappresentati da simboli grafici detti blocchi elementari. I blocchi sono collegati tra loro
tramite frecce che indicano la cronologia. Per questa loro connotazione topologica i
diagrammi di flusso possono essere ricondotti alla classe più ampia delle mappe concettuali.
I diagrammi trovano la loro applicazione in diversi ambiti: in campo industriale
schematizzano i processi, in campo economico vengono usati a supporto delle presentazioni
per aiutare i destinatari a visualizzare meglio i contenuti, ma storicamente sono sempre stati
molto usati in Informatica dove, in tempi recenti, sono stati soppiantati dall'introduzione
dello pseudocodice.
Una combinazione di blocchi elementari descrive un algoritmo se:
viene usato un numero finito di blocchi
lo schema inizia con un blocco iniziale e termina con un blocco finale
ogni blocco soddisfa delle condizioni di validità
43
BIOINFORMATICA
Condizioni di validità condizioni sui blocchi:
blocco azione e blocco lettura/scrittura: ogni blocco di questi due tipi ha una sola
freccia entrante e una sola freccia uscente
blocco di controllo: ogni blocco di questo genere ha una sola freccia entrante e due
frecce uscenti condizioni sulle frecce:
ogni freccia o entra in un blocco o confluisce in un'altra freccia condizioni sui percorsi:
dal via dev'essere possibile raggiungere ogni blocco
da ogni blocco dev'essere possibile raggiungere il blocco finale.
Esistono 5 tipi di blocchi elementari:
Blocco iniziale
Blocco finale
I/0
Blocco di elaborazione
Blocco di controllo
IL LIVELLO DEI LINGUAGGI
Linguaggi di basso livello. Sono tutti quelli che comunicano direttamente con il computer,
utilizzando i codici operativi dello stesso processore, quindi in "linguaggio macchina". Questo
modo di programmare offre al tecnico la più ampia libertà e potere, ma nello stesso tempo
lo porta a scendere al più basso dei livelli dei linguaggi formali, ovvero deve parlare la stessa
lingua operativa della macchina, adoperando una catena molto lunga di istruzioni
elementari, quindi con molta difficoltà di scrittura e di verifica del corretto funzionamento.
Prima della nascita dei linguaggi formali di alto livello (high-level languages) questa era
l'unica maniera per fare compiere un lavoro ad un computer.
Linguaggi di alto livello. Sono tutti quelli che fanno uso di uno pseudo-linguaggio umano,
utilizzando allo scopo parole-chiave o codici operativi ispirati quasi esclusivamente alla
lingua inglese. Ovviamente ciò facilita molto sia la stesura che la rilettura di un programma,
ma non mette il computer in condizione di capire direttamente cosa vogliamo. Per ottenere il
risultato finale è dunque necessario applicare un "interprete" che traduca il nostro linguaggio
simbolico e decisamente più sintetico, in reali istruzioni di macchina.
Nel tempo l'interpretazione del linguaggio simbolico (programma "sorgente") ha messo in
evidenza la lentezza causata dalla traduzione contemporanea durante lo svolgimento del
calcolo e perciò si è pensato di creare dei "compilatori" che svolgessero un ruolo molto più
completo e produttivo. Il compilatore è un programma (scritto in linguaggio macchina) in
grado di leggere le istruzioni del sorgente, verificarne la correttezza linguistica, e sviluppare
automaticamente le corrispondenti istruzioni in codice operativo di macchina (ottenendo così
un programma "oggetto" o "eseguibile" che dir si voglia). In questo modo abbiamo ottenuto
un valido compromesso, tra il parlare come la macchina e il parlare con la nostra lingua
naturale. Ovviamente i linguaggi simbolici impongono nuove regole di grammatica e sintassi,
per cui dobbiamo comunque fare uno sforzo iniziale per apprenderne le esigenze, ma dopo ci
troviamo la vita più facile perché con termini sintetici riusciamo a ottenere ciò che vogliamo
dal computer.
44
BIOINFORMATICA
ATTRIBUTI DEI LINGUAGGI
Generalmente si tende a suddividere i linguaggi ad alto livello in 3 categorie:
- imperativi
- funzionali
- dichiarativi
Però la classificazione può anche essere più ampia, e soprattutto comprendere alcuni
attributi particolari che ne definiscono meglio le capacità.
Linguaggi Imperativi: sono composti da una sequenza di istruzioni in grado di modificare
il contenuto della memoria del computer o di determinare le modalità di esecuzione di altre
istruzioni. Molto importante è l'istruzione di assegnazione. Quasi tutti i linguaggi più comuni
(RPG, Pascal, Basic, Fortran, C, Cobol, ecc.) agiscono in questo modo.
Linguaggi Funzionali: che servono a calcolare il valore di una funzione. In un linguaggio
funzionale puro l'assegnazione esplicita risulta addirittura completamente assente (si utilizza
soltanto il passaggio dei parametri). In tale modello rivestono particolare importanza la
ricorsione, in pratica l'utilizzo di funzioni che richiamano se stesse e, come struttura dati, la
lista (sequenza ordinata di elementi). Il più importante rappresentante di questa categoria di
linguaggi è senz'altro il Lisp (LISt Processing).
Linguaggi Dichiarativi (o logici): dove il programma è considerato come la dimostrazione
della verità di una asserzione. Il sorgente è costituito da una sequenza di asserzioni di fatti e
regole. Non è necessario indicare esplicitamente il flusso di esecuzione, ma dato un obiettivo
di partenza è il sistema che cerca di individuare i fatti e le regole rilevanti. Il fatto che vi sia
una netta separazione tra la parte dichiarativa (il cosa fare) e la parte procedurale (il come)
rende un programma scritto in un linguaggio logico particolarmente leggibile. I linguaggi
logici risultano molto adatti a risolvere problemi che riguardano entità e le loro relazioni,
mentre nelle normali applicazioni risultano essere di difficile utilizzo, anche perché,
comportano un modo di programmare completamente diverso dal solito. Il linguaggio più
famoso di questo tipo è il Prolog (PROgramming in LOGic).
Altri attributi dei linguaggi.
Linguaggi Strutturati. La programmazione strutturata è una tecnica il cui scopo è di
semplificare la stesura dei programmi, limitando l'uso dei controlli a pochi casi semplici, tutti
con un solo ingresso e una sola uscita. Tale metodo è stato adottato da molti linguaggi
anche preesistenti. Ad esempio per evitare l'uso indiscriminato del famoso GOTO (salto
incondizionato) sono state introdotte istruzioni di controllo strutturato del flusso, come i
blocchi IF-THEN-ELSE, DO WHILE, CASE, FOR, ecc.
L'adozione di nuove regole di strutturazione non impedisce, in casi in cui sia ritenuto
veramente utile, l'utilizzo dei vecchi comandi di salto (GOTO), ancora in uso, per esempio,
per uscire da una routine in caso di errore.
Linguaggi Object-Oriented. Il programma opera su insiemi di oggetti (insiemi di dati e
regole che manipolano questi dati) che comunicano tra loro e verso l'esterno mediante
messaggi. L'Object-Oriented ha adottato nuovi concetti come l'incapsulamento, l'ereditarietà
e il polimorfismo. Oltre a linguaggi specializzati che implementano i principi di tale
metodologia, come Smalltalk, ad esempio, sono nate delle estensioni dei linguaggi già
esistenti, che li integrano (ad es. C++ per il C, il Visual BASIC, Visual RPG, ecc.).
Il primo linguaggio di programmazione orientato agli oggetti fu il Simula (1967), seguito
negli anni '70 da Smalltalk e da varie estensioni del Lisp. Negli anni Ottanta sono state
create estensioni orientate ad oggetti del linguaggio C (C++, Objective C, e altri), e di altri
linguaggi (Object Pascal). Negli anni Novanta è diventato il paradigma dominante, per cui
gran parte dei linguaggi di programmazione erano o nativamente orientati agli oggetti o
avevano una estensione in tal senso. Oggi i linguaggi più usati tra quelli che supportano solo
il paradigma di programmazione orientata agli oggetti sono Smalltalk ed Eiffel. Tuttavia sono
linguaggi in generale poco usati. I linguaggi più usati sono invece quelli che supportano
anche il paradigma di programmazione orientata agli oggetti, come C++, Java, Delphi,
Python, C#, Visual Basic .NET, Perl, PHP (a partire dalla versione 5).
45
BIOINFORMATICA
Il concetto di classe può essere considerato l'erede del tipo di dato astratto, una tendenza
che si è sviluppata all'interno del paradigma della programmazione procedurale, secondo la
quale un modulo dovrebbe implementare un tipo di dato definito dall'utente, con cui si possa
interagire solo attraverso una interfaccia ben definita, che nasconda agli altri moduli i
dettagli dell'implementazione, in modo che sia possibile modificarli contenendo gli effetti
della modifica sul resto del programma. La classe può essere vista come il costrutto che
permette di realizzare questa astrazione con un supporto strutturato da parte del linguaggio.
Le classi sono uno strumento per costruire strutture dati che contengano non solo dati ma
anche il codice per gestirli. Ogni classe contiene degli oggetti che hanno le stesse
caratteristiche. Si avvale poi di relazioni di ereditarietà secondo le quali nuove classi di
oggetti sono derivate da classi esistenti, ereditando le loro caratteristiche e estendendole
con caratteristiche proprie.
Come tutti i costrutti che permettono di definire le strutture dati, una classe definisce un
nuovo tipo di dato. I membri di una classe sono:
attributi (dati, esattamente come i membri di un record)
metodi (procedure che operano su un oggetto)
Dal punto di vista matematico, una classe definisce un insieme in modo intensivo, ovvero
definendone le caratteristiche invece che elencandone gli elementi. Se l'accesso agli attributi
è ristretto ai soli membri della classe, le caratteristiche dell'insieme possono includere vincoli
sui possibili valori che la tupla degli attributi può o non può assumere, e anche sulle possibili
transizioni tra questi stati. Un oggetto può quindi essere visto come una macchina a stati
finiti. Una classe può dichiarare riservate una parte delle sue proprietà e/o dei suoi metodi, e
riservarne l'uso a sé stesso e/o a particolari tipi di oggetti a lui correlati. Un oggetto è una
istanza di una classe. Un oggetto occupa memoria, la sua classe definisce come sono
organizzati i dati in questa memoria.
Ogni oggetto possiede tutti gli attributi definiti nella classe, ed essi hanno un valore, che può
mutare durante l'esecuzione del programma come quello di qualsiasi variabile. Il paradigma
OOP suggerisce un principio noto come information hiding che indica che si debba accedere
agli attributi dell'istanza solo tramite metodi invocati su quello stesso oggetto.
Sintatticamente, i metodi di una classe vengono invocati "su" un particolare oggetto, e
ricevono come parametro implicito l'oggetto su cui sono stati invocati. Questo parametro
normalmente può essere referenziato esplicitamente; per esempio, a tale scopo in C++, in
Java, e in C# si usa la parola chiave this ($this in PHP), mentre in Smalltalk, in Objective-C,
Python e in Ruby si usa la parola chiave self.
Gli oggetti effettivamente creati sono membri dell'insieme definito dalla loro classe. Molti
linguaggi forniscono un supporto per l'inizializzazione automatica di un oggetto, con uno o
più speciali metodi detti costruttori. Analogamente, la fine della vita di un oggetto può
essere gestita con un metodo detto distruttore. L'incapsulamento è la proprietà per cui un
oggetto contiene ("incapsula") al suo interno gli attributi (dati) e i metodi (procedure) che
accedono ai dati stessi. Lo scopo principale dell'incapsulamento è appunto dare accesso ai
dati incapsulati solo attraverso i metodi definiti, nell'interfaccia, come accessibili dall'esterno.
Gestito in maniera intelligente, l'incapsulamento permette di vedere l'oggetto come una
black-box, cioè una scatola nera di cui, attraverso l'Interfaccia sappiamo cosa fa e come
interagisce con l'esterno ma non come lo fa. I vantaggi principali portati dall'incapsulamento
sono: robustezza, indipendenza e l'estrema riusabilità degli oggetti creati. Un
meccanismo molto importante, l'ereditarietà, che permette di derivare nuove classi a partire
da classi già definite. L'ereditarietà permette di aggiungere membri ad una classe, e di
modificare il comportamento dei metodi, in modo da adattarli alla nuova struttura della
classe. Da una stessa classe è possibile costruire diverse classi derivate. Da una classe
derivata è possibile derivarne un'altra con lo stesso meccanismo.
Sintatticamente, una classe può essere anche definita come derivata da un'altra classe
esistente. In molti linguaggi la classe derivata, o sottoclasse, eredita tutti i metodi e gli
46
BIOINFORMATICA
attributi della classe "genitrice", e può aggiungere membri alla classe, sia attributi che
metodi, e/o ridefinire il codice di alcuni metodi. L'ereditarietà può essere usata come
meccanismo per gestire l'evoluzione ed il riuso del software: il codice disponibile definisce
delle classi, se sono necessarie modifiche, vengono definite delle sottoclassi che adattano la
classe esistente alle nuove esigenze. La possibilità che le classi derivate implementino in
modo differente i metodi e le proprietà dei propri antenati rende possibile che gli oggetti
appartenenti a delle sottoclassi di una stessa classe rispondano diversamente alle stesse
istruzioni. Ad esempio in una gerarchia in cui le classi Cane e Gatto discendono dalla
SuperClasse Animale potremmo avere il metodo mangia() che restituisce la stringa "osso" se
eseguito sulla classe Cane e "pesce" se eseguito sulla classe Gatto. I metodi che vengono
ridefiniti in una sottoclasse sono detti "polimorfi", in quanto lo stesso metodo si comporta
diversamente a seconda del tipo di oggetto su cui è invocato. In linguaggi in cui le variabili
non hanno tipo, come Ruby, Python e Smalltalk è possibile richiamare un qualsiasi metodo
su di un qualsiasi oggetto, quindi il polimorfismo è molto più esteso, sebbene ciò comporti la
possibilità di errori a runtime.
Le buone regole di programmazione a oggetti prevedono che quando una classe derivata
ridefinisce un metodo, il nuovo metodo abbia la stessa semantica di quello ridefinito, dal
punto di vista degli utenti della classe. Un linguaggio di programmazione per poter essere
definito a oggetti deve quindi permettere di implementare i meccanismi seguenti:
incapsulamento, ereditarietà e polimorfismo.
Faremo un breve richiamo al linguaggio C progettato nel 1972 da D.M. Ritchie presso i
laboratori AT&T Bell, per poter riscrivere in un linguaggio di alto livello il codice del sistema
operativo UNIX. Il primo sviluppo del linguaggio C ebbe inizio nei laboratori AT&T Bell Labs
tra il 1969 e il 1973; secondo Dennis Ritchie, il periodo più creativo fu il 1972. Fu chiamato
C, perché molte delle sue caratteristiche derivavano del precedente linguaggio B. Questa è
la voce più accreditata, ma esistono anche altre voci fantasiose meno accreditate, come C
per l'iniziale di Compiler, oppure di Cat l'animale preferito di Ritchie. Esistono, inoltre, alcune
simpatiche leggende metropolitane riguardanti C e il suo sistema operativo imparentato,
Unix. Lo sviluppo del C fu il risultato del desiderio dei programmatori di avere un gioco tipo
Asteroids. Giocavano sul mainframe della loro compagnia, che stava per essere dismesso, e
c'erano circa cento giocatori incalliti, tra cui Thompson e Ritchie, che scoprirono di non aver
sufficiente controllo della navicella per evitare gli asteroidi. Di conseguenza, decisero di fare
il porting sul PDP-7 libero nel ufficio. Ma non esisteva il sistema operativo e quindi dovettero
scriverne uno. Con il tempo, decisero di fare anche il porting per il PDP-11, ma questo fu
molto più oneroso perché tutto il codice doveva essere scritto assembly. Provarono ad
utilizzare il linguaggio ad alto livello B, ma non supportava le funzionalità avanzate del PDP11, e da qui nacque il linguaggio C. La motivazione della creazione del primo calcolatore,
che venne utilizzato per sviluppare UNIX, fu la necessità di possedere un sistema per
automatizzare il processo dei brevetti. La versione primordiale di UNIX fu, dunque,
sviluppata in linguaggio assembly. Più tardi, fu usato il linguaggio C per riscrivere e
migliorare l'intero sistema operativo. Nel 1983 è stato definito uno standard (ANSI C) da
parte dell'American National Standards Institute. In seguito è stato aggiornato alla
programmazione orientata agli oggetti, in questo caso si parla di C++, e il suffisso dei file
solitamente è CPP. Il C consente la gestione di bit, byte e indirizzi di memoria, a differenza
di altri linguaggi di alto livello come Basic e Pascal, per questo è definito un linguaggio di
medio livello, ossia più vicino al basso livello, ossia all'assembler. Tra l'altro ha solo 32
parole chiave, ben poche al confronto del basic, che ne ha solitamente più di 150. Inoltre è
un linguaggio portabile, ossia un listato scritto in ANSI C può essere compilato su ogni
compilatore standard di ogni sistema operativo.
Caratteristiche principali del linguaggio C:
• Elevato potere espressivo:
• Tipi di dato primitivi e tipi di dato definibili dall’utente
• Strutture di controllo (programmazione strutturata, funzioni e procedure)
47
BIOINFORMATICA
• Caratteristiche di basso livello (gestione delle memoria, accesso alla rappresentazione)
• Sintassi definita formalmente
Elementi del testo di un programma C. Nel testo di un programma C possono comparire:
• parole chiave sono parole riservate che esprimono istruzioni, tipi di dato, e altri elementi
predefiniti nel linguaggio
• identificatori: nomi che rappresentano oggetti usati nel programma (ad esempio: variabili,
costanti, tipi, funzioni ecc.)
• costanti: numeri (interi o reali), caratteri e stringhe
• operatori : sono simboli che consentono la combinazione di dati in espressioni
• commenti
Parole chiave: sono parole riservate (cioè non possono essere utilizzate come identificatori)
che esprimono istruzioni, tipi di dato, e altri elementi predefiniti nel linguaggio:
auto
break
case
const
continue
default
do
double
else
enum
extern
float
for
goto
if
int
long
register
return
short
signed
sizeof
static
struct
switch
typedef
unsigned
void
volatile
while
Struttura di un programma C. Nel caso più semplice, un programma C consiste in:
<programma>::=[<parte-dich-globale>] <main>[{<altre-funzioni>}]
Struttura del main:<main>::= main(){<parte-dichiarazioni><parte-istruzioni>}il <main> è
costituito da due parti:
• Una parte di dichiarazioni (variabili, tipi, costanti, etichette, etc.) in cui vengono descritti e
definiti gli oggetti che vengono utilizzati dal main;
• Una parte istruzioni che descrive l’algoritmo risolutivo utilizzato, mediante istruzioni del
linguaggio.
Formalmente: il main è una funzione che non restituisce alcun valore.
Il linguaggio C è nato per scrivere programmi di sistema cioè programmi destinati ad
interagire attivamente con la struttura hardware del calcolatore. Flessibilità ed adattabilità
costituiscono i maggiori pregi di questo linguaggio, per contro esiste una carenza relativa
alla strutturazione, la chiarezza e la leggibilità dei programmi. Un'estensione del C,
sviluppata da Bjarne Stroustrup all'inizio degli anni '80, presso i Bell Laboratories, C++
fornisce una serie di funzioni che potenziano il C, ma, cosa ancora più importante, fornisce
le capacità di gestione della programmazione di tipo object-oriented, con ampio utilizzo
delle classi.
In particolare il linguaggio C++ presenta una serie di vantaggi avendo come obiettivo:
-Semplificare l'uso di librerie.
-Permettere il reimpiego del codice.
-Facilitare l'impiego la comprensione e la modifica del linguaggio.
-Creazione di programmi estensibili.
La programmazione orientata agli oggetti (OOP= Object Oriented Programming) rappresenta
una nuova concezione nella risoluzione dei problemi, sostanzialmente viene capovolto il tipo
di approccio; se prima si adattava il problema alla logica del calcolatore, con l'approccio
orientato agli oggetti si adatta il calcolatore al problema.
Il problema viene analizzato individuando delle entità che sono in relazione con altre; queste
entità sono facilmente traducibili nella logica della programmazione e si possono individuare
dei vincoli fisici o concettuali che le separano dal resto del problema. La scelta degli oggetti
48
BIOINFORMATICA
può risultare difficile proprio per le persone che conoscono altri linguaggi, perché abituati a
trasformare il problema nella logica della programmazione. Se vogliamo creare un
programma di gestione di una stalla gli oggetti saranno ad esempio le bovine presenti,
nell'analisi statistica un oggetto può essere rappresentato dalla matrice. Per programmare in
un linguaggio orientato é necessario creare tipi di dati che vengono chiamati classi ed
associare delle operazioni che indicano alle classi come trattare i messaggi inviati. Il
programmatore definisce degli oggetti (variabili) ed invia dei messaggi a questi oggetti.
Semplificando possiamo dire che la programmazione orientata consiste nell'inviare dei
messaggi ad un oggetto e si lascia la gestione del messaggio all'oggetto. Nelle tecniche di
programmazione orientata è più importante la fase di progettazione rispetto alla fase di
sviluppo strutturato. Un linguaggio orientato agli oggetti presenta tre caratteristiche:
Astrazione dei dati. Il meccanismo di astrazione dei dati consente di associare ad una
struttura dati alcune operazioni. Nel linguaggio C++ si ha ad esempio un controllo
dell'accesso ai dati attraverso alcune parole chiave: pubblico, privato, protetto (public,
private, protected).
Ereditarietà. Una volta definito un tipo di dato, si possono specificare altri tipi che
presentano un legame con il tipo definito. Esiste quindi una relazione tra il tipo base e i tipi
derivati. Cani, gatti, uccelli possono essere definiti come tipi animali domestici. L'ereditarietà
rappresenta una relazione concettuale che descrive anche una relazione nel mondo
esistente. Questi legami possono implicare che un messaggio inviato ad un oggetto derivato
dovrebbe generare una risposta appropriata.
Polimorfismo. Si intende il corretto comportamento di una classe derivata quando è
trattata come classe base. Si può infatti inviare qualsiasi messaggio al tipo base e gli oggetti
derivati accettano il messaggio.
Le attività di programmazione per gli oggetti è la creazione di nuovi tipi di dati astratti,
definiti come classi; questi tipi di dati possono essere creati mediante il meccanismo
dell'ereditabilità, e possono avere un comportamento polimorfo. Un utente di una classe
crea gli oggetti ed invia messaggi agli oggetti, l'oggetto è in grado di gestire il messaggio.
L'astrazione dei dati riducono l'interdipendenza tra i moduli, questo consente che la modifica
di un blocco non influenzi gli altri blocchi. L'ereditabilità è utile per un reimpiego del codice
esistente e il polimorfismo aiuta a reimpiegare i programmi o ad estendere i programmi
stessi.
Le dichiarazioni. Una dichiarazione indica al compilatore che un dato o una funzione
esistono all'interno del programma, ma nell'ambito di un programma ci deve essere una
unica definizione per ogni dato o funzione. Le dichiarazioni vengono inserite in file.
Dichiarare una variabile A corrisponde:
int A;
Ad esempio una funzione con ha due argomenti interi risulta essere: int func1 (int, int);
Le librerie. Per agevolare il lavoro ai programmatori esistono delle raccolte che contengono
un numero considerevole di funzioni e variabili. Per accedere a queste librerie si utilizzano
dei file chiamati header. Tali file hanno per convenzione una estensione .h che deve essere
richiamata dal preprocessore. Ad esempio avremo: #include "local.h"
L'esistenza di parentesi quadre può indicare la strada da percorrere per ricercare quel
determinato file.
Linkink. Consente di riunire dei moduli oggetto generati dal compilatore e trasformarli in un
programma eseguibile dal sistema operativo.
extern "C" #include<mioheader.h>
Ingresso-uscita. Esiste una classe predefinita che consente l'input e l'ouput dei file. Ad
esempio potremo avere iostream per evidenziare sullo schermo un messaggio.
#include <iostream.h>
Questo pacchetto automaticamente definisce una variabile oggetto chiamata count che
consente di accettare tutti i dati da inviare allo schermo. Il segno << indica di inviare a
count. Avremo ad esempio.
cout << "BUONGIORNO";
49
BIOINFORMATICA
Quando un programma inizia esegue un codice di inizializzazione e richiama una funzione
speciale main che deve essere preceduta da un valore di ritorno come void.
//: HELLO.CPP-- Visualizza una stringa del compilatore Borland
#include <iostream.h>
void main ( ) {
cout<< "BUONGIORNO SIGNORE"<< endl;
}
Gli iostrem consentono la lettura di caratteri. Il tipo di argomenti di >> determina il tipo di
input che l'operatore attende. Questo breve programma consente la manipolazione del
formato da decimale in ottale
//: NUMCOV.CPP-- Conversione numeri
#include <iostream.h>
void main ( ) {
int number;
cout<< "Inserire numero decimale";
cin << number;
cout << " Valore ottale=0"<<oct<<number << endl;
}
Operazioni condizionali. Sono sostanzialmente simili ad altri linguaggi, infatti si adotta if
(espressione) seguita da una istruzione else ed istruzione.
//: OPERAZCOND.CPP-- Operazioni Condizionali
#include <iostream.h>
void main ( ) {
int i ;
cout<< "Inserire numero e premere return";
cin >> i;
if (i>100)
cout << " Il numero è maggiore di 100<< endl;
else
if(i <100)
cout << " Il numero è minore di 100<< endl;
else
cout << " Il numero è uguale a 100<< endl;
}
Esistono inoltre delle istruzioni di ciclo che consentono l'esecuzione ripetuta fintanto che il
valore dell'espressione non diviene falso. La sintassi risulta: wihle (espressione).
Istruzione. Analogamente esiste l'istruzione for che prevede analogamente ad altri
linguaggi una preventiva inizializzazione. Normalmente i cicli for vengono utilizzati per
compiti che devono essere ripetuti un determinato numero di volte.
Switch. Con questa opzione possiamo effettuare una selezione tra diversi blocchi di codice
in dipendenza di un valore di una espressione intera. La sintassi è la seguente:
switch (selettore) {
case valore 1: istruzione; break
case valore 2: istruzione; break
case valore 3: istruzione; break
default : istruzione; break
}
Operatori matematici. Gli operatori sono comuni a tutti i linguaggi di programmazione e
sono: addizione (+), sottrazione (-), divisione (/), moltiplicazione (*) e modulo (%). La
divisione come nel Basic tende a troncare e non ad arrotondare il quoziente. Esistono delle
notazioni abbreviate che consentono contemporaneamente l'esecuzione di una operazione e
la assegnazione di un valore ad una variabile. Si voglia, ad esempio, sommare 4 alla
variabile x, avremo X+=4.
//: OPERMAT.CPP-- Operatori
50
BIOINFORMATICA
#include <iostream.h>
void main ( ) {
int i,j, k ;
cout<< "Inserire un numero";
cin >>j
cout<< "Inserire un numero";
cin >> k;
print ("j",j); print ("k",k);
i=j+k; print ("j+k", i);
i=j-k; print ("j-k", i);
i=j/k; print ("j/k", i);
i=j*k; print ("j*k", i);
i=j%k; print ("j%k", i);
}
Prototipi di funzione. Indicano al compilatore che esiste una funzione e come deve essere
chiamata. Con i prototipi di funzione si chiama sempre un modello della funzione, sarà il
compilatore a verificare la correttezza degli argomenti e del valore di ritorno. La
dichiarazione void indica che la funzione non ha argomenti.
Classe. Rappresenta un modo per combinare in una unica unità, blocchi di dati e funzioni
per poi manipolarli. Quando si crea una classe si crea un tipo di dato astratto. Questo tipo di
dato viene trattato dal compilatore secondo un tipo predefinito, ad esempio float. La
definizione di una classe è composta dal nome della classe seguita da un corpo racchiuso tra
parentesi graffe e termina sempre con un punto e virgola. Il corpo della funzione contiene
dichiarazioni di funzioni che possono essere associate solo con oggetti appartenenti alla
stessa classe.
Le variabili e le funzioni di una classe vengono definite come membri possono essere non
visibili all'utente e in tal caso sono definite come private. Esempio di definizione di una
classe:
class nurtz {
int i,
private:
void set (int v) {i=v;}
int read () {return i;}
};
Le funzioni membro non sono normali funzioni in quanto possono essere richiamate solo se
associate ad un oggetto.
Oggetto. Si può considerare un oggetto come uno stato interno e delle operazioni esterne.
Le operazioni esterne sono le funzioni membro, le chiamate di funzione rappresentano i
messaggi orientati agli oggetti. Il concetto di stato indica che un oggetto quando non viene
chiamato conserva le informazioni che lo riguardano. Si consideri come esempio un
programma che controlla i cicli di una lavatrice. Per definire una funzione membro è
necessario che il compilatore riconosca che la funzione è associata ad una particolare classe;
per questo si utilizza l'operatore ::
//: CICLI.CPP-- Lavatrice
#include <iostream.h>
constant idle =0;
constant pre_wash =1;
constant spin1 =2;
constant wash =3;
constant spin2 =4;
constant rinse =5;
constant spin3 =6;
class washing_machine
int current_cycle;
public:
51
BIOINFORMATICA
void start ( ) {current_cycle =idle;}
void next ( );
};
void washing_machine ::next () {
switch (current_cycle){
case idle:current_cycle = pre_wash;break;
case pre_wash: current_cycle = spin1;break;
case spin1: current_cycle = wash;break;
case wash: current_cycle = spin2;break;
case spin2: current_cycle = rinse;break;
case rinse: current_cycle = spin3;break;
case spin3: current_cycle = idle;break;
default : current_cycle = idle;
}
cout<<"current_cycle"=" <<current_cycle<<endl;
}
void main () {
washing_machine WM;
WM.start ();
for (int i=0; i<7; i++)
WM.next ();
}
Ereditarietà. Per reimpiegare il codice utilizzando la compilazione si deve dichiarare un
oggetto di una classe come membro di una nuova classe. Nel linguaggio C++ è comunque
necessario che tutti gli oggetti siano inizializzati correttamente. Per controllare la costruzione
di tutti i sotto-oggetti si ricorre ad una speciale sintassi per il costruttore della nuova classe,
cioè una lista di inizializzazione del costruttore. I motivi che spingono all'uso della
ereditarietà sono essenzialmente legati al fatto che si vuole evitare una riscrittura del
programma, un secondo motivo risiede nella possibilità di descrivere il problema secondo un
modello gerarchico delle classi. Quando si deriva una nuova classe da una vecchia la sintassi
è la seguente:
class derived_class_name : base_class name {
// Corpo della dichiarazione
};
I membri di una classe sono se non diversamente specificato private. Si immagini di voler
predisporre un programma che permetta il lampeggiamento dei caratteri sullo schermo
avendo già un programma che consente il posizionamento del cursore sullo schermo.
Avremo:
//: SCREEN2.H-- Lampeggiamento
#inndef SCREEN2_H
#define SCREEN2_H
#include " /chap_7/ screnn1_h"
class_cursor controller2: public cursor controller {
public:
void () normal;// Nessun attributo
void high_intensity ();
void blink (); // Lampeggio
void reverse ();
invisible ();
};
#endif //SREEN_2H_
Polimorfismo. Per meglio comprendere il significato del polimorfismo dobbiamo definire
delle funzioni virtuali che rappresentano il cuore della programmazione orientata agli
oggetti. Si consideri una classe shape (forma) che è in grado di gestire oggetti generici, con
una interfaccia che include le funzioni draw ed erase. Se noi deriviamo delle sottoclassi circle
52
BIOINFORMATICA
(cerchio), square (quadrato), triangle (triangolo) e line (linea). Immaginiamo che il
programma invii il messaggio di disegnare ad un oggetto di tipo shape senza sapere se si
tratta di un cerchio, un quadrato o una line; l'oggetto capisce come disegnarsi.
//: SHAPES.CPP-- Disegno
#include <iosream.h>
struct shape {
virtual void draw () {}
};
struct circle shape {
void draw () {"count << circle ::draw "<<endl; }
};
struct square {
void draw () {"count << square ::draw "<<endl; }
};
struct triangle {
void draw () {"count << triangle ::draw "<<endl; }
};
void main () {
shape*list [ 3 ] = draw (){new circle,new square,new triangle };
for (int i=0; i<3; i++)
list [ i ] ->draw ();
}
Linguaggi Event driven. Per programmare in ambienti di tipo Windows è necessario
provvedere alla gestione contemporanea del possibile verificarsi di tutta una serie di eventi
(movimento del mouse, click, comandi da tastiera, ecc.). In un ambiente guidato da eventi
non determinabili a priori, ma appunto "event driven" non esiste più una sequenza
determinata di comandi da eseguire, ma ad ogni evento bisogna promuovere una
determinata azione.
Per questo motivo anche il linguaggio di programmazione deve poter essere in grado di
gestire questi fatti segnalati dal sistema, ma non tutti i linguaggi lo sanno fare. Il grande
successo che ha riscosso il Visual Basic della Microsoft, o MS Access, derivano anche da
queste loro spiccate attitudini, che permettono di creare facilmente applicazioni sotto
Windows, fornendo anche la capacità di governare un flusso di tipo event driven.
LE CARATTERISTICHE DEI LINGUAGGI. In questo testo non vi è la velleità di affrontare
e risolvere il complesso problema dei linguaggi di programmazione e del loro utilizzo
migliore, ma il contenuto può servire per comprendere e sensibilizzarsi sulla grandezza del
problema, rimandando gli interessati ad altre fonti di approfondimento più qualificate.
Ci sono due strade altrettanto importanti per valutare un linguaggio di programmazione:
- capire "cosa" sa fare il linguaggio, ovvero le motivazioni che ne hanno spinto la
realizzazione, ma non alle sue origini, che magari si perdono nella notte dei tempi, bensì nel
suo stato più recente di disponibilità
- capire "come" lo sa fare, nel senso che molti linguaggi presentano strumenti di sviluppo
analoghi tra loro, ma possono presentarsi con regole grammaticali o sintattiche anche molto
diverse, oppure avere altri limiti, anche gravi, se valutati nel contesto delle nostre esigenze.
Oggi la scelta di un linguaggio da adottare per una certa applicazione si presenta assai vasta
e complessa. Sono finiti i tempi in cui un programmatore studiava e imparava un solo
linguaggio e campava con quello per tutta la sua carriera. La conoscenza di differenti
linguaggi è indispensabile perché il mondo informatico tende ad ampliarsi sempre di più,
integrando in una stessa applicazione problemi che possono essere di gestione dei dati di un
database, di comunicazioni remote, di accesso a Internet, di gestione della sicurezza, di
controllo dei processi, di collaborazione e scambio informazioni tra varie piattaforme o tra
53
BIOINFORMATICA
vari sistemi operativi e via dicendo. Un conto è dovere scegliere un linguaggio per sviluppare
dei giochi al computer, ben diversa la scelta per l'insegnamento universitario ed ancora
diversa quella per realizzare, invece, applicazioni in ambienti aziendali. Solo per citare tre
differenti approcci al problema. Il più elevato numero di programmi e di righe di codice oggi
è sicuramente legato al mondo aziendale, o commerciale o del business o del gestionale, che
dir si voglia.
È per questo motivo che anche molti linguaggi "puri", nati semplicemente per lo studio o con
scopi ben più teorici e nobili, hanno finito, prima o poi, per essere implementati e presentati
anche sul mercato del "grande business". La domanda di sviluppatori competenti è quindi
sempre più orientata a questa area di interesse, che non a tutte le altre. Allora nella marea
di linguaggi proponibili per lo sviluppo di applicazioni aziendali dobbiamo essere in grado di
fare scelte precise e vincenti.
Chiariamo un altro concetto: imparare un nuovo linguaggio richiede tempo e fatica e
soprattutto un buon periodo di esercitazione pratica, senza la quale non s'è imparato un bel
niente! Sbagliare scelta, sia in termini di cultura personale che -a maggior ragione- in
termini di scelta aziendale, può costare molto caro e condannarci a proseguire per quella
strada nel nostro sviluppo di programmi, non potendo buttare via tutto il lavoro già fatto per
ricominciare daccapo.
Gli elementi più critici da valutare possono quindi riguardare:
- la standardizzazione e diffusione del linguaggio e relativa tranquillità e fiducia nel fornitore,
che deve offrire tutte le garanzie di proseguire nella sua evoluzione, adeguando di volta in
volta il suo prodotto al rinnovarsi delle tecnologie, senza piantarci in asso, magari alla
versione 0.1/beta, del suo prodotto.
- le caratteristiche strutturali del linguaggio, gli strumenti che mette a disposizione e le sue
doti fondamentali, ovvero: elasticità, flessibilità, completezza, affidabilità, semplicità e
chiarezza, auto documentabilità, manutenibilità, sicurezza, economicità (rendimento in
termini di tempi di scrittura e debug), e via dicendo.
- la portabilità del codice su varie piattaforme hardware e sistemi operativi diversi.
Ognuno dei suddetti punti è più o meno importante e siccome non esiste il linguaggio ideale,
come non esistono tante altre cose ideali, bisogna dare pesi diversi ai vari attributi, in base
alle nostre specifiche esigenze. Per esempio, in alcune circostanze la portabilità di un
applicativo è fondamentale, mentre in altre situazioni può non essere un grave problema.
Teniamo anche presente che molto spesso esistono tools che alla più disperata ci potrebbero
aiutare molto a migrare da una soluzione ad un'altra.
Così pure la manutenibilità non è sempre un requisito primario. Tutti i programmi si possono
manutenere, ma chiaramente in un' applicazione rivolta a paghe e stipendi o a gestire una
produzione assai variabile nel tempo, questo problema può essere cruciale, mentre in altri
processi potrebbe passare in secondo ordine di importanza. Al di là, poi, delle caratteristiche
intrinseche di ogni linguaggio di programmazione c'è una valutazione altrettanto importante
che deve essere fatta: la conoscenza già acquisita. Se un linguaggio è già in uso da un certo
team di lavoro, anche se non è il linguaggio migliore, probabilmente i risultati che loro
riescono ad ottenere saranno ancora più validi di quelli conseguibili se passassero ad un
nuovo linguaggio. Bisogna anche pensare che l'approccio al problema della scelta è
radicalmente diverso se visto dal lato degli interessi aziendali piuttosto che da quello del
giovane che vuole affrontare la sua carriera. L'azienda ha il dovere di scegliere strade sicure
e soluzioni basate su linguaggi ben diffusi, in modo da non correre rischi di trovarsi in un
vicolo cieco con l'investimento o di essere posta sotto ricatto dal fornitore di software
esclusivo. Il tecnico, invece, può anche seguire i suoi gusti personali e fare scelte di
specializzazioni di nicchia, rischiando qualcosa in più, ma giocando la carta della richiesta sul
mercato. Oggi, per esempio, quanta gente al mondo sa programmare (o comunque dice di
saper programmare) in codice HTML? Sicuramente in tantissimi. Mentre quanti tecnici si
sono specializzati in Postscript? O conoscono bene l'ASP o XML o Perl o Delphi o Visual RPG?
Sicuramente molti di meno. Ma ciò non significa che non ci sia una domanda anche per
quelle conoscenze. Un punto è fondamentale nell'area delle applicazioni aziendali è la scelta
di un linguaggio che sia il più possibile "problem oriented", ovvero che non richieda grandi
sforzi di stesura del codice, ma che lasci al programmatore il tempo e la mente libera per
54
BIOINFORMATICA
potersi concentrare molto di più sulle reali esigenze aziendali e la loro traduzione in
programmi gestionali, piuttosto che arrovellarsi il cervello sul perché una certa attività del
programma non funzioni. Le applicazioni aziendali muovono un'infinità di dati e oggi sono
tutte imperniate su database relazionali. Il programmatore in questo campo deve dunque
essere più un fedele e sensibile interprete ed esecutore della volontà direzionale o della sua
società di servizi, che non un tecnico che si diverta a fare cose sofisticate al computer.
55
BIOINFORMATICA
56
BIOINFORMATICA
ELABORATORE
In termini di componenti, definiamo un elaboratore come un insieme di elementi
raggruppabili in due grosse categorie:
l’hardware - insieme dei componenti fisici, allo stato solido o di altro genere, che
costituiscono un elaboratore.
il software - insieme dei programmi che controllano il funzionamento di un elaboratore.
M
ainM
em
ory
Input
O
utput
C
entral Processing
U
nit
Elaboratore
L’hardware di un elaboratore può essere variamente costituito (come si vedrà nel seguito)
ma rispecchia il modello concettuale ideato da John Von Neumann nel 1946. Von Neumann
individuò i blocchi logici indispensabili a definire un elaboratore e le relazioni esistenti tra
essi, definendo formalmente uno schema che rappresenta ancora oggi il modello a cui i
moderni calcolatori fanno riferimento. Le unità di I/O e le memorie ausiliarie vengono di
norma chiamate periferiche in quanto rappresentano il tramite tra il mondo esterno e il
cuore di ogni calcolatore. Le frecce dello schema indicano il sistema di trasmissione tra i vari
blocchi che viene chiamato bus.
Il personal computer. Un computer è uno strumento per elaborare informazione. Il
computer lavora partendo da informazioni in ingresso (l'input del processo di elaborazione),
le elabora in base a una serie di regole (un programma), e restituisce informazione in uscita
(l'output del processo). La quasi totalità dei computer oggi utilizzati è di tipo digitale,
lavora cioè con informazioni "convertite in numeri" (digit=cifra).
Di solito si considera il computer come l'insieme di due componenti: hardware e software
entrambe indispensabili al corretto
funzionamento del sistema.
L'Hardware
rappresenta
la
"ferraglia", la macchina e le sue
periferiche, i componenti elettronici
e meccanici che costituiscono
l'elaboratore, le cose del computer
che si possono toccare. Costituiscono l'hardware: il processore, la memoria RAM, il disco
rigido,le schede, il monitor o video, la tastiera, il mouse, ecc. ecc. Il software non è palpabile
ma fa funzionare l'hardware: trasforma la macchina e le sue periferiche in un sistema
funzionante. Software è anche sinonimo di programmi: applicazioni finalizzate alla
soluzione di un determinato problema o alla realizzazione di una particolare attività. Sono
software il sistema operativo, i programmi applicativi, i driver per il corretto funzionamento
delle periferiche.
Possiamo distinguere i computer in due grandi famiglie:
• i personal computer sono sistemi monoutente (Personal = per uso personale).
• i mainframe possono essere utilizzati contemporaneamente da diversi utenti attraverso i
terminali. I terminali sono generalmente costituiti da un insieme di video e tastiera (a volte
anche mouse) per colloquiare con il sistema centrale. I terminali non sono computer, sono
periferiche di input/output.
Prima di approfondire i vari blocchi funzionali dell’elaboratore vediamo un esempio.
57
BIOINFORMATICA
Esempio. Per comprendere la struttura di un computer si può immaginare il comportamento
di un cuoco nella sua cucina. Il cuoco prepara delle pietanze, o piatti, che gli sono stati
ordinati, basandosi sulle indicazioni delle ricette corrispondenti. Le ordinazioni vengono
effettuate dai clienti che si rivolgono al cuoco perché hanno appetito.
Il computer è la cucina;
Il cuoco è il microprocessore o CPU;
L'appetito è il bisogno da soddisfare ovvero il problema da risolvere;
La ricetta è il programma che il microprocessore deve eseguire;
Gli ingredienti sono l'input del programma;
Le pietanze o i piatti sono l'output del programma.
Il cuoco, per poter lavorare, appoggia tutto quanto, ingredienti e ricetta, sul tavolo di lavoro.
Su una parte del tavolo sono incise alcune istruzioni che al cuoco
servono sempre, e in particolare quelle che il cuoco deve eseguire
ogni volta che la cucina viene aperta (pulire il tavolo, controllare
tutti gli strumenti: pentole, tegami, coltelli, cucchiai ecc., e
ricevere le ordinazioni assieme alle ricette); senza queste
istruzioni di inizio, il cuoco non saprebbe nemmeno che deve
accingersi a ricevere delle ordinazioni.
Il tavolo di lavoro del cuoco rappresenta, dunque, la memoria
centrale che si suddivide in ROM e RAM. La ROM è quella parte di
memoria che non può essere alterata (nell'esempio del cuoco, si
tratta delle istruzioni incise sul tavolo); la RAM è il resto della
memoria che può essere alterata a piacimento dalla CPU (il resto
del tavolo).
Il computer è pertanto una macchina composta da una o più CPU
che si avvalgono di una memoria centrale per trasformare l'input
(i dati in ingresso) in output (i dati in uscita). Il computer, per poter ricevere l'input e per
poter produrre all'esterno l'output, ha bisogno di dispositivi: la tastiera e il mouse sono
dispositivi di solo input, lo schermo e la stampante sono in grado soltanto di emettere
output. I dischi sono dispositivi che possono operare sia in input che in output.
Il cuoco si avvale di dispense per conservare derrate alimentari (pietanze completate,
ingredienti, prodotti intermedi) e anche ricette. Ciò perché il tavolo di lavoro ha una
dimensione limitata e non si può lasciare nulla sul tavolo quando la cucina viene chiusa,
altrimenti si perde tutto quello che c'è sopra (a eccezione di ciò che vi è stato inciso). I
dischi sono le dispense del nostro cuoco e servono per immagazzinare dati elaborati
completamente, dati da elaborare, dati già elaborati parzialmente e i programmi.
Diverse cucine possono essere collegate tra loro in modo da poter condividere o trasmettere
ricette, ingredienti, etc. Le interfacce di rete e i cavi che le collegano sono il mezzo fisico per
collegare insieme diversi computer, allo scopo di poter condividere dati e servizi collegati a
essi, e anche per permettere la comunicazione tra gli utenti dei vari computer connessi.
COMPONENTI HARDWARE DI UN CALCOLATORE
cabinet: è la scatola che contiene le parti elettroniche principali del personal computer
l’involucro che ha all'esterno interruttori e led e all'interno sostegni per l'alloggiamento delle
parti elettroniche.
Può avere tre forme:
• tower (verticale)
• desk top (orizzontale)
• lap top (portatile)
Contiene:
alimentatore
motherboard o scheda madre
BIOS
BUS
processore o CPU
memoria centrale
58
BIOINFORMATICA
disco rigido o hard disk
unità a dischetto o floppy disk
scheda video
porte di comunicazione
scheda di rete
schede aggiuntive opzionali:
• scheda audio
• modem
• schede di input/output dati
unità di memoria opzionali:
• lettore CD e DVD
• unità di backup a nastri
• ecc.
ALIMENTATORE
Abbassa e rettifica la corrente elettrica, per
alimentare le altre parti del computer. Necessita di
raffreddamento, quindi la ventola deve sempre
girare e non va ostruita
La scheda madre (motherboard).
La scheda madre è senza dubbio la componente
più importante del computer: le funzioni della
scheda madre sono moltissime, per primo
consente il funzionamento del computer stesso.
Le schede madri sono in commercio in due formati
principali: il formato AT e quello ATX. Una scheda
madre AT può essere montata solo ed
esclusivamente in un apposito case (denominato
appunto AT) e una ATX in un case ATX. Il formato AT è meno recente dell'ATX ed è stato
introdotto verso la fine degli anni ottanta, mentre quello ATX verso a metà del 1997. Il
formato ATX prevede delle porte di I/O integrate in piastra madre: una porta parallela
(LPT1) femmina 25 pin di colore viola, 2 porte seriali maschi 9 pin di colore blu, 2 porte USB
che possono collegare al PC qualsiasi tipo di periferica esterna. Fornisce gli alloggiamenti sui
quali si inseriscono numerose componenti: il processore (CPU), la memoria RAM, controller
per unità a dischetti e dischi fissi, gli slot (alloggiamenti delle schede di espansione) a 16 e
32 bit. La scheda madre determina anche il tipo di processore utilizzabile. La scheda madre
si occupa anche delle comunicazioni con le periferiche esterne attraverso le porte di
comunicazione quali le porte seriali, parallele, joystick, PS/2 e USB. In pratica queste porte
permettono di collegare al computer periferiche come stampanti, modem esterni, scanner. I
dischi rigidi e i CD-ROM sono collegati solitamente con un controller EIDE.
Sulla motherboard è anche presente un gruppo di elementi detto chipset che si incarica di
gestire e coordinare il funzionamento di tutti gli altri componenti. Ad esso è delegato il
controllo dell'I/O (Input/Output), dell'I/O del bus e, nelle schede più recenti, dell'elettronica
di gestione dei dischi fissi e CD-ROM. Il chipset coordina anche le richieste di interrupt (IRQ)
e gli accessi diretti alla memoria (DMA). Un altro componente presente sulla scheda madre è
un chip contenente il BIOS (Basic Input Output System). Questo particolare tipo di
memoria, di tipo PROM o Flash ROM sulle schede recenti, contiene un codice che viene
eseguito all'accensione del PC e consente una procedura di autodiagnostica (POST, Power
On Self Test) che esegue tutta una serie di controlli e verifiche sulla memoria RAM, tastiera,
processore, drive, disco fisso, porte di comunicazione.
1. Socket A: è il connettore della CPU sul quale viene montato il processore e bloccato per
mezzo di una leva di bloccaggio.
2. North bridge del chipset: nelle nuove motherboards questo componente è raffreddato
da un piccolo dissipatore di calore, in questo caso anche da una ventola, per via dell'elevata
temperatura che raggiunge durante il funzionamento, in quanto deve gestire un elevata
mole di dati da e per il processore, la memoria centrale e il bus AGP.
59
BIOINFORMATICA
3. South bridge del chipset: gestisce tutte le parti della piastra madre dalle quali non
transitano grandi quantità di dati come i bus PCI e ISA, le porte seriali e parallele, il
controller IDE.
4. Generatore di clock: questo chip fornisce la frequenza di bus utilizzata dalla scheda
madre.
5. Batteria per salvare il contenuto della
memoria CMOS
6. Connettori per i due canali EIDE
entrambi gestiti dal south bridge del chipset.
7. Connettore per due unità floppy disk.
8. Due connettori per canali EIDE
supplementari, gestiti dal controller EIDE
opzionale installato su questa scheda madre.
Questi due canali dispongono di funzionalità
RAID.
9. Slot AGP: connettore per l'adattatore
grafico.
10. Slot PCI: connettore per differenti
tipologie
di
periferiche
(schede
video,
controller SCSI, schede audio, ecc..).
11. Slot ISA: connettore per periferiche per il
quale si sta assistendo ad un progressivo abbandono, nelle schede madri più recenti, in
quanto non veloce e, pertanto, adatto all'impiego con le periferiche più moderne.
12. Bios della scheda madre, su zoccolo estraibile.
13. Slot memoria: come riferimento nell'immagine è stata presa una scheda madre Socket
A per cpu AMD Athlon, Athlon XP e Duron. Gli Slot memoria sono del tipo Dimm tradizionale,
per moduli memoria SDRAM Single Data Rate.
14.Porte parallela (sopra) e seriali (due, poste sotto).
15.Due porte USB per la connessione di periferiche esterne
16.Porte PS/2 per tastiera e mouse.
17.Connettore di alimentazione ATX.
BREVE STORIA DEI MICROPROCESSORI. Potremmo collocare l'inizio dell'era dei Personal
Computer nel fatidico anno 1981, quando nacque il PC IBM, dotato di un processore
denominato 80088 sviluppato nei laboratori Intel. Da allora in poi le CPU, con l'unica
eccezione del Pentium, sono state sempre contraddistinte da una duplice serie di numeri: il
primo è la sigla di progettazione ed è sinonimo della quantità di informazioni che il
microprocessore è in grado di trattare in una sola volta; il secondo numero rappresenta i
megahertz del processore ed indica la velocità con cui le informazioni vengono trasferite da
e verso la CPU. Alcuni processori sono contraddistinti anche da lettere del tipo SX o DX, che
indicano la versione del processore. Di seguito viene fornita una sintetica descrizione dei
principali modelli di microprocessore:
80088 e 80086. Rappresentano la preistoria dei microprocessori ed hanno una velocità
variabile da 4,7 a 10 MHz. I computer che utilizzano questi processori sono denominati XT e
sono usciti di produzione verso la metà degli anni 80.
80286. Nato nel 1985 dà inizio alla "storia infinita" dei computer denominati AT. La sua
velocità varia dagli 8 ai 20 MHz. Non viene più prodotto dal 1992.
80386. Inseriti sul mercato a partire dal 1986, hanno una velocità dai 16 ai 40 MHz.
Esistono due diversi modelli gli SX e i DX. Mentre i secondi sfruttano a pieno la tecnologia
appena immessa sul mercato, gli SX rappresentano una sorta di compromesso nato per
fattori economici, pur trattandosi di 80386 a tutti gli effetti sono montati su schede madre di
precedente generazione che non riescono a sfruttare a pieno titolo le prestazioni del
processore. Con questa generazione di processori è comparso anche il modello denominato
SL, equivalente ad un SX ma a basso consumo di energia, particolarmente sfruttato
soprattutto nei PC portatili.
60
BIOINFORMATICA
80486. Nel 1991 sono stati presentati i primi modelli della fortunata serie 80486
contraddistinta dalla caratteristica innovativa dell'incorporazione del coprocessore
matematico direttamente all'interno della CPU. Esistono 4 diversi modelli dei processori
80486: gli SX, i DX, i DX2 e i DX4, più alcuni modelli a basso consumo energetico come gli
SL. Anche il processore 80486 SX rappresenta una sorta di "anello di transizione" nato per
fini economici, in quanto è l'unico dell'intera serie a non essere dotato di coprocessore
matematico; la sua velocità varia da 25 a 33 MHz. I modelli DX raggiungono una velocità
massima di 50 MHz e hanno rappresentato, unitamente ai loro "fratelli maggiori" la vera
piattaforma di decollo per la grafica e la multimedialità. I DX2 e DX4 utilizzano una
tecnologia conosciuta sotto il termine di "doppio orologio", in grado di raddoppiare o
addirittura quadruplicare la velocità interna della CPU. Mentre un DX lavora in tutta la
scheda madre a 50 MHz, un DX2 lavora a 25 MHz nel resto del computer e a 50 MHz
all'interno della CPU. Le velocità dei DX2 variano da 50 a 66 MHz, mentre i DX4 raggiungono
normalmente i 100 MHz.
1971: Intel 4004: il primo processore a singolo chip della storia. L'architettura è a 4 bit.
1972: Intel 8008: microprocessore con architettura a 8 bit.
1978: Intel 8086: microprocessore a 16 bit.
1982: Intel 80286: microprocessore a 16 bit.
1986: Ubtek 80386: il primo microprocessore della storia con architettura a 32 bit.
1989: Intel i486: il primo microprocessore che infrange la barriera del milione di trasistor.
1993: Intel Pentium.
1997: Intel Pentium MMX: il primo microprocessore con un set di istruzioni dedicate al
multimediale.
1997: Intel Pentium II
1998: AMD introduce le estensioni 3DNow!
1999: Intel Pentium III
2000: AMD Athlon: il primo microprocessore a superare la barriera di 1 Ghz.
2000: Intel Pentium 4: microprocessore con architettura NetBurst.
2003: Intel Pentium M: microprocessore per il mercato mobile che sarà la base futura
architettura Core
2003: AMD Athlon 64: il primo microprocessore con architettura a 64 bit.
2005: AMD Athlon 64 X2: il primo microprocessore dual core.
2005: Intel Pentium D: microprocessore con tecnologia dual core. E' realizzato affiancando
due processori a singolo core in unico package.
2006: Intel Core 2: microprocessore con tecnologia dual core.
2007: Intel Core Quad: il primo microprocessore con tecnologia quad core.
2007: AMD Phenom il primo microprocessore con die monolitico e tecnologia quad core.
2008: Intel Core i7: il microprocessore basato sull'architettura Nehalem con controller di
memoria integrato e die monolitico.
2009: AMD Phenom II, la prima evoluzione del progetto Phenom.
PENTIUM. Secondo la tradizione avrebbe dovuto chiamarsi 80586, ma è stato battezzato
PENTIUM a causa delle leggi americane che non consentono di registrare un marchio di
fabbrica composto di soli numeri. Il nome è figlio di una problematica legale nata quando sul
mercato si sono affacciati i "cloni" dei processori della casa produttrice Intel. Lo
stratagemma del nome è nato per garantire alla Intel l'univocità di denominazione. Si tratta
di un processore immensamente potente la cui velocità varia dai 60 ai 200 MHz. La sua
storia è macchiata da un "neo" che la Intel si è affrettata a correggere con tempestività:
nelle sue primissime versioni in effetti restituiva un errore sul calcolo di una tipologia di
equazioni neppure particolarmente complesse; ma tecnici e progettisti si sono messi
immediatamente a lavoro, e ben presto l'azienda è stata in grado di sostituire gratuitamente
il processore agli acquirenti della sfortunata versione. Ogni generazione di microprocessori
sfoggia un numero di "piedini" superiore alla precedente. Questi piedini costituiscono l'unico
veicolo di comunicazione tra il processore e le varie componenti presenti sulla scheda
madre: ciascuno di essi assolve un ruolo unico ed insostituibile. I processori 80386, vero
61
BIOINFORMATICA
spartiacque dell'universo delle CPU in quanto i chip precedenti sono esclusi dalla prerogativa
delle gestione avanzata della memoria, hanno 132 piedini. Con l'entrata nel mercato degli
80486 siamo arrivati a 168 piedini; cui ne è stato aggiunto un 169° nel caso dei processori
dotati di Overdrive. I PENTIUM, per assicurare le prestazione a 64 bit, richiedono addirittura
273 piedini; che però possono scendere fino a 238 nel caso di Overdrive PENTIUM,
funzionanti internamente a 64 bit ma in grado di comunicare con l'esterno a soli 32 bit! In
aggiunta al microprocessore esistono anche i coprocessori matematici, progettati
appositamente per utilizzare quei programmi che effettuano calcoli molto complicati – in
virgola mobile - come, ad esempio, i programmi di grafica, i programmi CAD... La presenza
del coprocessore matematico è praticamente ininfluente per i programmi che richiedono
calcoli particolarmente complessi: se ad esempio utilizzo un programma di videoscrittura
non ottengo alcun vantaggio dalla presenza del coprocessore matematico. Tuttavia
nell'ultima generazione di processori - a partire dal 486 - il coprocessore matematico è
direttamente integrato nel processore, al fine di favorire le prestazioni multimediali.
Dual core. Unisce due processori indipendenti, le rispettive Cache e i cache controller in un
singolo package. Questo tipo di architettura consente di aumentare la potenza di calcolo
senza aumentare la frequenza di lavoro, a tutto vantaggio del calore dissipato, che
diminuisce rispetto al caso di due processori separati, così come l'energia assorbita.
Aumentare ulteriormente la frequenza di clock di una CPU single core è stato giudicato dai
progettisti una via molto onerosa e complicata, dato che i consumi dei processori hanno
superato i 100 W e si presenta un conseguente problema di raffreddamento dei circuiti.
I primi processori dual core prodotti sono gli IBM PowerPC del 2003 ma il concetto ha
assunto risonanza mondiale nel 2005, anno in cui i due maggiori produttori di CPU al mondo,
Intel e AMD, hanno messo in commercio i primi esemplari di una nuova generazione di
microprocessori. Nel corso del 2005 i due principali realizzatori di chip, Intel e AMD sono
stati praticamente costretti a iniziare il passaggio al nuovo tipo di architettura, quella dual
core, in quanto diventava sempre più difficile aumentare il clock dei tradizionali processori
single core, e a fine 2006 Intel ha presentato anche i primi chip multi core, a 4 core. Il loro
utilizzo è consigliato per applicazioni che richiedono una notevole capacità di elaborazione e
che possano distribuirla su due processori tramite appositi algoritimi, ad esempio
assegnando metà del lavoro a ciascuna CPU per poi unirlo, oppure facendo eseguire in
parallelo compiti differenti alle due CPU. Questo tipo di algoritmi è molto diffuso per
applicazioni di compressione/decompressione che, oltre ai normali programmi di
compattazione, si ritrovano anche nel video/audio editing e nel calcolo scientifico, campi
dove i sistemi multi processore si usano già da parecchio tempo; i sistemi dual core non
fanno altro che portare un sistema biprocessore su un unico socket.
L’Unità Centrale di Processo (Central Processing Unit).
Ha la funzione di elaborare i dati e di controllare il sistema, rappresenta, quindi, il
calcolatore vero e proprio. Si divide nei seguenti blocchi logico-funzionali:
Unità Aritmetico-Logica (Arithmetic-Logic Unit) Esegue le operazioni aritmetiche e
logiche in algebra binaria, comandi come l'addizione, la sottrazione, la moltiplicazione
e la divisione. I messaggi provenienti dall'unità di controllo indicano all'ALU le
operazioni da eseguire, quindi questa unità preleva i dati dai componenti più vicini, i
registri, per completare l'attività.
Unità di Governo (Central Unit) Controlla e gestisce tutte le altre componenti del
calcolatore durante l’esecuzione di un programma. Al suo interno si può individuare
un particolare elemento, detto unità di decodifica, che si occupa di tradurre le
complesse istruzioni dal linguaggio macchina in un semplice formato riconosciuto
dall'unità ALU e dai registri. L’unità di controllo, quindi, in base alle istruzioni
provenienti dall'unità di decodifica, crea dei segnali di controllo che indicano all'unità
ALU e ai registri come operare, su che cosa operare e che cosa fare con il risultato. In
altre parole, l'unità di controllo garantisce che tutto avvenga nel posto giusto al
momento giusto.
Una memoria locale formata da registri, locazioni di memoria ad accesso privilegiato
utilizzate dall’ALU per memorizzare i dati necessari a completare le attività richieste
62
BIOINFORMATICA
dall'unità di controllo. In questo modo, l'unità ALU può recuperarli rapidamente e in
modo efficiente. Alcuni di questi registri sono specializzati nel senso che vengono
utilizzati per una funzione precisa, fra questi vi sono:
Accumulatore utilizzato per salvare operandi e risultati intermedi dell’elaborazione.
La sua dimensione è un indicatore della potenza di calcolo del processore;
Registro Istruzioni (Instruction Pointer) contiene l’istruzione da eseguire;
Registro Contatore di Programma (Program Counter) contiene l’indirizzo della
prossima istruzione da eseguire.
La memoria centrale (Main Memory). La Central Processing Unit è il motore del
computer, la parte che elabora le informazioni.
Le caratteristiche principali dei processori sono il numero di informazioni che possono essere
elaborate contemporaneamente, la quantità di istruzioni eseguibili (ad es. modelli
286- 386- 486- Pentium) e la velocità di elaborazione (frequenza espressa in Mhz) Il
microprocessore o CPU (acronimo inglese di Central Processing Unit) si incarica di dirigere
tutte le operazioni e di trasferire le informazioni risultanti a tutti i componenti del computer:
costituisce il "cervello" vero e proprio del nostro elaboratore. Un "cervello" infinitamente
potente e non più grande di 10 cm quadrati. Rappresenta la grande area di memorizzazione
per i dati e le istruzioni situata all'interno del computer principale e all'esterno della CPU. Più
precisamente, la memoria centrale è un dispositivo in grado di conservare
temporaneamente dati espressi in codice binario (sequenze di 0 e 1).
La memoria centrale può essere vista come una grande tabella divisa in celle ognuna delle
quali è individuabile attraverso un indirizzo univoco. Usando, quindi, l’indirizzo è possibile
accedere ad una qualsiasi di queste celle per eseguire una lettura o una scrittura di
informazioni; questo è il motivo per cui questa memoria viene detta Random Access
Memory.
dato
dato
dato
CU
......
ALU
Unità di decodifica
istruzione
istruzione
Registri
istruzione
IP
PC
......
......
A
CPU
Memoria
Centrale
clock
L'unità di memorizzazione è il byte, la dimensione di una memoria è scelta tra le potenze di
2. Con un byte (8 bit) si possono rappresentare 256 diversi valori, con 1 kb si arriva a 1024.
Nella tabella seguente sono riportati i multipli del byte.
Il processo di esecuzione delle istruzioni ed il
Prefisso
Simbolo
Valore
movimento delle informazioni sia all'interno
Kilo
Kb
210
della CPU che con le altre componenti è regoMega
Mb
220
lato da un orologio (clock). Questo orologio è
Giga
Gb
230
semplicemente un segnale elettrico che può
Tera
Tb
240
cambiare di stato tra alto e basso voltaggio
centinaia di volte al secondo.
La velocità del clock viene misurata in milioni di Hertz (o cicli per secondo), comunemente
indicata con MHz. L’intervallo tra due segnali successivi del clock definisce un passo
elementare di funzionamento (ciclo macchina).
CISC o RISC. Fino all’inizio degli anno ’80 la quasi totalità degli elaboratori era basata su
processori con pochi registri ma con unità di controllo molto complesse in grado di eseguire
istruzioni anche molto articolate. Le architetture di questo tipo venivano chiamate CISC
63
BIOINFORMATICA
(Complex Instruction Set Computer) ovvero computer con set di istruzioni complesse (a loro
volta composte da microistruzioni). Successivamente a fianco di questa tipologia di CPU è
comparso un altro approccio detto RISC (Reduced Instruction Set Computer). L’idea di base
prevede di dotare il processore di un numero ridotto di istruzioni, ma di renderle
estremamente efficienti, in modo che combinando queste semplici istruzioni si potranno
ottenere programmi estremamente complessi che vengono eseguiti a velocità molto elevate.
L’obiettivo seguito per passare da architetture CISC a RISC, è stato certamente quello di
minimizzare il tempo macchina di esecuzione di una istruzione.
Definite le componenti di una macchina di Von Neumann, cosa succede quando questa deve
eseguire un programma, inteso semplicemente come una sequenza di istruzioni scritte in un
linguaggio riconoscibile dalla macchina.
Intuitivamente si può pensare che la CPU per poter svolgere il suo compito di “unità di
processo” deve conoscere, istante per istante:
l’istruzione da eseguire;
i dati da elaborare e la loro posizione in memoria;
l’indirizzo della prossima istruzione da eseguire.
I passi sono:
1.
La CPU preleva l’istruzione dalla memoria all’indirizzo contenuto nel registro PC
(Program Counter) e la memorizza nel registro IR (Instruction Register);
2.
Il valore del PC viene aggiornato in modo che contenga l’indirizzo della prossima
istruzione da eseguire;
3.
La CPU, grazie all’unità di decodifica, interpreta l’istruzione e la esegue con il
supporto dell’unità aritmetico-logica (ALU);
Se l’istruzione prevede l’elaborazione di dati (es: una somma tra due valori in memoria), la
CPU li preleva per salvarli temporaneamente nei suoi registri accumulatori. Dopo aver svolto
l’operazione il risultato viene spostato dalla CPU alla memoria.
Naturalmente a seconda del comando contenuto nell’istruzione la CPU si comporterà in
modo diverso, ma, volendo tentare una generalizzazione, si può affermare che ogni ciclo
macchina è idealmente diviso in tre fasi:
fase di fetch comprende tutte le operazioni svolte dalla CPU necessarie al reperimento
dell’istruzione;
fase di decode interpretazione dell’istruzione da parte dell’unità di decodifica;
fase di execute esecuzione vera e propria dell’istruzione.
Come accennato, le istruzioni sono composte da parole espresse in codice macchina.
Immaginiamo di volere sommare due numeri 2 e 3. In codice macchina (attenzione! Il
codice macchina dipende dal sistema hardware) questa operazione potrebbe diventare:
180 2
176 3
2 224
Il numero 180 viene riconosciuto dalla CPU come l’istruzione "copia il valore 2 nel registro
AH"; il 176 indica di copiare il numero 3 nel registro AL. L'istruzione 2 224 indica di
sommare il contenuto del registro AH con quello del registro AL e di mettere poi il risultato
in AH.
Le memorie. Vi sono molti tipi di memoria ma le due principali categorie sono: RAM
(Random Access Memory) e ROM (Read Only Memory). La di memoria veloce si chiama
cache (dal francese cacher che significa nascosto) di transito tra RAM e CPU, che velocizza
gli accessi ai dati e alle istruzioni. Si tratta di una memoria ad alta velocità (alcuni
nanosecondi) che può rispondere alle richiesta di lettura oppure filtrare le richieste di
scrittura verso la memoria centrale senza imporre stati di attesa al processore. Uno stato di
attesa è un ciclo di clock durante il quale il processore sospende l’elaborazione e attende il
completamento di una richiesta di lettura o scrittura sulla memoria. Pertanto quando la CPU
deve accedere ad un indirizzo di memoria, accede prima alla cache; nel caso in cui questo
64
BIOINFORMATICA
non sia presente nella cache si verifica un fallimento di accesso, allora lo preleva dalla
memoria centrale e lo ricopia nella memoria cache insieme ad un prefissato numero di
locazioni contigue. La cache di primo livello o interna: garantisce un flusso continuo
all’interno del processore. La capacità tipica della cache di primo livello è di circa 32-64 KB.
La cache di secondo livello o esterna che serve per superare la lentezza della memoria
centrale. La capacità tipica della cache di secondo livello è di 128K- 2MB. La cache di
secondo livello è detta anche RAM STATICA (SRAM).
MEMORIA
Veloce
Costosa
Volatile
Interna (RAM)
MEMORIA
Esterna (dischi)
Lenta
Economica
Permanente
La RAM equivale, da un punto di vista logico-funzionale, al blocco di Memoria Principale
presente nel modello di Von Neumann. Grazie alla tecnologia e ai materiali utilizzati, le RAM
hanno un alto grado di integrazione ed è, quindi, possibile integrare memorie da più
megabytes su un singolo chip. Tale tecnologia ha però lo svantaggio di non permettere
altissime velocità nel senso che il tempo di accesso è dell’ordine di qualche decina di
nanosecondi (10-9 sec).
La ROM contiene solo piccole quantità di software di sistema, necessarie ad avviare il
calcolatore; è una memoria a sola lettura.
Nel campo dell’hardware uno degli obiettivi è certamente quello di ridurre sempre più i tempi
di accesso alla memoria e di trasferimento dei dati. In quest’ottica è stata sviluppata la
tecnica della memoria cache che fornisce un compromesso tra velocità e costi utilizzando
una porzione di memoria veloce per contenere i dati acceduti più di frequente mantenendo
l’uso della RAM per consentire l’uso economico di memorie di grandi dimensioni.
La memoria cache si trova fisicamente vicino alla CPU e raggiunge la velocità dei
nanosecondi. Quando è richiesto una lettura della memoria la cache è ricercata per prima.
Mentre la memoria secondaria viene utilizzata per mantenere tutti i programmi e tutti i dati
che possono essere utilizzati dal computer. La memoria secondaria viene anche detta
memoria di massa. Quando si vuole eseguire un certo programma, questo dovrà essere
copiato dalla memoria di massa a quella principale (caricamento). La memoria secondaria
deve avere capacità di memorizzazione permanente e quindi per la sua realizzazione si
utilizzano tecnologie basate sul magnetismo (dischi e nastri magnetici) o tecnologie basate
sull'uso dei raggi laser (dischi ottici). Nel primo caso si sfrutta l’esistenza di sostanze che
possono essere magnetizzate. La magnetizzazione è permanente fino a quando non viene
modificata per effetto di un agente esterno. I due diversi tipi di magnetizzazione
corrispondono alle due unità fondamentali di informazione (bit). Le tecnologie dei dischi
ottici sono completamente differenti e sono basate sull'uso di raggi laser. Il raggio laser è un
particolare tipo di raggio luminoso estremamente focalizzato che può essere emesso in fasci
di dimensioni molto ridotte.
Una ulteriore possibilità per velocizzare i calcoli è rappresentata dall'impiego del
coprocessore al quale vengono demandate una classe particolare di operazioni. La FPU
(Floating Point Unit) è una unità per il calcolo in virgola mobile. Un termine formale per
indicare quello che più comunemente è conosciuto come coprocessore matematico (un’altra
denominazione è quella di Numeric Data Processor - NDP). Il processore primario nasce per
eseguire unicamente calcoli sui numeri interi e quando deve affrontare calcoli più complessi
diminuisce sensibilmente la propria efficienza. Il termine di virgola mobile si riferisce a un
65
BIOINFORMATICA
particolare tipo di notazione matematica che permette di rappresentare in modo sintetico
anche numeri molto grandi. La notazione in virgola mobile riporta il segno del numero, il
numero stesso (mantissa), la radice del sistema di numerazione in uso (10 nel caso di un
sistema decimale) e l’esponente da applicare a tale radice. Il coprocessore matematico è un
chip dedicato ai calcoli matematici a virgola mobile (ad esempio il Motorola 68882), alcuni
coprocessori sono dedicati al trasferimento dei dati al modem, alla stampante; nel caso si
debba lavorare con grafici e colori ad alta risoluzione si deve considerare l'acquisto di
coprocessori grafici come ad esempio l'AMD 29000. Nel caso ci si interessi di audio si
rendono necessari i chip DSP (processore digitale di segnale).
Al fine di guadagnare velocità esistono dei processori chiamati RISC (Reduced Instruction
Set Computer) che dispongono di una serie semplificata di istruzioni nella decodifica e nella
fase di preparazione degli argomenti di ogni singola istruzione. La velocità maggiore di
questi processori viene ottenuta essenzialmente in quanto questi limitano l'accesso alla
memoria operando direttamente tra un registro e l'altro. Per questo motivo i RISC
dispongono di un numero più elevato di registri.
SLOT DI ESPANSIONE. Sono gli alloggiamenti per la scheda grafica, il controller SCSI, la
scheda audio, l'adattatore di rete e qualsiasi altro tipo di espansione. Sono di tipo PCI (32
bit a 33 MHz) e ISA (16 bit a 8 MHz). Nelle schede recenti esiste anche uno slot di tipo AGP
(Accelerated Graphics Port) per l'interfacciamento con schede grafiche ad alta velocità (32
bit a 66 o 133 MHz)
BUS. I componenti del computer ricevono e spediscono informazioni attraverso dei canali
chiamati bus. Esistono diversi tipi di bus in ogni computer ma il più importante è il bus che
consente il passaggio tra la memoria e il processore. La questione più importante è relativa
alla velocità di passaggio dei dati e delle istruzioni. Due sono i fattori che governano questo
passaggio la velocità del clock e la larghezza del bus. La velocità è rappresentata dalla
quantità di dati che possono essere trasferiti con una operazione. I primi modelli di Pc
disponevano di un bus con 8 bit, che può essere rappresentato da 8 linee parallele. Questo
implica che l'informazione possa essere trasferita dalla memoria alla CPU un byte per volta.
BUS AGP. L'unità attraverso la quale le istruzioni provenienti dalla memoria principale del
computer vengono trasferite da e verso il microprocessore. Per assecondare l’incremento
della potenza di calcolo delle Cpu, Intel ha sviluppato una nuova architettura denominata
Agp. In pratica, tutti i dati in ingresso/uscita dalla Cpu vengono smistati all’AgpSet, che lo
convoglia direttamente alla scheda video, alla Ram o al bus Pci. In questo modo si
decongestiona il bus Pci, che non deve più trasferire i dati dalla Cpu al controller grafico. Un
altro vantaggio dell’Agp è la possibilità da parte della scheda video di utilizzare la Ram di
sistema con un evidente vantaggio economico.
CHIPSET. Come già accennato, il chipset si incarica di gestire tutti gli elementi presenti
sulla scheda madre. I chipset più diffusi per processori Pentium® sono contraddistinti dalle
sigle: Hx con supporto della memoria Fast-Page e EDO Ram. Vx che supporta anche le veloci
SDRAM e indirizza fino ad un massimo di 128 Mb Tx evoluzione del vecchiotto Vx, gestisce 6
banchi e indirizza fino a 512 Mb supporta anche il protocollo Dma/33 Eide per raddoppiare la
velocità massima di trasferimento del controller Eide. Lx per Pentium II composto da 2 chip
con supporto alla AGP, SDram, USB e Ultra DMA. Il CHIPSET si divide in NORTHBRIDGE e
SOUTHBRIDGE il primo si occupa dei dati diretti alla memoria centrale e alla Cache, il
secondo serve a controllare le porte seriali e tutte le periferiche.
Il microprocessore può essere integrato nella piastra madre. Al chipset sono affidati tutti i
trasferimenti di dati tra le varie periferiche e tra loro e il microprocessore; è quindi
opportuno scegliere un buon chipset nell'assemblare un computer di qualità, ed è composto
da due differenti chip, il North Bridge e il South Bridge; il primo ha dimensioni maggiori
rispetto al secondo, mentre il secondo è posto, generalmente, nella metà inferiore della
motherboard, nelle vicinanze degli Slot PCI e ISA. Mentre i primi chipset per sistemi Pentium
(quelli montati su motherboard dotate di Socket 5) erano formati da più di due chip, da un
paio di anni a questa parte tutti i produttori si sono orientati verso una costruzione a due
chip, il North Bridge e il South Bridge per l'appunto.
In dettaglio, le funzioni di questi due chip sono:
66
BIOINFORMATICA
• North Bridge: controlla il funzionamento di tutti i bus e il corretto funzionamento del
processore, della memoria centrale e dell'adattatore video, installato su bus AGP o PCI;
• South Bridge: gestisce i dati che sono indirizzati a tutte le periferiche presenti che non
sono indispensabili per il funzionamento del sistema, come il controller per sistemi di
memorizzazione di massa, le porte seriali e parallela, le porte USB, PS/2 (Mouse e tastiera)
le porte infrarossi, il controller Floppy Disk, i bus PCI e ISA.
Le caratteristiche da tenere in considerazione nella scelta di un chipset sono diverse, e tutte
hanno un ruolo di notevole importanza per quanto riguarda prestazioni e affidabilità.
Le più importanti sono:
• tipologia cache L2: modalità di gestione della cache L2;
• dimensione massima cache L2: quantitativo massimo di memoria cache L2 che può
essere gestita dal chipset; questo valore è interessante solo per le motherboard Socket 7 e
Super 7, in quanto nelle cpu Slot 1 la cache L2 è direttamente integrata nella cpu stessa;
• memoria massima supportata: quantitativo massimo di memoria che il chipset può
gestire;
• memoria massima cacheable: quantitativo massimo di memoria che può essere letta
attraverso la cache L2; se la quantità di memoria installata eccede tale limite si ha un
impatto negativo sulle prestazioni complessive;
• tipi di memoria supportata: FP (Fast Page); EDO (Extend Data Output); SDRAM
(Synchronous Dynamic Random Access Memory);
• nunero CPU gestibili: indica quante CPU, dello stesso tipo, il chipset può gestire
(configurazioni mono, bi, quadri processore);
• USB: supporto all'Universal Serial Bus, bus di comunicazione tra scheda madre e
periferiche di controllo e visualizzazione (tastiere, mouse, monitor, altoparlanti, ecc...) di
recente implementazione;
• AGP: supporto all'Advanced Graphic Port, standard di fatto per gli acceleratori video;
• plug & play: supporto al plug & play per il riconoscimento automatico delle periferiche
installate da parte del sistema operativo;
• versione PCI: la specifica 2.0 ha quale frequenza massima i 33 Mhz per le periferiche
PCI, mentre quella 2.1 i 66 Mhz;
• ACPI: l'ACPI (Advanced Configuration and Power Interface) è un'interfaccia di
programmazione che gestisce le modalità di risparmio energetico della motherboard;
• Presenza o meno di controller AUDIO o VIDEO integrati: per ridurre i costi di produzione
di PC, alcuni chipset (intel serie 810 e 815, Via MVP4 e KM133) integrano schede audio e
schede video. La memoria grafica delle schede video è una frazione (di quantitativo
regolabile da bios) della memoria di sistema. Essendo questo tipo di memoria più lento, le
prestazioni saranno ridotte rispetto allo stesso modello di scheda video su BUS AGP o PCI.
Un altra caratteristica dei chipset è il tipo di processori che esso può supportare. Questa
caratteristica è definita dal tipo di collegamento del processore.
CACHE DI ISTRUZIONI. La cache di istruzioni è un magazzino di istruzioni situato proprio
sul chip, in modo tale che il microprocessore non deve fermarsi a cercarle nella memoria
principale del computer. Questo accesso rapido velocizza l'elaborazione, in quanto le
istruzioni vengono trasferite tramite 'fetching' nell'unità di prefetch, dove vengono disposte
nell'ordine corretto per l'elaborazione.
UNITÀ DI PREFETCH. L'unità di prefetch stabilisce quando ordinare i dati e le istruzioni
provenienti dalla cache di istruzioni o dalla memoria principale del computer, in funzione dei
comandi o dell'attività in corso. Quando arrivano le istruzioni, l'attività più importante
dell'unità di prefetch consiste nell'assicurarsi che vengano tutte allineate correttamente per
essere poi inviate all'unità di decodifica.
UNITÀ DI DECODIFICA. L'unità di decodifica, come indica il nome, decodifica o traduce le
complesse istruzioni in linguaggio macchina in un semplice formato riconosciuto dall'unità
ALU (Arithmetic Logic Unit) e dai registri. In questo modo, l'elaborazione diventa più
efficiente.
UNITÀ DI CONTROLLO. L'unità di controllo è uno dei componenti più importanti del
microprocessore, in quanto è responsabile dell'intero processo. In base alle istruzioni
provenienti dall'unità di decodifica, crea dei segnali di controllo che indicano all'unità ALU
67
BIOINFORMATICA
(Arithmetic Logic Unit) e ai registri come operare, su che cosa operare e che cosa fare con il
risultato. L'unità di controllo garantisce che tutto avvenga nel posto giusto al momento
giusto.
ALU (Arithmetic Logic Unit). L'unità ALU rappresenta l'ultima fase di elaborazione nel
chip. Si tratta del componente intelligente del chip che esegue comandi come l'addizione, la
sottrazione, la moltiplicazione e la divisione. Inoltre, sa leggere i comandi logici come OR,
AND o NOT. I messaggi provenienti dall'unità di controllo indicano all'ALU le operazioni da
eseguire, quindi questa unità preleva i dati dai componenti più vicini, i registri, per
completare l'attività.
REGISTRI. I registri sono una piccola area di memorizzazione per i dati utilizzati dall'unità
ALU per completare le attività richieste dall'unità di controllo. I dati possono provenire dalla
cache di dati, dalla memoria principale o dall'unità di controllo e vengono tutti memorizzati
in posizioni speciali all'interno dei registri. In questo modo, l'unità ALU può recuperarli
rapidamente e in modo efficiente.
CACHE DI DATI. La cache di dati opera a stretto contatto con i suoi "partner
dell'elaborazione", vale a dire l'unità ALU, i registri e l'unità di decodifica. È qui che vengono
memorizzati i dati con etichette speciali provenienti dall'unità di decodifica per essere poi
utilizzati dall'unità ALU, ed è qui che vengono preparati i risultati finali prima della
distribuzione ai diversi componenti del computer.
MEMORIA PRINCIPALE. La grande area di memorizzazione per i dati situata all'interno del
computer principale e all'esterno del microprocessore. Di volta in volta, la memoria
principale può inviare dati o istruzioni per l'unità di prefetch, che spesso vengono
memorizzati in un indirizzo della cache di istruzioni per essere utilizzati in seguito.
MEMORIA CACHE. Una delle attività più lente in un elaboratore è il ricorso alla memoria,
sovente l’accesso alla memoria si effettua molte volte durante il ciclo di elaborazione, la
velocità di accesso quindi può condizionare le prestazioni di un processore. Per migliorare le
prestazioni si ricorre ad una memoria secondaria chiamata cache che viene posta tra la
memoria principale e il resto del processore. L’utilizzo di una memoria cache parte dal
presupposto che i dati e le istruzioni siano poste in allocazioni vicine fra loro nella memoria
principale.
SISTEMA OPERATIVO. Il sistema operativo di un computer è il programma più importante.
È quello che viene attivato al momento dell'accensione del computer; esso esegue gli altri
programmi. Sarebbe come se il cuoco eseguisse una ricetta (il sistema operativo) che gli da
le istruzioni per poter eseguire le altre ricette. Il sistema operativo determina quindi il
comportamento del computer. Cambiare sistema operativo in un computer è come cambiare
il direttore di un ufficio: a seconda della sua professionalità e delle sue doti personali,
l'ufficio funzionerà in modo più o meno efficiente rispetto a prima, e pur se non cambia
niente altro, per gli impiegati potrebbe tradursi in un modo di lavorare completamente
nuovo.
Un utente del computer ha la necessità di utilizzare le risorse della macchina e di
programmarla a tale scopo il sistema operativo gli mette a disposizione diversi strumenti.
1-Comandi di lettura scrittura sui diversi supporti di memorizzazione senza che l’utente
debba conoscere le caratteristiche dei diversi dispositivi.
2-Gestore dei file (file System) è un sistema semplice ed efficiente di archiviazione e ricerca
delle informazioni.
3-Traduttori una serie di traduttori che permettono di tradurre le istruzioni in un linguaggio
simbolico (sorgente) in microistruzioni in linguaggio macchina. I traduttori di basso livello
vengono definiti come assemblatori. I compilatori traducono un intero programma sorgente
in un linguaggio macchina, mentre gli interpreti se viene interpretata ogni singola linea di
programma e posta in esecuzione immediata.
4-Caricatore (loader) che prevede a copiare il programma dalla memoria di massa alla
memoria centrale RAM affinché possa essere eseguito dal processore:
5-Editore di testi (text Editor) che consente di comporre testi in formato ASCII mediante
tastiera.
68
BIOINFORMATICA
6-Un analizzatore di errori di programma (debugger) che consente la correzione e la messa
a punto dei programmi.
7-Una serie di programmi per la gestione della memoria e delle periferiche.
8-Programmi per l’ordinamento dei dati (sortine) e la loro successiva ricerca.
9-Programmi di interfaccia sistema/utente, anche di tipo grafico per facilitare la
comunicazione uomo/macchina.
Ci sono sicuramente affinità tra un sistema operativo e l'altro, ma questo vuol sempre dire
una marea di dettagli differenti e soprattutto l'impossibilità di fare funzionare lo stesso
programma su due sistemi operativi differenti, a meno che ciò sia stato previsto e voluto da
chi costruisce i sistemi operativi.
UTENTE
COMANDI
Sistema Operativo
PROGRAMMI APPLICATIVI
TRADUTTORE
INTERPRETE
NUCLEO Sistema Operativo
Il Sistema operativo costituisce una piattaforma sulla quale sono appoggiati tutti i
programmi che consentono il funzionamento del Computer. L’adozione del sistema
determina le applicazioni che possono funzionare ed essere utilizzate sul computer. Data la
struttura dei sistemi operativi è evidente che i programmi devono essere costruiti per quel
particolare sistema operativo. Il sistema operativo non si limita solo a rendere possibile
l’esecuzione dei programmi, regola il collegamento con tutte le periferiche. Attualmente la
stragrande maggioranza dei computer utilizza i sistemi operativi derivati da Windows, ma
esistono soluzioni alternative che possono presentare dei vantaggi. Un sistema operativo è
costituito da una serie di programmi, logicamente separati tra loro, che assieme formano un
software spesso di grandi dimensioni. Senza un sistema operativo un elaboratore personale
è praticamente inutilizzabile. Nella pratica quindi un sistema operativo fornisce un metodo
per poter interagire con l'utente. Un sistema operativo deve svolgere delle funzioni
essenziali per il funzionamento di un elaboratore. Non è però chiaro quali siano esattamente
le funzioni che devono appartenere al sistema operativo e quelle che possono essere
considerate delle semplici applicazioni. Nel campo informatico sono stati sviluppati diversi
sistemi operativi, che differiscono considerevolmente nelle funzionalità di base e nella
filosofia che li anima nella gestione delle risorse. Si pensi all'enorme differenza che esiste tra
alcuni sistemi operativi, da cui deriva anche una certa difficoltà al confronto in quanto si
tratta di oggetti diversi, nati e cresciuti con obiettivi e finalità diverse.
Negli anni '70 la scena del mercato dei computer era dominata dalla IBM che produceva
macchine enormi destinate ai centri di calcolo; per effettuare un calcolo si doveva prendere
appuntamento, programmare i calcoli, e successivamente si otteneva un listato chiamato
output di stampa, sul quale si potevano leggere i risultati dei calcoli. Una piccola rivoluzione
nacque con l'introduzione sul mercato dei minicomputer ed in particolare del modello Pdp 10
69
BIOINFORMATICA
della Digital. Su questa macchina iniziò a lavorare Bill Gates che di notte controllava gli
errori dei programmi (debugging). In quel periodo non esisteva quello che noi conosciamo
come il software, ma ogni macchina aveva dei programmi specifici. Nel 1974 sempre Bill
Gates creò una versione particolare del Basic ed iniziò a commercializzarlo.
Negli stessi anni una società americana la Altair inizia le vendite per corrispondenza del
primo microcomputer, le capacità operative di questa macchina erano davvero limitate. Paul
Allen e Bill Gates prepararono una versione Basic per l'Altair che montava un processore
Intel 8080, e contemporaneamente fondarono la Microsoft. Il successo fu enorme tanto da
spingere la IBM a creare una task force dedicata allo sviluppo dei minicomputer; non si
parlava ancora dei personal computer. Nel 1981 viene presentato il primo personal
computer IBM con una struttura standard espandibile attraverso il bus Isa. Il computer
montava un processore Intel in un ambiente Basic nella Rom e il nuovo sistema operativo
chiamato DOS (Disk Operating System). In effetti il sistema DOS non è stato creato dalla
Microsoft, ma bensì acquistato da una società di Seattle che aveva creato un clone del
sistema Cp/M della Digital. La Digital stessa si rifiutò di sviluppare il DOS e la IBM ricorse
all'aiuto di Gates ed Allen che fornirono il sistema. Si chiude in questo momento la prima
fase dell'era informatica.
Lo scopo di un sistema operativo è quello di nascondere la struttura intima di un calcolatore.
Si ha una struttura a cipolla. All'interno della cipolla si ha l'hardware, nel primo strato
esterno si impiega il linguaggio macchina e si trovano le procedure di gestione delle
interruzioni e dei driver. Le procedure di interruzione mettono il computer in uno stato di
attesa di un evento. Ad esempio attende che un tasto della tastiera venga premuto. Un
driver (letteralmente autista) è generalmente una astrazione che consente di risparmiare
molto tempo nelle operazioni di trasferimento. In pratica ogni dispositivo di ingresso/uscita
possiede un suo proprio drive che ne regola direttamente la gestione senza disturbare il
programma in esecuzione. Nel secondo strato troviamo i device, cioè dispositivi logici che
sfruttano e comandano i vari dispositivi fisici; sono device ad esempio, il monitor, la tastiera,
la stampante. Un device non comanda direttamente i dispositivi esterni, ma sfrutta i driver
presenti al primo livello. Un device ha quindi una serie di procedure indispensabili per
accedere alle funzioni dei dispositivi.
Nel terzo livello troviamo lo strato file system, che rappresenta le modalità con cui viene
interrogata la memoria di massa. Il file system consente ad esempio di conservare degli
oggetti anche quando si spegne la macchina. Un file è una sequenza logica di informazioni
che nelle memorie di massa sono necessarie per riconoscere un documento. L'accesso alle
memorie di massa generalmente è casuale e frammentato, pertanto il file deve essere
ricostruito prelevandolo dai diversi blocchi nei quali è stato posizionato. Si tratta quindi di
dare tutte le informazioni di posizionamento alle testine di lettura per recuperare le
informazioni richieste e trasformarle in codice binario. Nel terzo strato troviamo una specie
di convertitore che trasforma ed ordina logicamente i file nelle cartelle.
Il quarto stato effettua il collegamento con gli strati inferiori e le applicazioni finali, in alcuni
sistemi l'intero strato è denominato User Interface Toolbox e risulta suddiviso in blocchi
logici separati chiamati con il nome di Manager. Ciascun gruppo è rappresentato da una
serie di procedure, che ogni applicazione può richiamare per ottenere dei servizi dal sistema
operativo. L'insieme di tutte le procedure viene chiamata API (Application Program
Interface). Esistono quindi diversi Manager; possiamo avere una Memory Manager che
fornisce una serie di istruzioni per la gestione della memoria RAM, il Font Manger si occupa
della gestione dei caratteri, il Window Manger, il Control Manger, il Dialog Manager, tutti
manager che gestiscono la visualizzazione di oggetti tipici dell'interfaccia. L'ultimo strato del
sistema è rappresentato dall'interfaccia utente. Una volta veniva chiamato semplicemente
interprete comandi, in quanto l'utente interagiva direttamente con la macchina attraverso
dei comandi. I compiti essenziali di un'interfaccia utente sono quelli di rendere visibile
l'organizzazione dei file, di fornire assistenza al lancio di applicazioni.
IL SISTEMA OPERATIVO. Il sistema operativo è ciò che regola il funzionamento di tutto
l'insieme di queste cose. Volendo schematizzare, si possono distinguere tre elementi
il kernel
70
BIOINFORMATICA
la shell
i programmi di utilità.
KERNEL. Il kernel è il nocciolo del sistema. Idealmente, è una sorta di astrazione nei
confronti delle caratteristiche fisiche della macchina ed è il livello a cui i programmi si
rivolgono per qualunque operazione. Ciò significa, per esempio, che i programmi non devono
(non dovrebbero) accedere direttamente ai dispositivi fisici, ma possono utilizzare dispositivi
logici definiti dal kernel. Questa è la base su cui si fonda la portabilità di un sistema
operativo su piattaforme fisiche differenti. Il kernel avvolge idealmente il computer e i suoi
dispositivi fisici, ovvero tutto l'hardware, e si occupa di interagire con i programmi che
ignorano il computer fisico. La portabilità è quindi la possibilità di trasferire dei programmi
su piattaforme differenti, e ciò si attua normalmente in presenza di kernel che forniscono
funzionalità compatibili.
PROGRAMMI
SHELL
KERNEL
SHELL
PROGRAMMI
HARDWARE
KERNEL
Kernel e Shell
Naturalmente esistono sistemi operativi che non forniscono kernel tanto sofisticati e lasciano
ai programmi l'onere di accedere direttamente alle unità fisiche del computer. Si tratta però
di sistemi di serie "B'', anche se la loro nascita è derivata da evidenti necessità causate dalle
limitazioni di risorse dei computer per i quali venivano progettati.
SHELL. Il kernel offre i suoi servizi e l'accesso ai dispositivi attraverso chiamate di funzione.
Però, mentre i programmi accedono direttamente a questi, perché l'utente possa accedere ai
servizi del sistema occorre un programma particolare che si ponga come intermediario tra
l'utente (attraverso il terminale) e il kernel. Questo tipo di programma è detto shell. Come
suggerisce il nome (conchiglia), si tratta di qualcosa che avvolge il kernel, come se
quest'ultimo fosse una perla. La shell è il programma che consente all'utente di accedere al
sistema. I terminali attraverso cui si interagisce con la shell sono comunque parte
dell'hardware controllato dal kernel.
Un programma shell può essere qualunque cose, purché in grado di permettere all'utente di
avviare, e possibilmente, controllare i programmi. La forma più semplice, e anche la più
vecchia, è la riga di comando presentata da un invito, o prompt. Questo sistema ha il
vantaggio di poter essere utilizzato in qualunque tipo di terminale, compresa la
telescrivente. Nella sua forma più evoluta, può arrivare a un sistema grafico di icone o di
oggetti grafici simili, oppure ancora a un sistema di riconoscimento di comandi in forma
vocale. Si tratta sempre di shell.
MULTITASKING. Una componente del sistema operativo è responsabile delle risorse dei
computer tra le diverse task, si definisce questo processo task schedular. Esistono due
possibilità nella gestione delle task. Uno scheduling preventivo e uno cooperativo detto
anche non preventivo. Con lo scheduling preventivo, il task scheduler é legato al battito
interno del computer che regola le operazioni. Il task schedular assegna ad ogni task il
controllo delle risorse del computer per un tempo determinato. Quando questo tempo è
trascorso il sistema operativo mette in attesa l'applicazione e dedica il suo tempo
all'applicazione successiva. Nello scheduling cooperativo non esiste un tempo di allocazione
riservata. La divisione del tempo del microprocessore è divisa tra tutte le applicazioni in
esecuzione. Una applicazione quindi deve cedere il controllo del microprocessore ad intervalli
71
BIOINFORMATICA
frequenti in modo che le altre applicazioni abbiano il tempo per l'esecuzione. Se un
programma si impossessa del microprocessore per troppo tempo, l'esecuzione degli altri
programmi rallenta vistosamente fino all'arresto. L'inconveniente di questo sistema è che se
un programma si blocca, tutto il sistema resta bloccato.
PROGRAMMI DI UTILITÀ. I programmi di utilità sono un insieme di piccole applicazioni
utili per la gestione del sistema. Teoricamente, tutte le funzionalità amministrative per la
gestione del sistema potrebbero essere incorporate in una shell, in pratica, questo
solitamente non si fa. Dal momento che le shell tradizionali incorporano alcuni comandi di
uso frequente, spesso si perde la cognizione della differenza che c'è tra le funzionalità
fornite dalla shell e i programmi di utilità.
PROGRAMMI APPLICATIVI. Il computer non può essere una macchina fine a se stessa.
Deve servire a qualcosa, al limite a giocare. È importante ricordare che tutto nasce da un
bisogno da soddisfare. I programmi applicativi sono quelli che (finalmente) servono a
soddisfare i bisogni, e quindi, rappresentano l'unica motivazione per l'esistenza dei
computer.
IL SISTEMA OPERATIVO IN 5 PUNTI
MULTIUTENTE = possono essere utilizzati da più utenti contemporaneamente.
MULTITASKING = possono essere eseguite contemporaneamente più applicazioni.
MULTIHREADING = possono essere eseguite in modo concorrente diverse componenti di una
stessa applicazione.
MULTIPROCESSING = possibilità di utilizzare più unità centrali contemporaneamente.
SISTEMI REAL-TIME = dare la garanzia di risposta in tempi brevissimi.
MS-DOS. Quando IBM introdusse il primo personal computer negli anni '80 si prevedeva la
vendita di poche unità e la società non si preoccupò di renderli di facile utilizzo. La IBM si
accordò con una piccola società; la Microsoft, per dotare i calcolatori di un sistema
operativo. La Microsoft fornì un sistema chiamato MS-DOS che si rilevò un enorme successo
commerciale, non si può dire che il sistema fosse facile in quanto richiede agli utenti di
digitare parole chiave mnemoniche.
Tale sistema è considerato un'interfaccia a linea di comando; i comandi devono essere
digitati al prompt del DOS e non viene fornita nessuna indicazione del nome da immettere.
Ad esempio compare c:/>
Attualmente i computer sono diventati più potenti e più veloci, ma nessuno vuole
abbandonare il sistema MS-DOS in quanto tutti i programmi costruiti in DOS potrebbero non
essere più compatibili.
WINDOW. Il progetto Windows nasce nel 1983 per sopperire ai limiti del DOS. Microsoft era
consapevole che MS-DOS stesse invecchiando molto velocemente, gli utenti abituati ad
esempio al telecomando non erano disponibili a digitare complicate istruzioni per eseguire
qualsiasi operazione. Nasce da questa esigenza Window, che presentava sullo schermo una
serie di immagini chiamate icone; con le icone era necessario semplicemente puntare il
mouse sulle icone stesse. Negli stessi anni nasce il fenomeno commerciale delle Compaq che
tende ad imporre uno nuovo standard costruttivo, basato sull'architettura Microchannel dei
Ps/2. Il sistema era proprietario e quindi costoso, il mercato in notevole fermento propose
un sistema equivalente, la Pci. IBM voleva avere dei computer unici e superiori a quelli della
concorrenza e che tali computer facessero riferimento sia per l'architettura che per il sistema
operativo a quelli dei suoi grandi computer i mainframe. IBM, che aveva una alleanza con
Microsoft dal 1985 voleva che Windows fosse destinato alla fascia bassa del mercato per un
passaggio al sistema Os/2. Il mercato nella fase iniziale non offrì la rispondenza attesa. Nel
frattempo si sviluppano versioni di programmi definiti di "produttività personale" o di office
automation. Nel maggio 1990 viene presentato Windows 3.0 e Bill Gates conia la celebre
frase "information at your fingertips" (informazioni sulla punta della dita) ed inizia il vero
successo commerciale di Windows.
Negli anni successivi la crescita dell'hardware ha guidato la crescita del software. Windows 3
non era un multitasking e non era in grado di sfruttare al meglio la modalità protetta e il
codice era a 16 bit, la capacità di coesistenza delle applicazioni era demandata alle
applicazioni stesse, piuttosto che al sistema operativo, si trattava sostanzialmente di un
multitasking cooperativo. Negli anni '90 i rapporti con IBM si fanno tesi e nel 1992 la IBM
72
BIOINFORMATICA
presenta una prima versione autonoma del sistema a 32 bit del suo Os/2, le relazioni si
rompono e la Microsoft annuncia il progetto NT, un sistema di fascia alta. Le successive
versioni di Windows 3.x affinano sempre più le capacità di gestione, vengono rese pubbliche
le librerie di programmazione del sistema operativo (sono chiamate API), successivamente
vengono rese pubbliche anche le librerie Win 32, un set di API che dovrebbero essere
comuni a Windows NT e al successore del 3.x che in codice viene chiamato Chicago. Si tratta
dunque di un progetto che tende a far evolvere dai 16 bit ai 32 bit (il che permette di
superare ogni limite di indirizzamento della memoria: 4 Gigabyte). Nasce da precise
esigenze di mercato Windows 95 e la sua evoluzione Windows 98. Siamo di fronte a sistemi
che adottano un codice misto a 16 e 32 bit, ad un multitasking in parte cooperativo e in
parte preemptiv, con alcune tracce ancora del vecchio Dos. Con il termine Fat32 indichiamo
la struttura della tabella di allocazione dei file e con il termine 32 i bit supportati per la
definizione dei singoli campi. Uno dei grossi limiti di Windows 95 è stato quello di non
prevedere una partizione di grandezza superiore ai 2 Giga byte.
Con l'utilizzo della Fat32 viene drasticamente ridotta la dimensione dello spazio fisico
occupato dai file di piccole dimensioni e pertanto sfruttiamo meglio lo spazio a disposizione
sul disco rigido. Windows 98 eredita quindi da Windows 95 ed aggiunge dei componenti
fondamentali per il passaggio a NT, attraverso un driver chiamato Win "Device Driver Model"
ed uguale per i due sistemi. Per concludere questa breve rassegna possiamo dire che il
sogno di IBM si è realizzato con un piccolo particolare che il sistema sul quale converge
Windows non è OS/2 ma NT 4, o la prossima versione NT 5 attesa per il 2000. Window è
stato un grosso successo, ma il problema di fondo rimaneva in quanto Window non
sostituisce il DOS, ma funzionava sopra il DOS. Da un punto di vista commerciale era quindi
necessario acquistare sia il DOS che Window per rendere operativo un Pc.
UNIX. Il nome Unix deriva da MULTICS, acronimo di Multiuser Interactive Computer
System, un progetto iniziato al M.I.T. verso la metà degli anni '60. In questo progetto vi era
la finalità di definire uno standard per i sistemi operativi, attuabile da tutti i produttori. In
questo modo i programmatori potevano elaborare pacchetti di software eseguibili in molti
tipi di computer, inoltre gli utenti che avevano confidenza con una interfaccia avrebbero
potuto utilizzare con più facilità computer differenti. Pur avendo deluso in parte queste
attese UNIX rimane uno standard per i computer a livello superiore. Il sistema operativo
UNIX è generalmente installato sui mini e microcalcolatori, tale sistema ha conosciuto un
notevole sviluppo ed una diffusione negli anni recenti in quanto si adatta ad ambienti di
lavoro diversi (editoria, elaborazione testi, applicazioni scientifiche). L'interesse é aumentato
in quanto il grandi calcolatori interagiscono tra loro attraverso UNIX. Le caratteristiche di
semplicità sono il risultato di un insieme ridotto di meccanismi ben combinati tra di loro che
lo rendono un sistema operativo adatto allo sviluppo di programmi. Il sistema UNIX nasce
nei laboratori Bell, sviluppato da D. Ritchie e K. Thompson nel 1969, le prime versioni
vennero distribuite gratuitamente alle scuole, College ed Università americane. Una delle
prime scuole a ricevere UNIX fu l'Università di Berkeley che in seguito commercializzò una
versione chiamata UNIX BSD (Berkeley Software Distribution) giunta attualmente alla
versione 4.3. Una delle principali versioni di Unix sviluppata nel periodo che va dal 1979 al
1993 presso il Computer System Research Group dell’Università di Berkeley in California. Il
BSD ha giocato un ruolo fondamentale nel favorire la crescita di Internet poiché è stata la
prima versione di Unix a incorporare gratuitamente il protocollo TCP/IP oltre ad altre funzioni
innovative come la commutazione dei task (task switching), l’uso di 255 caratteri per i nomi
dei file e la gestione della memoria virtuale (area su disco che viene vista come
un’estensione della memoria centrale, altrimenti detta RAM).
Il gruppo incaricato di questo sviluppo fu capitanato da Bill Joy fino al 1982, anno in cui
quest’ultimo fondò la Sun Microsystems usando la versione 4.2 del BSD Unix come base per
il proprio SunOS. Il BSD fu distribuito gratuitamente a centinaia di college e università
americane e fu utilizzato da queste come ambiente di lavoro e di connessione in rete. Oggi
l’Università di Berkeley non è più impegnata direttamente nello sviluppo di Unix, tuttavia
alcune delle componenti introdotte allora, come le socket, sono diventate uno standard per
tutte le versioni di Unix in commercio. Molti dei laureati di Berkeley si impiegarono in società
informatiche pertanto derivarono delle versioni UNIX particolari; Sun OS della Sun
73
BIOINFORMATICA
Microsystem, HP-UNIX della Hewelett-Pakard, AIX della IBM. La Bell successivamente
sviluppò una versione conosciuta come System 5. A questo punto il Sistem V e l'UNIX BSD si
fusero insieme creando una società la Open Software Foundation che iniziò a
commercializzare un altro tipo di UNIX: OSF/1.
Senza un sistema operativo sofisticato un computer può eseguire una sola unzione alla
volta; con UNIX nasce il multitasking; cioè la possibilità di volgere più attività
contemporaneamente, inoltre UNIX è multiutente, esiste la possibilità per diversi utenti di
condividere lo stesso computer nello stesso arco di tempo. Il sistema è fornito di strumenti
di elaborazione testi, programmi di utilità, un programma per la gestione della posta
elettronica e un file system per memorizzare queste informazioni.
Il Sistema UNIX si divide in tre parti:
Il nucleo che gestisce ed organizza le operazioni tra le diverse unità.
Il file system è la struttura che organizza i dati e rappresenta una parte molto
importante.
La shell è l'interprete dei comandi e costituisce il guscio esterno del sistema a
diretto contatto con l'utente.
Gli interpreti si dividono in due gruppi il Bourne ed è evidente quando al promt compare il
simbolo $. L'interprete C attribuisce essenzialmente ai caratteri di punteggiatura un maggior
numero di significati.
DOS
UNIX
Descrizione
DIR
1s-al
Lista dei file nella directory
DIR/W
1s
Semplice lista dei file
DEL
rm
Elimina un file
COPY
cp
Copia un file
RENAME
mv
Rinomina un file
FIND
grep
Trova una stringa ASCI in un file
Come MS-DOS, Unix è un sistema operativo, dice al computer come fare certe cose. Ora,
anche se UNIX ha la reputazione di essere più complesso di MS-DOS, nella maggior parte
dei casi pochi comandi semplici e basilari saranno sufficienti. A differenza di MS-DOS, UNIX
è sensibile alle maiuscole, se si digitano i comandi o le directory nel modo sbagliato, si
riceverà un messaggio d'errore. Le directory di UNIX sono organizzate come i rami di un
albero. Alla base è presente la directory "root", con sotto-directory che si ramificano da
questa (e le sotto-directory possono avere delle altre sotto-directory). L'equivalente Mac di
una sotto-directory UNIX è una cartella contenente un'altra cartella.
Open source (termine inglese che significa sorgente aperto) indica un software i cui autori
(più precisamente i detentori dei diritti) ne permettono, anzi ne favoriscono il libero studio e
l'apporto di modifiche da parte di altri programmatori indipendenti. Questo è realizzato
mediante l'applicazione di apposite licenze d'uso.
La storia del free software (software libero e non gratuito) inizia nel 1985, quando negli
Stati Uniti Richard M. Stallman pubblica il manifesto Gnu, al termine di un lungo percorso
di riflessione iniziato negli anni '70. In quell'epoca Stallman, l'ultimo custode dell'etica
hacker sviluppata al MIT (Massachusetts Institute of Technology), storico centro
universitario americano, incubatrice di molti importanti progetti legati a Internet, utilizza i
principi assimilati nei suoi anni di permanenza all'Ia Lab, il laboratorio di intelligenza
artificiale, come linee guida per la sua opera più conosciuta, un programma di editing
chiamato Emacs che permette agli utenti di personalizzarlo senza limite: la sua architettura
aperta incoraggia le persone ad aggiungervi nuove funzioni e a migliorarlo senza sosta.
Stallman distribuisce gratis il programma a chiunque accetti la sua unica condizione:
rendere disponibili tutte le estensioni apportate, in modo da collaborare al miglioramento di
Emacs, che diviene quasi subito l'editor di testi standard nei dipartimenti universitari di
informatica.
Gnu è un acronimo "ricorsivo", una sigla definita nei termini di se stessa: le lettere Gnu,
infatti, sono le iniziali della frase "Gnu's Not Unix", che in italiano significa "Gnu non è
Unix". Lo scopo del progetto è la realizzazione di un "kit" di strumenti informatici composto
da un sistema operativo e da una serie di programmi, tutti liberamente distribuibili secondo
74
BIOINFORMATICA
le regole specificate nella Gpl (General public license), la licenza di utilizzo e distribuzione
che caratterizza il cosiddetto free software e l’open source.
La collaborazione di più parti (in genere libera e spontanea) permette al prodotto finale di
raggiungere una complessità maggiore di quanto potrebbe ottenere un singolo gruppo di
lavoro. L'open source ha tratto grande beneficio da Internet, perché esso permette a
programmatori geograficamente distanti di coordinarsi e lavorare allo stesso progetto.
I software open source attualmente più diffusi sono Firefox, OpenOffice, VLC, Gimp, 7-Zip,
oltre ad un gran numero di progetti rivolti non all'utente finale ma ad altri programmatori.
Sono inoltre degne di nota le famiglie di sistemi operativi BSD , GNU e il kernel Linux, i cui
autori e fautori hanno contribuito in modo fondamentale alla nascita del movimento. La
comunità open source è molto attiva, comprende decine di migliaia di progetti, numero che
cresce quotidianamente. Alla filosofia del movimento open source si ispira il movimento
open content (contenuti aperti): in questo caso ad essere liberamente disponibile non è il
codice sorgente di un software ma contenuti editoriali quali testi, immagini, video e musica.
Wikipedia è un chiaro esempio dei frutti di questo movimento. Attualmente l'open source
tende ad assumere rilievo filosofico, consistendo di una nuova concezione della vita, aperta
e refrattaria ad ogni oscurantismo, che l'open source si propone di superare mediante la
condivisione della conoscenza.
A partire dagli anni Cinquanta, e soprattutto negli anni Sessanta, è stato possibile riusare lo
stesso codice e distribuirlo anche se in modo oggi ritenuto piuttosto artigianale, ovvero con
nastri e schede perforate. Questo fenomeno diventò evidente soprattutto quando si affermò
il vantaggio di usare una stessa porzione di codice, il che presupponeva di avere macchine
uguali e problemi simili. Fino a tutti gli anni Settanta, anche se in misura decrescente, la
componente principale e costosa di un computer era l'hardware, il quale era comunque
inutile in assenza di software. Da ciò la scelta dei produttori di hardware di vendere il loro
prodotto accompagnato da più software possibile e di facilitarne la diffusione, fenomeno che
rendeva più utili le loro macchine e dunque più concorrenziali. Il software, tra l'altro, non
poteva avvantaggiare la concorrenza in quanto funzionava solo su un preciso tipo di
computer e non su altri, neanche dello stesso produttore. L'introduzione dei sistemi operativi
rese i programmi sempre più portabili, in quanto lo stesso sistema operativo veniva offerto
dal produttore di diversi modelli di hardware. La presenza di sistemi operativi funzionanti per
macchine di differenti produttori hardware ampliava ulteriormente le possibilità di usare lo
stesso codice in modo relativamente indipendente dall'hardware usato. Uno di questi sistemi
operativi era Unix, iniziato nel 1969 come progetto all'interno di un'impresa delle
telecomunicazioni, la AT&T. Una famosa causa antitrust contro la AT&T le vietò di entrare
nel settore dell'informatica. Questo fece sì che Unix venisse distribuito ad un prezzo
simbolico a buona parte delle istituzioni universitarie, le quali si ritrovarono ad avere una
piattaforma comune, ma senza alcun supporto da parte del produttore. Si creò
spontaneamente una rete di collaborazioni attorno al codice di questo sistema operativo,
coordinata dall'Università di Berkeley, da dove sarebbe poi uscita la versione BSD di Unix,
che diventa da un lato un centro di sviluppo ed innovazione, dall'altro è la base di partenza
per numerosi fork.
LINUX. Torvalds è colui che ha iniziato lo sviluppo del kernel Linux. Il sistema operativo
GNU/Linux, ottenuto unendo Linux con il sistema GNU, creato da Richard Stallman, è
entrato nella storia come valida alternativa ai sistemi operativi commerciali a licenza chiusa
(come per esempio Microsoft Windows, Mac OS X, Unix); a differenza di questi ultimi
sistemi, infatti, Linux è software libero rilasciato sotto licenza GPL (tale licenza è ritenuta
attualmente dall'OSI conforme alle norme che regolano l'open source), ovvero chiunque può
accedere al codice sorgente del sistema operativo, modificarlo a proprio piacimento, usare
l'eseguibile per ogni scopo e copiare legalmente tale software, come previsto dalla licenza
GPL. La popolarità di Torvalds ebbe inizio a seguito di una disputa di carattere tecnico in un
newsgroup internet con il professor Andrew Tanenbaum, della Vrije Universiteit di
Amsterdam. Tanenbaum aveva infatti realizzato per scopi didattici Minix, un sistema
operativo simile a Unix, che poteva essere eseguito su di un comune personal computer.
Tale sistema operativo veniva distribuito con il codice sorgente, ma la sua licenza di
distribuzione vietava di apportare modifiche al codice senza l'autorizzazione dell'autore. Altre
75
BIOINFORMATICA
divergenze, tra Tanenbaum e Torvalds, portarono quest'ultimo a riflettere sulla possibilità di
creare una sorta di Unix per PC, ispirato a Minix, ma con una licenza d'uso che consentisse a
chiunque la libera modifica del codice. Fu questa scelta a dare il via al progetto che, data la
licenza di software libero adottata, nel giro di pochi anni ha coalizzato centinaia di
programmatori che, per lavoro o per hobby, sono impegnati ad aggiornare il codice di Linux.
Attualmente Linus Torvalds vive in California, a Santa Clara, con la moglie Tove. Ha lavorato
fino alla primavera 2003 per la Transmeta occupandosi poi, a tempo pieno, del
coordinamento del gruppo di programmatori che sviluppa il kernel Linux per conto dell'OSDL
(Open Source Development Lab), un progetto di ricerca finanziato da industrie che hanno
fondato parte del proprio business su GNU/Linux, come Computer Associates, Fujitsu,
Hitachi, Hewlett-Packard, IBM, Intel, NEC. Nel 2006 è stato incluso nella selezione "60 years
of heroes" dall'edizione europea della rivista Time. Linux è un kernel monolitico. I driver e le
estensioni del kernel lavorano nel kernel space (ring 0 nella maggior parte delle CPU), con
pieno accesso all'hardware, sebbene alcune eccezioni lavorino in user space. Il sistema
grafico che la maggior parte delle persone utilizza con Linux non lavora nel kernel space, al
contrario di quello che accade in Microsoft Windows. La preallocazione consente ai driver dei
dispositivi di essere preallocati sotto determinate condizioni. Questa caratteristica è stata
introdotta per gestire correttamente gli interrupt dell' hardware e migliorare il supporto al
multiprocessing simmetrico (SMP). La preallocazione inoltre migliora la latenza,
incrementano la reattività e rendono Linux più adatto ad applicazioni in tempo reale.
Linux è scritto nella versione del linguaggio di programmazione C supportata dal compilatore
GCC (che ha introdotto numerose estensioni e cambiamenti al C standard), insieme a un
certo numero di brevi sezioni di codice scritte in linguaggio assembly (sintassi GCC con stile
"AT&T"). Grazie alle estensioni di C che supporta, GCC per lungo tempo è stato il solo
compilatore in grado di compilare correttamente Linux. Nel 2004, Intel asserì di aver
modificato il kernel in modo tale che anche il suo compilatore C fosse in grado di compilare
Linux. In qualche modo vengono utilizzati molti altri linguaggi, soprattutto nel processo di
compilazione del kernel (metodi in cui a partire dal codice sorgente viene creata
un'immagine avviabile). Questi includono Perl, Python e diversi linguaggi di shell scripting.
Alcuni driver possono anche essere scritti in C++, Fortran o altri linguaggi, ma è fortemente
scoraggiata come pratica. Il sistema di compilazione di Linux supporta ufficialmente solo
GCC come compilatore sia del kernel sia dei driver. Sebbene inizialmente non progettato per
essere portabile, Linux è uno dei kernel di sistema operativo maggiormente portabile, in
grado di funzionare su un'ampia gamma di sistemi dall' iPAQ (un computer palmare) all'IBM
System z9 (un server mainframe in grado di eseguire centinaia o migliaia di istanze Linux
contemporanee). Linux è il sistema operativo principale dei supercomputer Blue Gene di
IBM. Linux è il sistema operativo di più dell'85% dei sistemi nella classifica Top 500 dei
supercomputer. Inoltre, Linux è stato compilato in numerosi dispositivi portatili come
TuxPhone e l'iPod di Apple.
I DISPOSITIVI. Come già accennato, i dispositivi sono qualcosa che è separato dal
computer inteso come l'insieme di CPU e memoria centrale. A seconda del tipo e della loro
collocazione, questi possono essere interni o periferici, ma questo tipo di distinzione è quasi
scomparso nel linguaggio normale, tanto che molti chiamano ancora periferiche tutti i
dispositivi.
Vale la pena di distinguere fra tre tipi di dispositivi fondamentali:
dispositivi di memorizzazione;
dispositivi per l'interazione tra l'utente e il computer;
interfacce di rete.
I dispositivi di memorizzazione sono qualunque cosa che sia in grado di conservare dati
anche dopo lo spegnimento della macchina. Il supporto di memorizzazione vero e proprio
potrebbe essere parte integrante del dispositivo stesso oppure essere rimovibile.
I supporti di memorizzazione possono essere di qualunque tipo, anche se attualmente si è
abituati ad avere a che fare prevalentemente con dischi (magnetici, ottici o magneto-ottici).
In passato si è usato di tutto e il primo tipo di supporto di memorizzazione sono state le
76
BIOINFORMATICA
schede di cartoncino perforate. Anche i dispositivi per l'interazione con l'utente possono
avere qualunque forma possibile e immaginabile. Non è il caso di limitarsi all'idea che possa
trattarsi solo di tastiera, schermo e mouse. Soprattutto non è il caso di supporre che un
computer possa avere solo uno schermo, oppure che possa avere una sola stazione di
lavoro. Le interfacce di rete sono i dispositivi che permettono la connessione tra diversi
computer in modo da permettere la condivisione di risorse e la comunicazione in generale.
Anche in questo caso, non si può semplificare e pensare che possa trattarsi esclusivamente
di schede di rete: qualunque porta verso l'esterno può diventare una interfaccia di rete.
DISPOSITIVI DI MEMORIZZAZIONE. I dispositivi di memorizzazione sono
fondamentalmente di due tipi: ad accesso sequenziale e ad accesso diretto. Nel primo caso, i
dati possono essere memorizzati e riletti solo in modo sequenziale, senza la possibilità di
accedere rapidamente a un punto desiderato, come nel caso dei nastri magnetici usati
ancora oggi come mezzo economico per archiviare dati. Nel secondo caso, i dati vengono
registrati e riletti accedendovi direttamente, come nel caso dei dischi. I dispositivi di
memorizzazione ad accesso diretto, per poter gestire effettivamente questa loro
caratteristica, richiedono la presenza di un sistema che organizzi lo spazio disponibile al loro
interno. Questa organizzazione si chiama filesystem.
DISPOSITIVI DI MEMORIA SECONDARIA. Il disco fisso è quella parte del sistema che
memorizza i file di dati. Uno dei primi e dei più importanti standard introdotti nell’hardware
del PC è costituito dallo IDE (Integrated Drive Electronics): uno standard che controlla il
flusso dei dati tra il processore e il disco fisso. Un controller IDE può gestire due dischi e la
velocità di trasferimento è di 1-4 Mbyte al secondo. L’idea IDE è stata proposta inizialmente
nel 1986 da Western Digital e da Compaq, per superare i limiti nelle prestazioni dei primi
standard.
Una delle principali innovazioni portate con sé dal sistema IDE è stata l’integrazione delle
funzioni del controller all’interno del disco stesso. Il rendimento risulta influenzato in
maniera determinante dal controller, cioè dalla scheda preposta al controllo del disco. Una
seconda tipologia di controller è rappresentata dallo SCSI (Small Computer Interface), una
tecnologia più complessa in grado di gestire fino a 7 unità con una velocità di trasferimento
di circa 5 Mbyte al secondo.
Un parametro per valutare le prestazioni di questi dispositivi è dato da il "tempo medio di
accesso": si tratta del tempo impiegato dal disco per individuare la traccia nella quale è
immagazzinato un dato, oltre che la sua posizione specifica all’interno della traccia. Questo
valore viene normalmente indicato in millisecondi (ms). Oltre al tempo medio di accesso, è
necessario prendere in considerazione il "transfer rate", cioè la velocità con la quale il disco
è in grado di trasferire i dati dalla sua superficie verso la CPU. Questo valore viene in
generale indicato in Mbyte al secondo (Mbps). Una unità a dischi magnetici è costituita da
uno o più piatti (anche una decina) ricoperti da materiale magnetico. I dischi più piccoli sono
chiamati floppy e sono formati da un solo piatto. Ciascuna delle superfici è fornita di
una testina di lettura che si muove verso l'interno o
l'esterno per leggere le informazioni che sono scritte
a distanze differenti dal centro. L'unità disco ruota
con una velocità di diverse migliaia di giri al minuto;
DIR1
in questo modo la testina passa circa 60 volte al
secondo sulla stessa superficie.
Le informazioni sono disposte sul disco in tracce, un
FAT1
dischetto a singola faccia usa una sola superficie del
piatto e può avere da 40 a 80 tracce suddivise in
sezioni o settori, mentre un hard disk può avere 10
BOOT
piastre con venti superfici ed ogni superficie può
avere 1000 tracce, ed ogni traccia contenere 50.000
byte. Nelle altre zone circolari del dischetto (settori) vengono memorizzate le copie della
tabella di allocazione dei file che si chiama FAT (File Allocation Table) e che costituisce una
mappa dei settori utilizzati e di quelli liberi. Quindi ogni informazione viene individuata con
un indirizzo fisico definito dal numero del settore, numero della traccia, numero del lato; a
questo viene associato un indirizzo logico corrispondente al numero progressivo del settore.
77
BIOINFORMATICA
La tabella di allocazione dei file viene realizzata in più copie per reperire le informazioni
corrette.
Quando si effettua una cancellazione di un file, nella pratica si elimina solo il primo carattere
dell’indirizzario di appartenenza e rendendo disponibile lo spazio sul disco mappato. In
questo momento i dati sono ancora residenti e vengono cancellati solo quando nel settore
viene soprascritta. Di seguito vengono riportati alcuni esempi di DIR e di FAT.
SCHEMA DIR
Nome
Dimensioni
Data
Ora
Indirizzo
Attributi
FILE1
1425
10-05-01
13:45
3
A
FILE2
2255
10-07-01
18:12
4
A
FILE3
1589
18-05-01
04:19
5
A
SCHEMA FAT
1
2
3
4
5
6
7
8
X
X
4
5
EOF
8
EOF
9
9
EOF
0
0
0
0
0
0
0
Il termine EOF indica la fine del file. I file del nucleo del sistema operativo risiedono nei
primi settori del disco fisso e sono protetti dalle normali operazioni di cancellazione o
modifica accidentale.
LE UNITÀ WROM. (Write Once, Read Many times) consentono di scrivere una sola volta,
ma di leggere molte volte il disco; hanno una capacità variabile tra 400 e 800 Mb. Una
tecnologia nuova sono le unità magneto-ottiche che consentono la riscrittura dei dischi.
Hanno a seconda delle dimensioni una capacità da 500-600 Mb nelle cartucce da 5" 1/4,
mentre nel formato da 3"1/2 il contenuto é di 125 Mb, i tempi di accesso sono dell'ordine di
60 millisecondi.
NASTRO MAGNETICO. Rappresenta il sistema più economico per l’immagazzinamento di
grandi quantità di dati, simile per struttura ai comuni tape per la registrazione delle musica.
Le unità a nastro magnetico consentono di registrare e leggere su nastro e sono costituite
da una testina di lettura e scrittura e nelle apparecchiature più complesse di colonne di
depressione per mantenere in tensione il nastro e per consentire un arresto rapido del
nastro. Il nastro magnetico presenta un accesso di tipo sequenziale.
CD-ROM. Il CD-ROM, ormai uno standard su quasi tutti i nuovi PC, è in grado di
memorizzare una quantità di dati più di 400 volte superiore rispetto ad un dischetto, vale a
dire 650 MB. L'unità CD-ROM di un sistema da acquistare dovrebbe essere almeno di tipo
16x. Il numero che precede la "x" indica il numero per cui moltiplicare la velocità di
trasferimento dati di un normale lettore di CD audio; si tenga presente che diversi lettori
CD-ROM utilizzano la sigla maX per indicare la massima velocità raggiungibile nella sezione
più esterna del supporto CD-ROM. Il CD-ROM standard serve da dispositivo di
memorizzazione per i dati. Un altro tipo di CD è il CD-R, che è scrivibile oltre che leggibile.
Questo tipo di unità è particolarmente adatto per la memorizzazione di immagini, audio e file
di dati.
DVD. Si tratta dell'ultimo sviluppo nel campo della memorizzazione e del trasferimento di
dati. Il DVD, acronimo di Digital Versatile Disk, consente di memorizzare una quantità di dati
circa 10 volte superiore rispetto ad un'unità CD-ROM standard. Con questo tipo di capacità,
è iniziata una nuova era ricca di opportunità per il software ad elevato contenuto
multimediale. Attualmente, il DVD offre video di qualità e altri tipi di intrattenimento in una
soluzione compatta e facile da utilizzare. La capacità dei dischi DVD varia da 4,7 GB (singola
faccia, singola densità) a 15,9 GB (doppia faccia, doppia densità) e le unità sono anche in
grado di leggere i CD-ROM tradizionali. Per il momento, il DVD non è scrivibile.
DISPOSITIVI PER L'INTERAZIONE TRA L'UTENTE E LA MACCHINA. Se escludiamo il
periodo delle schede perforate, si può dire che il primo tipo di strumento per l'interazione tra
utente e macchina sia stato la telescrivente: una sorta di macchina da scrivere in grado di
ricevere input dalla tastiera e di emettere output attraverso la stampante. In questo modo,
l'input umano (da tastiera) era costituito da righe di testo che terminavano con un codice
per il ritorno a capo (newline), e nello stesso modo era composto l'output che appariva su
carta. La telescrivente era (ed è) un terminale del computer. Ormai, la stampante della
78
BIOINFORMATICA
telescrivente è stata sostituita da uno schermo, che però, spesso si comporta nello stesso
modo: emette un flusso di testo dal basso verso l'alto, così come scorre la carta a modulo
continuo attraverso una stampante. In questa situazione, la stampante ha preso un suo
ruolo indipendente dal terminale originale e serve come mezzo di emissione di output finale,
piuttosto che come mezzo per l'interazione. Il terminale, composto da tastiera e schermo, o
comunque da una unità per ricevere l'input ed un'altra per emettere l'output, viene visto
normalmente come una cosa sola. Quando si tratta di quello principale, si parla in
particolare di console.
TASTIERA. La tastiera è una tavoletta composta da un insieme di tasti, ognuno dei quali
genera un impulso particolare. È il computer che si occupa di interpretare e tradurre gli
impulsi della tastiera. Questo sistema permette poi di attribuire ai tasti particolari funzioni.
Questo significa anche che non esiste uno standard generale di quello che una tastiera deve
avere. Di solito si hanno a disposizione tasti che permettono di scrivere le lettere
dell'alfabeto inglese, i simboli di punteggiatura consueti e i numeri; tutto il resto è opzionale.
Tanto più opzionali sono i tasti a cui si attribuiscono solitamente funzioni particolari. Questa
considerazione è importante soprattutto per chi non vuole rimanere relegato a una
particolare architettura di computer. I tasti possono essere così raggruppati :
tasti alfanumerici;
tasti speciali (il tasto ENTER, il tasto BACK SPACE, il tasto LINE FEED ecc.);
frecce direzionali;
tasti funzione;
La tastiera non ha capacità di elaborazione, l'unica cosa che è in grado di fare è di avvertire
il processore ogni volta che un carattere è disponibile in ingresso. Si tratta quindi di un
dispositivo di ingresso a carattere. È compito del sistema quello di prelevare il carattere,
depositarlo in una memoria temporanea ed infine, al termine dell'immissione, passare i dati
di input raccolti nella memoria temporanea al programma cui erano destinati. La tastiera è
un dispositivo di input cieco, nel senso che l'utente non può vedere i dati immessi nel
calcolatore. Per questa ragione la tastiera è utilizzata insieme ad un dispositivo di output su
cui vengono visualizzate le informazioni fornite tramite tastiera. La tastiera e il video non
sono direttamente collegati tra loro: è compito del processore riprodurre sul video tutte le
informazioni fornite in input tramite la tastiera.
Nell'ambito della ricerca è importante che nella tastiera sia riservato uno spazio per il
tastierino numerico, necessario per accelerare l'immissione di dati numerici.
SCHERMO. Il terminale più semplice è composto da una tastiera e uno schermo, ma
questa non è l'unica possibilità. Infatti, ci possono essere terminali con più schermi,
ognuno per un diverso tipo di output. Nel tempo, l'uso dello schermo si è evoluto, dalla
semplice emissione sequenziale di output come emulazione di una stampante, a una sorta
di guida di inserimento di dati attraverso modelli-tipo. Le maschere video sono questi
modelli-tipo attraverso cui l'input della tastiera viene guidato da un campo all'altro.
L'ultima fase dell'evoluzione degli schermi è quella grafica, nella quale si inserisce anche
l'uso di un dispositivo di puntamento, solitamente il mouse, come una estensione della
tastiera.
La modalità di visualizzazione è un requisito essenziale: il modo di rappresentare i dati.
Un'interfaccia grafica non rappresenta lettere e numeri avvalendosi di matrici fisse o
diciamo di uno o più set di caratteri, ma opera costruendo un layout di pixel, ovvero di
puntini sullo schermo, indipendenti l'uno dall'altro. In altre parole dal computer al monitor
non viaggiano byte che rappresentano ciascuno un carattere che viene poi interpretato e
visualizzato, ma semplici punti da visualizzare. Ogni punto avrà poi le sue coordinate di
visualizzazione e i suoi attributi, che possono essere di luminosità, di lampeggiamento, di
colore e via dicendo. I punti "disegnano" dunque qualsiasi traccia, da una lettera
dell'alfabeto (piccola o grande quanto si voglia) ad una serie di linee, di fondi, di immagini,
ecc. Appare subito evidente che l'impegno per disegnare su uno schermo è ben diverso da
quello di comunicare dei dati che già rappresentino dei caratteri. Per riempire uno schermo
che consenta di indirizzare 80 caratteri su 24 linee bastano infatti 1920 bytes. Mentre per
rappresentare gli stessi caratteri a singoli puntini i bytes da trasmettere allo schermo
diventano milioni! Prima che compaiano le reali interfacce grafiche nasceranno degli
79
BIOINFORMATICA
ingegnosi compromessi: ovvero interfacce composte non di singoli pixel, ma che sfruttando
un set di caratteri particolarmente ampio e contenente anche alcuni piccoli simboli grafici,
come rette, angoli, frecce, faccine, ecc. saranno in grado di dare "l'illusione" della grafica.
Ma si tratta pur sempre di interfacce di solo testo e non d'interfacce grafiche nel vero senso
del termine.
Il concetto di finestre. Un ambiente grafico non può presentare una sola finestra alla
volta, deve comprendere la possibilità di ridimensionare una finestra, spostarla, aprire altre
finestre e via di seguito. Ciò significa che oltre ad avere la massima elasticità d'esposizione
dei dati, ogni finestra può realmente rappresentare un diverso programma, siamo quindi
nella necessità di disporre contemporaneamente di un sistema multitasking reale. Le
finestre devono presentare una barra con dei comandi essenziali e nel loro interno deve
essere possibile visualizzare qualsiasi cosa. Altra caratteristica implicita nel concetto di
finestra è la possibilità di scorrerne il contenuto in verticale e in orizzontale. È implicito nel
termine stesso di "finestra", un modo per guardare ai propri dati, qualunque sia la loro
ampiezza, dunque anche se superiore alle reali dimensioni dello schermo.
Il concetto di menù pull down. Ogni finestra può possedere dei comandi che siano
apribili per consultarne tutte le funzioni previste. I menù pull-down, cioè a discesa,
rappresentano un metodo molto pratico per navigare tra le varie funzioni o programmi o
procedure che dir si voglia, senza doversi ricordare strani o complicati comandi.
Il concetto di combo box o list box. All'interno di una finestra possono comparire dei
riquadri che a loro volta hanno comandi per scorrere righe di dati e per selezionare una o
più righe alla volta. Le applicazioni dei combo box e list box sono infinite. In linea generale
rappresentano un elenco di scelte obbligate (o libere). Infatti è molto più facile fornire
un'informazione scegliendo tra quelle proposte e previste dal computer, che non doverla
battere da tastiera, col rischio di scriverla in un modo diverso da quello atteso dal
programma.
Il concetto di font. La massima elasticità di rappresentazione dei caratteri si ottiene
potendo scegliere il loro stile e la loro dimensione sullo schermo (o verso le stampanti). Ciò
diventa essenziale quando si usano programmi di elaborazione o composizione di
testi. Ogni carattere deve poi avere i suoi attributi di visualizzazione oltre allo stile.
Il concetto di puntatore. Nell'ambito di una interfaccia grafica il mouse è l'elemento
essenziale, perchè il più idoneo a gestire in modo rapido, facile ed efficiente la vasta
gamma di eventi che si possono verificare, senza dover ricorrere a sofisticati comandi da
tastiera per spostare un puntatore e fare una scelta. Infatti in questi ambienti di lavoro non
abbiamo più la sequenza unica di domanda-risposta, ma l'operatore è libero di scegliere
cosa fare semplicemente spostando il puntatore e premendo un tasto (il famoso click).
Il concetto di programmazione ad eventi. Dietro il semplice utilizzo del puntatore e dei
tasti del mouse, però, si nasconde una programmazione "per eventi" decisamente
complessa, vista l'ampia gamma di casi che si possono presentare. La programmazione ad
eventi richiede un sistema operativo veloce ed efficiente e una dose massiccia di
programmazione aggiuntiva. Vale sempre la regola che più facile è operare, più difficile è
programmare.
Il concetto di icona. Al giorno d'oggi noi siamo abituati a decifrare migliaia di simboli
grafici diversi, presenti sulle lavatrici, televisori, telefonini, automobili, videocamere, ecc.
ecc. Le icone sono semplicemente dei simboli grafici e presentano molti vantaggi, rispetto
ad un titolo scritto in caratteri. Prima di tutto i simboli sono internazionali. Poi occupano
meno spazio ed infine sono più mnemonici. Pensate al concetto di "cestino" per rendervi
conto di quanto sia più facile insegnare a qualcuno che un documento si cancella
spostandolo nel cestino e anzichè dare strani comandi.
Il concetto di copia/incolla. La capacità di copiare alcune informazioni, dopo averle
selezionate, e di "incollarle" in altra parte dello schermo, è sicuramente un altro enorme
vantaggio integrato nell'interfaccia grafica. In alternativa alle funzioni di copia/incolla si può
usare l'opzione drag and drop, che rappresenta in modo ancor più visivo, la capacità di
scegliere un oggetto e trascinarlo in altro posto sempre sullo schermo. E non importa di
quale tipo di oggetto si tratti: il drag and drop sposta (o copia) parti di testo così come
immagini, pezzi di suoni o quant'altro sia visibile al momento.
80
BIOINFORMATICA
La differenza di come appare oggi uno schermo di pc rispetto a tutte le interfacce
precedenti non ci sorprende più, perchè ormai siamo abituati ad identificare questo modo
di rappresentare i dati come se fosse l'unico possibile, ma ritornate con lo sguardo al
vecchio prompt del DOS e capirete quale enorme differenza essite tra i due sistemi. Questa
differenza ovviamente si riflette poi in termini di resa produttiva del proprio lavoro e di
facilità nello svolgere compiti assai più complessi di quelli che si potevano realizzare in
passato.
In tutti i casi faremmo un gravissimo errore se ci
limitassimo a valutare la qualità della semplice
interfaccia grafica. Dietro alla facciata del GUI c'è
un sistema operativo intero, che deve gestire tutto
ciò che si presenta sullo schermo e che è
comandato da tastiera o da mouse. Il punto debole
della catena non è l'aspetto esteriore, ma
l'adeguatezza di un kernel e di tutti gli altri
componenti collaborativi, rispetto alle configurazioni
medie offerte dal mercato del momento. OS/2
proposto da IBM, un sistema operativo a 32 bit, era
esteriormente più accattivante e generalmente più
potente, ma non passò nella catena della grande
distribuzione. E ciò non avvenne solo perché Bill
Gates era più furbo o perché più abile a condizionare i produttori e i distributori ad inserire
il rudimentale Windows (gratis!) nei PC dell'epoca (286, 386 e 486). Semplicemente era
più indietro col suo sistema grafico e questo occupava meno spazio, era meno esigente e
più facile da capire. I primi Windows giravano (e senza troppi problemi) su qualsiasi PC!
Il grande pubblico degli utenti di PC non aveva mai visto un mouse e non sapeva cos'erano
le finestre GUI. Con Windows familiarizzarono lentamente e senza spendere soldi per
potenziare il PC. Impararono così ad apprezzare i semplici giochini, ad usare la calcolatrice,
la ancor più semplice scrittura di un testo sotto Write a fare i primi disegnini sotto Paint e
ad avvicinarsi poi timidamente ad Excel. Era quanto ci voleva per muovere il mercato,
formare gli utenti, crearne la sensibilità al prodotto e di conseguenza la fedeltà.
IBM, invece, si preoccupò dei suoi PC che venivano clonati, forse si pentì d'avere creato per
la prima volta una macchina così "aperta" e corse ai ripari con i PS/2 (incopiabili) e con
l'OS/2, per far vedere che aveva una proposta migliore dei concorrenti, sperando di fare
affari d'oro con le sue esclusive.
Questa strategia si rivelò decisamente sbagliata, perché fuori tempo. E quando il grande
pubblico dei consumatori di PC crebbe e si fece più esigente si era ormai rassegnato ogni
due o tre anni a passare alla versione più evoluta di Windows. Ciò gli garantiva un
passaggio più semplice e la massima compatibilità dei suoi documenti e di quanto aveva faticosamente- imparato a fare. In un libero mercato nessuno impone niente, il successo è
il risultato di buone strategie e basta. I PS/2 si sono estinti, OS/2 non è più in circolazione
ed anche le reti Token ring hanno cessato di esistere. E tutto ciò malgrado queste soluzioni
fossero decisamente migliori di quelle presenti dal 1980 al 2000.
STAMPANTE. Le stampanti tradizionali sono solo in grado di emettere un flusso di testo,
come avveniva con le telescriventi. Più di recente, con l'introduzione delle stampanti ad
aghi, si è aggiunta la possibilità di comandare direttamente gli aghi in modo da ottenere una
stampa grafica. Ma quando la stampa diventa grafica, entrano in gioco le caratteristiche
particolari della stampante. Per questo, l'ultima fase evolutiva della stampa è stata
l'introduzione dei linguaggi di stampa, tra cui il più importante è stato ed è PostScript, come
mezzo di definizione della stampa in modo indipendente dalle caratteristiche della stampante
stessa. In questo modo, l'output ricevuto dalle stampanti può essere costruito sempre nello
stesso modo, lasciando alle stampanti l'onere di trasformarlo in base alle loro caratteristiche
e capacità.
CODICI A BARRE. I codici a barre sono diventati attualmente uno standard per descrivere
le informazioni sui prodotti. Un codice a barre è formato da una serie di righe verticali,
81
BIOINFORMATICA
scritte con un inchiostro nero. I caratteri sono rappresentati dallo spessore delle righe che si
combinano tra di loro. Il codice che ha la maggior diffusione è l’European Article Number
(EAN) che associa ad ogni articolo un codice di dodici cifre, più una cifra di parità.
GRID. Il termine “Griglia” è stato coniato intorno alla metà degli anni Novanta. Il vero e
specifico problema alla base del concetto di Griglia è la condivisione coordinata di risorse
all’interno di una dinamica e multi-istituzionale organizzazione virtuale. La condivisione delle
risorse di calcolo ci permette di suddividere Nella Storia dell'informatica possimao
riconoscere facilmente 4 periodi evolutivi. Nella prima era quella caratterizzata dall'idea di
un singolo computer per molti utenti. In questa era l'acquisto delle risorse di calcolo ha costi
talmente ingenti che il problema è quello dell'uso contemporaneo di tali risorse da parte dei
diversi utenti. A partire dagli anni '80 i costi dell'hardware subirono cali che permisero di
avere un computer per ogni singolo utente. Nascono in questo periodo i primi personal
computer e l'infrastruttura di calcolo si evolve verso il SIMD. Single Instruction, Multiple
Data (SIMD) è un'architettura in cui più unità elaborano dati diversi in parallelo. Questa
viene utilizzata da processori vettoriali o da processori che funzionano in parallelo. La SIMD
è spesso usata dai supercomputer e con alcune varianti anche nei moderni microprocessori,
particolarmente in Apple.
Il modello SIMD è composto da un'unica unità di controllo che esegue una istruzione alla
volta controllando più ALU che operano in maniera sincrona. Ad ogni passo, tutti gli elementi
eseguono la stessa istruzione scalare, ma ciascuno su un dato differente. Un elaboratore
basato su questo modello è anche detto Array Processor.
Già dalla fine degli anni '80 si comincia a diffondere l'idea della condivisione dell'architettura
hardware ciò anche grazie al già detto alla riduzione dei prezzi, portando alla nascita delle
prime macchine parallele virtuali. Gli anni '90 sono quelli durante i quali si applica in toto la
legge di Moore e si affermano le reti di calcolatori e Internet (concetti fondamentali per il
Grid) La condivisione non è limitata solo allo scambio dei file, ma si estende all’accesso
diretto a computer, a software, in generale a tutto l’hardware necessario alla risoluzione di
un problema scientifico, ingegneristico o industriale. Gli individui e le istituzioni, che mettono
a disposizione della griglia le loro risorse per la medesima finalità, fanno parte della stessa
VO. Caratteristica comune dei progetti Grid è la necessità di disporre un ambiente di calcolo
data-intensive, all’interno del quale le applicazioni hanno il bisogno di accedere a grandi
quantità di dati geograficamente distribuiti in maniera veloce e affidabile ed, è proprio
l’onere della Grid, far operare tali applicazioni nel miglior modo possibile. È facile osservare
che nessun computer attualmente in commercio sarebbe in grado, da solo, di elaborare
simili moli di dati in tempi ragionevoli; tuttavia la condivisione di risorse quali CPU e dischi
opportunamente coordinati può dare l’impressione all’utente di accedere ad un
supercomputer virtuale, con una incredibile potenza computazionale e capacità di
memorizzazione in grado di sopportare grandi carichi di lavoro. Dall’idea di far apparire tutta
l’architettura di un Grid come un unico supercomputer virtuale, celando all’utilizzatore tutta
la complessità interna e mostrandogli solo i benefici, nasce l’esigenza di progettare e
realizzare uno schedulatore di risorse Resource Broker. Esso è uno dei componenti critici del
sistema di gestione delle risorse, ha il compito di assegnare le risorse ai job (Gridlet), in
modo da soddisfare le esigenze delle applicazioni e del sistema. Le risorse di cui esso deve
tenere traccia e gestire includono sistemi di calcolo e sistemi di immagazzinamento dati
(mediante lo Storage Broker, rete di interconnessione e, tramite il Network Monitor). Lo
scheduling è un campo tradizionale dell’informatica, ma nonostante siano state studiate
molte tecniche per numerose tipologie di sistemi (da uniprocessore a multiprocessore ai
sistemi distribuiti), le caratteristiche tipiche delle griglie di dati rendono molti di questi
approcci inadeguati. Infatti, mentre nei sistemi tradizionali le risorse e i job sono sotto il
diretto controllo dello schedulatore, le risorse delle griglie sono geograficamente distribuite.
Queste ultime sono di natura eterogenea e, appartengono a diversi individui o
organizzazioni, ciascuna con le proprie politiche di scheduling, modelli di costo di accesso
differenti, carichi di lavoro e disponibilità di risorse che varia dinamicamente nel tempo. La
mancanza di un controllo centralizzato, insieme alla presenza di utenti che generano job
(Gridlet), molto diversi l’uno dall’altro, rendono la schedulazione più complicata rispetto a
quella dei sistemi di calcolo tradizionali.
82
BIOINFORMATICA
83
BIOINFORMATICA
BASI DI DATI
In informatica, il termine database, banca dati, base di dati (soprattutto in testi
accademici) o anche base dati, indica un archivio strutturato in modo tale da consentire la
gestione dei dati stessi (l'inserimento, la ricerca, la cancellazione ed il loro aggiornamento)
da parte di applicazioni software. Il database è un insieme di informazioni, di dati che
vengono suddivisi per argomenti in ordine logico (tabelle) e poi tali argomenti vengono
suddivisi per categorie (campi). Informalmente e impropriamente, la parola "database"
viene spesso usata come abbreviazione dell'espressione Database Management System
(DBMS), che si riferisce a una vasta categoria di sistemi software che consentono la
creazione e la manipolazione efficiente di database.
La base di dati, oltre ai dati veri e propri, deve contenere anche le informazioni sulle loro
rappresentazioni e sulle relazioni che li legano. Spesso, ma non necessariamente, una base
dati contiene le seguenti informazioni:
Strutture dati che velocizzano le operazioni frequenti, tipicamente a spese di operazioni
meno frequenti.
Collegamenti con dati esterni, cioè riferimenti a file locali o remoti non facenti parte del
database.
Informazioni di sicurezza, che autorizzano solo alcuni profili utente ad eseguire alcune
operazioni su alcuni tipi di dati.
Programmi che vengono eseguiti, automaticamente o su richiesta di utenti autorizzati,
per eseguire elaborazioni sui dati. Un tipico automatismo consiste nell'eseguire un
programma ogni volta che viene modificato un dato di un certo tipo.
In un sistema informatico, una base di dati può essere manipolata direttamente dai
programmi applicativi, interfacciandosi direttamente con il sistema operativo. Tale strategia
era quella adottata universalmente fino agli anni sessanta, ed è tuttora impiegata quando i
dati hanno una struttura molto semplice, o quando sono elaborati da un solo programma
applicativo.
A partire dalla fine degli anni Sessanta, tuttavia, per gestire basi di dati complesse condivise
da più applicazioni si sono utilizzati appositi sistemi software, detti sistemi per la gestione
di basi di dati (in inglese "Database Management System" o "DBMS"). Uno dei vantaggi di
questi sistemi è la possibilità di non agire direttamente sui dati, ma di vederne una
rappresentazione concettuale.
La ricerca nel campo delle basi di dati studia le seguenti problematiche:
Progettazione di basi di dati.
Progettazione e implementazione di DBMS.
Interpretazione (o analisi) di dati contenuti in database.
Le basi di dati spesso fanno uso di tecnologie derivate da altre branche dell'informatica. È
usuale utilizzare tecniche derivate dall'intelligenza artificiale, come ad esempio il data
mining, per cercare di estrarre relazioni o più in generale informazioni presenti nelle banche
dati ma non immediatamente visibili.
Al contrario dei dati utilizzati all'interno di un programma (come ad esempio le variabili, gli
array, le strutture dati dinamiche, ecc.), archivi (o file) e basi di dati (database)
memorizzano dati in maniera permanente (i dati rimangono in memoria anche in seguito alla
terminazione di una data applicazione o allo spegnimento della macchina). Si definisce
archivio l'insieme dei dati che vengono salvati su un supporto di memorizzazione (disco). Un
database è un archivio con una particolare struttura. In particolare, i database sono formati
da oggetti detti record. Un passo fondamentale (ma non l'unico) nella definizione di un
database consiste nella descrizione di come sono formati i record, ovvero il numero, il nome
84
BIOINFORMATICA
e i tipi di dato che essi contengono, oltre ad altre informazioni complementari. In altri
termini, definire un database significa sia descrivere i dati che lo compongono, sia fornire
una definizione di questi dati (ad esempio, come sono organizzati, il loro significato, ecc.).
La principale differenza tra archivio e database, dunque, è la seguente:
Se si usano gli archivi, la definizione dei dati, del loro
significato e del modo in cui sono organizzati è parte
integrante dell'applicazione:
Se si usano i database, la definizione della struttura dei
dati è indipendente dall'applicazione:
DataBase Management System
Un DBMS è una collezione di file tra loro collegati ed un
insieme di programmi che permettono accessi e
modifiche ai dati.
Lo scopo principale di un DBMS è di fornire un ambiente efficiente e conveniente per
accedere e memorizzare grandi collezioni di dati. La gestione di questi dati implica la
definizione di strutture fisiche per la memorizzazione e di meccanismi per la manipolazione
delle informazioni. Un DBMS deve inoltre gestire e controllare l’accesso concorrente degli
utenti e le loro autorizzazioni.
Un DBMS fornisce agli utenti una visione astratta dei
vista1
vista2
vistaN
...
dati, occupandosi dei dettagli riguardanti la
memorizzazione e il mantenimento.
Un database è visto in base a tre livelli di astrazione:
Livello fisico: è il livello più basso in cui si descrive
come i dati sono effettivamente memorizzati (usando
Livello fisico
le strutture dati);
Livello concettuale (o logico): è il livello in cui si
descrive quali sono i dati memorizzati nel DB e le associazioni tra di essi. L’intero DB è
descritto da un numero limitato di strutture dati relativamente semplici sebbene la loro
implementazione possa comportare l’uso di strutture fisiche assai complesse.
Livello esterno (view): è il livello più alto e mostra una porzione dell’intero DB. Possono
essere definiti più livelli esterni per lo stesso DB, ognuno di essi fornisce la visibilità di una
parte dei dati.
Un DBMS consente di realizzare DB e accedere ai dati attraverso uno schema logico,
occupandosi di tradurre in modo efficiente le richieste dell’utente in operazioni “fisiche”
(come l’accesso a file) con l’ausilio di strategie ad-hoc e l’apporto di informazioni di sistema.
Il DBMS permette inoltre di:
definire vincoli di integrità sui dati,
definire utenti e privilegi con diversi livelli di visibilità per garantire la sicurezza dei dati,
accedere in modo concorrente ai dati.
Livello logico
Architettura di un DBMS. All’interno di un DBMS si possono individuare un certo numero
di componenti funzionali ognuno dei quali ha un ruolo ben preciso e interviene a seconda
dell’operazione da svolgere:
85
BIOINFORMATICA
-
query parser: controlla la correttezza sintattica dei comandi espressi nei linguaggi del
DBMS e li traduce in un formato interno;
- query optimizer: trasforma una richiesta utente in una equivalente ma più efficiente;
- authorization and integrity manager: verifica i vincoli di integrità sui dati e
controlla i diritti di accesso degli utenti;
- recovery manager: assicura che il DB rimanga in uno stato consistente nel caso di
cadute del sistema;
- concurrency controller: gestisce e controlla l’accesso concorrente ai dati.
- buffer manager: si occupa del trasferimento dei dati da disco a memoria centrale e
viceversa con l’obiettivo di ridurre al minimo gli accessi al disco;
- file manager: stabilisce la strategia di mappatura delle strutture dati in file mentre il
sistema operativo si occupa dell’allocazione e dell’organizzazione dello spazio su disco;
Per poter svolgere queste funzioni il DBMS utilizza, oltre ai dati utente anche informazioni di
sistema quali il dizionario dei dati, l’elenco delle autorizzazioni, gli indici e alcuni dati
statistici utili per le scelte strategiche.
Modelli dei dati. Un modello dei dati è un insieme di strumenti concettuali (cioè un
formalismo) per descrivere i dati, le associazioni tra i dati e i vincoli (semantici) tra i dati. Il
modello dei dati è la colonna vertebrale di un DBMS in quanto permette di rappresentare
elementi del mondo reale mediante strutture di dati (artificiali) che il DBMS è in grado di
trattare.
Le basi di dati possono avere varie strutture, tipicamente, in ordine cronologico:
1. gerarchica (rappresentabile tramite un albero - anni sessanta),
2. reticolare (rappresentabile tramite un grafo - anni sessanta),
3. relazionale (attualmente il più diffuso, rappresentabile mediante tabelle e relazioni
tra esse - anni settanta),
4. ad oggetti (estensione alle basi di dati del paradigma "Object Oriented", tipico della
programmazione a oggetti - anni ottanta),
5. semantica (rappresentabile con un grafo relazionale - inizio anni duemila).
Il formato XML, oltre che per scambi di dati su web, si sta diffondendo per la definizione di
vere e proprie basi di dati. XML ha una struttura gerarchica, pare quindi un "ritorno alle
origini" dei modelli di dati. Un requisito importante di una buona base dati consiste nel non
duplicare inutilmente le informazioni in essa contenute: questo è reso possibile dai gestori di
database relazionali (teorizzati da Edgar F. Codd), che consentono di salvare i dati in tabelle
che possono essere collegate. La funzionalità di un database dipende in modo essenziale
dalla sua progettazione: la corretta individuazione degli scopi del database e quindi delle
tabelle, da definire attraverso i loro campi e le relazioni che le legano, permette poi una
estrazione dei dati più veloce e, in generale, una gestione più efficiente.
I grafi i sono oggetti discreti che permettono di schematizzare una grande varietà di
situazioni e di processi e spesso di consentire di analizzarli in
termini quantitativi ed algoritmici. In termini informali, per
grafo si intende una struttura costituita da:
oggetti semplici, detti vertici (vertices) o nodi (nodes),
collegamenti tra i vertici. I collegamenti possono essere:
orientati, e in questo caso sono detti archi (arcs), e il grafo è
detto orientato
non orientati, e in questo caso sono detti spigoli (edges), e il
grafo è detto non orientato eventualmente dati associati a nodi e/o collegamenti
Il modello Entity-Relationship. È un modello concettuale che fa uso dei componenti
essenziali di entità, attributi e relazioni.
Prima di implementare un'applicazione che fa uso di uno o più database, è bene scrivere ed
aver chiaro in mente il modello dei dati che si intende utilizzare. Un modello dei dati consiste
in una rappresentazione astratta delle strutture dei dati di un database. L'atto della
creazione di un modello dei dati prende il nome di modellazione dei dati o data modeling. La
stragrande maggioranza delle applicazioni esistenti che fanno uso dei database, esano un
86
BIOINFORMATICA
particolare tipo di modello per i dati, noto con il nome di modello Entità-Relazione (E-R). Il
suo nome deriva dal fatto che permette di modellare il mondo reale utilizzando
esclusivamente due concetti: entità e relazioni. Le entità sono gli oggetti principali su cui
vengono raccolte informazioni. Ogni entità
user query
del modello E-R serve a rappresentare un
query parser
concetto, concreto o astratto, del mondo
reale. Quando si parla di entità, una
strategy selector
log
nozione molto importante da capire è
user transaction
recovery manager
quella di istanza di una entità. L'istanza di
una entità consiste in un singolo oggetto
concurrency controller
descritto dall'entità.
Esempio: Una entità potrebbe essere uno
buffer manager
buffer
lock table
studente. In questo caso, una istanza di
questa
entità
potrebbe
essere
un
file manager
particolare
studente.
Dal
precedente
esempio, risulta chiaro che, al fine di poter
definire delle istanze, e quindi avere a
disposizione degli oggetti precisi, occorre
disk storage
statistical data
specificare in modo esatto come sono fatte
index
le entità. In generale, una entità è
User data
System data
composta da una serie di attributi. Una
particolare istanza di un attributo è detta
valore. I valori degli attributi devono
permettere di distinguere tra le varie istanze delle entità.
Esempio: Prendiamo di nuovo in considerazione l'esempio precedente. Al fine di poter usare
il concetto di studente, e quindi poter caratterizzare particolari studenti, occorre specificare
come vogliamo che sia definito uno studente nell'applicazione. Un esempio tipico è il
seguente: uno studente è definito dalla seguente tripla: (nome, cognome, numero di
matricola). A questo punto, una entità (ovvero un particolare studente!) potrà essere, ad
esempio: (Paolo, Rossi, 87364).
In questo esempio:
• (nome, cognome, numero di matricola) è ciò che rappresenta l'entità studente all'interno
del programma. Si può anche dire che è l'entità studente.
• (Paolo, Rossi, 87364) è un'istanza dell'entità studente.
• nome è un attributo.
• Paolo è un valore dell'attributo nome.
Si dice dominio di un attributo la collezione di tutti i valori possibili di quell'attributo. Gli
attributi possono essere classificati come chiavi o descrittori. Le chiavi identificano
univocamente una istanza di una entità. I descrittori, invece, descrivono una caratteristica
non unica di una entità.
Un’entità è un oggetto che esiste nella realtà e che è distinguibile dagli altri oggetti. Ogni
entità è caratterizzata da un insieme di attributi che ne definiscono le proprietà.
La combinazione di diversi valori degli attributi determinano le istanze di un’entità. Ad
esempio nel caso di un’entità Persona con attributi codice_fiscale, cognome e nome, la tupla
(‘PRRSFN60J54Z679K’, ‘Pirra’, ‘Stefano’) rappresenta un’istanza dell’entità Persona.
Se poi uno o più attributi distinguono un’istanza da un’altra questi vengono detti chiave. Ad
esempio, nel caso dell’entità Persona l’attributo codice_fiscale è chiave.
Un insieme di entità correlate, ovvero esistenti in una stessa porzione di realtà, costituiscono
un set di entità e definiscono i confini del modello.
Una relazione è un’interconnessione tra entità. Esistono due tipi di relazioni, quelle tra
attributi di entità e quelle tra entità nel loro complesso, anche chiamate associazioni.
Es.
Entità: cliente(nome, indirizzo)
conto(numero, saldo)
Associazione: cliente-conto, associa ad ogni cliente della banca il proprio conto.
87
BIOINFORMATICA
Una associazione può essere una corrispondenza di tipo:
1:1 (uno a uno o biunivoca) quando ogni istanza della prima entità si associa ad un’unica
istanza della seconda entità (es. persona e passaporto nell’ambito di una nazione).
1:N (uno a molti) quando ogni istanza della prima entità si può associare ad una o più
istanze della seconda entità mentre ogni istanza della seconda si deve associare ad un’unica
istanza della prima (es. persona e prestito nell’ambito di una biblioteca).
N:N (molti a molti) quando ogni istanza della prima entità si può associare ad una o più
istanze della seconda e viceversa (es. docente e studente nell’ambito di una scuola).
Nella figura seguente viene riportato lo schema E-R di un DB su tesi, tesisti e relatori.
T itolo
Matric ol a
Codic e
Cognome
Nome
(1,1)
(1,n)
TT
T ESIST A
Codic e
Des crizi one
T ESI
(1,1)
(1,3)
(1,1)
(1,3)
ARGT
REL
COR
(1,n)
(1,n)
ARGOMENT O
Codic e
Cognome
Nome
Indiri zzo
T el
RELAT ORE/CORRELAT ORE
Dipartimento
Ditta
INT ERNO
EST ERNO
Quali fic a
I modelli logici. Il modello logico discende da quello concettuale e disegna un’architettura
che dipende dal tipo di DBMS, ossia tiene conto delle strutture dati e delle operazioni
eseguibili da quel DBMS. Tra i modelli logici quello di gran lunga più utilizzato è quello
relazionale e, di conseguenza, i più diffusi DBMS sul mercato sono RDBMS, cioè relational
DBMS.
Il modello relazionale. La ragione principale della popolarità di questo modello è che ha
permesso lo sviluppo di linguaggi semplici (dichiarativi) e potenti con cui esprimere richieste
di accesso e manipolazione dei dati.
Questo modello inoltre si basa sull’algebra relazionale ed è quindi supportato da una solida
base teorica che permette di dimostrare formalmente proprietà di dati e operazioni. Senza
approfondire troppo l’argomento assai vasto, vediamone i concetti fondamentali.
I dati e le relazioni tra i dati sono rappresentati per mezzo di un insieme di tabelle
bidimensionali ognuna delle quali è formata da righe e colonne con nomi unici (all’interno
della stessa tabella). Le colonne rappresentano gli attributi mentre le righe rappresentano le
tuple della relazione.
Es.codicecitta (città, provincia, regione, CAP)
CITTA
PROVINCIA REGIONE
CAP
Sesto San Giovanni MI
Lombardia 20099
Cinisello Balsamo
MI
Lombardia 20092
......
....
....
....
Il più piccolo insieme di attributi che distingue fra loro le tuple della relazione viene detto
chiave. Nell’esempio la chiave è definita dal solo attributo CAP, per definizione identificativo
univoco di una città. Vi possono essere più chiavi per una stessa relazione, in questo caso
normalmente ne viene selezionata una definita primaria. La chiave ha una funzione
fondamentale nella fase di ricerca dei dati.
88
BIOINFORMATICA
Vi sono un certo numero di operazioni applicabili alle relazioni che definiscono
completamente l’algebra relazionale. Le cinque operazioni di base sono unione, differenza,
prodotto cartesiano, proiezione e selezione a cui se ne aggiungono altre tra cui JOIN che,
pur non aumentando la potenza espressiva del linguaggio, ne facilitano l’uso.
Il risultato dell’esecuzione di queste operazioni tra relazioni è a sua volta una relazione e,
quindi, può essere utilizzata per successive operazioni. I concetti del modello relazionale
verranno ripresi nel seguito a proposito del linguaggio SQL.
Linguaggi di un DBMS. Si è già accennato come il DBMS funga da interfaccia tra utente e
database nel senso che tutte le richieste di operazioni sui dati devono essere indirizzate al
DBMS il quale si preoccupa di controllarle, tradurle in comandi interni ed eseguirle. Questa
funzione il DBMS la svolge anche per le applicazioni che dovessero richiedere accessi ad un
database. Infatti un DBMS può ricevere comandi direttamente dall’utente in modo
interattivo, tramite un linguaggio di interrogazione; oppure attraverso un linguaggio di
manipolazione dei dati proprio del DBMS; o, infine, tramite un programma scritto in un
linguaggio di programmazione.
Ogni DBMS fornisce dei linguaggi ad-hoc, il cui scopo è descritto nel seguito.
Data Definition Language (DDL) è il linguaggio che permette di definire lo schema
(logico) di un DB. Il risultato della compilazione delle espressioni del DDL è un insieme di
tabelle che sono memorizzate nel dizionario dei dati. Un dizionario dei dati contiene
metadati, cioè dati che descrivono altri dati ed è consultato dal DBMS prima di accedere o
modificare i dati.
Storage Definition Language (SDL) è il linguaggio che permette di definire le strutture
dati e i metodi di accesso. Il risultato della compilazione delle espressioni del SDL è un
insieme di istruzioni che specificano i dettagli di implementazione degli schemi del DB. I
DBMS attuali hanno solitamente un SDL molto limitato e svolgono autonomamente quasi
tutti i compiti di definizione delle strutture dati.
Data Manipulation Language (DML) – fornisce le primitive per l’inserimento, la modifica e
la cancellazione di dati contenuti nel DB. Il DML permette, inoltre, il reperimento (o accesso)
delle informazioni memorizzate nel DB. Solitamente tali primitive vengono indicate a parte
con il nome di Query Language (QL).
Esistono due tipi di DML, procedurali e dichiarativi. Nel primo caso l’utente deve specificare
quali dati vuole e in che modo reperirli, nel secondo caso l’utente indica solamente i dati che
desidera. Fa parte di questa categoria il linguaggio SQL, certamente il più diffuso linguaggio
di interrogazione esistente.
Passi nell’esecuzione di una interrogazione. Una volta che l’utente formula la richiesta
nell’opportuno linguaggio, il DBMS svolge alcune operazioni e, infine, accede ai dati e
restituisce il risultato. I passi sono:
Parsing: viene controllata la correttezza sintattica della query e ne viene generata una
rappresentazione interna;
Controllo di esistenza: viene controllata l’esistenza di tabelle e colonne specificate;
Controllo autorizzazioni: vengono controllati i permessi di accesso al DB;
Trasformazioni algebriche: rappresenta la prima fase di ottimizzazione, attraverso il
calcolo relazionale si ottiene una query equivalente ma più efficiente in termini di accessi al
DB;
Selezione ed esecuzione della strategia: si determina in modo preciso come la query
sarà eseguita e si eseguono gli accessi al disco.
Naturalmente queste operazioni sono nascoste all’utente il quale si deve solo preoccupare di
esprimere in modo semanticamente corretto la propria interrogazione.
Il linguaggio SQL. Nel 1974 esce, dai laboratori di ricerca dell’IBM, SEQUEL (Structured
English Query Language), un linguaggio per la definizione delle caratteristiche dei database
relazionali, successivamente contratto in SQL.
Ha inizio così lo sviluppo di sistemi di gestione di database relazionali che porterà nei primi
anni ottanta alla presentazione di prodotti commerciali, in particolare DB2 di IBM e Oracle
della Relational Software. Nel corso degli anni ottanta altre compagnie, tra cui Informix,
commercializzarono prodotti basati su SQL, che divenne così lo standard industriale di fatto
per quanto riguarda i database relazionali. Nel 1986 arrivò anche il riconoscimento dell’ANSI
89
BIOINFORMATICA
(American National Standard Institute) che adottò SQL come standard per i linguaggi
relazionali e nel 1987 seguì anche lo standard ISO (International Standards Organization).
Lo standard venne chiamato SQL/86; oggi, dopo aver subito varie revisioni, è arrivato alla
versione SQL/92 ed è in corso, da parte degli organismi ANSI e ISO, lo studio di uno
standard rinnovato che comprenda anche la gestione di tipi di dati multimediali.
Nonostante esista uno standard, gli attuali RDBMS in commercio non implementano la
versione completa del linguaggio preferendo l’adozione di comandi proprietari.
Il linguaggio SQL consente all’utente di:
definire e modificare l’architettura del DB (funzioni di DDL),
inserire e modificare i dati (funzioni di DML),
gestire utenti e permessi di accesso (funzioni di Data Control Language, DCL),
interrogare il DB (funzioni di QL).
In realtà gli attuali DBMS forniscono interfacce grafiche che permettono di svolgere diverse
attività senza utilizzare direttamente SQL. Questo però è l’unico linguaggio riconosciuto da
tutti gli RDBMS in commercio e, dunque, permette in linea teorica di essere indipendenti dal
prodotto.
Ricordiamo che attualmente i DBMS relazionali più diffusi in commercio sono Oracle, IBM
DB2, MS SQLServer, MySQL della MySQLAB e, per l’home-computing, MS Access.
Il resto di questo capitolo è dedicato all’esplorazione dei principali comandi SQL. L’esempio
descritto di seguito sarà un utile ausilio a tale scopo e verrà arricchito di volta in volta.
Docente(codice, cognome, nome, classe_concorso, tipo_contratto, anzianità_servizio,
codiceIstituto) Questa relazione potrebbe rappresentare la realtà degli insegnanti impiegati
in una determinata provincia. Gli attributi individuano la materia insegnata, il tipo di
contratto (tempo indeterminato/temporaneo), l’anzianità di servizio calcolata in base al
numero di anni di servizio e il codice dell’istituto di appartenenza.
Il tracciato della tabella risultante è il seguente dove il campo codice rappresenta la chiave
primaria.
Codice
Cognome
Nome
C_concorso
T_contratto
A_servizio
C_istituto
Si supponga di aver definito la tabella e di aver inserito un certo numero di tuple, a questo
punto è possibile interrogare il DB utilizzando la clausola SELECT di SQL.
Nel caso più semplice in cui si vuole ottenere l’intero contenuto della tabella si scriverà:
SELECT * FROM DOCENTE;
Il simbolo speciale * indica che si desiderano tutti gli attributi della relazione.
Il risultato di tale interrogazione è:
Codice
1054
1061
1077
1062
1123
1063
1298
1301
1028
1325
1035
Cognome
Agnoletti
Giotto
Zanna
Andora
Boldi
Bianchi
Cerpi
Palo
Torti
Delta
Gentili
Nome
Antonio
Giacomo
Daniela
Giuseppe
Luisa
Andrea
Elisa
Anna
Paolo
Carlo
Angela
C_concorso
A050
A042
A031
A037
A042
A037
A048
A048
A033
A031
A042
T_contratto
I
T
I
I
T
I
T
T
I
T
I
A_servizio
12
15
5
7
2
11
1
0
25
0
9
C_istituto
MI0691
MI0145
MI0145
MI0721
MI0902
MI0691
MI0537
MI0537
MI0145
MI0145
MI0902
La clausola WHERE del comando SELECT permette di specificare condizioni da applicare alle
tuple.
Es. Selezionare nome, cognome e classe di concorso di tutti i docenti impiegati nell’istituto
con codice MI0145.
SELECT Cognome, Nome, C_concorso FROM DOCENTE WHERE C_istituto=”MI0145”;
90
BIOINFORMATICA
Risultato:
Cognome
Giotto
Zanna
Torti
Delta
Nome
Giacomo
Daniela
Paolo
Carlo
C_concorso
A042
A031
A033
A031
Operatori logici. Gli operatori logici permettono di specificare più condizioni all’interno di
una stessa clausola WHERE.
Utilizzando l’operatore logico AND si possono specificare più condizioni che devono essere
tutte verificate.
Es. Selezionare nome, cognome e classe di concorso dei docenti impiegati nell’istituto
MI0145 con anzianità superiore ai 10 anni.
SELECT Cognome, Nome, C_concorso FROM DOCENTE
WHERE A_servizio>10 AND C_istituto=”MI0145”;
Risultato:
Cognome Nome
C_concorso
Giotto
Giacomo
A042
Torti
Paolo
A033
Usando l’operatore OR si ottengono, invece, tutte le tuple che soddisfano almeno una delle
condizioni.
SELECT Cognome, Nome, C_concorso FROM DOCENTE
WHERE A_servizio>10 OR C_istituto=”MI0145”;
Risultato:
Cognome Nome
C_concorso
Agnoletti
Antonio
A050
Giotto
Giacomo
A042
Zanna
Daniela
A031
Bianchi
Andrea
A037
Torti
Paolo
A033
Delta
Carlo
A031
Usando l’operatore NOT posso, ad esempio, selezionare tutti i docenti con servizio superiore
ai 10 anni e non appartenenti all’istituto MI0145.
SELECT Cognome, Nome, C_concorso FROM DOCENTE
WHERE A_servizio>10 AND NOT C_istituto=”MI0145”;
Risultato:
Cognome Nome
C_concorso
Agnoletti
Antonio
A050
Bianchi
Andrea
A037
Ordinamento del risultato di una query. Usando la clausola ORDER BY si può indicare al
DBMS di ordinare i risultati secondo una o più colonne. La parola chiave DESC indica un
ordinamento decrescente.
Es. Selezionare l’elenco dei docenti impiegati nell’istituto MI0145 ordinandolo per cognome.
SELECT Cognome, Nome, C_concorso FROM DOCENTE
WHERE C_istituto=”MI0145” ORDER BY Cognome;
Risultato:
Cognome Nome
C_concorso
Delta
Carlo
A031
Giotto
Giacomo
A042
Torti
Paolo
A033
Zanna
Daniela
A031
91
BIOINFORMATICA
Es. Selezionare l’elenco dei docenti impiegati nell’istituto MI0145 ordinandolo per classe di
concorso e per anzianità in senso decrescente.
SELECT Cognome, Nome, C_concorso, A_servizio FROM DOCENTE
ORDER BY C_concorso, A_servizio DESC;
Risultato:
Cognome Nome
C_concorso A_servizio
Zanna
Daniela
A031
5
Delta
Carlo
A031
0
Torti
Paolo
A033
25
Bianchi
Andrea
A037
11
Andora
Giuseppe
A037
7
Giotto
Giacomo
A042
15
Gentili
Angela
A042
9
Boldi
Luisa
A042
2
Cerpi
Elisa
A048
1
Palo
Anna
A048
0
Agnoletti
Antonio
A050
12
La clausola DISTINCT. Se volessi conoscere l’elenco delle discipline presenti nella
relazione DOCENTE potrei scrivere:
SELECT C_concorso FROM DOCENTE;
Così facendo però otterrei molti duplicati, uno per ogni docente appartenente alla medesima
classe di concorso. Per eliminare questi duplicati si usa la clausola DISTINCT:
SELECT DISTINCT C_concorso FROM DOCENTE;
Risultato:
C_concorso
A050
A042
A031
A037
A048
A033
Funzioni di gruppo. Le funzioni di gruppo permettono di estrarre informazioni riassuntive
da gruppi di tuple di una relazione.
Es. Stabilire il numero di docenti per classe di concorso.
SELECT C_concorso, COUNT(*) FROM DOCENTE GROUP BY C_concorso;
Risultato:
C_concorso COUNT(*)
A050
1
A042
3
A031
2
A037
2
A048
2
A033
1
Es. Selezionare le classi di concorso con un numero di docenti inferiore a 2.
SELECT C_concorso, COUNT(*) FROM DOCENTE
GROUP BY C_concorso HAVING COUNT(*)<2;
Risultato:
C_concorso COUNT(*)
A050
1
A033
1
92
BIOINFORMATICA
Oltre alla funzione COUNT(*) vi sono SUM (esegue la somma dei valori di una colonna), MAX
(determina il massimo valore di una colonna), AVG (determina la media di una colonna).
Interrogazioni su più relazioni. Supponiamo di aggiungere al modello l’entità istituto con
i suoi attributi.
Istituto(codiceIstituto, nome, tipologia, preside,numero_utenti, indirizzo, città)
La tabella risultante ha il seguente tracciato, dove C_istituto è chiave primaria:
C_istituto Nome
Tipo
Preside
N_utenti
Indirizzo
Citta
Per visualizzarne l’intero contenuto:
SELECT * FROM ISTITUTO;
Risultato:
C_istituto Nome
Tipo
Preside
N_utenti
MI0691
B. Croce
ITI
Membretti
600
MI0145
L. da Vinci
L.S.
Giara
200
MI0721
G. Leopardi
ITC
Paolini
900
MI0902
G. d’Arco
ITI
Rossi
400
MI0537
A. Manzoni
L.S.T.
Acerra
300
Indirizzo
....
....
....
....
....
Citta
Bollate
Corsico
Sesto S.G.
Milano
Milano
Per individuare gli istituti scolastici con un numero di utenti superiore a 500 scriverò:
SELECT Nome, Tipo, N_utenti FROM ISTITUTO WHERE N_utenti>500;
Risultato:
Nome
Tipo
N_utenti
B. Croce
ITI
600
G. Leopardi
ITC
900
Le tabelle DOCENTE e ISTITUTO sono legate da una relazione 1:N che individua le
caratteristiche di un istituto e l’elenco dei docenti impiegati presso di esso.
A questo punto possiamo selezionare i nomi e i presidi degli istituti che hanno un numero di
docenti inferiore a 20.
SELECT Nome, Preside, COUNT(*) FROM ISTITUTO, DOCENTE
WHERE ISTITUTO.C_istituto = DOCENTE.C_istituto
GROUP BY C_istituto HAVING COUNT(*)<20;
Oppure possiamo estrapolare i dati dell’istituto in cui è impiegata la prof.ssa Gentili Angela.
SELECT Nome, Tipo, Preside, N_utenti, Citta FROM ISTITUTO, DOCENTE
WHERE ISTITUTO.C_istituto = DOCENTE.C_istituto AND
DOCENTE.Cognome=”Gentili” AND DOCENTE.Nome=”Angela”;
Risultato:
Nome
Tipo
Preside
N_utenti Citta
G. d’Arco
ITI
Rossi
400 Milano
Le condizioni che specificano la relazione tra le due tabelle realizzano l’operazione di join
che, in questo caso, permette di concatenare informazioni provenienti da entrambe le
tabelle grazie al campo C_istituto.
Subquery. Una caratteristica che rende potente il linguaggio SQL è la possibilità di
esprimere query complesse in termini di query più semplici. La clausola WHERE, infatti, può
contenere al suo interno un’altra query, chiamata subquery.
Es. Si vogliono selezionare tutti i docenti che appartengono alla stessa classe di concorso di
Gentili Angela.
SELECT Cognome, Nome FROM DOCENTE
WHERE C_concorso=
(SELECT C_concorso FROM DOCENTE
WHERE Cognome=”Gentili” AND Nome=”Angela”);
Il risultato della subquery viene utilizzato per creare dinamicamente la condizione
C_concorso=”A048” e svolgere la query principale.
Risultato:
93
BIOINFORMATICA
Cognome Nome
Giotto
Giacomo
Boldi
Luisa
Gentili
Angela
I quantificatori ALL e ANY. Se la subquery ritorna più di un valore è necessario
specificare come questi debbano essere utilizzati all’interno della clausola WHERE. Ad
esempio, se volessimo conoscere i nomi degli istituti che hanno un numero di utenti
maggiore di tutti gli Istituti Tecnici Industriali scriveremmo:
SELECT Nome, Tipo, N_utenti FROM ISTITUTO
WHERE N_utenti > ALL
(SELECT N_utenti FROM ISTITUTO
WHERE Tipo=”ITI”);
Risultato:
Nome
Tipo
N_utenti
G. Leopardi
ITC
900
Se sostituissimo il quantificatore ALL con ANY otterremmo i nomi di tutti gli istituti che
hanno un numero di utenti superiore ad almeno un ITI.
Subquery correlate. La subquery viene svolta ripetutamente, per ogni tupla candidata
dell’interrogazione principale.
Es. Selezionare, per ogni tipo di istituto, quello col minor numero di utenti.
SELECT Nome, Tipo, N_utenti FROM ISTITUTO X
WHERE N_utenti < ALL
(SELECT N_utenti FROM ISTITUTO
WHERE X.Tipo=Tipo);
X viene detto alias di relazione e quando appare in una subquery si riferisce ad una tupla
candidata dell’interrogazione principale.
Risultato:
Nome
Tipo
N_utenti
B. Croce
ITI
600
L. da Vinci
L.S.
200
G. Leopardi
ITC
900
A. Manzoni
L.S.T.
300
SQL: funzioni di DDL. SQL contiene anche i comandi per la creazione di tabelle. In realtà
questa parte dipende molto dal DBMS, soprattutto per quanto riguarda i tipi di dati permessi
e i loro nomi.
Creazione tabelle. Es. Creare la tabella associata alla relazione Docente.
CREATE TABLE DOCENTE(Codice
Decimal not null,
Cognome
Char(25),
Nome
Char(20),
C_concorso
Char(4) not null,
T_contratto
Char(2),
A_servizio
Decimal(2),
C_istituto
Char(6)) not null;
I valori tra parentesi indicano la dimensione massima della colonna, mentre not null
specifica che la colonna non può contenere valori nulli. È il DBMS che, in fase di inserimento
dati, controllerà che questi vincoli siano rispettati prima di procedere alla memorizzazione
vera e propria.
Il comando CREATE TABLE può essere esteso per permettere la definizione di chiavi e vincoli
di integrità referenziale. Questi vincoli stabiliscono il comportamento del DBMS in caso di
cancellazione delle tuple. La sintassi estesa è la seguente:
CREATE TABLE table-name (
Col-name-1 type-1 [NOT NULL]
[,Col-name-2 type-2 [NOT NULL]
…..]
[, PRIMARY KEY (col-name-list)]
94
BIOINFORMATICA
[, FOREIGN KEY (col-name-list)
REFERENCES other-table-name
[ON DELETE {RESTRICT | CASCADE | SET NULL}]
[, FOREIGN KEY …]] )
dove le opzioni RESTRICT, CASCADE, SET NULL indicano rispettivamente:
la cancellazione della tupla viene effettivamente eseguita solo se nella tabella
referente non esiste alcuna tupla che abbia come chiave esterna la chiave della tupla (es.
un istituto viene cancellato solo se nella tabella DOCENTE non vi sono tuple che abbiano
nel campo C_istituto il codice dell’istituto in questione);
la cancellazione della tupla implica la cancellazione di tutte le tuple della tabella
referente che abbiano come chiave esterna quella della tupla. (es. quando viene
cancellato un istituto vengono eliminati anche tutti i docenti che hanno nel campo
C_istituto quel codice);
la cancellazione di una tupla comporta che in tutte le tuple della tabella referente con
chiave esterna uguale a quella della tupla, tale chiave venga posta, se ammesso, a
valore NULL (es. quando viene cancellato un istituto le tuple dei docenti ad esso legati
vengono modificate ponendo a 0 il campo C_istituto).
Comando DROP TABLE. Utilizzato per eliminare tabelle dal DB. Es:
DROP TABLE ISTITUTO;
Comando ALTER TABLE. Permette di modificare la struttura delle tabelle. Naturalmente è
buona norma non modificare la struttura del DB dopo aver già eseguito degli inserimenti in
quanto l’operazione potrebbe comportare una perdita di dati. Vi sono due comandi di
modifica: ALTER TABLE ADD permette di aggiungere una colonna alla tabella, ALTER TABLE
MODIFY permette di modificare le proprietà di una colonna.
Es. Aggiungere alla tabella DOCENTE la colonna Mailbox.
ALTER TABLE DOCENTE ADD (Mailbox Char(20));
Es. Aumentare la lunghezza della colonna Cognome della tabella DOCENTE.
ALTER TABLE DOCENTE MODIFY (Cognome Char(30));
Creazione di viste. Le viste sono relazioni virtuali attraverso cui è possibile vedere i dati
memorizzati nel DB. Una vista, dunque, non contiene dati ma riferimenti alle tabelle di base.
Il meccanismo delle viste è utile in quanto permette di semplificare l’accesso ai dati oltre a
garantirne la privatezza. Su una vista si possono eseguire (un gruppo ristretto di) query e
modifiche.
Es. Creare una vista che raggruppi dati provenienti dalle due tabelle di base e metta in
risalto nome e tipo di ogni istituto insieme al numero dei docenti.
CREATE VIEW Ist_Doc(Nome_Ist, Tipo, N_doc) AS
SELECT ISTITUTO.Nome, ISTITUTO.Tipo, COUNT(*) FROM DOCENTE, ISTITUTO
WHERE DOCENTE.C_istituto=ISTITUTO.C_istituto GROUP BY C_istituto;
Risultato:
Nome_Ist
Tipo
N_doc
B. Croce
ITI
2
L. da Vinci
L.S.
4
G. Leopardi
ITC
1
G. d’Arco
ITI
2
A. Manzoni
L.S.T.
2
Il valore della colonna N_doc viene ricalcolata a partire dalle relazioni di base ognivolta che
la vista viene usata in modo da rispecchiare gli eventuali cambiamenti apportati alle tabelle
di base.
A questo punto posso svolgere interrogazioni sulla vista.
Es. Selezionare l’istituto col maggior numero di docenti.
SELECT Nome_Ist FROM Ist_Doc
WHERE N_doc =
(SELECT MAX(N_doc) FROM Ist_Doc)
95
BIOINFORMATICA
L’uso delle viste “alleggerisce” la scrittura delle interrogazioni e quindi facilita l’accesso ai
dati inoltre permette all’amministratore del DBMS di definire modalità di accesso al DB
diverse a seconda dei privilegi degli utenti.
Comando DROP VIEW. Permette di cancellare una vista. Es:
DROP VIEW Ist_Doc;
SQL: Funzioni di DML. SQL fornisce anche primitive per inserire e modificare i dati nel DB.
Per queste operazioni i DBMS, generalmente, mettono a disposizione degli utenti anche
strumenti come le maschere, speciali finestre che permettono di lavorare più agevolmente
con i dati sia in fase di inserimento sia in fase di visualizzazione.
Comando INSERT. Permette l’inserimento di una tupla nel DB. Es:
INSERT INTO DOCENTE VALUES
(269, ‘Antico’, ‘Giovanni’, ‘A053’, ‘I’, 13, ‘MI0256’);
Va rispettato l’ordine delle colonne così come impostato in fase di creazione della tabella.
È possibile anche inserire in una relazione tuple provenienti da un’altra relazione
combinando i comandi INSERT e SELECT.
Es. Supponiamo di voler creare una nuova relazione NUOVI_ASSUNTI che contenga solo i
docenti con anzianità di servizio pari a zero. Una volta creata la nuova tabella, il comando di
inserimento sarà:
INSERT INTO NUOVI_ASSUNTI (Cognome, Nome, C_istituto)
SELECT Cognome, Nome, C_istituto FROM DOCENTE
WHERE A_servizio = 0;
Comando UPDATE. Permette di modificare i dati contenuti nel DB. Ad esempio, si vuole
incrementare di un’unità gli anni di servizio di tutti i docenti registrati:
UPDATE DOCENTE
SET A_servizio = A_servizio+1;
È possibile modificare più colonne con un unico comando usando la virgola come separatore.
Comando DELETE. Permette di cancellare una o più tuple di una relazione.
Es. Cancellare dal DB tutti i docenti impiegati nell’istituto B. Croce:
DELETE FROM DOCENTE WHERE C_istituto=
96
BIOINFORMATICA
WAREHOUSE
Un Data warehouse (termine inglese traducibile con magazzino di dati), è un archivio
informatico contenente i dati di un'organizzazione. I DW sono progettati per consentire di
produrre facilmente relazioni ed analisi. Vengono considerati componenti essenziali di un
sistema Data warehouse anche gli strumenti per localizzare i dati, per estrarli, trasformarli e
caricarli, come pure gli strumenti per gestire un dizionario dei dati. Le definizioni di DW
considerano solitamente questo contesto ampio.
Gli elementi costitutivi dell'architettura sono:
I dati provenienti dai sistemi transazionali: sono quell'insieme di dati elaborati dai
sistemi transazionali dell'azienda. Essi possono essere contenuti all'interno dello stesso
database o provenire da diversi database o anche esterni all'azienda. Spesso
l'architettura di un data warehouse prevede l'integrazione dei dati interni con quelli
esterni. L'utilizzo di questi ultimi consente di arricchire il patrimonio informativo.
Il data movement: tale componente è responsabile dell'estrazione dei dati dai sistemi
transazionali, dell'integrazione tra dati aziendali e dati esterni, del pre-processing dei
dati, del controllo della consistenza dei dati, della conversione delle strutture dati, e
dell'aggiornamento dei dizionari dei dati.
Il data warehouse: i dati estratti dagli archivi transazionali vengono memorizzati
internamente al data warehouse. Nel data warehouse l'accesso ai dati è consentito in
sola lettura. Tali dati hanno una dimensione storica e sono riferiti a soggetti di
business. Essi possono essere memorizzati in un archivio centrale o in un data mart. Il
termine data mart identifica un data warehouse di dimensioni ridotte, specializzato per
una particolare area di attività. Si pensi, ad esempio, al data mart per il marketing, in
cui i dati filtrati dagli archivi transazionali sono memorizzati per consentire l'analisi
della clientela. All'interno della banca possono quindi esistere più data mart, aventi
finalità diverse e orientati a coprire diverse aree di business. I dati contenuti nel data
warehouse possono essere aggregati e indicizzati per rispondere a specifiche necessità
informative.
I metadati: i metadati costituiscono informazione aggiuntiva che arricchisce i dati
contenuti nel data warehouse. Spesso essi vengono chiamati in gergo "data about
data" indicando la provenienza, l'utilizzo, il valore o la funzione del dato. A tale
proposito vengono costituiti dei veri e propri information catalog. Questi ultimi sono i
file che contengono i metadati. Il catalog consente di spiegare all'utente la natura dei
dati nel data warehouse, il loro significato semantico, da quali archivi essi provengono
e la loro storicità.
L'utente finale: i dati contenuti nel data warehouse vengono presentati all'utente
finale, il quale dispone di un insieme di strumenti per effettuare elaborazioni e produrre
informazioni appropriate. I tool a disposizione dell'utente possono essere semplici
generatori di query e report, interfacce grafiche che consentono la rappresentazione
dei dati o sistemi di analisi dati più complessi.
Il data warehouse è organizzato su quattro livelli architetturali:
1. trasformazione dei dati: è il livello che si occupa di acquisire i dati e validarli;
2. preparazione e "stoccaggio" dati: è il livello che fornisce i dati agli utenti e alle
applicazioni analitiche;
3. interpretazione e analisi dati: è il livello, ad elevato valore aggiunto, che presiede alla
trasformazione dei dati in informazioni aventi valore strategico;
4. presentazione dati: è il livello, a basso valore aggiunto, che presiede alla presentazione
finale agli utenti delle informazioni e quindi delle risposte cercate.
Nel suo complesso il data warehouse è un sistema periferico, cioè non risiede fisicamente sul
sistema informativo centrale. Il motivo di ciò va ricercato nel tipo di attività svolto: una
piattaforma di tipo transazionale è maggiormente orientata all'esecuzione costante di
97
BIOINFORMATICA
operazioni di aggiornamento, per cui l'ottimizzazione viene fatta soprattutto sull‘I/O; una
piattaforma di supporto alle decisioni invece deve essere ottimizzata per effettuare un
numero limitato di query particolarmente complesse. Un'eccezione a tale regola può essere
rappresentata da soluzioni di tipo mainframe, ove la possibilità di definire macchine virtuali
all'interno della stessa macchina fisica consente la coesistenza sullo stesso server fisico delle
applicazioni transazionali e delle applicazioni di decision support.
Vediamo ora nei dettagli come è fatta un'architettura per il data warehouse.
Data transformation layer. L'architettura parte dallo strato denominato data
transformation, cioè dall'insieme di applicazioni che svolgono l'attività di estrazione,
trasformazione e caricamento dei dati dai sistemi transazionali che alimentano il data
warehouse. Nella maggior parte dei casi la fase di estrazione dei dati dai sistemi alimentanti
viene implementata utilizzando i linguaggi proprietari delle piattaforme alimentanti. Si tratta
per lo più di interrogazioni ad hoc, parametrizzate per quanto riguarda l'arco temporale,
eseguite periodicamente solitamente nei momenti di minore attività del sistema. La fase di
trasformazione, quella a maggiore valore aggiunto tra le tre contenute in questo layer
applicativo, applica regole di integrazione, trasformazione e cleansing (business rule) ai dati
estratti dai sistemi alimentanti. È in questo layer che molto spesso si gioca la credibilità dei
dati del data warehouse presso gli utenti. Nella maggior parte dei casi i dati estratti dai
sistemi transazionali sono incompleti o comunque inadatti a prendere decisioni, in quanto
non sono coerenti con le analisi da effettuare. In alcuni casi le operazioni di trasformazione
possono causare un reject (rifiuto), il quale segnala l'impossibilità di accettare parte del
flusso alimentante a causa di ‘impurità’ nei dati di origine.
Le possibili cause di rifiuto sono varie:
-Codifiche incoerenti. Lo stesso oggetto è codificato in modo diverso a seconda del sistema
alimentante. In fase di trasformazione ogni flusso alimentante andrà ricodificato seguendo la
codifica convenzionale definita per il data warehouse;
-Unità di misura/formati incoerenti. È il caso in cui la stessa grandezza viene misurata con
unità di misura o rappresentata con formati differenti a seconda del sistema alimentante di
provenienza. In fase di trasformazione ogni flusso alimentante andrà convertito in un'unica
unità di misura convenzionale per il data warehouse;
-Denominazioni incoerenti. È il caso in cui, a seconda della fonte, lo stesso oggetto (di solito
un dato) viene denominato in modo diverso. Solitamente il dato all'interno del warehouse
viene identificato in base alla definizione contenuta nei metadati del sistema;
Dati incompleti o errati. Nei tre casi precedenti le operazioni di trasformazione consistevano
essenzialmente in attività di conversione, entro certi limiti automatizzabili. In questo caso,
invece, l'operazione di trasformazione può richiedere l'intervento umano per risolvere
casistiche non prevedibili a priori.
Data preparation and storage layer. Una volta che i dati hanno superato il
transformation layer, essi vengono ‘stoccati’ in questo livello architetturale per consentire:
-la creazione di sintesi informative per gli utenti (Un Data mart è un raccoglitore di dati
specializzato in un particolare soggetto. Un Data mart contiene un'immagine dei dati che
permette di formulare strategie sulla base degli andamenti passati.) mediante procedure ad
hoc che solitamente vengono innescate (in termini di update) al completamento delle
operazioni di estrazione, trasformazione e caricamento;
-l'esecuzione di analisi avanzate, basate prevalentemente su algoritmi di tipo statistico, che
richiedono di operare sul massimo dettaglio disponibile dei dati per restituire risultati
significativi.
Questo livello coincide con il massimo dettaglio disponibile (in termini di dati) all'interno del
sistema di data warehousing.
Data interpretation and analysis layer. A questo livello si trovano oggetti tra loro molto
diversi per funzione e tecnologia. Le funzionalità base espletate da questo livello
architetturale sono: aggregazione, analisi e interpretazione.
98
BIOINFORMATICA
Aggregazione. La funzionalità di "aggregazione" provvede a costruire sintesi decisionali
partendo dai dati di dettaglio presenti nel layer precedente. Qui si deve fare un'importante
precisazione architetturale. In una situazione in cui non esiste il data warehouse gli utenti
sono costretti ad accedere ai sistemi legacy per ottenere le informazioni loro necessarie. In
alcuni casi si può decidere di estrarre dai sistemi legacy una o più sintesi (data mart) per gli
utenti che effettueranno l'analisi su di esse. In questa situazione, anche se la tecnologia e
l'architettura assomigliano a quelle di un data warehouse, l'impossibilità di arrivare a dati di
dettaglio superiore a quello delle sintesi disponibili ne riduce la potenza informativa. Peraltro
il data warehouse non va necessariamente considerato come una base dati a cui tutti gli
utenti accedono liberamente per le proprie analisi. Questo può essere vero dove gli utenti
siano particolarmente addestrati e, comunque sia, ha delle controindicazioni in quanto le
risorse hardware necessarie per supportare un elevato numero di utenti che eseguono
interrogazioni complesse sono difficilmente prevedibili e pianificabili. Molti presunti progetti
di Warehousing falliscono proprio perché ci si limita a 'portare dentro i dati' senza però di
fatto renderli disponibili agli utenti meno esperti.
La situazione ideale è quella in cui esiste un data warehouse centrale, contenente tutti i dati
al minimo livello di dettaglio richiesto per effettuare analisi avanzate e per costruire
aggregazioni per tutti gli utenti. In questo caso i data mart possono essere tematici (cioè
contenenti tutte le informazioni riguardo un certo soggetto) oppure per gruppi specifici di
utenti. Questa strategia architetturale fa del data warehouse un vero processo di information
delivery, ove la richiesta di nuove sintesi decisionali comporta non già la costruzione di altri
flussi di alimentazione ma piuttosto la creazione di altri data mart. Lo sviluppo di nuovi data
mart è una normale attività di gestione del data warehouse. La differenza con quanto si
dovrebbe fare utilizzando i sistemi legacy è essenzialmente di costo: generare un nuovo
data mart all'interno di un'architettura di warehousing ha costi e tempi di sviluppo e di
controllo qualità dei dati nettamente inferiore.
Analisi e interpretazione. La funzionalità di analisi consente di effettuare indagini sugli
aggregati costruiti dal sistema. Tipicamente le funzionalità di analisi di un data warehouse si
appoggiano su una tecnologia di tipo OLAP (On-Line Analytical Processing). L'OLAP è
essenzialmente un approccio ai processi decisionali che si focalizza sull'analisi dimensionale
delle informazioni. Le sue caratteristiche principali sono:
-è orientato agli utenti di business: il business è fatto a dimensioni e non a tabelle e chi
analizza e tenta di comprenderlo ragiona appunto per dimensioni; è per questo che, una
volta intuiti i due concetti fondamentali (dimensione e gerarchia), qualsiasi utente di
business è in grado di utilizzare uno strumento OLAP;
-è pensato per la risoluzione di problemi non strutturati: a differenza dei tradizionali
strumenti di reporting che presentano già le risposte preconfezionate, gli strumenti OLAP
stimolano le domande e consentono analisi di causa-effetto. Ciò avviene grazie alla loro
struttura che permette la navigazione tra le informazioni, utilizzando le gerarchie e le
relazioni tra le informazioni stesse come ‘sentieri’;
-si focalizza sulle informazioni: i motori OLAP non sono di per sé strumenti di presentazione
delle informazioni ma architetture ottimizzate di data storage e navigazione; ne segue che
tutto ciò che un utente trova in questo ambiente sono solo le informazioni di cui ha bisogno,
organizzate secondo la logica delle dimensioni di analisi di business;
-(di conseguenza) crea efficienza: ovviamente il risultato netto di tutto ciò è l'efficienza
creata da questi sistemi con la loro capacità di andare dal generale al particolare e di aiutare
l'utente a trovare l'informazione necessaria in base a percorsi logici e non ‘scartabellando’.
Data presentation layer. Questo livello contiene i sistemi di presentazione delle
informazioni agli utenti.
I sistemi appartenenti a questo layer architetturale possono essere raggruppati in tre grandi
categorie:
strumenti specialistici di Business Intelligence: in questa categoria, molto vasta in
termini di soluzioni presenti sul mercato, troviamo strumenti per costruire query, strumenti
di navigazione OLAP (OLAP viewer) e, in un'accezione ampia, anche i Web browser, che
stanno diventando l'interfaccia comune per diverse applicazioni;
99
BIOINFORMATICA
strumenti di Office Automation: spesso i software vendor presenti con le loro soluzioni
nel layer architetturale precedente indicano come soluzioni di front end gli strumenti ordinari
del lavoro quotidiano, come word processor e fogli elettronici. Questa è una soluzione
rassicurante per gli utenti che si avvicinano per la prima volta al data warehouse, in quanto
non sono costretti ad imparare nuovi strumenti complessi. Il problema consiste nel fatto che
tale soluzione è adeguata per quanto riguarda produttività ed efficienza, lo è meno per
l'utilizzo intensivo del data warehouse, dal momento che questi strumenti, in tale caso,
hanno limiti architetturali e funzionali significativi;
strumenti di grafica e publishing: anche qui prevale una considerazione di efficienza e
produttività: gli strumenti di Business Intelligence sono capaci di generare grafici e tabelle
per i propri utenti, la soluzione in oggetto serve sostanzialmente ad evitare inefficienti doppi
passaggi.
I dati. Un data warehouse comprende diversi livelli o tipologie di dati:
Dati attuali di dettaglio: sono i dati al massimo livello di dettaglio che si ritiene possa essere
utile ai processi decisionali, sulla base delle esigenze note e di quelle ragionevolmente
prevedibili. In realtà, questa parte comprende non solo i dati propriamente attuali (cioè
validi al momento dell'interrogazione), ma anche una certa finestra temporale di dati storici.
Oltre all'eventuale prima aggregazione, i dati di questo livello hanno già subito rispetto ai
dati operativi tutte le altre operazioni: filtraggio delle informazioni non necessarie,
interrogazione delle informazioni da fonti diverse, trasformazione rispetto allo schema dati
del data warehouse.
Dati storici di dettaglio: i dati di dettaglio che superano la finestra temporale del dato
"attuale" ma che rientrano comunque nella finestra temporale del data warehouse vengono
collocati su supporti meno impegnativi e costosi, ma anche accessibili meno comodamente.
Dati aggregati: la presenza dei dati aggregati nel data warehouse deriva da considerazioni di
efficienza e praticità nella risposta alle richieste degli utenti; infatti tutte le informazioni
ricavabili dai dati aggregati sono in teoria ricavabili dai dati di dettaglio, ma ciò
richiederebbe di volta in volta il loro ri-calcolo. In questo modo, però, non potranno essere
soddisfatte esigenze non previste che richiedano aggregazioni diverse da quelle predisposte,
ma a questo scopo sono comunque conservati i dati di dettaglio.
La progettazione di un Data warehouse. Come accennato precedentemente, il data
warehouse è un sistema OLAP (On-Line Analytical Processing) che differisce dai sistemi OLTP
(On Line Transaction Processing), sebbene i dati provengano da questi ultimi. I sistemi OLAP
sono sistemi orientati al soggetto, sono integrati, storici e permanenti. Non comprendono
dati analitici e statici come i sistemi OLTP, inoltre i dati OLAP non sono adatti ad uso
corrente, ma vengono usati per analisi. Un data warehouse è sempre diviso dal suo
ambiente operativo. I dati del data warehouse non vengono mai cambiati; sono memorizzati
all'inizio e messi a disposizione, e non sono aggiornati come nei sistemi OLTP. Prima di
essere memorizzati nel data warehouse, i dati sono integrati seguendo diverse strategie.
La fonte dei dati per un data warehouse è un sistema operativo, anche se la prima non è
una pura copia del secondo: i dati in un sistema decisionale sono filtrati, classificati
cronologicamente, sono aggiunti dei valori riassuntivi e sono cambiati prima di essere
caricati nel data warehouse. In particolare, per i microdati, i dati sono riassunti a due livelli
di aggregazione distinti: il primo livello (primo livello di data mart) specifica l'unità del
tempo, e nel secondo livello (data mart finale) sono memorizzati permanentemente soltanto
dati a più alta frequenza. Così, se i dati sono acceduti più frequentemente, il livello di
sommarizzazione è più elevato. In altre parole, è memorizzato un numero minore di dati, e
l'accesso ai dati è più veloce ed efficiente. I principali approcci per sviluppare un ambiente di
data warehouse sono due: il primo è basato sulla creazione di un data warehouse centrale,
usando dati dal sistema principale ed altre fonti. Questo data warehouse centrale può essere
poi usato per creare/ aggiornare data warehouse dipartimentali o data mart locali. Il
secondo approccio è basato sulla creazione di data mart indipendenti, ognuno memorizzato
direttamente dal sistema centrale e altre fonti dei dati. L'approccio di un data warehouse
100
BIOINFORMATICA
centrale può iniziare con un data warehouse semplice, ampliabile nel tempo per soddisfare
utenti con richieste crescenti e diventare un ambiente che contenga sistemi di data
warehouse interconnessi. In un ambiente di data warehouse semplificato bisogna
organizzare tre aree:
-l'estrazione e la trasformazione dei dati dai sistemi operativi;
-la base di dati del data warehouse;
-gli strumenti per interpretare i dati.
È necessario monitorare la rete che consente l'accesso agli utenti. Ci sono di solito almeno
tre repository per i metadati e per le altre informazioni collegate: uno per descrivere la
struttura dei dati, per la loro trasformazione e per l'estrazione dei dati; uno per il database
del data warehouse; ed uno o più per gli strumenti di navigazione. Questi repository devono
essere curati individualmente e complessivamente. I dati nell'ambiente del database del
data warehouse dovrebbero essere maneggiati con la stessa cura. La complessità di questo
compito dipende dalla complessità del database scelto, ma include copie di backup,
recovery, riorganizzazioni, archiviazioni, operazioni di monitoraggio e tuning. Sono creati
sub-set di dati dipartimentali o locali (data marts) per migliorare la performance delle
consultazioni dell'utente e ridurre la dipendenza dal data warehouse. Questo livello
aggiuntivo di dati aumenta la complessità di gestione dell'ambiente: aggiunge un altro livello
di metadati e possibilmente un altro repository, richiede controllo e gestione della
distribuzione dei dati dei data mart, e, a meno che l'amministrazione dei data mart sia
completamente devoluta a livello locale, richiede anche la gestione di dati del database del
data mart. La situazione diventa anche più difficile se l'ambiente continua ad evolvere
tramite la creazione di data warehouse multipli. In alcuni di questi casi, le complessità di
amministrazione diventano opprimenti.
Nell'approccio con data mart indipendenti, la creazione di un solo data mart orientato a
risolvere un particolare problema rappresenta una soluzione semplice. Le tre aree da
amministrare sono:
-l'estrazione dei dati dalle fonti e la trasformazione nelle strutture dei dati corrette per il
database del data mart;
-il database del data mart stesso;
-gli strumenti per interpretare i dati.
Poiché questo ambiente non contiene grandi volumi di data warehouse esso è più
maneggevole. Nel caso si adotti una tale semplice soluzione di data mart nella realizzazione
di data warehouse e nell'organizzazione, il compito dell'amministratore sarebbe
relativamente facile. Questo approccio non si ferma di solito ad un data mart e, una volta
che vengono aggiunti altri data mart, la situazione diventa più complicata. Il compito di
portare numerosi data mart separati in un solo ambiente di data warehouse è estremamente
difficile. Ogni data mart viene sviluppato di solito individualmente. Tali data mart hanno il
potenziale di diventare parte del sistema centrale. In questo modo, possono porre il
problema di discordanze nella definizione dei dati che il data warehouse è stato disegnato
per risolvere. Questa situazione poco attraente si evita solamente se esiste un'architettura
centralizzata di amministrazione dello sviluppo del sistema. Il data warehouse potrebbe
arrivare a contenere volumi molto grandi di dati, non sempre interessanti per tutti gli utenti.
Lavorare con questi volumi di dati non correlati può essere inefficiente e consumare molte
risorse di calcolo. In questa situazione è possibile suddividere il data warehouse in aree di
interesse specializzate. Inoltre, molti tool per lo sfruttamento dei dati creano i loro primi
ambienti, ognuno col proprio repository. Tale repository contiene le informazioni richieste
per l'esplorazione dei dati. Se il data warehouse è amministrato centralmente, questi
ambienti devono essere incorporati nella struttura di gestione centrale. Anche dove la
responsabilità dell'amministrazione dei tool di sfruttamento dei dati è a livello locale, serve
un collegamento tra il sistema di amministrazione centrale e gli ambienti distribuiti. Questo
101
BIOINFORMATICA
collegamento è necessario per assicurare che i cambiamenti dei tool degli ambienti distribuiti
possano essere identificati anche centralmente.
I livelli ‘operativi’ del data warehouse possono esistere sotto due condizioni fondamentali:
-l'esistenza di un'adeguata organizzazione di supporto al processo, con ruoli e responsabilità
definiti. In modo analogo alle applicazioni transazionali, un sistema di decision support
necessita di figure organizzative con la responsabilità di mantenerlo, soprattutto in chiave
evolutiva, per far sì che esso sia costantemente allineato alle esigenze degli utenti di
business, condizione necessaria e sufficiente perché continui ad esistere;
- il giusto rilievo alla tecnologia di supporto al processo, composta di scelte equilibrate e
basate sulle esigenze funzionali del processo stesso. La tecnologia è cruciale per il data
warehouse, date le problematiche di system integration che esso comporta. La gestione
costante della variabile tecnologica è uno dei fattori di successo del data warehouse, a
partire dalle scelte iniziali per arrivare alla gestione operativa degli aggiornamenti e degli
ampliamenti della piattaforma.
Applicazioni del data warehouse. Il data warehouse è un sistema informativo dove i dati
sono organizzati e strutturati per un facile accesso da parte dell'utente e per fornire
supporto ai processi decisionali. I seguenti sistemi sono abilitati dal data warehouse:
DSS (Decisional Support System)
EIS (Executive/Enterprise Information System).
Il primo è utilizzato per risolvere problemi specifici, mentre il secondo consente una continua
circolazione dei dati non dipendente da problemi specifici. Nelle banche e in generale nelle
istituzioni finanziarie gli ambiti di utilizzo sono molteplici, poiché tutte le aree gestionali di
tali organizzazioni sono caratterizzate da volumi considerevoli di dati su cui devono essere
prese decisioni strategiche. Poiché il data warehouse può avere un valore strategico,
all'interno di tali tipi di organizzazioni è fondamentale per il management definire una
strategia per il data warehouse. La strategia per il data warehouse è essenzialmente un
percorso evolutivo che porta l'azienda da applicazioni DW non ‘mission-critical' verso una
situazione in cui il data warehouse è una componente fondamentale del sistema informativo
aziendale.
La strategia di data warehousing di un'azienda può essere classificata in base a due
dimensioni fondamentali:
-utilizzo del DW esistente: livello di maturità degli utenti e delle funzioni di supporto del DW
nell'utilizzo dell'esistente;
-utilizzo del DW in prospettiva: di utilizzo del DW come piattaforma di decision support.
Le aziende attraversano dunque quattro fasi nella storia dell'utilizzo del data warehouse:
-la prima fase, chiamata supporto (basso utilizzo del DW esistente, basso utilizzo prospettico
del DW), è la fase in cui si trovano le aziende che hanno fallito uno o più progetti di
warehousing e non pensano di ampliarne l'utilizzo prospettico. In questa fase si possono
trovare anche aziende che non hanno un DW e non pensano di realizzarlo;
-la seconda fase, chiamata opportunità (basso utilizzo del DW esistente, alto utilizzo
prospettico del DW), è la fase in cui si trovano le aziende che, pur avendo fallito uno o più
progetti di warehousing o avendo semplicemente esplorato la tematica senza approfondirla,
puntano a sviluppare le attività di decision support tramite il data warehouse.
-la terza fase (alto utilizzo del DW esistente, alto utilizzo prospettico del DW), è quella fase
in cui il data warehouse diviene strategico per i processi decisionali aziendali. In questa fase
si trovano tutte quelle aziende che hanno intrapreso con successo un progetto di
warehousing e che ne stanno sfruttando a pieno le potenzialità;
-la quarta fase, chiamata factory (alto utilizzo del DW esistente, basso utilizzo prospettico
del DW) è la fase in cui si trovano le aziende in cui il data warehouse è maturo, la
metodologia di implementazione consolidata e le aree decisionali critiche sono presidiate. In
questa fase l'imperativo principale è l'efficienza e il risparmio di costi derivanti dal data
warehouse e nel suo utilizzo. Un processo di sclerotizzazione nell'uso del data warehouse
può in alcuni casi far tornare l'azienda alla prima fase.
102
BIOINFORMATICA
Banche Dati
In informatica, il termine database, banca dati, base di dati (soprattutto in testi
accademici) o anche base dati, indica un archivio strutturato in modo tale da consentire la
gestione dei dati stessi (l'inserimento, la ricerca, la cancellazione ed il loro aggiornamento)
da parte di applicazioni software. Il database è un insieme di informazioni, di dati che
vengono suddivisi per argomenti in ordine logico (tabelle) e poi tali argomenti vengono
suddivisi per categorie (campi). Informalmente e impropriamente, la parola "database"
viene spesso usata come abbreviazione dell'espressione Database Management System
(DBMS), che si riferisce a una vasta categoria di sistemi software che consentono la
creazione e la manipolazione efficiente di database. Una Base Dati corrisponde ad un
archivio di informazioni strutturate, vale a dire di dati che si ripetono secondo una struttura
costante, a prescindere dal mezzo destinato alla loro conservazione e gestione, e può essere
informatizzata ma anche cartacea.
La necessità di reperire le informazioni scientifiche non è un problema nuovo, l'impossibilità
di sfogliare le pagine dei periodici di settore (nel campo biomedico si pensa esistano oltre
10.000 riviste) ha portato alla creazione dei primi repertori o indici bibliografici. La National
Library of Medicine (NLM) vide la luce nel 1818 come modesta raccolta di libri e riviste di
medicina nello studio di un ufficiale medico dell'esercito USA. Nel 1865 il giovane chirurgo
militare, John Shaw Billings, fu mandato a Washington e, oltre agli altri compiti, venne
incaricato di occuparsi della biblioteca. Nel 1879 Billings iniziò a compilare quello che in
seguito divenne l'Index Medicus e, un anno dopo, pubblicò il primo volume dell'"IndexCatalogue of the Library of the Surgeon General's Office". Quando se ne andò, 30 anni dopo,
l'istituzione era diventata la più grande biblioteca medica al mondo. Negli anni '50 con la
possibilità offerta dall'informatica diveniva possibile riordinare le informazioni e con un
opportuno programma di ricerca estrarre una qualunque citazione. Nasceva in questo modo
una Base di Dati. In seguito le possibilità offerte dalla telematica hanno consentito la
trasmissione dei dati dal calcolatore ad un operatore remoto; inoltre la possibilità di lavorare
con uno stesso collegamento ha consentito a molti utenti l’utilizzo delle risorse di calcolo
(time-sharing). All'inizio degli anni '60 iniziò il progetto MEDLARS, cioè la progressiva
digitalizzazione delle informazioni contenute nell'Index Medicus. Nel 1964, l'enorme
computer MH 800 svolgeva il lavoro di ricerca informatizzata. I suoi nastri magnetici
contenevano circa 13000 citazioni e per ogni ricerca dovevano essere letti tutti in circa 40
minuti. Non esistendo ancora la ricerca online, era la NLM che svolgeva le ricerche
bibliografiche: i clienti inviavano la richiesta alla NLM, questa effettuava le ricerche e spediva
i risultati per posta. Il tutto richiedeva dalle 3 alle 6 settimane in quanto il numero di
richieste diventava sempre maggiore (dalle 6.000 del 1967 alle 20.000 del 1970). Nel 1977
il sistema MEDLARS la prima banca dati che poteva essere interrogata da qualunque
ricercatore che disponesse di un modem o di un telex. Si pensa che attualmente esistano
oltre 8.000 basi di dati su supporto elettronico generalmente online, e distribuite da 2500
produttori.
Gli archivi cartacei presentano limiti evidenti soprattutto dal punto di vista gestionale. Questi
limiti sono sia di tipo operazionale, relativi cioè all’aggiornamento (modifica, cancellazione,
aggiunta di dati) che nella maggior parte dei casi non è possibile se non attraverso la
sostituzione di singole unità dell’archivio, sia di tipo funzionale quali ad esempio la
duplicazione dei dati: l’archivio cartaceo infatti non consente ordinamenti secondo criteri
differenti se non attraverso la duplicazione dell’archivio stesso. Tali archivi richiedono
pertanto un lavoro più oneroso di quelli informatizzati, sia in termini di tempo che di risorse
umane.
103
BIOINFORMATICA
L’informatizzazione delle Basi Dati ha inizio intorno agli anni ‘60. La spinta innovativa nasce
principalmente dall’esigenza, sempre più sentita, di reperire informazioni estraendole, nel
minor tempo possibile, dalla marea di quelle prodotte.
Tale esigenza porterà, in breve tempo, alla trasformazione delle versioni a stampa di
repertori e indici bibliografici, quali ad es. Index Medicus, nato circa un secolo prima negli
Stati Uniti, in versioni elettroniche, grazie soprattutto all’impulso dato dallo sviluppo
dell’informatica e degli strumenti ad essa destinati. In una base di dati le informazioni
omogenee e strutturate che possono essere reperite rapidamente attraverso uno specifico
software definito DBMS (Data Base Management System) in pratica sistema per la gestione
delle basi di dati. È importante considerare che un data base contiene dei dati ma anche le
relazioni che esistono tra essi. Un data base deve rispondere ad una serie di requisiti
Non devono esserci dei dati duplicati (ridondanza).
Gestire velocemente i dati.
Indipendenza dei dati rispetto ai programmi.
Disponibilità di linguaggi di interrogazione.
L’informatica ha permesso di raccogliere enormi quantità di materiale strutturalmente
organizzato, permettendone all’occorrenza la reperibilità pressoché immediata e
consentendone una maggiore diffusione e l’utilizzo da parte di più utenti
contemporaneamente.
Ciò è stato possibile principalmente grazie a due innovazioni tecnologiche:
La telematica, ossia la possibilità di trasmissione dati da un calcolatore ad un
operatore remoto tramite linea telefonica
Il time-sharing (sistema multiutenza), capacità di tale calcolatore di lavorare
contemporaneamente con più operatori remoti.
Le basi di dati possono essere definite in base alla struttura, tipicamente, in ordine
cronologico:
-gerarchica (rappresentabile tramite un albero - anni sessanta),
-reticolare (rappresentabile tramite un grafo - anni sessanta),
-relazionale (attualmente il più diffuso, rappresentabile mediante tabelle e relazioni tra
esse - anni settanta),
-ad oggetti (estensione alle basi di dati del paradigma "Object Oriented", tipico della
programmazione a oggetti - anni ottanta),
-semantica (rappresentabile con un grafo relazionale - inizio anni duemila).
Le basi dati possono essere classificate in base alla loro morfologia:
Numeriche = se contengono dati in forma numerica (proprietà chimiche, valori di
tossicità).
Basi dati fattuali o repertori elettronici: mettono a disposizione direttamente le
informazioni. Possono essere di diverso tipo a seconda della informazione
contenuta.
Testuali = se prevalgono gli aspetti testuali (monografie, leggi).
Grafiche = le informazioni sono espresse in forma grafica.
Basi dati di riferimento: rimandano alla fonte primaria dove sono reperite le
informazioni.
Basi dati bibliografiche = sono una sottocategoria delle basi di riferimento in quanto
le fonti primarie sono i periodici.
Basi dati testuali o fulltext = non sempre possono essere considerate vere Banche
Dati ma di fonti informative primarie.
Base dati portatile = quando l'informazione è contenuta in un dischetto o CD-ROM e
non necessita di un collegamento in linea.
MEDLARS (Index
Una Base Dati è costruito ed aggiornato da un producer che provvede alla raccolta,
selezione, indicizzazione e validazione delle informazioni. Medicus on-line è la prima Base
Dati con queste caratteristiche, Medline il cui producer è la National Library of Medicine.
L'ultimo numero dell' Index Medicus è stato pubblicato nel dicembre 2004, ma queste
informazioni continuano ad essere disponibili gratuitamente attraverso PubMed insieme a più
104
BIOINFORMATICA
di 15 milioni di riferimenti e sommari di articoli pubblicati dagli anni '60 e 1,5 milioni di
riferimenti che risalgono agli anni '50. La NLM gestisce inoltre il National Center for
Biotechnology Information (NCBI) che raggruppa alcuni database biologici liberamente
accessibili su Internet.
Possiamo distinguere alcune categorie tipo
di Basi Dati:
fattuali:
che
danno
accesso
direttamente all’informazione, a
loro volta distinguibili in numeriche,
testuali e grafiche in base al tipo di
dati contenuti (ad es. la Base Dati
Hazardous Substances Data Bank HSDB);
di riferimento: che rimandano alle
fonti primarie delle informazioni,
tra queste possiamo ricordare le
basi
dati
bibliografiche
che
rimandano a monografie e periodici
(ad
es.
Developmental
And
Reproductive Toxicology - DART);
full-text: vere e proprie fonti
primarie di informazione (ad es.:
Core biomedical collection).
Rete dati
Le Basi Dati vengono gestite da strutture,
pubbliche o private che ne costituiscono i vendors dette Banche Dati o più genericamente
Hosts, ad esempio la statunitense Dialog corporation. Le Banche Dati memorizzano e
gestiscono le Basi Dati attraverso l’Host-computer che costituisce l’Hardware sul quale viene
installato il Software di gestione e di dialogo con gli operatori remoti. Le reti permettono la
connessione tra utenti e Banche Dati per mezzo di terminali e computers.
I Software sviluppati per la gestione degli archivi rientrano fondamentalmente in due
tipologie:
Data Base Managment Systems (DBMS), soprattutto i relazionali (RDBMS) nel
significato dato a questo termine dalla matematica moderna, nei quali le relazioni vengono
rappresentate in tabelle opportunamente correlate a costituire il database, e associate agli
indici;
Information Retrieval Systems (IRS) che rendono possibile la gestione operazionale e
la ricerca, il riordino ed il trasferimento dei dati stessi.
Mentre gli RDBMS sono destinati più ad un impiego amministrativo-aziendale, per la rapidità
con cui sono in grado di ricercare un elemento in una colonna di tabella, gli IRS trovano
migliori applicazioni nel campo della documentazione in quanto orientati maggiormente,
rispetto ai precedenti, alla ricerca delle informazioni in basi dati testuali, strutturate e non,
nelle quali permettono di effettuare ricerche molto sofisticate attraverso la combinazione di
termini. Un’altra caratteristica che differenzia le due tipologie è che mentre nei primi la
struttura dei campi si presenta a lunghezza fissa nei secondi tale lunghezza è variabile e non
essendo vincolati alla struttura tabellare essi si prestano alla gestione di documenti anche
eterogenei.
I modelli più diffusi di programmi possono utilizzare le seguenti tipologie di strutturazione:
Relazionali il legame viene stabilito da corrispondenze (relazioni) e quindi associati
tra loro attraverso alcuni campi definiti campi chiave.
Gerarchico è basato sulla struttura ad albero ed è caratteristico delle prime
banche dati.
Reticolare è basato su un modello a rete.
Il massimo rendimento nella gestione degli archivi è ottenibile qualora si utilizzino, per il
trattamento dei dati, entrambe le tipologie: la prima per la produzione, la seconda per la
ricerca, ma ciò è certamente svantaggioso dal punto di vista economico.
105
BIOINFORMATICA
La ricerca della localizzazione di una frase e di una parola nelle Banche dati ci si avvale di
particolari programmi chiamati text-retrival-system che si basano sulla indicizzazione. La
ricerca di una parola secondo lo schema adottato nei programmi di scrittura come ad
esempio Word presenta alcune limitazioni. I Software di gestione utilizzati dalle Banche Dati,
text-retrieval-systems, non utilizzano la ricerca sequenziale, che richiede la lettura dei dati
dall’inizio alla fine, ma si basano sul concetto di indicizzazione. La ricerca avviene in modo
sequenziale, cioè il programma legge tutte le parole e le confronta con quella cercata e le
segnala nel caso di perfetta equivalenza. Tale equivalenza viene riconosciuta solo se esiste
una identità assoluta (maiuscola, minuscola). Non è possibile effettuare ricerche che
prevedano la presenza contemporanea di due o più parole. Come si può comprendere un
tale sistema non può essere adottato nel caso di ricerche da effettuarsi su grandi basi dati
con miliardi di parole. Per quanto attiene ai linguaggi per la creazione e la gestione di un
data base possiamo avere
DDL (Data Defintion Language) ovvero il linguaggio per la definizione della
struttura dei dati che permette in sintesi di costruire lo schema del Data Base.
DML (Data Manipulation Language) è il linguaggio adottato per la manipolazione
dei dati, consente di estrarre le informazioni di dati, la loro modifica (interfaccia
utente).
SQL (Sistem Query Language) è il linguaggio di manipolazione dei dati ed è
costituito da un numero ristretto di istruzioni e regole.
Affinché il software possa gestire efficacemente la Basi Dati è fondamentale che essa sia
costruita secondo una organizzazione strutturale e uno standard costante.
L'efficacia
di
una
ricerca
dipende
dalla
strutturazione dei dati. L'insieme della Base dei
dati viene suddiviso in unità elementari definite
records che rappresentano la singola citazione
bibliografica. Ogni record viene suddiviso in parti
omogenee che sono rappresentate dai campi, tali
campi offrono le informazioni sugli autori, la
rivista, l'indirizzo degli autori, il titolo del lavoro il
riassunto ect.
Struttura Record
Nella fase di archiviazione ogni campo è
indicizzato in modo da consentire la creazione di
un indice; un indice per autori, per il titolo ect. La
suddivisione in campi e tanti indici separati
consente di effettuare ricerche più precise. Ad
esempio possiamo identificare gli articoli in cui
Red è uno degli autori, ma non verranno
evidenziati gli articoli in cui compare ad esempio
red cells.
Le Basi Dati bibliografiche coprono generalmente
le pubblicazioni dagli anni ‘60 in poi. I produttori
appartengono
prevalentemente
all’area
anglosassone e spesso, per questo motivo,
Ricerca verso diverse Banche dati
selezionano
una
determinata
letteratura
scientifica tralasciandone altra di diversa appartenenza geografica. Alcune fonti poi, come ad
esempio molti congressi e la letteratura grigia vengono spesso ignorate.
Supponendo che una ricerca sia stata eseguita in modo corretto, esistono fondamentalmente
due parametri per valutare dal punto di vista qualitativo e quantitativo Basi Dati
confrontabili.
Recall: numero di citazioni recuperate in una Base Dati in rapporto al numero totale
di citazioni recuperabili, su un determinato argomento;
Precision: rapporto tra citazioni mirate reperite nella Base Dati e totale delle
citazioni recuperate nella stessa Base Dati, su un dato argomento.
Maggiore è il richiamo, minore è la precisione e viceversa.
106
BIOINFORMATICA
Oltre l’autorevolezza dell’ente produttore, due sistemi di controllo permettono inoltre di
valutare identità e qualità dei dati stessi, essi sono:
Data control: sistemi che permettono di assicurare l’identità fra dati memorizzati e
dati presenti nelle fonti primarie
Peer review: valutazione delle informazioni da parte di esperti, che ne garantisce
l’affidabilità.
I programmi text retrival consentono di effettuare ricerche complesse, in quanto permettono
di effettuare selezioni utilizzando degli operatori logici come ad esempio AND, OR, NOT.
Considerando di ricercare due termini, vengono create due liste con AND si crea una lista
che comprende solo i records che contengono entrambi i termini. Con il termine NOT si ha
una differenza logica creando un criterio di esclusione, cioè si selezionano tutti gli articoli che
contengono la prima parola e non la seconda. Una somma logica si ottiene con OR; si creano
due liste e vengono confrontate e si crea una unica lista in cui compaiano entrambi i termini
ricercati.
Nel caso in cui i criteri di conoscenza fossero incompleti si può ricorrere a particolari
operatori che consentono di ricercare semplicemente la radice della parola. Si possono
utilizzare dei caratteri di troncatura o Wild-cards. Possiamo avere il simbolo * che ritrova
l'insieme dei caratteri di qualunque lunghezza ed il simbolo ? per un singolo carattere.
Esempio di troncatura
DEPRESS* = DEPRESSION, DEPRESSIVE, DEPRESSED
WART? = WARTH, WARTS, WART
SM?TH = SMITH, SMYTH
SM?TH* = SMITH, SMYTH, SMITHE SMYTHE
Text retrival
Gli operatori di contiguità sono uno strumento che
consente di selezionare con maggior efficacia la ricerca,
infatti come nell'esempio precedente potremo trovare
che i due termini della ricerca siano nel contesto distanti
tra di loro, mentre nel nostro caso siamo interessati ad
una associazione stretta tra i termini. Nel nostro caso la
ricerca dovrebbe essere esplicitata come segue: CATTLE
ADJ DAIRY
Le basi dati possono contenere semplici citazioni bibliografiche, dati numerici, interi testi o
periodici o anche immagini grafiche. Solitamente le basi dati di tipo scientifico contengono
sono di tipo bibliografico e quindi la politica del produttore è quella di scegliere le riviste e gli
aggiornamenti.
É evidente che se cercassimo la stessa informazione nelle tre banche dati otterremmo dei
risultati diversi; in pratica esiste una sovrapposizione del 30%. Il ricercatore è quindi
invogliato per ottenere una ricerca completa a selezionare più banche dati.
La qualità delle risorse fornite da una banca dati risiede in larga misura dal tipo di indexing
adottato dal produttore, dalla precisione che possiedono i recensori. Particolare importanza
riveste anche l'assegnazione di particolari descrittori che facilitano la ricerca.
BIOSIS
possiede
un
BANCHE ANNO FONTI
RECORDS AGGIORNAMENTO
programma
di
ricerca
MEDLINE
1966 3.200 6.500.000
settimanale
amichevole “user friendly”
EMBASE
1974 4.000 4.000.000
settimanale
che consente di accedere ad
BIOSIS
1968 9.000 7.000.000
quindicinale
alcune
banche
dati
specializzate:
AIDS in Focus. Contiene riferimenti ad articoli e convegni sul tema dell’AIDS.
Bioexpress. Riporta articoli di riviste di biomedicina.
Biopatent. Riporta i brevetti nel settore della biotecnologia e biomedicina in USA.
Biomeetings. Si riferisce ad interventi, manifestazioni nell’ambito della
biomedicina.
Biotheses. Riporta le tesi e i master di biomedicina di oltre 500 Università.
107
BIOINFORMATICA
Forthcoming. Informazioni su seminari, meeting workshop del settore della
medicina.
In questo ambito si ha un sistema a tendina che facilita la ricerca:DMC (Dialog Medical
Connection) nei seguenti data Base:
Medical Reference Library (Medline, Clinical Abstract, Cancerlit….).
Bioscience Reference Library (Biosis, Previews, Agricola, CAB, Food Science &
Technology….).
HGMP. (Human Genome Mapping Project). Permette di accedere alle banche dati del settore
della genetica molecolare e di usufruire dei programmi con un collegamento Telnet.
Servizio di Posta Elettronica. Permette lo scambio di messaggi da una lista del gruppo
BIOSC, che si occupa di biologia molecolare. I partecipanti ricevono un bollettino con
aggiornamenti su convegni e congressi.
Analisi e manipolazione delle sequenze. Consente un collegamento alle banche dati
delle sequenze nucleotidiche e proteiche (GenBank, EMBL Library NBRF, Swissprot).
Genoma Data. È possibile usufruire delle informazioni della base di dati OMIN (McKusick’s
online Mendelian Iheritance in Man) che corrisponde a Human Gene Map and Molecular
Defects List, inoltre è possibile accedere alla GDB (Human Genome Database) della J.
Hopkins University di Baltimora che contiene informazioni sul mappaggio dei geni umani.
Genetic Linkage Analysis. Comprende i pacchetti di alcuni programmi come Linkage di
Lathrop e Lalouel, il programma CRIMAP, MAP per la concatenazione genetica.
Nel campo chimico la ricerca di un prodotto sulla base della nomenclatura chimica può
essere particolarmente difficile (l'Index Guide del Chemical Abstracts dedica circa 200 pagine
alle regole di nomenclatura) pertanto le ricerche si basano sulla formula di struttura che
rappresenta un mezzo immediato per definire un prodotto e non sussistono diversità nelle
convenzioni in quanto riflettono il linguaggio naturale dei chimici. La possibilità di ricercare
una struttura risiede evidentemente nell'esistenza di una codificazione delle informazioni.
CSD Cambridge Structural Database, Data base chimico inglese del Council for Central
Laboratory of the Research Council
Daresbury che fornisce informazioni
sulla
spettroscopia,
cristallografia
offre informazioni anche di biologia
molecolare
SEQNET.
http://www.
ccl.ac.uk
Le banche dati nel settore biomedico
sono particolarmente numerose:
ABDA-Pharma
contiene
cinque
archivi con informazioni bibliografiche
e testuali su circa 15.000 sostanze
farmaceutiche, per ogni sostanza
vengono fornite le indicazioni sul
dosaggio, gli effetti collaterali e le
controindicazioni.
CCML (Comprensive Core Medical
Library). Riporta il testo completo di
alcune riviste mediche di rilievo
Banche dati di chimica
internazionale (Lancet, Annals of
Internal Medicine, British Medical
Journal) e dei manuali di medicina.
Telgen. Contiene i riferimenti bibliografici con gli
Abstract
della
letteratura
mondiale
sulle
biotecnologie e sull’ingegneria genetica. Le fonti
sono rappresentate da oltre 7.000 riviste, libri atti
di convegno. In questa banca dati possiamo
utilizzare 15 descrittori per effettuare la ricerca.
La postelaborazione. IntelliGenetic Suite è un particolare programma per l'interrogazione
di dati di sequenze nucleotidiche o peptidiche che consente il confronto ragionato tra
108
BIOINFORMATICA
sequenze, la determinazione del grado di omologia, la generazione di mappe restrizione a
partire dai dati concernenti i singoli frammenti.
I DATA BASE ITERATIVI. Alcune Banche Dati consentono all'utente la possibilità di
interagire con l'informazione contenuta in maniera molto spinta rispetto alle Banche Dati
tradizionali. Queste Banche dati sono quelle che riportano archiviate le sequenze, i
distributori di queste Banche hanno sviluppato dei software di interrogazione che consentono
di ritrovare una sequenza anche quando esiste una parziale differenza rispetto a quella
proposta dall'interrogante.
MEDLINE (Index Medicus Online). Il
PRODUTTORE DATA BASE DISTRIBUTORE
National Center for Biotechnology
CAS
CASSEQ
vari
Information (NCBI), Centro Nazionale
EMBL
EMBL
BioNet
per le Informazioni di Biologia Molecolare,
IntelliGenetics GENBANK
IntelliGenetics
è una parte della National Library of
Derwent
GENESEQ
IntelliGenetics
Medicine (Biblioteca nazionale americana di
NBRF
NBRF
BioNet
medicina), che dipende a sua volta
NBRF
PIR
BioNet
dall'Istituto per la salute americano. L'NCBI
ha la sua sede a Bethesda, nel Maryland, ed è stato fondato nel 1988. Questo centro deve la
sua importanza anche al fatto che ospita e gestisce varie banche dati di genomica
(GenBank), proteine e altre informazioni relative alle biotecnologie, nonché sviluppa
strumenti e software per analizzare i dati del genoma.
L'istituto rende anche disponibile un immenso database di citazioni di articoli scientifici (più
di 20 milioni a gennaio 2009), principalmente di carattere biomedico, con riferimenti agli
articoli stessi, talvolta ad accesso libero (PubMed). Tutti i database sono disponibili online
attraverso un motore di ricerca interno, Entrez, ed è possibile avere un collegamento diretto
tra i vari database per fare ricerche incrociate. Tra i programmi sviluppati dall'NCBI vi è
BLAST, un algoritmo che permette di effettuare ricerche di similitudine su sequenze di DNA
o aminoacidiche immagazzinate nei loro database o di comparare tra loro due sequenze
esterne immesse dal ricercatore. La ricerca comincia dalla scheda Search Formulation; che si
avvale di un sistema chiamato Knowledge Finder per accedere all'archivio della National
Library of Medicine del Dipartimento della Sanità americano che comprende gli articoli di
circa 3.400 riviste di medicina. Le specifiche della ricerca vanno poste nel campo Topic
Search Statement, in questo campo possiamo inserire frasi, concetti parole chiave per un
massimo di 32.000 caratteri.
L'algoritmo individua tutti i termini specificati e successivamente tutte le schede che
racchiudono il maggior numero di termini. Effettuando un settaggio con il Relevance Filter
possiamo ottenere un maggior numero di schede ma con un minor grado di attinenza
oppure un minor numero di schede ma con un grado di attinenza superiore. La ricerca può
essere orientata utilizzando MeSH (Medical Subject Heading) che è un tesaurus dei termini
utilizzati nella composizione delle schede MEDLINE. La possibilità di utilizzare l'opzione Word
Variant possiamo allargare la ricerca ai termini simili a quelli specificati. Indicate tutte le
specifiche si attiva l'icona Search che consente di individuare le schede di interesse che
appaiono attivando l'icona Eyes. La prima scheda è quella che presenta la maggior attinenza
rispetto alle specifiche richieste. L'opzione Save File consente di salvare le schede in un file a
cui è possibile accedere attraverso altre applicazioni o con applicazioni specifiche come Procite.
Medical Subject Headings (MeSH). Ogni record nel database di MEDLINE include un certo
numero di termini che sono riportati in un tesaurus denominato MeSH. In MEDLINE ci sono
circa 24.000 termini raggruppati in una struttura da albero con appositi indici per un
intercollegamento. I termini gerarchicamente, dal più generale al più specifico, in sedici
categorie identificata da lettere dell'alfabeto ("A" per l'anatomia, "B" per gli organismi, "C"
per le malattie, ecc.), ciascuna delle quali a sua volta è suddivisa in sottocategorie,
identificate da numeri, sempre più specifiche a mano a mano che si si procede in basso per
cui la specificità del termine è proporzionale alla lunghezza del numero. Grazie alla struttura
ramificata che scaturisce da questa classificazione, si ottengono degli elenchi di termini
definiti "alberi". La struttura ad albero è di tipo gerarchico per cui discendendo si aumenta la
109
BIOINFORMATICA
specificità. In aggiunta i termini MeSH sono accompagnati da uno o più sottoindici che
indicano un particolare aspetto in discussione per esempio:
therapeutic use, etiology, toxicology etc.
MEDLINE utilizza i termini MeSH come testo. È possibile individuare i termini MeSH in diversi
modi. Se si effettua un click verrà presentato un box nel quale si potranno ricercare i termini
desiderati. Se ad esempio ricerchiamo diverticulitis noi troveremo 9 potenziali termini MeSH.
Se clicchiamo il termine avremo delle informazioni più specifiche, introducendo i termini più
appropriati nel Limit box del form di ricerca; tutte le ricerche verranno limitate al termine o
ai termini inseriti in Evaluated TM MEDLINE.
Visualizzazione della gerarchia MeSH. È possibile mostrare la struttura del tesaurus
utilizzando il livello discendente e visualizzare ogni ramo per ogni specifico step. Esempio:
diseases (C)
digestive system diseases (C6)
gastrointestinal diseases (C6.405)
intestinal diseases (C6.405.469)
enteritis (C6.405.469.314)
Cliccando è possibile inserire ogni termine o gruppo di termini nel Limit box. Tutte le
ricerche saranno limitate ai termini selezionati fintanto che saranno rimossi utilizzando
l'opzione Clear Search.
Selezione dei termini MeSH dai records. Il record full text di MEDLINE include una lista
di termini MeSH. Tali termini possono essere ricopiati nel Search form. Cliccando sui termini
the MeSH è possibile vedere i descrittori in forma gerarchica.
Qualificatori MeSH. I qualificatori MeSH sono indicati per particolari record. Per esempio,
servono per distinguere un particolare di un farmaco tra utilizzo terapeutico effetti negativi e
impiego veterinario del farmaco. Esempio: 'enteritis *5 ve' si individuano i farmaci di utilizzo
veterinario legati all'enterite.
Campo
Codice
Esempio
Autore
Au
'smith a':au
Autore Indirizzo
Ad
'new york':ad
CAS Registry number
Rn
'54 04 6':rn
Country of Journal
Cy
Data di Pubblicazione
Dp
1995:dp
Riassunto in Inglese
Ea
a:ea
Mese di ingresso
Em
9603:em
Simbolo di Gene
Gs
Nome della rivista
Ta
'am j med sci':ta
MeSH
Mh
heart:mh
MeSH qualificatori
Mhql
tu:mhql
Un certo numero di qualificatori possono essere applicati ad un singolo termine MeSH, ma è
raccomandato non impiegare più di 5 qualificatori. Esempio: tu:mhql Non tutti i qualificatori
possono essere utilizzati con tutti i termini MeSH. I qualificatori disponibili sono riportati nel
MeSH term.
110
BIOINFORMATICA
Restrizione della ricerca. La ricerca può essere limitata utilizzando un campo di ricerca.
Esempio: blood:ti In questa ricerca il termine 'blood' verrà ricercato solo nel titolo del
lavoro. I seguenti campi possono essere utilizzati (lista non esaustiva).
Restrizione per rivista. La ricerca può essere limitata ad una particolare rivista utilizzando
il codice jc, nell'esempio si ottiene malaria and nsc:jc e vengono riportati solo gli articoli
della rivista Nature.
Restrizione per tipo di pubblicazione.
Abstract
Bibliography
Classical-Article
Clinical-Conference
Clinical-Trial
Clinical-Trial-Phase-I
Clinical-Trial-Phase-II
Clinical-Trial-Phase-III
Esempio di ricerca in MEDLINE sui records della caffeina legati a prove cliniche; caffeine and
Clinical-Trial:pt
Restrizione per lingua. Ogni lingua possiede un codice come riportato nella tabella a titolo
di esempio
Esempio selezioniamo tutti gli articoli in russo
African
afr
Bulgaro
bul
che parlano di polmonite rus:la and pneumonia
Simboli speciali (wildcard)
Italiano
ita
Portoghese
por
*include le lettere e i numeri .
Esempio: sul*ur ricerca i termini sulphur e sulfur.
Svedese
swe
Ucraino
ukr
Esempio: m*cclements trova i records che
contengono "McClements" o "MacClements".
I simboli wildcard possono essere utilizzati per trovare le parole che iniziano con una
desinenza comune.
Esempio: catheter* consente di trovare i termini catheters; catheterisation; catheterization;
catheterise etc.
? indica uno solo carattere
Esempio: sulf?nyl ha come risultato sulfonyl or sulfinyl.
Soundex matching.
Se si utilizza il simbolo $ si ricorre ad una ricerca sulla fonetica, vengono riportati i termini
che possiedono suoni simili.
Esempio: stevenson$:au vengono riportati 'stevenson', 'stephenson' e 'stephens'
Entrez è un potente motore di ricerca che permette una ricerca contemporanea su differenti
database biomedici. L'Entrez Global Query Cross-Database Search System è un sistema di
ricerca integrato tra banche dati biomediche contenenti informazioni di tipo differente.
Entrez è coordinato dal National Center for Biotechnology Information (NCBI) statunitense,
parte della National Library of Medicine (NLM) (essa stessa parte dei National Institutes of
Health).
PubMed. Raccoglie i riferimenti agli articoli apparsi su un numero elevato di riviste scientifiche,
principalmente di tipo biomedico. Contiene anche riferimenti immediati ad articoli scientifici ad
accesso libero.
PubMed Central. Raccoglie articoli scientifici ad accesso libero.
Bookshelf. Raccoglie libri di testo di argomenti biomedici ad accesso libero.
OMIM. Cataloga tutte le patologie umane aventi una componente genetica.
OMIA. Cataloga tutte le patologie animali aventi una componente genetica.
Nucleotide. Banca dati di sequenza nucleotidica (GenBank).
Protein. Banca dati di sequenza proteica.
Genome. Raccoglie sequenze genomiche complete.
Structure. Contiene strutture tridimensionali di macromolecole.
Taxonomy. Cataloga gli organismi secondo la classificazione scientifica.
SNP. Raccoglie gli SNPs (single nucleotide polymorphisms).
Gene. Raccoglie informazioni di sequenza centrate sui singoli geni.
HomoloGene. Classifica i geni a seconda dell'omologia tra differenti specie.
111
BIOINFORMATICA
PubChem Compound. Raccoglie informazioni sulle strutture chimiche di piccole molecole
chimiche.
PubChem Substance. Raccoglie dati depositati su molecole chimiche.
Genome Project. Informazioni sui progetti genoma in corso.
CDD. Contiene un database con i domini conservati delle proteine.
3D Domains. Contiene domini provenienti da Entrez Structure.
UniSTS. Raccoglie dati di marcatura e mappatura.
PopSet. Cataloga dati relativi a studi sulla popolazione (epidemiologia).
Cancer Chromosomes: database citogenetici
PubChem BioAssay: vaglio dell'attività biologica di sostanze chimiche
GENSAT: atlante dell'espressione genica nel sistema nervoso del topo
Probe: sequenza specifica di reagenti
Il sistema Entrez può mostrare visuali delle sequenze di geni e proteine e mappe
cromosomiche. Entrez può efficientemente richiamare le sequenze, strutture e le referenze
relative. Alcune guide tutorial sono anche disponibili online grazie al sistema Entrez. Entrez
Global Query è un motore di ricerca integrato che fornisce accesso a tutti i database
contemporaneamente.
GO. Il progetto Gene Ontology fornisce un vocabolario controllato che descrive geni e
prodotti di geni relativi a ogni tipo di organismo sulla base di un insieme di attributi
predefiniti. GO (Gene Ontology) è una delle
risorse più utilizzate in compiti di annotazione
di geni e sequenze. Dato che un prodotto di
gene può essere associato o localizzato in più
di un componente cellulare, essere attivo in più
di un processo biologico durante il quale può
svolgere più di una funzione molecolare, GO è
organizzata
sulla
base
di
tre
fattori:
componenti cellulari, processi biologici e
funzione molecolare. Ad esempio, il prodotto di
gene “cytochrome c” può essere descritto
tramite il termine relativo alla funzione
molecolare “oxidoreductase activity”, il termine
relativo al processo biologico “oxidative
phosphorylation and induction of cell death” e il
termine relativo alla componente cellulare “mitochondrial matrix and mitochondrial inner
membrane”. I processi biologici trattati in GO si riferiscono a insiemi di eventi generati da un
insieme ordinato di funzioni molecolari (es., trasduzione di signali), inoltre, essi sono distinti
dai pathway in quanto GO non rappresenta le dinamiche e le dipendenze di eventi che
servono a descrivere un pathway. Per quanto riguarda le funzioni molecolari, GO descrive le
attività che avvengono a livello molecolare piuttosto che le entità (molecole o complessi) che
effettuano l’azione, né specifica dove o quando l’azione ha luogo. Dato che spesso si
confonde un nome di un prodotto di gene con la sua funzione molecolare, in GO le funzioni
molecolari riportano sempre la parola “activity”.
GO è un insieme di ontologie di termini legati da relazioni is_a e part_of. Ogni ontologia è
strutturata come grafo diretto aciclico ma un nodo figlio può essere associato a più nodi
padre relativi a termini più generali. Per esempio, il termine “hexose biosynthesis” della
categoria processo biologico ha due termini padre, “hexose metabolism” e “monosaccharide
biosynthesis”. Questo perché “biosynthesis” è un sottotipo di metabolismo e un “hexose” è
un tipo di monosaccaride. Quando un gene è coinvolto in un processo di “hexose
biosynthesis” viene annotato con questo termine e automaticamente anche con “hexose
metabolism” e “monosaccharide biosynthesis”, perchè ogni termine GO figlio che descrive un
prodotto di un gene deve essere legato ai termini padri che si riferiscono a quello stesso
prodotto di gene. Il formato di annotazione di GO (http://www.geneontology.org/
GO.annotation.shtml - file) prevede uno schema composto da attributi relativi a link a
112
BIOINFORMATICA
citazione bibliografica sullo specifico prodotto genico, link a tassonomie di organismi, db
genici relazionati alla entry (http://www.geneontology. org/cgi-bin/xrefs.cgi), sinonimi del
prodotto, categoria (funzione molecolare, processo, ecc.).
Example GO Term
id: GO:0000016
name: lactase activity
namespace: molecular_function
def: "Catalysis of the reaction:lactose + H2O = D-glucose + D-galactose."[EC:3.2.1.108]
synonym: "lactase-phlorizin hydrolase activity" BROAD [EC:3.2.1.108]
synonym: "lactose galactohydrolase activity" EXACT [EC:3.2.1.108]
xref: EC:3.2.1.108
xref: MetaCyc:LACTASE-RXN
xref: Reactome:20536
is_a: GO:0004553 ! hydrolase activity, hydrolyzing O-glycosyl compounds
Attualmente GO comprende 22646 termini, dei quali 96.3% sono dotati di definizione. Si
dividono in 13257 processi biologici, 1863 componenti cellulari e 7526 funzioni molecolari
CAB. Nell'ambito della medicina Veterinaria il CAB ha prodotto un CD chiamato VETCD, che
include i record relativi a diversi aspetti della medicina veterinaria: patologia, fisiologia e
biochimica degli animali domestici, ispezione degli alimenti, zootecnia. Informazioni sono
disponibili anche per quanto concerne gli artropodi, i protozoi e i parassiti degli animali
selvatici e domestici. Le micotossine e tutti gli aspetti dei funghi sono coperti da questo CD.
Le informazioni riguardano: animali domestici, animali da compagnia, e tutti gli animali di
interesse economico compresi i pesci, gli animali selvatici e degli zoo. Il VETCD database
comprende i records ottenuti da 10.000 riviste, monografie, Congressi realizzati in oltre 100
Paesi. Approssimativamente 26.000 nuovi records si aggiungono ogni anno. Il CAB
Thesaurus del 1990 contiene oltre 50.000 descrittori. Gli articoli che possiamo individuare
hanno dei descrittori principali che offrono utili indicazioni. Si consideri ad esempio l'indirizzo
degli Autori, se scrivete agli Autori e richiedete il testo completo del loro lavoro al 95%
avrete l'articolo che stavate ricercando.
TI Titolo del lavoro
OT Titolo originale se non in inglese
AU Autori
CA Istituzione di appartenenza
AD Indirizzo dell'Autore
SO Citazione bibliografica
PY Anno di pubblicazione
LA Lingua della pubblicazione
LS Lingua del riassunto
AB Riassunto
DE Descrittori
SU Soggetto principale
GE Area geografica
PT Tipo di pubblicazione
AV Disponibilità
CI Citazione secondaria
IS Numerazione internazionale per i libri
CAB Numero del CAB
UD Codice
AN Numero CAB
Per esempio si vogliono
trovare gli articoli in lingua
inglese
che
riguardano
l'impiego della salomicina nei
suini.
Ricerca con il CAB
113
BIOINFORMATICA
La prima operazione che dobbiamo compiere è quella di inserire la richiesta nel riquadro.
Find Records: scriviamo english in la, che significa i lavori scritti in lingua inglese. Nella
parte superiore comparirà l'informazione relativa ai record trovati.
Nel nostro caso verranno individuati nel Search History 128.000 articoli scritti in lingua
inglese. Si pone la seconda domanda inserendo nel Find Records salinomycin and (pig* in
de). Significa trovare i records che contengono la parola salinomycin e il suino o suini.
In questo caso troviamo un numero di articoli relativi alla salinomicina 219 che
evidentemente riguardano tutti gli animali domestici.
Per i suini troviamo un numero di oltre 11.000 articoli, nella selezione congiunta salomicina
suino e suini troviamo un numero ridotto di articoli: 18. Passiamo alla fase finale che è
quella di individuare gli articoli in lingua inglese. Dobbiamo allora porre le condizioni in #1
con quelle #4 ed otterremo la #5 che ci indica l'esistenza di 8 articoli che rispondono alle
nostre esigenze. Considerate che il tempo di
esecuzione di questa ricerca è estremamente
rapido.
Per visionare i record trovati dovremo fare click
su Show Records button: per vedere tutti i
record selezionati. I record possono essere
salvati con l'opzione Save. In questo caso
Ricerca con CAB.
vengono salvati in formato testo, per
recuperarli si deve aprire il file direttamente dal programma di scrittura.
Esempio di record relativo alla combinazione tra la ricerca 1 e 4, si riferisce al 3° record
degli 8 trovati.
Chiunque debba compiere una ricerca
bibliografica
su
Internet
troverà
abbondanti risorse. Il nucleo storico
della rete è costituito da Istituti di
Ricerca Universitari ed è naturale che gli
atenei abbiano provveduto a condividere
le informazioni archiviate nelle rispettive
biblioteche. L'Università degli Studi di
Milano dispone di una serie numerosa di
Banche dati consultabili attraverso il
Risultati della ricerca.
sistema Ovid, l'accesso a queste banche
dati è riservato ai ricercatori muniti di password.
114
BIOINFORMATICA
INTELLIGENZA ARTIFICIALE
“L’intelligenza artificiale” è un ramo dell’informatica interessato allo studio e allo sviluppo di
sistemi computerizzati che esibiscano qualche forma di intelligenza: sistemi che apprendono
nuovi concetti o compiti; sistemi che ragionano e traggono delle conclusioni; sistemi che
comprendono un linguaggio naturale; sistemi che percepiscono e interpretano una scena
visiva; sistemi che eseguono azioni che comportano forme di intelligenza umana.”
Nel secolo scorso alcuni filosofi avevano ipotizzato che una macchina in grado di effettuare
calcoli sarebbe stata simile al cervello umano e di conseguenza avrebbe manifestato un
comportamento intelligente. Quando nel dopoguerra vennero realizzati i primi computer ci si
accorse che i computer non manifestavano un comportamento intelligente, anche se erano
straordinariamente abili in matematica.
Alla fine degli anni '40, alcuni scienziati pensarono di poter costruire computer le cui
prestazioni fossero equiparabili all'opera dell'ingegno umano. Per realizzare un computer
dotato di pensiero si deve da un lato cercare di capire la natura dell'apprendimento, del
linguaggio e della percezione sensoriale e, dall'altro, comprendere il funzionamento dei
miliardi di neuroni interconnessi che compongono il cervello umano. Molti ricercatori
ritenevano fosse più difficile la comprensione del funzionamento
della mente umana che non l'emulazione del suo comportamento.
In verità, i ricercatori trovarono difficoltà a definire l'intelligenza;
per alcuni consisteva nel risolvere problemi difficili, per altri nella
capacità di confrontarsi ed adattarsi alla realtà e per altri, infine‚
nell'apprendimento oppure nella formulazione di generalizzazioni o
analogie. Molti ricercatori accettarono la prova di Turing secondo
la quale un computer si poteva considerare intelligente se riusciva
ad ingannare una persona, inducendola a credere che fosse un
uomo. Dopo la seconda guerra mondiale, la tecnologia elettronica
permise la realizzazione del primo computer digitale a semiconduttori, che sembrava poter
raggiungere il traguardo utopistico di simulare il comportamento umano. Verso la fine degli
anni 50 queste prime ricerche confluirono in un campo dell’informatica conosciuta come
Intelligenza Artificiale.
Il termine “Intelligenza Artificiale" (o A.I.) fu coniato nel 1956 da un gruppo di ricercatori
americani tra i quali Marvin Minsky che la definì come quella branca dell'informatica che
studia la metodologia e le tecniche di base per il progetto e la costruzione di sistemi
elettronici capaci di fornire prestazioni generalmente considerate caratteristiche ed esclusive
dell'intelligenza umana.
Fin dall'inizio si vennero a creare due atteggiamenti o tendenze:
l’A.I. cosiddetta “forte” con lo scopo di emulare di processi di percezione e pensiero
umani e, quindi, di imitare l’intelligenza (aspetti cognitivi) ed è sostenuta dai
funzionalisti, che ritiengono che un computer correttamente programmato possa
essere veramente dotato di una intelligenza pura, non distinguibile in nessun senso
importante dall'intelligenza umana. L'idea alla base di questa teoria è il concetto che
risale al filosofo empirista inglese Thomas Hobbes, il quale sosteneva che ragionare
non è nient'altro che calcolare: la mente umana sarebbe dunque il prodotto di un
complesso insieme di calcoli eseguiti dal cervello.
l’A.I. cosiddetta “debole” con lo scopo di eseguire compiti “intelligenti”
efficacemente ed efficientemente (tecniche operative). L’ intelligenza artificiale
debole, sostiene che un computer non sarà mai in grado di eguagliare la mente
umana, ma potrà solo arrivare a simulare alcuni processi cognitivi umani senza
riuscire a riprodurli nella loro totale complessità.
115
BIOINFORMATICA
Il primo filone comprende i ricercatori interessati alla scienza pura e che usano il computer
come strumento per sperimentare teorie riguardanti il modo di pensare dell'uomo; il
secondo, invece, comprende i ricercatori interessati allo sviluppo di “macchine intelligenti”,
in particolare programmi intelligenti.
Esempio classico del volo: l’uomo non è mai riuscito a volare finché ha tentato di farlo
imitando il volo degli uccelli; lo ha fatto quando è riuscito a costruire una macchina
intelligente in grado di volare.
Queste due tendenze confluirono in due discipline, la cibernetica e la bionica.
Naturalmente cibernetica e bionica continuano ad essere due discipline molto vicine ma, a
differenza della cibernetica, la bionica (anche detta A.I. tradizionale) non è confinata a
metodi che siano biologicamente osservabili.
I sostenitori dell' intelligenza artificiale forte sostengono che un computer opportunamente
programmato non sia solo la simulazione o un modello della mente, ma che esso possa
essere una mente. Esso cioè capisce, ha condizioni conoscitive e può pensare. La Stanza
cinese è un esperimento mentale ideato da John Searle. Esso è un controesempio della
teoria dell'intelligenza artificiale forte. Alla base del ragionamento di Searle è che la sintassi
(grammatica) non è equivalente alla semantica (significato). Searle presentò
l'argomentazione della Stanza cinese nel suo articolo "Minds, Brains and Programs" (Menti,
cervelli e programmi) pubblicato nel 1980 dalla rivista scientifica Behavioral and Brain
Sciences. L'argomento di Searle (o meglio, l'esperimento mentale) si oppone a questa
posizione. L'argomentazione della stanza cinese è la seguente: Si supponga che, nel futuro,
si possa costruire un computer che si comporti come se capisse il cinese. In altre parole, il
computer prenderebbe dei simboli cinesi in ingresso, consulterebbe una grande tabella che
gli consenta di produrre altri simboli cinesi in uscita. Si supponga che il comportamento di
questo computer sia così convincente da poter facilmente superare il test di Turing. In altre
parole, il computer possa convincere un uomo che parla correttamente cinese (per esempio
un cinese) di parlare con un altro uomo che parla correttamente cinese, mentre in realtà sta
parlando con un calcolatore. A tutte le domande dell'umano il computer risponderebbe
appropriatamente, in modo che l'umano si convinca di parlare con un altro umano che parla
correttamente cinese. I sostenitori dell'intelligenza artificiale forte concludono che il
computer capisce la lingua cinese, come farebbe una persona, in quanto non c'è nessuna
differenza tra il comportamento della macchina e di un uomo che conosce il cinese.
Ora, Searle chiede di supporre che lui si sieda all'interno del calcolatore. In altre parole, egli
si immagina in una piccola stanza (la stanza cinese) dalla quale riceva dei simboli cinesi, e
una tabella che gli consenta di produrre dei simboli cinesi in uscita in modo identico a
quanto faceva il programma seguìto dal calcolatore. Searle fa notare che egli non capisce i
simboli cinesi. Quindi la sua mancanza di comprensione dimostra che il calcolatore non può
comprendere il cinese, poiché esso è nella sua stessa situazione. Il calcolatore è un semplice
manipolatore di simboli, esattamente come lo è lui nella stanza cinese - e quindi i calcolatori
non capiscono quello che stanno dicendo tanto quanto lui.
Cibernetica. La cibernetica è la scienza che si propone di studiare e creare sistemi in
grado di simulare il comportamento umano, basandosi su modelli neurali e combinando
principi biologici, matematici ed elettronici. La cibernetica è la scienza che studia i
fenomeni di autoregolazione comunicazione, sia negli organismi naturali quanto nei sistemi
artificiali. La cibernetica si pone dunque come un campo di studi interdisciplinare tra le
scienze e l'ingegneria. Il termine cybernetics fu coniato nel 1947 dal matematico
statunitense Norbert Wiener, derivandola dal greco Kybernetes (timoniere, pilota). Famoso
per ricerche sul calcolo delle probabilità ma soprattutto per gli sviluppi dati, insieme al suo
allievo Claude Shannon, alla teoria dell'informazione essendo riconosciuto come il padre
della cibernetica moderna. Dagli studi di Wiener nacque la cibernetica, scienza di
orientamento interdisciplinare che si occupa non solo del controllo automatico dei macchinari
mediante il computer e altri strumenti elettronici, ma anche dello studio del cervello umano,
del sistema nervoso e del rapporto tra i due sistemi, artificiale e biologico, di comunicazione
e di controllo. Dagli anni '40 fino agli anni '60, un numero sempre maggiore di studiosi di
cibernetica analizzò, sia nei centri di ricerca universitari, sia nell'industria, le facoltà più
recondite del cervello per ricavare i corrispondenti modelli neurali. L'ampia varietà di modelli
116
BIOINFORMATICA
non può prescindere dal costituente di base, il neurone artificiale proposto da W.S.
McCulloch e W. Pitts in un famoso lavoro del 1943: "A logical calculus of the ideas immanent
in nervous activity", il quale schematizza un combinatore lineare a soglia, con dati binari
multipli in entrata e un singolo dato binario in uscita: un numero opportuno di tali elementi,
connessi in modo da formare una rete, è in grado di calcolare semplici funzioni booleane.
Questo modo cibernetico o di modellatura neurale di concepire una macchina intelligente fu
presto battezzato bottom-up (dal basso verso l'alto).
Tale metodo di procedere prevedeva di partire dall'esame del cervello di creature primitive
contenenti pochi neuroni e di proseguire fino ad arrivare a livello umano, per analogia. Per
raggiungere, però, risultati concreti non si doveva soltanto superare il problema tempo, ma
anche quello dovuto all'eccessivo costo dell'hardware elettronico di tipo analogico. Le prime
ipotesi di apprendimento furono introdotte da D.O. Hebb nel libro del 1949: "The
organization of behavior", nel quale vengono proposti collegamenti con i modelli complessi
del cervello. Se modellare, infatti, il sistema nervoso di una formica, che possiede "soltanto"
ventimila neuroni, era già economicamente proibitivo, praticamente impossibile risultava per
il cervello umano che ne ha ben 100 miliardi. Poiché nella sperimentazione cibernetica più
sofisticata si potevano usare soltanto pochi neuroni, di fronte a questa limitazione molti dei
primi ricercatori si scoraggiarono e abbandonarono il campo di ricerca. Un ricercatore che
non si lasciò scoraggiare fu Frank Rosenblatt, il cui lavoro sembrava concretizzare le più alte
aspirazioni della cibernetica.)
Infatti, verso la fine degli anni 50, il giovane scienziato presentò la simulazione al calcolatore
del suo ''perceptrone'', un apparecchio elettronico sperimentale concepito per emulare i
processi del pensiero umano. Per simulare i complicatissimi collegamenti elettrici del
perceptrone utilizzò uno dei computer più potenti dell'epoca, l'IBM 704.
Nel 1958, J. Von Neumann nella sua opera "The computer and the brain" esamina le
soluzioni proposte dai precedenti autori sottolineando la scarsa precisione che queste
strutture possedevano per potere svolgere operazioni complesse. Nello stesso anno, F.
Rosenblatt nel libro "Phychological review" introduce il primo schema di rete neurale, detto
Perceptron (percettrone), antesignano delle attuali reti neurali, per il riconoscimento e la
classificazione di forme, allo scopo di fornire un'interpretazione dell'organizzazione generale
dei sistemi biologici. Il modello probabilistico di Rosenblatt è quindi mirato all'analisi, in
forma matematica, di funzioni quali l'immagazzinamento delle informazioni, e della loro
influenza sul riconoscimento dei patterns; esso
costituisce un progresso decisivo rispetto al modello
binario di McCulloch e Pitts, perché i suoi pesi
sinaptici sono variabili e quindi il percettrone è in
grado di apprendere.
I collegamenti erano così complicati che il computer
impiegava circa mezz'ora per eseguire le funzioni che
il perceptrone avrebbe eseguito in millesimi di
secondo. Con il suo ''occhio'' formato da fotocellule il
perceptrone di Rosenblatt avrebbe trasmesso dei
segnali elettrici ad una serie di celle di memoria
elettromeccaniche progettate per misurare l'intensità
di tali segnali. Questi collegamenti erano disposti in modo casuale, in base alla teoria allora
prevalente, che il cervello assorbe e reagisce ad informazioni nuove attraverso un sistema di
collegamenti casuali tra i neuroni. Il perceptrone rappresentò un notevole sviluppo nel
campo della cibernetica in quanto il comportamento del modello non era prestabilito ma
poteva evolvere determinando i propri parametri in base ad un principio di apprendimento
per esempi. Inoltre il perceptrone presentava la notevole capacità di generalizzare i concetti
appresi e una sorta di rappresentazione interna della conoscenza
Durante la simulazione al calcolatore, alla presenza della stampa specializzata, il sistema
esplorò due figure di quadrati, selezionò i segnali e li distinse dalle altre forme. Due anni
dopo tale dimostrazione, Rosemblatt presentò il suo primo modello operativo di perceptrone,
il MARK 1 in grado di identificare alcune lettere dell'alfabeto.
117
BIOINFORMATICA
L'opera di Rosenblatt stimola una quantità di studi e ricerche che dura per un decennio, e
suscita un vivo interesse e notevoli aspettative nella comunità scientifica, destinate tuttavia
ad essere notevolmente ridimensionate allorché nel 1969 Marvin Minsky e Seymour A.
Papert, nell'opera "An introduction to computational geometry", mostrano i limiti operativi
delle semplici reti a due strati basate sul percettrone, e dimostrano l'impossibilità di risolvere
per questa via molte classi di problemi, ossia tutti quelli non caratterizzati da separabilità
lineare delle soluzioni: questo tipo di rete neurale non è abbastanza potente, infatti non è in
grado di calcolare neanche la funzione or esclusivo (XOR). Marvin Minsky e Seymour Papert
in una pubblicazione criticarono aspramente il lavoro di Rosenblatt affermando che il
perceptrone aveva delle capacità molto limitate. Di conseguenza, a causa di queste
limitazioni, ad un periodo di euforia per i primi risultati della cibernetica (come veniva
chiamata negli anni '60), segue un periodo di diffidenza durante il quale tutte le ricerche in
questo campo non ricevono più alcun finanziamento dal governo degli Stati Uniti d'America;
le ricerche sulle reti tendono, di fatto, a ristagnare per oltre un decennio, e l'entusiasmo
iniziale risulta fortemente ridimensionato. In realtà Minsky e Papert non si resero conto
subito, come invece fecero più tardi, che il perceptrone rappresentava solo il caso più
semplice di una famiglia di sistemi in grado di risolvere anche problemi complessi.
A seguito di tali critiche la cibernetica subì un rallentamento e buona parte degli sforzi e
delle risorse vennero dirottati progressivamente sulla bionica.
L’interesse per le reti neurali si riaccese all’inizio degli anni ‘80, in concomitanza con il
diffondersi di nuove idee sui sistemi complessi e con il palesarsi degli insuccessi riportati in
alcuni settori dell’intelligenza artificiale tradizionale, ossia della bionica.
Nel 1986 il PDP (Parallel Distributed Processing) research group dell’Università della
California, capeggiato dagli psicologi David Rumenhart e James McClelland, pubblicò due
volumi in cui venivano riportati una serie di esperimenti riguardanti modelli di calcolo
parallelo e un algoritmo di apprendimento detto backpropagation. Questa pubblicazione
segnò l’ingresso delle reti neurali nel campo della psicologia cognitiva.
Bionica Vs Cibernetica. In contrapposizione alla teoria bottom-up (cibernetica), si sviluppò
una scuola top-down (bionica) specializzata nella programmazione di computer digitali
polivalenti, in grado di eseguire azioni che richiedevano una attività intelligente come, per
esempio, giocare a scacchi. Per la maggior parte degli studiosi, l'AI sarebbe diventata
sinonimo di metodo bionico.
Tra i fautori della bionica c'erano i professori Minsky e Papert, del MIT. Minsky aveva
incominciato la sua carriera con ricerche sulla macchina intelligente seguendo la scuola
cibernetica di Rosenblatt e nel 1951 costruì una rete autodidatta di circuiti a valvole
termoioniche. Quando Rosenblatt presentò il suo Perceptrone Minsky era già passato alla
scuola top-down e, come si è visto, non mancò di criticare fortemente i risultati dell’excollega.
La differenza metodologica è profonda, nel caso della tradizione cognitiva l’approccio è topdown, mentre è bottom-up per la scuola connessionista. La bionica iniziò ben presto ad
incontrare dei grossi ostacoli in quanto l’approccio simbolico si rivelò limitativo nella
rappresentazione della realtà, cioè ci si accorse che la mente è immersa in un mondo in cui
non tutto è simbolizzabile. La rivalità tra i sostenitori dell’uno e dell’altro approccio ha negli
ultimi anni assunto toni abbastanza pacati, in quanto da entrambe le parti é stata ammessa
la possibilità di una cooperazione. Questa cooperazione nasce con intenti pratici, quali quelli
di realizzare automi capaci di apprendere dei compiti e di muoversi efficacemente in un
ambiente reale, superando le difficoltà incontrate inizialmente dalla robotica con indirizzo
simbolico. Quello che caratterizza questo settore, è appunto l'accento posto sulla necessità
che il sistema sviluppi una propria implicita rappresentazione dell'ambiente, piuttosto che
fornire ad esso il modello dell'ambiente che lo sperimentatore ritiene più opportuno.
Applicazioni dell’Intelligenza Artificiale. Le radici della A.I. possono essere rinvenute
negli automi cellulari di John Von Neumann e Arthur W. Burks. Nelle parole di Burks, che fu
il continuatore della sua opera, Von Neumann si chiedeva:"Quale tipo di organizzazione
logica è sufficiente ad un automa per riprodurre se stesso?"
Von Neumann pensava al fenomeno naturale dell'autoriproduzione quando la pose, ma non
tentò di simulare l'autoriproduzione di un sistema naturale a livello genetico e biochimico.
118
BIOINFORMATICA
Egli voleva astrarre dal problema naturale dell'autoriproduzione la sua forma logica (Burks,
1970).
Il formalismo che permise la realizzazione di un tale sistema, fu proposto da un suo collega,
Stan Ulam, con il nome di Automa Cellulare (Ulam, 1962). Un automa cellulare è
semplicemente un sistema che può avere un numero finito di stati ed il cui stato è
determinato dallo stato di altri automi che lo circondano. Il comportamento degli automi
cellulari diventa interessante proprio perché formano una rete di interazioni, il cui
comportamento globale, nel tempo, non è prevedibile; anche se le leggi che governano i
passaggi di stato per ogni singolo automa sono semplici e ben determinate. Lo stato di ogni
automa di questa rete, in ogni istante di tempo, è determinato dallo stato posseduto,
nell'istante precedente, dagli automi che lo circondano.
Con gli automi cellulari, Von Neumann impostò un sistema capace di autoreplicarsi e stabilì
che, qualunque sistema capace di fare ciò, doveva fare uso delle informazioni contenute
nella sua descrizione in due modi fondamentalmente differenti: interpretandole, quindi
svolgendo le azioni per realizzare il replicante; copiandole.
Quando, in seguito, si scoprì la struttura ed il funzionamento del DNA emerse che erano
proprio i modi in cui la cellula fa uso delle informazioni contenute in esso durante i suoi
processi di trascrizione e traduzione da una parte e replicazione dall'altra.
Gli automi cellulari si sono rivelati un valido modello nel campo dell’Artificial Life, una
disciplina della A.I. che studia la realizzazione di sistemi artificiali che esibiscano un
comportamento caratteristico dei sistemi naturali. L’Artificial Life (aLife) complementa la
biologia tradizionale il cui scopo fondante è l’analisi dei sistemi viventi, tentando di
sintetizzare i comportamenti “life-like” attraverso l’uso di computer e altri strumenti
artificiali. Nel settembre del 1987 si è tenuta a Santa Fe la prima conferenza sull'Artificial
Life (che è considerata l'atto di nascita ufficiale di questa nuova scienza), organizzata da
Chris Langton del Santa Fe Institute. Ad essa parteciparono non solo scienziati che, con vari
approcci, lavoravano alla costruzione di robot, o scienziati cognitivi, ma anche filosofi,
chimici e biologi.
Parlando generalmente di Intelligenza Artificiale oggi possiamo distinguere due grossi filoni
che si intrecciano tra loro: quello della robotica e quello delle simulazioni.
Vi sono, ovviamente, anche molti tentativi di integrare le due strategie. Uno fra tutti quello
di un importante ricercatore nel campo della robotica, Rodney Brooks che suggerisce l’uso di
reti neurali con l’ausilio di algoritmi genetici per l’aspetto dell’apprendimento, per superare le
difficoltà di trasportare apprendimenti e tecniche dalle simulazioni al mondo reale. Un
automa deve apprendere ad agire in un ambiente e, in linea di principio, non fa molta
differenza se questo ambiente è reale o simulato. L'ambiente simulato, però, non deve
essere progettato in modo da rendere il più semplice possibile "la vita" all'automa. Questa
semplificazione spesso finisce per rendere ancora più difficile operare in tale ambiente.
Nella vita reale quello che è riportato dai sensori è, infatti sempre molto incerto.
Quell'imprecisione che, a prima vista, sembrerebbe un problema, in realtà porta ad
apprendimenti più flessibili in partenza; fa si che non si creino conflitti di precedenza
artificiali come in alcune simulazioni e soprattutto porta in maniera più naturale a prendere il
punto di vista del robot, invece di fornirgli la propria visione dell'ambiente.
Data la vastità dei temi che vanno sotto il nome di Intelligenza Artificiale si è tentato di
definirne le competenze e di formalizzarne i confini e gli ambiti. Non si pretende di essere
esaustivi.
AMBITO
PERCEZIONE VISIVA
COMPRENSIONE DEI LINGUAGGI
NATURALI
CAPACITA' DI APPRENDIMENTO
CAPACITÀ DI RAGIONAMENTO,
DEDUZIONE, INFERENZA
CAPACITÀ DI MOVIMENTO
APPLICAZIONI
Visione
e
riconoscimento
di
forme
grafiche,
interpretazione di segnali
Riconoscimento vocale, riconoscimento linguistico
Robotica, Controllo di processi
Sistemi di supporto alle decisioni, diagnostica, sistemi di
previsione (es. in campo economico), problemi di
ottimizzazione
Robotica
119
BIOINFORMATICA
Percezione visiva. Nel campo della percezione visiva inizialmente sembrava che la
difficoltà maggiore stesse nel poter analizzare un'immagine a partire da una sua
rappresentazione su una matrice di pixel, allo scopo di evidenziare i contorni o alcune
proprietà geometriche. Questo scoglio è stato superato avendo individuato opportuni
algoritmi.
La seconda difficoltà nasce dalla necessità di far comprendere al computer il significato
dell'immagine. Distinguere un bicchiere da un elefante comporta una conoscenza del mondo
e delle immagini che supera la semplice analisi geometrica.
Si pensi che un oggetto deve essere riconosciuto anche se osservato da diversi punti di
vista. In alcune situazioni è necessario riconoscere oggetti differenti rappresentati dalla
stessa immagine (si consideri la lettera N che non è altro che una Z rovesciata). Quando
esistono figure ambigue il problema della percezione visiva diventa quello di comprendere il
significato delle immagini nel contesto in cui appaiono. Attualmente esistono programmi in
ambito industriale capaci di percepire immagini con una gamma limitata di possibilità.
Apprendimento. Per quanto riguarda l'apprendimento, possiamo distinguere un
apprendimento genetico ed uno individuale, proprio come negli esseri viventi reali.
In genere oggi si tende ad utilizzare o l'uno o l'altro, ma con un uso integrato di entrambe le
forme di apprendimento si potrà fare, tra l'altro, ulteriore chiarezza su una questione che nel
passato ha riempito molte pagine: quanta parte del comportamento di un organismo è
attribuibile al suo patrimonio genetico e quanto all'apprendimento nella sua vita. La
questione ormai ha raggiunto un sufficiente grado di chiarezza con il riconoscimento del
contributo integrato di entrambe le componenti, ma si ripropone ogni volta la proporzione e,
soprattutto, la natura delle predisposizioni genetiche quando si parla di comportamenti o di
attività mentali. Molto più babalmnte l’apprendimento può essere supervisionato o meno. La
tecnica di apprendimento automatico che mira a istruire un sistema informatico in modo da
consentirgli di risolvere dei compiti in automatico.
Si definiscono i dati in ingresso come insieme I, (tipicamente vettori)
Si definisce l'insieme dei dati in uscita come insieme O (gli output possono essere
valori continui (regressione), o una etichetta numerica)
Si definisce una funzione h che associa ad ogni dato in ingresso (I) la sua risposta
corretta (O)
Tutti gli algoritmi di apprendimento supervisionato partono dal presupposto che se forniamo
all'algoritmo un numero adeguato di esempi l'algoritmo sarà in grado di creare una funzione
h1 che approssimerà la funzione h. Se l'approssimazione di h risulterà adeguata quando
proporremo ad h1 dei dati in ingresso mai analizzati la funzione dovrebbe essere in grado di
fornire delle risposte in uscita simili a quelle fornite da h e quindi corrette o quasi. Molti di
questi algoritmi in sostanza lavorano in un mondo lineare, presupponendo che ingressi simili
necessitino di uscite simili. Si può facilmente intuire che il buon funzionamento di questi
algoritmi dipende in modo significativo dai dati in ingresso; se si forniscono pochi ingressi
l'algoritmo potrebbe non aver abbastanza esperienza, mentre molti dati in ingresso
potrebbero rendere eccessivamente lento l'algoritmo, dato che la funzione h1 generata dagli
ingressi potrebbe essere molto complicata. Questi algoritmi sono molto sensibili al rumore,
anche pochi dati errati potrebbero rendere l'intero sistema non affidabile e condurlo a
decisioni errate. Tradizionalmente i principali algoritmi sono stati:
Albero di decisione
Regole di decisione
Sistemi esperti
La ricerca oggi si concentra su quelle che sono considerate le due classi principali di
algoritmi possibili:
Metodi Generativi
Metodi Discriminativi
I metodi generativi si basano sulla creazione di un modello dei dati che poi viene utilizzato
per predire le risposte desiderate (o dati di uscita). Esempi sono le Reti Bayesiane
ricordiamo brevemente che l'equazione di Bayes è alla base di tutti i moderni sistemi di
Intelligenza Artificiale per l'inferenza probabilistica, poichè permette di eseguire
120
BIOINFORMATICA
agevolmente inferenze anche su modelli di notevole complessità. Esistono centinaia di
applicazioni, sia didattiche che commerciali, che consentono fondamentalmente inferenze di
due tipi:
Inferenze diagnostiche, orientate alla risoluzione di malfunzionamenti, al
rilevamento di patologie in base ai sintomi, ecc.
Inferenze causali, orientate invece allo studio del comportamento di un sistema
alle sollecitazioni, in particolare per la ricerca di difetti strutturali.
Nel secondo caso l'inferenza è diretta, cioè l'algoritmo propaga gli effetti delle ipotesi
introdotte verso il basso del grafo permettendo di analizzarne le conseguenze; nel primo
caso invece l'inferenza è inversa, cioè l'evidenza introdotta (i sintomi di un paziente o il
malfunzionamento di una macchina) si rispecchia nelle sue possibili cause alterandone le
probabilità, permettendone così la ricerca delle più probabili.
I metodi discriminativi al contario cercano di modellare direttamente la relazione tra dati in
entrata e quelli in uscita, in modo da minimizzare una funzione di perdita (loss function in
letteratura). Esempi di questo tipo di modello sono le Macchine a vettori di supporto
(Support Vector Machines) e più in generale i Metodi basati su funzioni di kernel.
Nelle simulazioni che si fanno in questo campo, si utilizzano in genere alternativamente
strategie che possiamo considerare ispirate all'apprendimento in vita (tramite
backpropagation principalmente, ma anche con l'apprendimento competitivo, con la regola
di Hopfield, o comunque apprendimenti basati sulla modifica dei valori delle connessioni tra
neuroni); oppure all'apprendimento su base genetica, che si compie di generazione in
generazione (algoritmi genetici). Ultimamente si sta diffondendo enormemente l'uso di
questa ultima strategia. Ciò è logico, se si considera, al di là di un'analisi più circostanziata,
che, in questa fase iniziale, potrebbe essere una buona strategia, quella di lasciare
sviluppare le specie più adatte ai vari scopi che si propongono i ricercatori.
Bisogna considerare che, in questi primi tentativi di realizzare automi in grado di modificare
il proprio comportamento in modo da ottimizzare un certo risultato, l'importanza che hanno i
metodi di apprendimento effettivamente utilizzati è molto relativa. Infatti possiamo ottenere
risultati piuttosto simili, sia utilizzando una strategia "filogenetica", come gli algoritmi
genetici, che una "ontogenetica", come la modifica delle connessioni in base al risultato delle
azioni. Quello che effettivamente si sta sperimentando, non sono tanto queste teorie
"parziali" dall'apprendimento, quanto proprio la strategia globale di organizzazione del
proprio comportamento da parte di questi sistemi. Anche tecniche non basate sulle reti
neurali, ma su classificatori che rientrerebbero più propriamente nel campo dell'intelligenza
artificiale, sono utilizzati in questo modo con risultati paragonabili a quelli delle altre
tecniche.
Riconoscitori di Linguaggi Naturali. Una applicazione notevole della AI è nei programmi
di lettura (OCR, Optical Character Recognition). Le stesse difficoltà sono presenti nel campo
della percezione del linguaggio naturale. A differenza dei linguaggi formali (BASIC, PASCAL,
ecc), i linguaggi naturali sono per loro natura ambigui, nel senso che la medesima frase può
assumere significati diversi in diversi contesti (Es. dare i numeri può voler significare anche
essere matto). Ma oltre a quelle che sono le frasi idiomatiche, un linguaggio può essere
ambiguo anche dal punto di vista sintattico. Quando fu annunciato uno dei primi traduttori
dei linguaggi naturali (da inglese in russo), durante la presentazione venne proposta la
seguente frase "la carne è stanca, ma lo spirito è vivo", il programma offrì una traduzione
simile "la carne è putrida, ma la vodka è buona".
Riconoscimento vocale. Nel caso del riconoscimento della voce il problema principale è
quello di individuare le parole ed in caso di ambiguità scegliere la più pertinente nel contesto
della frase. Il problema della conoscenza è ricorrente nel campo dell'intelligenza artificiale, in
pratica si tratta di possedere delle informazioni che permettano di effettuare dei
ragionamenti e delle deduzioni.
SISTEMI ESPERTI. I sistemi esperti hanno rappresentato a partire dagli anni ‘80 una delle
applicazioni di A.I. più di successo, anche se da un punto di vista teorico forse non sono il
risultato più esaltante. Lo scopo di un sistema esperto è quello di fornire all'utente un certo
risultato, vale a dire la soluzione di un determinato problema. Tale risultato viene ottenuto
attraverso una ricerca euristica (dal greco eurisko = trovare, significa metodo di ricerca della
121
BIOINFORMATICA
verità basato sulla documentazione dei fatti). Un sistema esperto è sostanzialmente un
programma specializzato fornito di una base di conoscenza e in grado di rispondere a
specifiche domande. Le informazioni di cui si avvale un sistema esperto possono derivare da
una conoscenza empirica, non formalizzata, fondata esclusivamente sulla pratica e
sull'esperienza, senza cognizioni teoriche e scientifiche (empirica deriva dalla parola greca
empeirikos).
La ricerca euristica, contrapposta a quella algoritmica, consiste nel trovare una soluzione
ipotizzando tutte le soluzioni possibili verosimili e cercando di verificarle attraverso una
documentazione di cause e fonti. I metodi algoritmici sono più sicuri, in quanto effettuano
una ricerca esaustiva senza venire influenzati da informazioni fuorvianti.
Un Sistema Esperto si definisce trasparente quando gli utenti possono vedere il suo
funzionamento e si capisce perché ha prodotto un certo risultato. Fin dagli anni ’60 alcuni
ricercatori di diverse discipline scientifiche si posero il problema di facilitare il processo
ipotetico deduttivo e conseguentemente quali metodologie adottare. Inizialmente ci fu un
grande entusiasmo per i programmi risolutori generali di problemi GPS (General Problem
Solver) come quello di Newell e Simon, ma gli entusiasmi vennero notevolmente
ridimensionati a partire dagli anni ’70. I programmi non potevano dare una risposta
generale, ma potevano offrire una risoluzione a problemi particolari e molto circoscritti.
Il termine expertise (esperienza specifica) venne utilizzato per la prima volta nel 1967 da
Joel Moses nella sua tesi di laurea sull’Intelligenza Artificiale discussa al MIT di Cambridge,
ma già nel 1961 aveva visto la luce il programma MACSYMA, ancora basato su algoritmi
tradizionali; seguito verso la metà degli anni 60 da DENDRAL, il primo classico esempio di
generate and test., ovvero di procedura euristica, destinato alla ricerca nelle discipline
chimiche. I primi studi sulla comprensione e l’elaborazione del linguaggio naturale portarono
nel 1967 alla nascita di HEARSAY, un programma concepito da un’equipe di ricercatori della
Carnegie Mellon University per consentire il colloquio fra esperti tramite una lavagna astratta
costituita appunto dal computer. Da DENDRAL in poi i Sistemi Esperti si orientarono in modo
particolare alla soluzione di problemi medici ed in questo settore una vera e propria pietra
miliare fu MYCIN che prese avvio come progetto nel 1972 all’Università di Stanford. EMYCIN
fu nel 1979 il primo sistema inteso come strumento generale per lo sviluppo specialistico di
ulteriori programmi. Sul suo modello presero forma programmi destinati a diagnosticare
malattie polmonari (PUFF e CENTAUR), per il cancro (ONCOCIN) ed anche per la diagnosi dei
guasti industriali (DART). Proprio sulla base posta dal sistema EMYCIN fu sviluppato il
concetto della shell. Sempre per il settore medico fu realizzato, nei primi anni 70, CASNET,
caratterizzato dalla presenza al suo interno di uno schema generale (EXPERT) utilizzabile
anche in sistemi con diversa specializzazione; mentre con ben diversa specializzazione
furono PROSPECTOR, realizzato nel 1979 da Peter Hart e Richard Duda per la ricerca
petrolifera; XCON poi divenuto R1, realizzato nel 1980 dal John Mc Dermott per progettare
la configurazione hardware dei grandi computer; e PLANT, realizzato nel 1981 da Ryszard
Michalski dell’Università dell’Illinois per diagnosticare le malattie nelle coltivazioni di soia. Sia
presso le università che nelle aziende specializzate (software house) l’ambiente in cui in un
primo tempo s’era coltivata la programmazione avanzata è andato trasformandosi in
ambiente di sviluppo per Sistemi Esperti.
Tradizionalmente un programma è definito passo passo in modo deterministico e la sua
abilità risiede nei codici; nei sistemi esperti invece l'esperienza non è espressa con dei codici
ma memorizzata in forma simbolica nella base di conoscenza, una struttura di dati
facilmente dominabile e modificabile. L'aspetto più innovativo è il fatto che la conoscenza, o
l'esperienza non deve necessariamente essere coerente e seguire uno schema predefinito,
infatti può anche operare su una base di conoscenza contraddittoria, incompleta o incerta.
Struttura di un Sistema Esperto. In generale l'architettura di un Sistema Esperto è
formata da quattro elementi:
La base di conoscenza
I fatti noti
Il motore inferenziale
L'interfaccia utente o shell
122
BIOINFORMATICA
FRAME. Il frame rappresenta uno schema o meglio un insieme di dati da utilizzare con una
struttura tipo, in generale ogni frame viene identificato con un nome e prevede la presenza
di descrittori (slot) che possono contenere altri schemi o semplici identificatori; ad esempio il
frame animale può contenere gli slot sesso, età, peso ….
Frame: ANIMALE
Slot: sesso =<M or F>
Slot: età = <less than or equal to 12 month>
Questo tipo di struttura prende il nome di frame classe e consente ad esempio di avere o
assegnare dei valori prestabiliti (default): quando si attribuisce uno specifico nome al frame
questo diviene frame-membro ed erediterà le caratteristiche generali del frame di classe.
Con questo sistema siamo in grado di costruire un albero che descrive le caratteristiche degli
oggetti di conoscenza di un dato problema.
Albero di decisione è un grafo di decisioni e delle loro possibili conseguenze, (incluso i
relativi costi, risorse e rischi) utilizzato per creare un 'piano di azioni' (plan) mirato ad uno
scopo (goal). Un albero di decisione è costruito al fine di supportare l'azione decisionale. Nel
machine learning un albero di decisione è un modello predittivo, dove ogni nodo interno
rappresenta una variabile, un arco verso un nodo figlio rappresenta un possibile valore per
quella proprietà e una foglia il valore predetto per la variabile obiettivo a partire da i valori
delle altre proprietà, che nell'albero è rappresentato del cammino (path) dalla nodo radice
(root) al nodo foglia. Normalmente un albero di decisione viene costruito utilizzando
tecniche di apprendimento a partire dall'insieme dei dati iniziali (data set), il quale può
essere diviso in due sottoinsiemi: il training set sulla base del quali si crea la struttura
dell'albero e il test set che viene utilizzato per testare l'accuratezza del modello predittivo
così creato. Nel data mining un albero di decisione viene utilizzato per classificare le istanze
di grandi quantità di dati (per questo viene anche chiamato albero di classificazione). In
questo ambito un albero di decisione descrive una struttura ad albero dove i nodi foglia
rappresentano le classificazioni e le ramificazioni l'insieme delle proprietà che portano a
quelle classificazioni. Di conseguenza ogni nodo interno risulta essere una macro-classe
costituita dall'unione delle classi associate ai suoi nodi figli. Il predicato che si associa ad
ogni nodo interno (sulla base del quale avviene la ripartizione dei dati) è chiamato
condizione di split. In molte situazioni è utile definire un criterio di arresto (halting), o anche
criterio di potatura (pruning) al fine di determinarne la profondità massima. Questo perché il
crescere della profondità di un albero (ovvero della sua dimensioni) non influisce
direttamente sulla bontà del modello. Infatti, una crescita eccessiva della dimensione
dell'albero potrebbe portare solo ad aumento sproporzionato della complessità
computazionale rispetto ai benefici riguardanti l'accuratezza delle previsioni/classificazioni.
BASE DI CONOSCENZA. Contiene l'esperienza del Sistema Esperto; è un'area di memoria
in cui sono immagazzinate le frasi che costituiscono la "conoscenza" del campo di
applicazione. Per rappresentare la conoscenza sono spesso utilizzati gli alberi di
classificazione o di decisione.
Infatti, essendo essi costituiti da diversi rami, con maggiore facilità è possibile ricavare la
regola che corrisponde ad ogni ramo completo dell'albero di decisione. I fatti noti
contengono informazioni temporanee attinenti al problema che il sistema esperto sta
tentando di risolvere in quel momento, cioè i dati del problema. Queste informazioni sono
utili al fine di risolvere il problema attuale, una volta ottenuta la soluzione si possono
cancellare.
Il motore inferenziale è un algoritmo che scandisce in ordine opportuno la base di
conoscenza al fine di reperire documentazione, selezionare ipotesi e costruire la soluzione
del problema. La selezione di una regola dalla base di conoscenza avviene in seguito a
un'analisi dei fatti noti e a un colloquio con l'utente. In sostanza il motore inferenziale è
quella parte di programma che, utilizzando l'esperienza contenuta nella base di conoscenza,
effettua delle riduzioni e rende possibile un colloquio senz'altro pertinente. Ciò significa che
le domande vengono poste all'utente solo se correlate ai fatti che fino a quel momento sono
noti. L'esperienza di un Sistema Esperto può essere rappresentata in diversi modi, la più
usata è quella che fa uso di regole di produzione. Una regola di produzione ha la seguente
forma:
123
BIOINFORMATICA
SE X ALLORA Y
dove x e y sono stringhe di caratteri, ad esempio:
SE è la ragazza del tuo migliore amico ALLORA devi dimenticarla.
Le frasi comprese fra SE e ALLORA si chiamano antecedenti, quella che appare dopo allora si
chiama conseguente. Il nome produzione è dovuto al fatto che il conseguente descrive lo
stato di cose che viene prodotto se gli antecedenti sono soddisfatti. Quando in una regola
compaiono più antecedenti, separati da una virgola, questi si intendono concatenati da una
"e". Quando più regole hanno lo stesso conseguente, significa che i rispettivi antecedenti
sono concatenati da una "o". Quando il conseguente di una regola è uguale all'antecedente
di un'altra regola, queste si intendono
concatenate da una deduzione.
Una base di conoscenza formata da regole come
quelle viste sopra viene detta sinergica (attività
simultanee, più enti che collaborano per un
medesimo effetto). Per riempire una base di
conoscenza non è necessario analizzare il
problema nella sua concretezza né avere una
visione di insieme né tantomeno studiare reti a
grafi che evidenzino le correlazioni fra varie
regole.
Basterà
inserire
regole
sparse,
preoccupandosi solo del fatto che abbiano un
senso compiuto di per se e un significato
nell'ambito del programma in questione.
Sistema Esperto
Il motore inferenziale, scandendo in modo
opportuno tale base di conoscenza, darà all'utente l'impressione di dialogare con un sistema
estremamente ordinato, in cui si segue un filo logico e ogni domanda è pertinente. In una
base di conoscenza è possibile modificare una regola o aggiungerne altre senza dover
conoscere le restanti, poiché le regole sono indipendenti una dall'altra. Questo è un enorme
vantaggio, soprattutto quando il numero di regole è elevato.
MOTORE INFERENZIALE. Il motore inferenziale è un programma costituito da: un
interprete che decide quale regola applicare per poter aumentare la base di conoscenza; uno
schedulatore che organizza le regole da sviluppare e il loro ordine di esecuzione.
Il compito del motore è estrarre le regole utili alla soluzione del problema secondo un
meccanismo di riconoscimento e attivazione delle stesse, eseguendo un esame delle regole
nella base di conoscenza, selezionando la regola più appropriata, eseguendo la regola e
registrando nella memoria di lavoro l'azione, ripetendo finché non trova la possibile
soluzione. Il motore è organizzato in due parti: una memoria di lavoro (o lavagna) dove
viene memorizzato il piano generale di soluzione ed un'agenda delle cose ancora da fare,
oltre ad una descrizione della soluzione o delle soluzioni per ora ipotizzate. Nel motore
inferenziale vi è inoltre il rafforzatore di consistenza; questo è un modulo che una volta che
sia stata generata un'ipotesi di soluzione cerca, sfruttando specifiche sorgenti di conoscenza,
evidenze che permettano di rafforzare o scartare l'ipotesi
fatta.
Quindi, se l'inferenza è una singola deduzione che il
sistema è in grado di trarre dalle premesse (ad esempio un
singolo calcolo), il motore inferenziale è lo strumento con
cui il sistema determina, in maniera ordinata, il complesso
delle inferenze. A tal proposito va ricordato che esistono
due tipi di inferenza:
Inferenza deduttiva
Inferenza induttiva
La parola deduzione significa procedimento logico per
ricavare una verità particolare a partire da una verità
generale. In altre parole, data una regola generale, una deduzione consiste nell'applicare la
regola a un caso particolare per ottenere un risultato.
124
BIOINFORMATICA
L’induzione è un procedimento logico che, al contrario della deduzione, permette di ricavare
una regola generale a partire da un insieme di esempi particolari. Un algoritmo di inferenza
deduttiva applica le regole, contenute nella base di conoscenza, a un caso particolare,
contenuto nei fatti noti, e ne trae alcune conclusioni.
L'inferenza deduttiva viene chiamata forward chaining cioè concatenamento in avanti,
perché partendo da fatti noti si applicano le regole in avanti allo scopo di dedurre altri fatti.
In contrapposizione al forward chaining vi è il backward chaining, cioè il concatenamento
all'indietro.
Esempio di colloquio con un sistema esperto:
Hai il naso otturato? Si
Hai gli occhi arrossati? Si
Quanto hai di febbre? Non lo so.
Hai sudato? Perché?
Perché il sudore e la sensazione di freddo sono indici della febbre.
Hai sudato? Poco.
Hai preso medicinali? Ho misurato la febbre.
Quant'è la temperatura? 39,2
Hai preso freddo? Non tanto.
Si tratta di influenza. Hai problemi a prendere l'aspirina? Non ho capito.
L'aspirina è sconsigliata a chi soffre di ulcera.
Allora? Nessun problema.
La ricetta è: aspirina tre volte al giorno. Grazie
Questo algoritmo parte da un possibile risultato e va a verificare l'esistenza di una regola
capace di fornire un risultato simile; man mano che si applicano le regole, se ne rendono
applicabili altre con un procedimento ciclico, fino a quando non si trova una regola i cui
antecedenti siano fatti noti, quindi verificati per definizione. L'interazione tra l'utente e il
sistema esperto avviene tramite un dialogo. Tale dialogo viene reso possibile con l'impiego
di display grafici che sono in grado di mostrare immagini di varia natura, grafica sonora o
linguaggio naturale. Il sistema consente all'utente di chiedere il "perché" dei quesiti che gli
vengono proposti al terminale e, a conclusione della sessione di lavoro e cioè dopo aver
visualizzato una particolare deduzione, "come" questa è stata ricavata da parte del sistema.
Inoltre deve prevedere funzioni di salvataggio, stampa in vari formati ecc..
INTERFACCIA UTENTE. Nell'ambito dei Sistemi Esperti, lo Shell, (conchiglia, guscio,
rivestimento), viene utilizzato per indicare il "rivestimento" della base di conoscenza, cioè
tutto ciò che si trova tra quest'ultima e l'utente: il motore inferenziale è l'interfaccia utente.
Lo shell quindi è un Sistema Esperto privo di conoscenza, il programma privo di dati, e di
conseguenza non eseguibile.
Uno shell è uno strumento molto appetibile commercialmente perché mette in grado un
utente di costruirsi il proprio Sistema Esperto con pochissimo sforzo. Sviluppare una base di
conoscenza ben fatta e ben interpretabile dallo shell a disposizione non è un impresa facile.
Per primo, ogni shell richiederà un certo qual formato per le regole di produzione, in secondo
luogo ogni dominio di applicazione avrà le proprie regole correlate più o meno strettamente
fra di loro. Al fine di facilitare lo sviluppo e la manutenzione delle basi di conoscenza, è utile
definire un linguaggio di sviluppo che permette di esprimere le regole di produzione in
maniera facilmente comprensibile e offra all'utente dei comandi per la gestione della base di
conoscenza. La maggior parte degli shell in commercio è corredata di strumenti ausiliari per
lo sviluppo incrementale della base di conoscenza (compilatori, interfacce, strumenti di
verifica, ...).
Se volessimo trasformare il nostro Sistema Esperto in uno shell degno di tale nome
dovremmo:
memorizzare le regole di produzione su file;
definire un linguaggio per esprimere le regole;
implementare un programma di utilità che metta a disposizione dei comandi di
accesso a tali file (aggiungi, togli, modifica, ...) .
125
BIOINFORMATICA
Nonostante l'esistenza di questi strumenti, lo sviluppo di una base di conoscenza rimane
sempre il punto critico per la buona riuscita del Sistema Esperto. I Sistemi Esperti
costituiscono uno dei tanti campi dell'intelligenza artificiale, ma si distinguono dagli altri
poiché sono stati gli unici in cui si sono ottenuti risultati brillanti. Nonostante questi successi,
non bisogna perdere di vista i limiti e le caratteristiche di un Sistema Esperto; essendo
infatti il fondamento su cui esso si basa una conoscenza fornitagli dall'uomo, tutto ciò che
può fare un Sistema Esperto può essere fatto da un uomo. A differenza dell’uomo però, un
Sistema Esperto è sempre cosciente delle deduzioni che fa e instancabilmente disposto a
concedere spiegazioni.
Nel seguito verrà riportata una breve descrizione di alcuni dei più conosciuti Sistemi Esperti.
Dendral. Dendral è uno dei primi Sistemi Esperti, sviluppato nel 1965 ha il compito di
identificare la formula strutturale di un composto chimico organico, partendo da dati di
spettrometria di massa e da informazioni fornite dall'utente. Conoscendo quali sono gli atomi
che compongono una molecola, esistono milioni e milioni di diversi disposizioni, che
determinano a loro volta diverse proprietà chimiche, Dendral cerca di individuare tale
disposizione. Il motore inferenziale è di tipo "plan-generate-test", ciò significa che dai dati di
partenza si individua un insieme di molecole candidate, che viene via via ridotto per
eliminazione, attraverso una serie di test. Le sue prestazioni sono eccellenti infatti in più di
un caso il sistema ha risolto problemi che mettevano in difficoltà chimici di professione.
Prospector. Prospector assiste il geologo nel valutare le potenzialità di un’area quale
possibile sede di un giacimento minerario. L'aspetto più spettacolare è costituito dalle
capacità grafiche che giungono al punto di fornire la mappa geografica della più probabile
dislocazione di nuovi filoni. La base di conoscenza è composta da una rete inferenziale, la cui
struttura non differisce molto dalle regole di produzione; è inoltre corredata da una
descrizione tassonomica dei dati. È il Sistema Esperto che ha dato finora i risultati più
sensazionali, localizzando un giacimento di molibdeno del valore di molti milioni di dollari, di
cui i geologi non sospettavano nemmeno l'esistenza.
Mycin. Mycin, realizzato nel 1972, assiste il medico nelle decisioni riguardanti la scelta della
terapia appropriata nella cura di malattie infettive che richiedono l’impiego di una terapia
con antibiotici. La base di conoscenza del Mycin è formata da cinquecento regole di
produzione dotate di fattore di certezza. Il motore inferenziale è di tipo backward chaining e
ha capacità di ragionamento approssimato.
EXAMPLE:MYCEN(SHORTLIFFE)
An expert system for guiding bacterial infection therapy
Premise:($and(same cntxt gram grampos)
(same contxt morph coccus )
(same cntxt conform clumps))
Action: (conclude cntxt ident staphylococcus tally 0.7)
IF(1)la
colorazione
dell’organismo
è
gram-positivo,and
(2)
la
morfologia dell’organismo è coccus, and 3 la conformazione di crescita
è fitta, c’è una suggestiva evidenza (0.7) che l’identificazione
dell’organismo sia staffilococco.
Questo Sistema esperto è molto utilizzato soprattutto negli ospedali statunitensi grazie al
fatto che la sua base di conoscenza contiene molti dettagli sulla sintomatologia di tutte le
sindromi infettive conosciute.
Logic Theorist è un particolare programma per calcolatore creato nel 1958 per la
dimostrazione di teoremi di logica simbolica elementare con tecniche euristiche simili a
quelle utilizzate dagli esseri umani. Appartiene al gruppo dei programmi di Problem Solving.
Il Logic Theorist fu testato sulla dimostrazione di alcuni teoremi di logica formale tratti dal
poderoso "Principia mathematica" di Whitehead e Russell. Il programma era in grado di
dimostrare un teorema facendo delle congetture sulle possibili combinazioni di altri teoremi,
dati dal programmatore come bagaglio informativo di base, per raggiungere la soluzione. In
più di un caso il Logic Theorist ha trovato la dimostrazione più elegante, più corta, di un
teorema rispetto a quella proposta dagli autori. In anni successivi alla prima pubblicazione, il
programma è passato dall’essere un dimostratore di teoremi a rappresentare una prima
approssimativa spiegazione di alcuni processi umani.
126
BIOINFORMATICA
127
BIOINFORMATICA
RETI NEURALI
Una rete neurale è un insieme di unità di calcolo elementari (generalmente adattabili)
connesse fra di loro con struttura parallela, organizzate in maniera gerarchica e predisposte
per interagire con gli “oggetti” del mondo reale secondo un comportamento analogo ai
sistemi nervosi biologici. Come ricorda Hinton (1987) "uno degli scopi principali della ricerca
sulle reti neurali è scoprire delle procedure di apprendimento efficienti che consentano alle
reti di costruirsi complesse rappresentazioni interne del loro ambiente."
Un esempio significativo di reti neurali fu presentato nel 1987 da Agree e Chapman
sottoforma di un programma che apprende a giocare ad un comune videogioco, come se
avesse una strategia, senza che gliene sia stata fornita alcuna e senza che gli sia stata
fornita una esplicita rappresentazione dell'ambiente. Gli autori partirono dalla constatazione
che, anche se molte delle nostre azioni sono pianificate, la maggior parte dei nostri
comportamenti è una diretta reazione alla situazione ambientale. Inoltre, molte risposte alle
sollecitazioni ambientali, devono essere date in tempi troppo rapidi perché si possa
analizzare quale risposta darebbe i risultati migliori. La realtà è troppo imprevedibile,
complessa, immediata perché la pianificazione possa avere un posto così centrale quale
quello attribuitogli da modelli dell'attività.
Ritennero, quindi, che la maggior parte dell'attività, derivi da un meccanismo di risposta
immediato alla situazione presente. Questo meccanismo, fa tesoro delle regolarità
riscontrate nel suo interagire con l'ambiente, così da dar luogo a comportamenti complessi
ed apparentemente pianificati, senza aver bisogno di esplicite rappresentazioni del mondo.
Per mettere alla prova la validità di queste valutazioni, avevano necessità di un ambiente più
semplice di quello reale, ma comunque abbastanza complesso e imprevedibile: un
videogioco in un ambiente bidimensionale e discretizzato. Il gioco originale consisteva nel
muovere un pinguino, inseguito da api in grado di ucciderlo sotto una certa distanza. Sia il
pinguino che le api possono modificare l'ambiente movendo dei blocchi di ghiaccio che sono
distribuiti su tutto lo schermo e vengono a costituire un labirinto. Muovendo i blocchi,
possono anche colpirsi vicendevolmente, eliminandosi. Il pinguino era fornito di un algoritmo
di apprendimento che gli permetteva di muoversi efficacemente nell’ambiente nonostante
non avesse alcun esplicita rappresentazione dell’ambiente né piani o strategie di gioco..
Il meccanismo su cui è basato il comportamento e l'apprendimento del pinguino è
un'applicazione dei loro principi: delle routines che prevedono la messa in atto di un
determinato comportamento (fuga, spinta di un blocco ecc.) nel momento in cui esso si
trova in una data situazione (ad esempio: "quando stai per essere catturato, scappa"). La
sua valutazione della situazione è basata sugli aspetti indicativo-funzionali dell'ambiente,
cioè sugli oggetti individuati per la loro funzione in un particolare istante (il blocco che sto
spingendo, il passaggio attraverso il quale sto correndo) ed in base a queste applica le sue
routines.
In questo modo il comportamento tenuto con un oggetto potrebbe essere applicato ad un
altro oggetto che, in un altro momento, si trovi nella stessa situazione funzionale.
Un altro interessante lavoro che persegue la strategia di non fornire all'automa alcuna
rappresentazione, ma fare il modo che ne sviluppi una sua è basato sui sistemi a
classificatori sviluppati da Holland.
I sistemi a classificatori sono progettati in modo da fornire l'automa di una base di
conoscenza, che gli permetta di sopravvivere in un dato ambiente, modificando il proprio
comportamento in base alle conseguenze delle proprie azioni. Le azioni sono valutate da un
algoritmo (funzione di valutazione), che fornisce premi e punizioni a seconda della coerenza
delle conseguenze con gli obiettivi. In base alle risposte che richiedono, le varie situazioni
128
BIOINFORMATICA
producono delle classi di equivalenza di stati ambientali (alla stessa classe appartengono le
situazioni che, dato uno o più obiettivi, richiedono la stessa risposta).
Nonostante ciò gran parte delle ricerche utilizzano sistemi a classificatori con gli algoritmi
genetici, sistemi quindi che rientrerebbero più propriamente nel campo dell'intelligenza
artificiale. Questo a riprova del fatto che il campo è caratterizzato più da un atteggiamento e
da una strategia comune che dalle tecniche utilizzate. Bernard Windrow della Stanford
University viene riconosciuto come un pioniere e il maggior studioso delle reti neurali. Si
deve a lui il programma Adaline un programma basato sulle reti neurali che elimina gli eco
dalle linee telefoniche. Gli stessi principi sono stati attualmente adottati per eliminare gli
errori nei modem.
Campi di applicazione delle reti neurali. Le potenzialità applicative delle reti neurali sono
legate principalmente ad alcune loro capacità fondamentali:
riconoscimento di pattern
apprendimento da esempi
simulazione delle interazioni tra un ampio numero di parametri
resistenza ai guasti
Quest’ultima proprietà consiste nella capacità della rete di continuare a funzionare, con
prestazioni leggermente inferiori, anche in caso di rottura di alcuni suoi elementi. Nel caso di
implementazioni hardware in silicio ciò si traduce nella possibilità di utilizzare anche i
dispositivi parzialmente difettosi.
Si possono individuare 3 principali modalità d’uso delle reti neurali:
1. Classificazione/trasformazione di pattern; rientrano in questo caso i sistemi per il
riconoscimento di immagini, suoni, voci ed altri pattern, le memorie associative, i
sistemi per la cancellazione del rumore e per la riduzione della ridondanza di
informazioni;
2. Ottimizzazione; rientrano in questo caso i sistemi esperti basati su reti neurali. Un
tipico problema di ottimizzazione é quello del "commesso viaggiatore": dato un certo
numero di città, trovare il percorso più breve per visitarle tutte.
3. Previsione; rientrano in questo caso i sistemi di previsione meteorologica.
Le applicazioni che consentono il maggiore impatto pratico sono quelle in cui la rete
neuronale viene usata come classificatore, cioè per riconoscere una serie di pattern di
ingresso nel campo dell’automazione. Tali reti possono essere utilizzate per riconoscere
immagini di oggetti migliorando le prestazioni dei sistemi di controllo della qualità come
quelli di ispezione ottica nel campo della robotica; l’applicazione delle reti neurali al
riconoscimento delle immagini può portare notevoli miglioramenti sia sul piano delle capacità
di movimento in ambienti complessi sia sul piano della acquisizione di informazioni.
Nel campo dell’automazione d’ufficio una applicazione tipica é quella della macchina da
scrivere, implementata su PC, che scrive sotto dettatura; nel campo militare le applicazioni
riguardano il riconoscimento di aerei, navi o sommergibili sulla base delle loro immagini
radar o sonar; nel campo dell’elettronica in generale le reti neurali possono essere utilizzate
per ripulire o, addirittura, rigenerare segnali affetti da rumore; in particolare nel settore
biomedicale questa possibilità può essere sfruttata per l’elaborazione dei tracciati
elettrocardiografici.
Le memorie associative basate su reti neurali possono essere utilizzate per migliorare il
funzionamento delle basi di dati, rendendo possibile il reperimento di informazioni a partire
da riferimenti incompleti. Nel campo dei cosiddetti sistemi esperti istantanei, in cui le reti
neurali possono apprendere dagli esempi e, quindi, possono utilizzare anche conoscenze non
esprimibili sotto forma di regole <<se ... allora>> nel campo finanziario per la valutazione
dei rischi connessi alla concessione di prestiti, per la previsione degli andamenti del mercato,
nel campo meteorologico le reti neurali possono essere utilizzate per realizzare sistemi di
previsione.
Il neurone biologico. Dal punto di vista computazionale possiamo rappresentare le
funzioni utilizzando unità di calcolo elementari e modi di apprendere tali rappresentazioni a
partire da semplici esempi. Questo modo di rappresentare è detto rete e risulta analogo ai
circuiti costituiti da semplici porte logiche che rappresentano funzioni booleane. Dal punto di
vista biologico possiamo considerare il cervello dotato di unità elementari chiamate neuroni.
129
BIOINFORMATICA
Una rete quindi corrisponde ad un gruppo di neuroni connessi tra di loro, da qui il termine di
reti neurali.
Il neurone
biologico è
l'unità
fondamentale del sistema nervoso ed è costituito dalla cellula neurale o corpo cellulare e dai
suoi prolungamenti. Il neurone biologico è l'unità fondamentale del sistema nervoso ed è
costituito: dalla cellula neurale o corpo cellulare e dai suoi prolungamenti. Le immagini
mostrano neuroni multipolari in cui si evidenzia la loro morfologia, in particolare si
osservano i dendriti e degli assoni. Il metallo pesante, in questo caso l'argento, si deposita
sugli elementi costituenti il citoscheletro del neurone, permettendone in tal modo lo studio.
Risulta visibile il nucleo e, all'interno, il nucleolo. Essendo la sezione spessa, il dettaglio dei
processi neuronali si perde allorché essi passano al di fuori del piano di osservazione. Notare
le cellule gliali circostanti. Una prima classificazione dei neuroni viene compiuta in base alla
morfologia dei prolungamenti; secondo questa classificazione i neuroni possono essere di tre
distinti tipi:
I neuroni pseudounipolari
I neuroni bipolari
I neuroni multipolari. Prolungamenti protoplasmatici o dendriti, sono rappresentati
da un'arborizzazione, talvolta imponente, che nasce dal corpo cellulare. Essi sono
piuttosto corti e sono forniti di spine o varicosità.
Le fibre nervose sono prolungamenti che nascono per mezzo di un cono di origine o
monticolo dal soma. Esso è molto lungo, non si arborizza, esce dalla sostanza grigia e corre
in compagnia di altri neuriti in fasci di sostanza bianca. Può anche abbandonare il sistema
nervoso centrale ed entrare nella costituzione dei nervi periferici.
I neuroni possono essere classificati sulla base
della natura dell'impulso che trasportano;
secondo questa classificazione possono essere di
due tipologie:
neuroni
motori
o
efferenti,
caratterizzati dal fatto che trasmettono
impulsi diretti alle periferie, ai muscoli
ed alle ghiandole, quindi agli effettori;
neuroni sensitivi o afferenti, che
provvedono a raccogliere gli stimoli e a
trasmettere i relativi eccitamenti ai
centri.
Nel sistema nervoso centrale l'impulso percorre
Cellula nervosa o neurone.
catene di neuroni che sono articolati tra loro in
una particolare giunzione detta sinapsi o bottone sinaptico; essa rappresenta, in pratica, la
terminazione dei neuriti che sono i fili di collegamento tra i neuroni.
L'impulso si trasmette nelle sinapsi in una sola direzione. I segnali si propagano da neurone
a neurone grazie ad una serie molto complessa di reazioni chimiche; alcune sostanze che
fungono da trasmettitori chimici sono rilasciate dalle sinapsi ed entrano nel dendrite, questo
130
BIOINFORMATICA
ingresso provoca un abbassamento o un innalzamento del potenziale elettrico del corpo
cellulare.
Quando questo potenziale raggiunge una certa soglia si ha l’invio di un segnale elettrico. Le
sinapsi che aumentano il segnale sono dette eccitatorie mentre quelle che riducono il
potenziale d’azione sono dette inibitorie. Le connessioni sinaptiche sono interessanti in
quanto mostrano una certa plasticità, cioè una capacità di modificare le connessioni in
risposta a determinati schemi di stimolazione.
Il cervello umano memorizza le informazioni attraverso sistemi che variano la forza dei
collegamenti, aumentando o diminuendo il loro numero, variando il tipo di messaggio
chimico, che li percorre trasportando i segnali, variando la soglia di risposta dei neuroni.
Le connessioni sinaptiche sono interessanti in quanto mostrano una certa plasticità, cioè una
capacità di modificare le connessioni in risposta a determinati schemi di stimolazione.
Nell’uomo l’elaborazione dell’informazione avviene nella corteccia cerebrale in strutture a
forma di barile che contengono circa 2000 neuroni, ed è noto come certe aree del cervello
possiedano delle specifiche funzioni; nel 1861 P.P. Broca dimostrò che nei soggetti incapaci
di parlare (afasia) vi era un danno nella terza convulsione frontale sinistra della corteccia
cerebrale.
Il cervello ed il computer hanno compiti piuttosto diversi e hanno proprietà differenti.
Attualmente non si conosce ancora bene come le funzioni di competenza di una zona
cerebrale, in caso di danneggiamento, possano essere trasferite ad un’altra zona, inoltre non
è nota nessuna teoria che spieghi come venga immagazzinato un singolo ricordo. La
neurobiologia è assai lontana da una teoria completa sulla coscienza, cioè alla capacità che
hanno semplici cellule di condurre al pensiero, all’azione e alla conoscenza.
Computer Workstation
Cervello Umano
Unità di calcolo
CPU – 106 porte
1011 neuroni
Unità di memoria
109 bit RAM, 1010 disco
1011 neuroni
–8
Tempo per un ciclo
10 sec
10–3 sec
Lunghezza di banda
109 bit/sec
1014 bit/sec
Aggiornamento neuroni/sec
105
1014
Il cervello ed il computer hanno compiti piuttosto diversi e hanno proprietà differenti e
dobbiamo ritenere che il cervello umano migliorerà le sue prestazioni molto lentamente,
mentre i computer potranno migliorare la loro capacità di immagazzinamento e la velocità di
calcolo.
Un computer è in grado di eseguire una istruzione in decine di nanosecondi, mentre i
neuroni possono richiedere millisecondi per essere attivati. Il cervello umano ha però
attualmente un enorme vantaggio in quanto tutti i neuroni possono lavorare
contemporaneamente, mentre un computer può avere un numero limitato di CPU che
lavorano congiuntamente. Quindi anche se un computer è un milione di volte più veloce
nella commutazione rispetto al cervello, risulta più lento del cervello nel calcolo parallelo.
Un compito complesso come quello del riconoscimento di una immagine, viene eseguito dal
nostro cervello con un numero di cicli limitato ed in tempi dell’ordine del secondo, mentre un
calcolatore impiega miliardi di cicli e tempi di risposta non sempre accettabili. Inoltre non
dobbiamo dimenticare alcuni aspetti non trascurabili: il cervello tollera meglio i guasti
rispetto ad un computer; infatti un difetto dell’hardware che altera un solo bit può fare fallire
un’intera operazione di calcolo; il cervello umano è in grado di funzionare per 70-80 anni
senza necessità di una sostituzione della memoria; il cervello ha una degradazione
tendenzialmente dolce delle sue prestazioni.
Il neurone elettronico. Una rete neurale é composta di elementi di elaborazione, detti
neuroni elettronici ed ispirati ai neuroni biologici, connessi tra loro con collegamenti ispirati
alle sinapsi, in modo da formare uno schema assimilabile ad un semplicissimo tessuto
nervoso. Ciascun collegamento ha un peso numerico associato ad esso. I pesi sono il
principale mezzo di memorizzazione a lungo termine nelle reti neurali e l’apprendimento in
genere avviene attraverso l’aggiornamento dei pesi.
Gli elementi di elaborazione (PE ossia Processing Elements) sono i neuroni elettronici, che
con i loro schemi di interconnessione sono molto più semplici dei neuroni e dei tessuti
131
BIOINFORMATICA
biologici, ma conservano un grado elevato di analogia. L’osservazione della struttura del
cervello può, infatti, fornire importanti spunti per la ricerca sulle reti neurali, mentre queste
ultime possono fornire modelli esplicativi del funzionamento del cervello.
Il neurone biologico può essere rappresentato dal neurone elettronico o di Hopfield, che
consiste in un dispositivo elettronico di sommatoria non lineare dotato di:
- più ingressi, che corrispondono ai dendriti nel neurone biologico;
- una sola uscita, che corrisponde all'assone nel neurone biologico.
Ogni elemento di processo (neurone) riceve segnali diversi (normalmente da altri PE) e può
inviare il suo segnale d'uscita a più PE. L’interconnessione tra i vari PE non è un semplice
conduttore, poiché la sua funzione consiste nel "pesare" il segnale del neurone emittente
moltiplicandolo per un opportuno valore detto peso di interconnessione, variabile tra 0 e 1,
oppure tra –1 e +1. I pesi sono detti eccitatori se positivi, inibitori se negativi; un peso
uguale a 0 rappresenta una non connessione. Il calcolo è basato sul valore di ciascun
segnale ricevuto dai nodi vicini e dal peso assegnato a ciascun ingresso.
Il numero di ingressi di eccitazione o inibizione non è soggetto a limitazioni.
Architettura delle reti neurali. L'architettura è senza dubbio il principale carattere
distintivo di una rete neurale. Le tipologie sono:
il percettrone a singolo strato, che é il più semplice tipo di rete neurale in quanto composto
da una o più PE disposti su un'unica fila. Questo tipo di rete è in grado di effettuare una
semplice classificazione dei segnali presentati ai suoi ingressi, ad esempio realizzando una
funzione AND.
il percettrone multistrato, che è composto da più schiere di PE. Un percettrone a due strati
è in grado di dividere il piano degli input disegnando regioni chiuse o aperte comuni, ciò che
è necessario per effettuare la funzione XOR. Un percettrone a tre strati può dividere il piano
degli input disegnando virtualmente qualunque forma e la sua capacità classificatoria è
ancora superiore.
Back-propagation. Il meccanismo con cui tutta questa struttura apprende è del
tipo back-propagation (Propagazione all'indietro) ed è riassunto in queste fasi:
Feed Forward: é la fase di propagazione diretta del segnale dall'ingresso all'uscita,
in cui noti gli ingressi e i pesi viene calcolata l'uscita della rete.
Error Back–Propagation: é la fase di retro–propagazione dell'errore dove l'errore
calcolato dalla differenza tra l'uscita (calcolata al punto precedente) e il target viene
trasmesso a tutti i neuroni della rete.
Wheight Update: é la fase di modifica dei pesi, resa possibile dalle informazioni
ottenute nelle prime due fasi.
La tecnica di back-propagation è stata sviluppata da Rumelhart–Hinton e Williams nel 1986.
Essa costituisce, secondo stime prudenziali, almeno il 50% delle applicazioni sviluppate. Uno
dei campi di applicazione è quello delle previsioni di mercato in ambito economico.
Il principio di apprendimento è quello di lasciare che la rete impari dai suoi errori.
Inizialmente, i valori dei pesi sono scelti a caso (in particolare vengono presi valori
normalizzati , tra 0 e 1 o tra –0.5 e +0.5), a questo punto esistono diverse modalità per
assegnare questi valori che possono essere definiti come metodi supervisionati e non
supervisionati, cioè si attribuisce o meno il ruolo di un "insegnante" che corregge gli errori di
output. I neuroni dello strato N ricevono gli output dallo strato I (che diventano ora gli input
dello strato N) calcolano ognuno i loro output e li trasmettono allo strato U. I neuroni dello
strato U calcolano i loro output sulla base degli input ricevuti e li confrontano con i dati reali
storici. I neuroni dello strato U calcolano un errore che è funzione della differenza fra il loro
output e il valore reale. A questo punto i neuroni dello strato U trasmettono i loro output ai
neuroni dello strato N cambiando i pesi N-U di una piccola quantità nel senso di minimizzare
l'errore calcolato. I neuroni dello strato N ricevono gli input dallo strato U (che sono gli
output dello strato U) calcolano ognuno i loro output e li trasmettono allo strato I
modificando i pesi I-N. I neuroni dello strato I ricevono un nuovo set di dati storici che
vengono ognuno moltiplicato per i nuovi pesi I-N modificati nella fase precedente e calcolano
i loro output ripetendo il ciclo dall'inizio.
132
BIOINFORMATICA
Questo ciclo viene ripetuto fino a che l'errore tra l'output calcolato ed il dato reale soddisfa
la condizione che l'utente impone, che può essere un errore minimo fra dato reale e
calcolato tra i dati storici o un numero massimo di interazioni. A volte alcuni set di dati
storici (di solito circa il 20%) non vengono usati nella fase di apprendimento, ma vengono
usati periodicamente per confrontare l'output calcolato da tutta la struttura con il valore
reale.
Un modello di rete neurale del tipo Multi Layered
Perceptron o Percettrone Multistrato è raffigurato
nella seguente figura.
Essa è costituita da:
3 neuroni in input;
Un primo livello nascosto con 4 neuroni;
Un secondo livello nascosto con 3 neuroni;
Un neurone di output.
In questo esempio, ogni neurone è collegato a tutti
quelli del livello immediatamente inferiore in modo
tale da potersi scambiare dei messaggi.
Le regole di apprendimento sono le regole
secondo cui si variano i pesi di interconnessione in
funzione di determinati parametri dell'attività della rete. Esempi di tali regole sono:
la regola di Hebb: stabilisce che il peso venga variato di una quantità proporzionale
al prodotto dei valori di attivazione dei neuroni connessi dal peso in questione,
tendendo così a rinforzare i pesi più forti e ad indebolire quelli più deboli. Nella sua
formulazione iniziale Hebbe scrisse «se un neurone A è abbastanza vicino ad un
neurone B da contribuire ripetutamente e in maniera duratura alla sua eccitazione,
allora ha luogo in entrambi i neuroni un processo di crescita o di cambiamento
metabolico tale per cui l'efficacia di A nell'eccitare B viene accresciuta». In parole
più semplici, la regola stabilisce che "due neuroni che scaricano assieme si
potenziano reciprocamente". Hebb introdusse inoltre il concetto di assemblea
cellulare, per definire un gruppo di neuroni che costituiscono un'unità di
elaborazione, e ipotizzò che la combinazione delle connessioni tra gruppi di neuroni
costituisse l'algoritmo, in continua mutazione, che dettava al cervello la risposta ai
diversi stimoli.
la regola di Windraw–Haff: stabilisce che i pesi siano variati in una quantità
proporzionale alla differenza tra i valori di uscita effettivi e i valori desiderati.
La supervisione è necessaria solo nel secondo caso: la supervisione entra in gioco quando le
prove prevedono la correzione delle risposte.
Apprendimento induttivo: il sistema parte dai fatti e dalle osservazioni derivanti da uninsegnante o dall’ambiente circostante e le generalizza, ottenendo conoscenza che,
auspicabilmente, sia valida anche per casi non ancora osservati (induzione). Due tipi di
apprendimento induttivo:
– apprendimento da esempi:conoscenza acquisita a partire da un insieme di esempi positivi
che sono istanze del concetto da imparare e di esempi negativi che sono non-istanzedel
concetto
– apprendimento di regolarità: non c’è un concetto da imparare, l’obiettivo è quello ditrovaren regolarità (ovvero caratteristiche comuni) nelle istanze date.
Gli elementi del processo interagiscono tra di loro in funzione del tipo di interconnessione.
Diversi sono i criteri con i qu ali si stabiliscono le interconnessioni e questo rappresenta
l'architettura del sistema; il grado delle interconnessioni determina il livello di parallelismo.
Mentre la memoria di un computer è misurata in byte, la memoria di una rete neurale viene
misurata dalle interconnessioni. La velocità di un computer viene misurata dal numero di
istruzioni eseguite per secondo, in una rete neurale la velocità viene misurata in
interconnessioni per secondo. Molti dei processi mentali umani richiedono dei tempi di
risposta di poche centinaia di millisecondi; un singolo neurone compie una operazione in un
133
BIOINFORMATICA
tempo superiore a quello di un computer. Il cervello umano sfrutta ampiamente il
parallelismo utilizzando 10 bilioni di neuroni.
Addestramento delle reti neurali. Per istruire una rete neurale vengono usati degli
esempi reali, che si chiamano training set. Ogni esempio contiene sia gli input che gli output
del problema. La rete agisce come un bambino che impara per tentativi: legge il training set
per decine e decine di volte, finché non lo ha imparato ovvero fino a quando il suo output è
simile a quello che le stiamo insegnando e quindi la rete ha capito il modello che trasforma
gli input in output.
L’addestramento, dunque, provoca a livello neuronale la modificazione dei pesi
d'interconnessione.
Il processo di apprendimento prevede due possibili regimi:
con pochi esempi la rete si
comporta da memoria, senza
ricorrere a nulla;
con molti esempi, la rete è in grado
di generalizzare, ossia ricavare una
regola che sia applicabile anche a
nuovi casi.
La rete neurale si comporta quindi come
un esperto umano che basa i suoi
ragionamenti solo sulla sua esperienza
passata, senza aggiungere la creatività
propria degli esseri umani. Le reti neurali
non danno risultati completamente corretti o completamente sbagliati, ma solo
approssimativamente corretti o sbagliati. Una rete se ha imparato a dare una risposta A
quando si presenta una serie di dati A, se si presenta una serie A’ di dati molto simile ad A,
la rete risponde in modo sensato, cioè B: questa capacità di estrapolare è una delle
principali caratteristiche delle reti neurali rispetto ai sistemi simbolici tradizionali.
ALGORITMI GENETICI. A partire dal 1975 John Holland dell’Università del Michigan
applicò per primo il processo della selezione naturale al problema dell’apprendimento delle
macchine sottoforma di un algoritmo genetico che genera soluzioni possibili ai problemi
individuati dalla teoria darwiniana sull’evoluzione naturale.
Gli A.G. funzionano bene nell’ambito dell’Artificial Life in quanto simulano l’evoluzione
biologica naturale e producono organismi specializzati attraverso le operazioni di
riproduzione, crossover e mutazione. Un tipico algoritmo genetico parte da un certo numero
di possibili soluzioni (individui) chiamate popolazione e provvede a farle evolvere nel corso
dell'esecuzione: a ciascuna iterazione, esso opera una selezione di individui della
popolazione corrente, impiegandoli per generare nuovi elementi della popolazione stessa,
che andranno a sostituire un pari numero d'individui già presenti, e a costituire in tal modo
una nuova popolazione per l'iterazione (o generazione) seguente. Tale successione di
generazioni evolve verso una soluzione ottimale del problema assegnato. La loro evoluzione
viene ottenuta attraverso una parziale ricombinazione delle soluzioni, ogni individuo
trasmette parte del suo patrimonio genetico ai propri discendenti, e l'introduzione di
mutazioni casuali nella popolazione di partenza, sporadicamente quindi nascono individui
con caratteristiche non comprese tra quelle presenti nel corredo genetico della specie
originaria. Finita la fase di evoluzione la popolazione delle soluzioni viene analizzata e
vengono tenute solo le soluzioni che meglio risolvono il problema: gli individui con le qualità
più adatte all'ambiente in cui si trovano hanno quindi maggiori possibilità di sopravvivere e
riprodursi. Queste soluzioni subiranno una nuova fase di evoluzione e così via. Alla fine ci si
aspetta di trovare una popolazione di soluzioni che riescano a risolvere adeguatamente il
problema posto. Non vi è modo di decidere a priori se l'algoritmo sarà effettivamente in
grado di trovare una soluzione accettabile. Di norma gli algoritmi genetici vengono utilizzati
per problemi di ottimizzazione per i quali non si conoscono algoritmi di complessità lineare o
polinomiale. Un caso particolare di applicazione di algoritmi genetici è Acovea, un software
studiato per trovare il profilo migliore delle opzioni di ottimizzazione del compilatore gcc: un
problema di elevata complessità.
134
BIOINFORMATICA
A Livello informatico gli algoritmi genetici consistono sostanzialmente in varie tecniche, che
portano alla selezione degli algoritmi che danno (in base ad un determinato criterio) i
risultati migliori ed alla ricombinazione casuale di alcune loro porzioni e/o alla mutazione di
alcune loro parti.
In genere si parte con una certa popolazione di automi che hanno leggere differenze tra loro
e si fanno agire in un ambiente per un certo numero di cicli. In seguito quelli che si saranno
comportati meglio avranno la possibilità di riprodursi. Cioè si prenderà, ad esempio, il venti
per cento della popolazione che si è comportato nel modo migliore e da questi, con
mutazioni casuali e ricombinazioni, si otterrà anche il restante ottanta per cento di automi;
con questa nuova popolazione si farà un'altra sessione di cicli, al termine dei quali, si
ripeterà lo stesso procedimento. All'interno di questo schema generale, le effettive
realizzazioni degli algoritmi possono essere molto diverse: da programmi in vari linguaggi, a
valori di connessioni di reti neurali.
La teoria di Holland si basa sui seguenti presupposti:
Gli algoritmi genetici generano una popolazione di cromosomi sempre migliori,
manipolando quelli della generazione precedente.
Gli algoritmi genetici non conoscono nessuna caratteristica del problema finale che
devono risolvere.
Gli algoritmi utilizzano la valutazione della fitness per far riprodurre i cromosomi
con le migliori valutazioni e scartare quelli con le peggiori valutazioni.
Le frequenze dei geni e dei relativi caratteri ad esse associati possono essere cambiate
attraverso la selezione. Selezionare significa scegliere gli animali ai quali è permesso avere
dei discendenti.
La selezione artificiale viene operata dall’uomo che sceglie i geni (in realtà gli animali) in
funzione del loro valore economico. La selezione naturale permette invece la sopravvivenza
dei genotipi più adatti all’ambiente naturale. La frequenza di un gene in una popolazione
sottoposta a selezione dipende dalla fitness (adattamento, capacità di lasciare discendenti)
dei genotipi nella popolazione. Con fitness si intende la proporzione del genotipo che si
riproduce rispetto ad altri genotipi. Fitness pari ad 1 indica una completa capacità di
riprodursi di quel genotipo, fitness inferiore ad 1 indica fitness ridotta per incompleta vitalità
o fertilità o altro di un particolare genotipo.” (G. Pagnacco in Genetica applicata alle
produzioni animali. Città Studi Edizioni p.27).
In natura, la valutazione della fitness è data direttamente dall’interazione di un cromosoma
con l’ambiente circostante: se esso sopravvive bene in un dato ambiente, tenderà a
riprodursi con più probabilità di un altro essere che ha difficoltà a sopravvivervi. In questo
modo i cromosomi più validi tramanderanno il loro “buon” patrimonio genetico ai rispettivi
figli, per generazioni e generazioni.
Gli algoritmi genetici sono perciò dei semplici manipolatori di cromosomi, che generano
popolazioni di cromosomi migliori di quelle da cui provengono. Gli algoritmi genetici
artificiali, al contrario di tutte le precedenti generazioni dell’informatica, possono creare
situazioni nuove. Se però una situazione è nuova, si pone il problema di chi poi sia in grado
di valutarla, ovvero di chi possa assegnare una fitness ai nuovi individui creati. A questo
scopo ci vengono in aiuto le reti neurali, che sono in grado di valutare una stringa di dati
mai visti direttamente in precedenza. Questo è valido solo quando ogni nuova situazione è
assimilabile a qualcosa che la rete neurale ha già imparato. In presenza di situazioni
completamente nuove e non generalizzabili da passate esperienze, è necessario ricorrere ad
altre soluzioni.
Gli operatori genetici più utilizzati in questo campo sono:
Cross over;
Mutazione;
Inversione;
Sostituzione;
Mutazione percentuale;
Inversione parziale.
135
BIOINFORMATICA
La maggioranza delle operazioni genetiche che si riscontrano in natura sono di tipo cross
over, le mutazioni avvengono con scarsissima probabilità, mentre le inversioni non hanno un
riscontro naturale.
L’unione degli algoritmi genetici con le reti neurali rappresenta un’ulteriore ampia possibilità
di soluzione per problemi estremamente complessi.
Funzionamento dei Genetic Algorithms. Per poter parlare, in maniera più generale, dei
Genetic Algorithms è necessario innanzitutto stabilire una codifica della soluzione al
problema trattato in termini di stringhe binarie. La ricerca di una buona soluzione diventa
quindi la ricerca di particolari stringhe binarie, considerate come individui, all'interno di una
determinata popolazione. Si parte da una popolazione iniziale casuale dove ciascun
individuo mantiene una data soluzione al problema da ottimizzare, data da un insieme di
parametri o stati variabili, codificati all'interno della stringa binaria. Ogni parametro è
visto come un gene, in quanto, come tale, definisce una determinata caratteristica
all'individuo. Ad ogni individuo della popolazione viene successivamente assegnato un valore
di fitness che, in accordo con la "genetica delle popolazioni", definisce e valuta l'insieme
delle caratteristiche dell'individuo stesso (ovvero la sua combinazione di geni) e quindi la
sua possibilità di riprodursi: individui con valore di fitness migliore hanno una probabilità più
alta di essere selezionati per generare discendenza. Questa operazione di selezione può
essere vista come una metafora della sopravvivenza naturale dove, il valore di Fitness di un
individuo determina l'abilità nel superare tutti gli ostacoli imposti dall'ambiente.Un
tradizionale GA consiste nelle seguenti operazioni:
1-Generazione casuale di una popolazione iniziale di
individui (possibili soluzioni). Ogni individuo è diverso
dall'altro in quanto possiede particolari caratteristiche
dettate dalla combinazione dei suoi geni e quindi dal suo
genotipo.
2-Mapping e calcolo del valore di fitness F(Xi), per ogni
individuo della popolazione corrente.
3-Generazione
di
nuovi
individui
mediante
"accoppiamento" degli individui ritenuti più idonei ed
applicazione degli Operatori Genetici in modo da
generare variabilità all'interno della popolazione.
Esistono numerosi Operatori Genetici, quelli più comuni
sono: CrossOver e Mutations.
L'operatore di CrossOver prende parti dei due individui
(genitori) e crea un nuovo individuo (figlio), combinando queste parti. In questo modo i figli
conterranno caratteristiche di entrambi i genitori e, come spesso avviene, una parte buona
di un genitore può rimpiazzare una parte meno buona dell'altro genitore, creando un figlio
migliore. L'operatore Mutations (di mutazione), cambia casualmente i valori di un gene di
un individuo appena creato.
La generazione di nuovi individui
viene solitamente definita sulla base
di due modelli, secondo i quali la
popolazione si evolve. Nel Modello di
Generazione Discreto si tiene ogni
generazione distinta dall'altra. In
questo modo riusciamo a distinguere
la popolazione dei genitori dalla
popolazione dei figli. Se tutti i genitori
hanno prodotto i loro figli, questi ultimi diventeranno i nuovi genitori della generazione
successiva e così via. Nel Modello di Generazione Continuo la decisione di sopravvivenza
del figlio viene fatta immediatamente dopo la sua creazione, anzichè dopo la generazione di
tutti gli altri figli. I figli con valori di fitness migliori possono quindi diventare
immediatamente disponibili come genitori. In questo caso non è possibile distinguere nella
generazione corrente tra genitori e figli.
136
BIOINFORMATICA
4-Nuovamente Mapping e calcolo del valore di fitness per la nuova generazione di individui.
Se le soluzioni possono essere ancora migliorate, si ripetono le operazioni dal punto 3,
altrimenti l'algoritmo termina dopo un numero prefissato di generazioni consecutive senza
che si sia verificato alcun miglioramento della soluzione migliore della popolazione.
TECNICA DI SELEZIONE. La selezione di un padre con fitness elevata non è eseguita su
una pura base numerica. Si seleziona un padre con una probabilità che è proporzionale alla
sua fitness: più la fitness è elevata più quel padre
prolificherà; però anche un padre con bassa fitness
Roulette Wheel Parent
avrà qualche probabilità di poter proliferare. Infatti
F - RWPS Selection
A
anche da padri non ottimi si possono ottenere delle
D
generazioni buone.
C
La tecnica utilizzata per selezionare i padri si chiama
Roulette wheel parent selection (RWPS) che significa
E
B
selezione del padre dalla ruota della roulette. Questa
tecnica consiste nel generare una ruota di roulette,
dove gli spicchi hanno una dimensione proporzionale
alla fitness di ogni cromosoma e quindi la probabilità che la pallina si fermi su uno spicchio
più grande sarà maggiore rispetto alla probabilità che si fermi su uno spicchio più piccolo.
Si procede attraverso tre fasi:
Sommare tutte le fitness in modo da ottenere la fitness totale.
Generare un numero casuale compreso tra 0 e la fitness totale.
Selezionare il primo cromosoma la cui fitness, sommata alle fitness dei
precedenti cromosomi, è maggiore o uguale al numero casuale generato al
passo precedente.
Esempio:
Cromosoma
A
B
C
D
E
F
Fitness
.10 .20 .10 .10 .80 .10
Somma delle fitness .10 .30 .40 .50 1.3 1.4
Numero casuale
.48 .72 .91 1.1 .19
Padre selezionato
D
E
E
E
B
Il cromosoma E viene selezionato con una probabilità superiore a quella degli altri
cromosomi essendo contenuto in uno spicchio più ampio della ruota della nostra roulette
virtuale. Per l’eliminazione dei cromosomi non adatti alla selezione si procede invece
attraverso altri tre passi:
Somma di tutte le fitness = Fitness totale
Fitness totale/numero di cromosomi = Fitness media
Fitness/fitness media = Fitness normalizzata
Distinguiamo tre diversi obiettivi:
Massimizzare la fitness: vengono eliminati tutti i cromosomi con fitness normalizzata
inferiore ad un valore vicino ad uno.
Minimizzare la fitness: vengono eliminati tutti i cromosomi con fitness normalizzata
superiore ad un valore vicino ad uno.
Far sopravvivere cromosomi che si avvicinano ad un valore predefinito: vengono
selezionati solo i cromosomi che hanno una fitness vicina a quella voluta.
137
BIOINFORMATICA
Approfondimento. Le reti neurali sono costituite da molte parti e dovremo usare una
semplice notazione matematica.
Notazione Significato
ai
Valore di attivazione dell’unità i.
ai
Vettore dei valori di attivazione per gli ingressi dell’unità i.
g
Funzione di attivazione.
g’
Derivata della funzione di attivazione.
Erri
Errore (differenza tra entrata ed uscita).
Erre
Errore per l’esempio e
Ii
Attivazione di una unità i nello strato di ingresso
I
Vettore delle attivazioni di tutte le unità di ingresso
Ie
Vettore degli ingressi nell’esempio e
ini
Somma pesata degli ingressi dell’unità i
N
Numero totale di unità nella rete
O
Attivazione della singola unità di uscita di un percettrone
Oi
Attivazione di una sola unità di uscita del percettrone
O
Vettore delle attivazioni di tutte le unità di strato di uscita
t
Soglia per la funzione di strato a gradino
T
Uscita obiettivo per un percettrone
Te
Vettore obiettivo per l’esempio e
Wj,i
Peso di un collegamento dall’unità j all’unità i
Wi
Peso dell’unità i all’uscita in un percettrone
Wi
Vettore dei pesi diretti all’unità i
W
Vettore di tutti i pesi della rete
Ogni elemento di processo (neurone) riceve quindi segnali diversi (normalmente da altri PE)
e può inviare il suo segnale d'uscita U(x) a più PE. L’interconnessione tra i vari PE non è un
semplice conduttore, poiché la sua funzione consiste nel "pesare" il segnale del neurone
emittente moltiplicandolo per un opportuno valore detto peso di interconnessione, variabile
tra 0 e 1, oppure tra –1 e +1. I pesi sono detti:
eccitatori se sono positivi
inibitori se negativi
un peso uguale a 0 rappresenta una non connessione.
Gli elementi di una rete sono i
cosiddetti
neuroni
di
Hopfield,
Unità di calcolo neurale elementare.
dispositivi elettronici di sommatoria
non lineare a più ingressi ed una sola
uscita. Nel 1982, il fisico John J.
Hopfield
pubblica
un
articolo
fondamentale in cui presenta un
modello matematico comunemente
noto appunto come rete di Hopfield:
tale rete si distingue per "l'emergere
spontaneo
di
nuove
capacità
computazionali dal comportamento
FUNZIONE DI ATTIVAZIONE
collettivo di un gran numero di
INGRESSO
USCITA
semplici elementi d'elaborazione". Le
proprietà collettive del modello
producono una memoria associativa
per
il
riconoscimento
di
configurazioni corrotte e il recupero di informazioni mancanti. Hopfield ritiene che ogni
sistema fisico può essere considerato come un potenziale dispositivo di memoria, qualora
esso disponga di un certo numero di stati stabili, i quali fungano da attrattore per il sistema
stesso. Sulla base di tale considerazione, egli si spinge a formulare la tesi secondo cui la
138
BIOINFORMATICA
stabilità e la collocazione di tali attrattori sono proprietà spontanee di sistemi costituiti, come
accennato, da considerevoli quantità di neuroni reciprocamente interagenti. Tra le nuove
idee messe in luce da Hopfield, quella più degna di menzione riguarda il capovolgimento del
rapporto, fino allora esistente, tra calcolo e numeri: mentre era universalmente noto che il
calcolo producesse numeri, assai meno banale era l'osservazione di Hopfield che, viceversa,
anche i numeri potessero spontaneamente generare calcolo, e che questo potesse emergere
quale attributo collettivo di sistemi interattivi siffatti. Le applicazioni delle reti di Hopfield
riguardano principalmente la realizzazione di memorie associative, resistenti all'alterazione
delle condizioni operative, e la soluzione di problemi d'ottimizzazione combinatoriale. Da un
punto di vista strutturale, la rete di Hopfield costituisce una rete neurale ricorrente
simmetrica, di cui è garantita la convergenza. Una rete ricorrente è un modello neurale in
cui è presente un flusso bidirezionale d'informazioni; in altri termini, mentre nelle reti di tipo
feedforward la propagazione dei segnali avviene unicamente, in maniera continua, nella
direzione che conduce dagli ingressi alle uscite, nelle reti ricorrenti tale propagazione può
anche manifestarsi da uno strato neurale successivo ad uno precedente, oppure tra neuroni
appartenenti ad uno stesso strato, e persino tra un neurone e sé stesso.
Il dispositivo elettronico é costituito da 3 blocchi funzionali posti in cascata, ciascuna unità
esegue una computazione semplice: riceve ad esempio i segnali di ingresso e calcola un
livello di attivazione che invia lungo i collegamenti di uscita.
Il calcolo è basato sul valore di ciascun segnale ricevuto dai nodi vicini e dal peso assegnato
a ciascun ingresso. I calcoli che vengono effettuati sono di due tipi, il primo è chiamato
funzione di ingresso ini, che calcola la somma pesata dei valori di ingresso, si definisce
anche Sommatore algebrico: effettua la sommatoria algebrica di segnali di ingresso, che
possono essere eccitatori o inibitori; i primi vengono sommati direttamente mentre i secondi
vengono invertiti, ossia moltiplicati per (–1) prima della somma.
W
j,
i
a
j
in
i
g
a
g
(in
i=
i)
In
g
r
e
s
s
o
F
u
n
z
io
n
ed
iin
g
r
e
s
s
o F
u
n
z
io
n
ed
ia
ttiv
a
z
io
n
e U
s
c
ita
Il numero di ingressi di eccitazione o inibizione non è soggetto a limitazioni, come pure
l'oscillazione positiva o negativa dell'uscita dell'elemento sommatore (Summer).
ini wj,iaj
j
= Wi * ai con notazione vettoriale. In questa notazione i pesi sui collegamenti che entrano
nel nodo i sono indicati con Wi, l’insieme dei valori di ingresso è indicato con ai e il prodotto
scalare indica la somma dei prodotti componente per componente.
Ad ogni passo elementare ciascuna unità calcola il suo valore di attivazione applicando la
funzione di attivazione g al risultato ottenuto per la funzione di ingresso
a
g
(
in
g
(
w
)
i
i)
j
,
ia
j
j
Usando funzioni diverse come g, si possono avere modelli diversi. Le principali funzioni che
possiamo utilizzare sono: funzione a gradino, funzione di segno e la sigmoide.
139
BIOINFORMATICA
+1
+1
+1
ai
ai
t
in
ai
in
i
in
i
i
-1
Funzione gradino
1
se
xt
gradino
tx
0
se
x
t
Funzione segno
1
se
x0
segno
x
1
se
x
0
Funzione sigmoide
1
sigmoide
(
x
)
x
1e
Amplificatore a guadagno G: la somma, che chiameremo x, eseguita dal 1° blocco viene
inviata all’ingresso di un 2° blocco che la moltiplica per una costante G. In particolare alti
valori di G rendono i neuroni molto sensibili a piccole variazioni di x intorno allo 0, riducendo
però la flessibilità dell'intero sistema che tende a comportarsi come un comparatore
analogico, caratterizzato da 2 soli distinti livelli (VOH = 1 e VOL = 0) della sua uscita.
Infatti, per G elevati (ad esempio G = 10) non ci sono "sfumature", cioè livelli intermedi, e,
pertanto, l’intera rete di neuroni perde la capacità di trovare soluzioni di compromesso.
Dall'altro lato, se il guadagno G è troppo basso, tutti i neuroni oscilleranno intorno al
medesimo valore e nessuno prevarrà sugli altri.
Stadio d’uscita non lineare: esegue una trasformazione non lineare sul segnale G*x,
comprimendo il suo valore tra 0 ed 1.
In pratica l’uscita U(x) é una funzione di trasferimento sigmoidale, alla quale corrisponde
una curva a forma di S, come illustrato che corrisponde a:
1
U
(x)
1 eGx
va da zero, per valori negativi elevati di G*x
va ad 1 per valori positivi elevati di G*x
vale ½ per G*x = 0
Tale tipo di curva si usa nei sistemi di compressione del segnale audio in cui si deve trovare
un equilibrio tra fedeltà e gamma dinamica ampia. La caratteristica non lineare del neurone
conferisce effettivamente ad una rete di neuroni, cioè all'insieme di n neuroni collegati tra
loro, una gamma dinamica più estesa ed un grado maggiore di flessibilità.
Risulta chiaro che la base cognitiva delle reti è proprio la teoria del connessionismo, la quale
ritiene che i processi cognitivi siano basati sull'interazione di moduli elementari molto
semplici e che il comportamento, estremamente complesso, di un sistema formato da molti
di questi moduli derivi dall'interazione tra questi. Il connessionismo ha avuto un impatto
enorme nello sviluppo di nuovi algoritmi per l'intelligenza artificiale; questi devono essere
visti nell'ottica di una loro futura implementazione hardware basata sull’interconnessione di
molti PE (in generale più una rete è grande e ovviamente maggiori sono le sue prestazioni).
Inoltre dobbiamo considerare la notevole varietà delle strutture possibili per le reti, ciascuna
delle quali conduce a proprietà computazionali molto diverse. Le reti nell’ambito della
connessione possono essere alimentate in avanti e ricorrenti, dal punto di vista informatico
la rete può essere considerata come un grafo diretto aciclico o DAG (Directed Acyclic
Graph); in generale questo tipo di reti sono organizzate in strati dove non ci sono
collegamenti tra unità dello stesso strato, né all’indietro tra uno strato e il precedente e
inoltre non ci sono salti di strato. L’assenza di cicli implica che il calcolo computazionale può
procedere unicamente dall’unità di ingresso verso l’unità di uscita. Il cervello umano non può
140
BIOINFORMATICA
avere una rete alimentata unicamente in avanti; in questo caso non si avrebbe una memoria
a breve. Alcune regioni del cervello sono largamente alimentate in avanti e stratificate, ma
con evidenti connessioni all’indietro. Il cervello è quindi una rete ricorrente, ed in generale le
reti ricorrenti richiedono agenti complessi e l’impiego di metodi matematici molto avanzati,
poiché diventano instabili e tendono ad oscillare e comportarsi in modo caotico. Le reti di
Hopfield sono una classe di reti ricorrenti molto utilizzata, dove le connessioni sono
bidirezionali con pesi simmetrici, tutte le unità sono di ingresso e di uscita, e la funzione di
attivazione g è la funzione segno e i livelli di attivazione possono essere solo 1. La rete di
Hopfield funziona come una memoria associativa che dopo una serie di esempi porterà la
rete a stabilizzarsi su una configurazione di attivazioni corrispondente all’esempio
nell’insieme di addestramento che assomiglia maggiormente al nuovo stimolo. Le macchine
di Boltzmann utilizzano pesi simmetrici, ma impiegano unità che non sono né di ingresso né
di uscita: esse utilizzano una funzione di attivazione che è detta stocastica, tale che la
probabilità che l’output sia 1 è una qualche funzione di ingresso pesato complessivo.
In questa rete a sinistra vi
sono delle unità definite
come
unità
di
input,
I1
W
W
1
3
3
5
H
3
mentre alla destra vi è una
unità di output, tra di esse
O
5
i nodi etichettati come H,
non
hanno
nessuna
I2
H
4
connessione diretta con
W
4
5
l’esterno
per
questo
W
2
4
motivo vengono definiti
nodi nascosti. Alcune reti
chiamate
semplicemente
Rete a due strati alimentata in avanti con due nodi nascosti.
percettroni non hanno nodi
nascosti, questo implica che ci sia un apprendimento molto semplice, ma per converso
possono rappresentare solo realtà molto limitate. Le reti che possiedono diversi starti di
unità nascoste prendono il nome di reti multistrato. Con una struttura fissa e funzioni di
attivazione g fissate le funzioni rappresentabili da una rete alimentata in avanti sono limitate
ad avere una specifica struttura parametrizzata. I pesi che si utilizzano per la rete
definiscono quale di queste funzioni è effettivamente rappresentata. Nel nostro esempio
avremo a
a5 =g (W3,5 a3 + W4,5 a4) ma dove in realtà avremo
=g (W3,5 g (W1,3 a1 + W2,3 a2)+ W4,5 g(W1,4 a1 + W2,4 a2))
in cui il simbolo g indica la funzione di attivazione e ai è l’output al nodo i. Le funzioni di
attivazione g non sono lineari, quindi l’intera rete rappresenta una complessa funzione non
lineare. Se pensiamo ai pesi come a dei coefficienti questa funzione diventa una funzione di
aggiustamento dei parametri in modo tale da farli corrispondere all’insieme di
addestramento, in altre parole adottiamo un procedimento che in statistica viene chiamato
di regressione non lineare. Fino a questo punto si sono considerate reti con una struttura
fissata, determinata a priori, se scegliamo una rete troppo piccola il modello potrebbe non
essere in grado di rappresentare la funzione desiderata, se al contrario opteremo per una
rete troppo grande correremo il rischio che la rete non sia in grado di comportarsi
correttamente per gli esempi che non ha incontrato. Come nella statistica, i modelli
potrebbero essere sovradimensionate. Allo stato attuale non esiste un algoritmo che ci
permetta di identificare la rete ottimale (NERF= Network Efficiently Representable
Functions).
GLOSSARIO
Activation function: Una funzione per la quale le nuove output dell'unità base sono
derivate da una combinazione degli input o dal livello dell'unità.
Auto-associative: Un processo nel quale il sistema ha immagazzinato un set di
informazioni. Successivamente al sistema viene sottoposto un set analogo.
141
BIOINFORMATICA
Axon: Parte di una cellula nervosa attraversata dall'impulso; parte elettricamente attiva
della cellula nervosa.
Back-propagation: Algoritmo di apprendimento nel quale i weights sono modificati nella
propagazione di un segnale di errore backward dall'ouput all'input.
Chaos: Lo studio delle dinamiche non lineari (disordine deterministico).
Clonare: riprodurre per clonazione; in informatica, duplicare un elemento di hardware o
software; nelle telecomunicazioni, duplicare un dato o un segnale (clonazione:
riproduzione artificiale di una copia genetica identica ad una preesistente).
Connetion: Collegamento tra gli elementi di processo, sia positivo che negativo, legami tra
elementi di processo in una rete.
Conoscenza deterministica: Sistema sufficientemente semplice e ben conosciuto da
rendere inutile l'applicazione di tecniche per la trattazione di conoscenza incerta.
Dendrite: Parte di una cellula nervosa che trasporta l'impulso. Parte elettricamente passiva
della cellula nervosa.
Euristica: Nell'ambito di una scienza, la metodologia di ricerca di fatti o verità, ovvero di
fonti e documenti, preliminare allo studio specifico.
Feedback loop: Un loop continuo di input nella rete fintanto che non si ottiene un risultato
atteso.
Fuzzy logic: Informazione incompleta o contraddittoria.
Fuzzy: Col termine si intende il modo di ragionare tipicamente umano che porta a prendere
decisioni ragionevoli anche in situazioni reali dominate dall'incertezza e dall'imprecisione.
Intelligenza Artificiale (A.I.=Artificial Intelligence): Campo della scienza dei computer che
studia il ragionamento simbolico e le metodologie di risoluzione dei problemi.
Learning: La fase nella quale si istruisce la rete neurale.
Modelli computazionali: Modelli di calcolo.
Network paradigm: Architettura che specifica le interconnessioni e la struttura della rete.
Neurone: Unità strutturale e funzionale del sistema nervoso.
Perceptron: Una larga classe di reti neurali con un solo input layer e ouput layer.
Ragionamento monotonico: Fatti asseriti che restano validi nel tempo e non sono
confutati da successive osservazioni.
Ragionamento qualitativo: Costruzioni di modelli computazionali per il ragionamento
automatico sul mondo fisico mediante l'uso di rappresentazioni qualitative.
Robot: Sistema artificiale capace di interagire con il mondo; esso deriva dalla parola
cecoslovacca "Robota" cioè lavoro, nome degli automi che agiscono come operai in un
dramma di K. Capek. È un automa controllato da un cervello elettronico usato per
sostituire l'uomo in attività manuali faticose o pericolose o troppo costose nell'ottica del
profitto.
Simulazione: Generazione del comportamento.
Soft computing: Settore di ricerca che si prefigge di integrare i sistemi fuzzy con altre
tecniche. Fonda le sue basi sulla teoria dei fuzzy set, si avvale della teoria delle reti
neurali e degli algoritmi genetici per ottenere un sistema integrato per lo sviluppo di
applicazioni.
Spreading activation: Processo di attivazione simultanea alle reti neurali.
Stochastic: Che prevede una probabilità o di variabile random.
Summation function: Una funzione che ingloba diversi input e si attiva con un solo output.
Threshold: Livello minimo di eccitazione energetica.
Training: Processo di apprendimento associato ad input con risposte corrette.
142
BIOINFORMATICA
BIOINFORMATICA MOLECOLARE
Le banche dati biologiche sono
generalmente
suddivise
in
primarie o specializzate. Le
banche
dati
primarie
contengono informazioni e
annotazioni delle sequenze
nucleotidiche
e
proteiche,
strutture di DNA e proteine e
dati
sull’espressione di DNA e
proteine. Le principali banche dati primarie sono: la EMBL datalibrary, la
GenBank e la DDBJ. La EMBL datalibrary è la banca dati europea costituita
nel
1980 nel laboratorio Europeo di Biologia Molecolare di Heidelberg
(Germania). La GenBank è la corrispondente banca americana e la DDBJ è
la
corrispondente Giapponese. Fra le tre banche dati è stato stipulato un
accordo internazionale per cui il contenuto dei dati di sequenza presenti
nelle
tre banche dati è quasi del tutto coincidente in quanto gli aggiornamenti
quotidiani apportati in ciascuna banca dati vengono automaticamente
trasmessi alle altre due. Le banche dati specializzate si sono sviluppate
successivamente e raccolgono insiemi di dati omogenei dal punto di vista
tassonomico e/o funzionale disponibili nelle banche dati primarie e/o in letteratura, o
derivanti da vari approcci sperimentali, rivisti e annotati con informazioni di valore aggiunto.
Una volta che i dati sono stati archiviati nelle banche date biologiche i meccanismi di accesso
sono molto poco standardizzanti e fortemente dipendenti da strumenti bioinformatici
sviluppati ad hoc. Essi si sono sviluppati in base a tre processi biologici fondamentali:
sequenza del DNA, fattore che determina la sequenza aminoacidica della proteina;
sequenza aminoacidica, fattore che determina la struttura tridimensionale della
proteina;
struttura tridimensionale della proteina, fattore che ne determina la funzione.
Le origini. Storicamente negli anni ’60
Dayhoff e colleghi raccolsero tutte le
informazioni relative alle sequenze degli
aminoacidi e pubblicarono tali dati nell’Atlas of
Protein Sequences and Structure nel 1965.
I dati allora noti potevano essere contenuti in
un semplice dischetto e rappresentavano il
lavoro di un anno di un piccolo gruppo di
ricercatori. Oggi la stessa quantità di
informazioni viene prodotta in un’ora circa. Nel
1982 con l’avvento delle tecnologia della PCR
per il DNA, inizia il progetto sul genoma
umano e il gruppo del Laboratorio Europeo di
Biologia Molecolare inizia a creare un database
trascrivendo le informazioni contenute nelle
riviste. utte le istruzioni necessarie per dirigere
lo sviluppo di un organismo, mantenerlo in
vita e farlo riprodurre, sono custodite
all’interno di un particolare polimero organico
presente in ogni singola cellula di ogni essere vivente, il DNA (DeoxyriboNucleic Acid). A
143
BIOINFORMATICA
discapito della sua relativamente semplice struttura chimica, il DNA possiede
l’importantissima funzione di mantenere e tramandare questa sorta di “codice chimico della
vita”, da sempre criptico ed inaccessibile. Intorno alla metà degli anni '80, una compagnia
chiamata Applied Biosystem, cominciò a vendere una macchina che consentiva, in maniera
rapida ed automatizzata, di effettuare la lettura del DNA in modo da risalire all'informazione
contenuta all'interno della molecola per poterne poi interpretare il significato.
DATA BASE. Il DDBJ, il EMBL e la GenBank rappresentano i data base maggiormente
utilizzati nello studio delle sequenze nucleotidiche o proteiche, sono dei pubblici repertori per
avere informazioni di ordine biologico-molecolare.
La conoscenza dei formati e della strutturazione dei dati è di importanza fondamentale per
gli utilizzatori di queste informazioni. Allo stato attuale il formato dei file di DDBJ, EMBL,
GenBank rimane il formato di elezione per lo scambio delle sequenze a livello internazionale.
Si deve osservare comunque che a livello di utilizzazione informatica di questi data base è
necessario il collegamento a suite di programmi specifici. È allo studio una versione di data
base chiamata ASN.1 (ABSTRACT SYNTAX NOTATION) che dovrebbe sopperire ad alcune
limitazioni per la manipolazione informatica delle sequenze offrendo una strutturazione
analoga per i formati analoghi nei campi simili. Inizialmente gli inglesi stipulano un contratto
di collaborazione con un gruppo americano (Los Alamos National Laboratory) da questa
collaborazione nasce GenBanK. GENBANK è un database sulle sequenze, sui nucleotidi e
sulle proteine della NIH (National Institutes of Health di Bethesda nel Maryland). Ogni unità
di record rappresenta una stringa di RNA o DNA con le relative annotazioni. Tutti i record
nelle GENBANK sono generati dall’immissione diretta delle sequenze da parte dei relativi
autori. Questa banca dati di biologia molecolare è mantenuta dal National Center for
Biotechnology Information (NCBI) al NIH.
Questo data base rappresenta i risultati di una collaborazione con un centro giapponese
(DNA Data base of Japan, DDBJ, che si trova a Mishana) e il Laboratorio Europeo di Biologia
Molecolare (EMBL che si trova in Inghilterra a Hinxton ed è mantenuto dall’European
Bioinformatic Institute). Ognuno di questi centri rappresenta un punto di immissione dei dati
relativi alle sequenze. Attualmente la GenBank viene considerata una banca DNA centrica, e
rappresenta il punto di riferimento nell' ambito della biologia molecolare.
144
BIOINFORMATICA
Rappresentazione simbolica di sequenze.
Si deve fare una importante distinzione sui data base possiamo avere DB Primari che sono
detti anche ARCHIVAL, mentre i secondari sono detti CURATED. I data base primari
rappresentano i risultati emersi dalla sperimentazione in laboratorio, sono quindi i risultati di
un sequenziamento ottenuto a livello di DNA.
Ogni annotazione del DNA e definita come CDS (coding sequence). In molti casi la sequenza
di aminoacidi viene ricavata in quanto difficilmente si attua un sequenziamento a livello
aminoacidico. Si deve comunque prestare molta attenzione nell’uso e nell’interpretazione dei
risultati ottenuti da queste sequenze. La interpretazione della sequenza di proteine da una
sequenza di mRNA non è difficile, ma è necessario determinare il corretto codone di
inizializzzazione.
COME RAPPRESENTARE UNA SEQUENZA DI DNA. Il modo più semplice di
rappresentazione è quello di una stringa di nucleotidi con una serie di tag o identificatori.
>LO4459
GCAGCCACGA …………TATAC
analogamente potremo trovare per una proteina
>P31373
MTLQESDKFA…………………………………………………KQATN
Il formato con il quale si utilizzano le informazioni di biologia molecolare è il FASTA, tale
formato viene utilizzato nei principali programmi di analisi di biologia molecolare.
>171361 gb Lo4459 YSCCYS3A Saccaromicies cerevisiae cystathionine gamma-lyase
(CYS3) gene, complete cds.
GCAGCGA…………………………………………
……………………………………………………………
……………………………………………………………TATAC
Un file FASTA contiene il carattere > che indica l’inizio, un identificatore Lo4459 e una
sequenza di lettere Maiuscole, o minuscole solitamente disposte in righe di 60 caratteri.
Sono inoltre presenti altre informazioni per identificare e caratterizzare la sequenza.
Il formato della GenBank. Il formato di scambio utilizzato per rappresentare la sequenza
è il GBFF che significa GenBank FlatFile. Il file GBFF può essere scomposto in tre parti.
Esempio di GENES.
LOCUS HSAMCC
DATE 07-JUN-1960
DEFINITION Human amphiphysin mRNA, complete cds.
CITATION YAMAR95
SEQUENCE
1
ccaggtgcct actgactcct tcagaaatgt
cagttcctgt cccatgccct taatatttcc
61
cacatgcagg gctctgtgca caatgcgtga
caatggcttt tagat
//
Esempio di REFLIST
D YAMAR95
RA Yamamoto R., Li X., Winter S., Francke U., Kilimann M.W.;
RT Primary structure of human amphiphysin, the dominant autoantigen
RT of paraneoplastic Stiff-Man syndrome, and mapping of its gene
RT (AMPH) to chromosome 7
RL Hum. Mol. Genet. 4:265-268(1995).
I
145
BIOINFORMATICA
//
HEADER. La parte iniziale è la più specifica del file, il primo elemento del file è LOCUS che
indica il nome del locus, dal punto di vista storico il nome dovrebbe rappresentare anche il
nome del record. Solitamente è un insieme di lettere e numeri (massimo 10) ad esempio
HUMBB indica il locus della beta-globulina umana.
LOCUS AF10325 3291 bp DNA INV 08-JUL-1999
Al fine di evitare errori o confusioni viene assegnato anche un numero di accesso indicato
come un insieme di caratteri alfanumerici, questo numero è unico e specifico.
La lunghezza della sequenza viene indicata con il numero di coppie (da 1 a 350,000), in
pratica si trovano sequenze con oltre 50 bp.
Il termine DNA indica il tipo di molecola utilizzata nella determinazione della sequenza, i tipi
possono essere : DNA, RNA, tRNA, rRNA, mRNA e uRNA.
Di seguito vengono riportate tre lettere che hanno il significato di facilitare la classificazione
in termini tassonomici o di altre classificazioni, e costituisce un sistema di divisione
funzionale. La data indica il giorno in cui la sequenza è stata resa disponibile.
DEFINITION. Con questo termine si riportano le informazioni di tipo biologico relative al
record. In generale esiste un certo accordo tra i diversi data base circa la strutturazione
della definizione.
Esempio :
DEFINITION Genus species protein X (XXX) gene
Con le seguenti possibilità
nuclear gene encoding mitocondrial protein
nuclear gene encoding chloroplast protein
chloroplast gene encoding mitocondrial protein
In ambito di collaborazione fra i diversi data base il nome completo del genere o della specie
viene riportato nella linea di definizione (esempio H.sapiens per Homo sapiens). Solo un
organismo sfugge a questa definizione si tratta del virus della immunodeficienza che è
rappresentato nella definizione come HIV1 e HIV2.
Il Numero di accesso, rappresenta la chiave primaria ed univoca di accesso a un determinato
record. Questo numero viene anche citato nella pubblicazione relativa e anche se la
sequenza viene aggiornata il numero non cambia. Le possibilità sono di avere una lettera
Maiuscola e 5 numeri, oppure da due lettere e 6 numeri.
Possiamo trovare anche un numero di accesso secondario, che costituisce il retaggio di un
vecchio sistema di classificazione.
Il NID rappresenta l’identificatore genetico (gi) per i nucleotidi, il prefisso (d, e oppure g)
indica il data base che viene utilizzato.Semplicemente un numero di gi indica un unico
identificatore associato ad una unica sequenza, se la sequenza cambia, si modifica anche il
relativo gi, mentre il numero di accesso non si modifica.
ACCESSION
AF010325
NID
g2245686
VERSION
AF010325.1 GI: 2245686
Al fine di facilitare la ricerca esiste anche la versione, nel nostro caso si ha la prima versione
associata al NID g2245686.
KEYWORDS. Rappresentano un retaggio storico, attualmente l'uso è scoraggiato in quanto
molti autori hanno inserito dei termini non contenuti nel vocabolario del data base; inoltre,
l’inserimento delle parole chiave non è stato applicato in modo uniforme all’intero data base.
SOURCE. Indica il nome comune o il nome scientifico dell’organismo, in molti casi sono
presenti
anche
informazioni
source /organism= “Drosophila melanogaster”
/map=”2-106.8 cM, 60B1-“
relative
alla
tassonomia.
In
/clone=”P1-Phage DS00543”
questo caso si prevede un
/cromosome=”2”
collegamento con la pagina della
Tassonomia del NCBI (National Center for Biotechnology Information).
Ogni records della GenBank riporta una referenza bibliografica, e un link alla pubblicazione
di MEDLINE. Nella parte finale sono riportati i commenti e le note, nel passato si trovavano
anche precise indicazioni sugli autori come ad esempio gli indirizzi di posta elettronica o
specifiche URL, attualmente questa tendenza viene scoraggiata, in quanto gli indirizzi
146
BIOINFORMATICA
elettronici tendono a cambiare con una rapidità maggiore rispetto agli indirizzi postali. A
livello scientifico MEDLINE rappresenta la banca dati bibliografica più importante, ogni
articolo viene registrato con un codice di identificazione (MUID), attraverso questo numero è
facile risalire all'articolo e alla rivista.
REFERENCES
AUTHORS
1 (bases 1 to 3291)
Morcillo,
P.,
Rosen,
C.,
Bayles, M.k
CHIP,
a
widely
expressed
chromosal protein required
for
remote
enchancer
activity and segmentation in
Drosophila.
J.Biol.Chem.
269
8(19),
14064-14073 (1994)
94245725
7514599
Recentemente la NCBI, con MEDLINE e
altri editori ha introdotto un nuovo
identificatore chiamato PubMed (PMID)
TITLE
che contiene sia gli articoli pubblicati sia
anche articoli non ancora pubblicati. È
l’unica rappresentazione comune a tutti i
records della GenBank, contiene inoltre
una serie di qualificatori legali e alcuni
JOURNAL
qualificatori obbligatori (esempio il tipo
di organismo).
MEDLINE
FEATURE TABLE. Rappresenta la parte
PUBMED
centrale del GBFF record, e costituisce la
parte di maggior rilievo per la rappresentazione biologica del record.
FEATURES Location/Qualifiers. Il qualificatore dell’organismo può essere descritto come
genere e specie, sovente l’organismo viene descritto a livello di subspecie.
CDS. Le CDS costituiscono una serie di
CDS
140………1897
istruzioni per leggere e interpretare la
/gene=M-Delta-3”
sequenza.
Leggendo
si
hanno
/codon_start=1
informazioni, in questo caso della
/db_xref=”PID:e322087”
posizione degli aminoacidi. È da notare la
/db_ref=”PID:g2415691”
presenza di indicazioni per avere un
/translation=”MVSLQVSPLLSTQTL…………
………………………………………………………………… ……YAREA” cross-references verso data base esterni,
con l’indicazione del PID (identificatore
per le proteine) e con il relativo gi.
Il prefisso e indica la banca dati EMBL, mentre g porta alla GenBank. Questo avviene perché
ogni banca dati mantiene un proprio identificatore.
Nella GeneBank si trovano due PDI per
CDS
140………1897
indicare che record proviene da EMBL;
/protein_id =”AAA12345.1”
questo sistema tende ad ingenerare una
/db_xref=”GI:2415691”
certa confusione. I sistemi tendono a
/db_ref=”PID:e322087”
divenire meno ambigui come nell’esempio
/db_xref= PID:g2415691”
riportato, ma attualmente convivono
diversi modi di espressione dei records. Il termine protein id rappresenta l’identificatore delle
proteine o numero di accesso che nel caso deriva dal database delle sequenze nucleotidiche.
L’identificatore è costituito da tre lettere e cinque numeri, seguiti da un ulteriore numero che
informa sulla versione. La versione incrementa di una unità quando viene aggiornata la
sequenza; questo sistema permette di vedere l’evoluzione osservando ad esempio i records
precedenti.
INFORMATION RETRIEVAL NEI DB. Attualmente la GenBank contiene 1.6 milioni di
records che coprono circa 1 bilione di basi nucleotidiche. Uno sforzo è stato fatto quindi per
permettere al ricercatore di accedere al data
To: [email protected]
base e di interrogarlo direttamente. Il modo
Subject: Complex Query
considerato più semplice per accedere alle
DATALIB swissprot
informazioni è quello di formulare una
Begin
interrogazione attraverso la posta elettronica.
“histone H1” AND “Saccharomicies”
Con questa modalità si attiva un server
OR “Schizosaccaromicies”
chiamato RETRIVE. Il server quindi attiva la
ricerca che può essere per singola parola
Schema di richiesta con posta elettronica.
chiave o una ricerca più complessa con
l'utilizzo di molte parole chiave associate a operatori Booleani.
147
BIOINFORMATICA
L'invio di una richiesta ad un server di posta richiede che nella compilazione della richiesta si
utilizzi un formato standard di interrogazione, come riportato nell'esempio.
Per primo troviamo l'indirizzo di posta elettronica a cui dobbiamo inviare la nostra richiesta,
il soggetto della richiesta non è strettamente indispensabile per il server, ma ci viene chiesto
generalmente dal nostro programma di posta elettronica. L'inizio del messaggio è DATALIB
che rappresenta la richiesta di interrogazione verso uno specifico data base. Il termine
BEGIN indica che non esistono altri parametri della ricerca e che i termini sotto riportati
costituiscono le parole chiave da ricercare.
Gli operatori Booleani sono AND, OR, NOT che possono essere usati singolarmente e
congiuntamente. Le " " indicano che la frase deve essere letta congiuntamente. Chiaramente
l'utilizzo di questo sistema di interrogazione pone dei limiti, primo fra tutti quello di dovere
effettuare delle interrogazioni multiple alle diverse DATLIB, quindi un data base alla volta. La
consapevolezza dell'esistenza di una serie numerosa di connessioni naturali ha indotto alla
ricerca di un motore in grado di interrogare per una precisa entità biologica senza dover
ricorrere ad un processo sequenziale e legato ai sistemi specifici di interrogazione del
database. La risposta a queste esigenze è il sistema chiamato ENTREZ, creato e gestito dalla
NCBI. Il vantaggio di questo sistema consiste nella possibilità di utilizzare diverse
piattaforme di avere un accesso integrato ai records PubMed (Medline). Con una sola
richiesta di interrogazione QUERY è possibile ottenere informazioni relative a: sequenze di
Nucleotidi, proteine, struttura tridimensionale, mappaggio.
ENTREZ offre due possibilità di accedere e connettersi ad un data base:
1-neighbonring
2-hard links
Neighbounring. Il primo sistema risponde alla interrogazione in base alle somiglianze o
vicinanze ed è basato su un approccio statistico di similarità. I sistemi con i quali si può
procedere sono diversi.
BLAST (Basic Local Alignment Search Tool) è un algoritmo di ricerca introdotto nel 1990 da
Altschul et al., che si basa sull'allineamento delle sequenze e determina un punteggio HSPs
(High Scoring segment Pairs).
Programma
Database
Blastp
Proteine
Blastn
Blastx
Nucleotidi
Nucleotidi
Tblastn
Proteine
Query
Protein
Note
Utilizza una matrice di sostituzione per
trovare le relazioni di distanza.
Nucleotidi
Crea lo scoring, ma non la distanza
Protein
Utile per l’analisi delle nuove sequenze
di DNA
Nucleotidi
Utile per trovare le regioni nelle
sequenze del database
Nucleotidi
Utile per le analisi con EST
Search Tools). Creato nel 1995 da Madej et al. consente di
utilizzando un sistema di analisi complesso che prevede tre
Tblastx
Nucleotidi
VAST (Vector Alignment
confrontare le coordinate
passaggi1-Identifica le coordinate di tutte le catene alfa e beta della proteina e le trasforma in
vettori.
2- Un algoritmo cerca di individuare gli allineamenti ottimali del vettore, analizzando le
coppie di elementi strutturali dello stesso tipo, con medesima orientazione. Si ottengono
quindi delle substrutture significative dal punto di vista statistico e successivamente si
confrontano con delle proteine scelte casualmente.
3- Un affinamento viene dato impiegando la
tecnica di Montecarlo per definire i residui tali da
ottimizzare l'allineamento strutturale. Con questo
approccio è possibile trovare delle relazioni di tipo
strutturale e probabilmente anche funzionale che
legano le proteine. Si deve ricordare comunque
che il metodo VAST non è il miglior metodo per
148
BIOINFORMATICA
determinare le similarità strutturali. La riduzione ad una serie di vettori induce una perdita di
informazioni che con i metodi di HOMOLOGY MODEL BUILDING al contrario vengono
conservate.
Si deve segnalare come sia molto importante
l'uso corretto delle KEYWORDS, per dare un
maggior peso ad un termine rispetto ad altri
termini. Si definisce questa un tecnica di
ponderazione delle parole, MEDLINE utilizza un
testo libero dove la grammatica e la sintassi non
sono sempre definite. ENTREZ impiega un
metodo di ricerca chiamato relevance pair model
of retrieval che attribuisce un peso diverso alle
parole.
Consideriamo i seguenti titoli: BRCA1 as a
Genetic Marker for Breast Cancer e Genetic
Factors in the Familial Transmission of the BRCA1
Possibilità di collegamenti in MEDLINE
Gene.
Entrambi gli articoli contengono i termini BRCA1 e Genetic e quindi supponiamo che
entrambi gli articoli trattino dello stesso argomento, ma nel primo articolo le informazioni
contenute nel titolo del lavoro sono più specifiche (Breast Cancer). Le parole chiave che
vengono reperite direttamente nel titolo hanno un punteggio maggiore rispetto a quelle
ritrovate nel riassunto, le parole vicine assumono un valore più importante di non quando
non siano separate o distanti all'interno di una frase. Inoltre il peso di una parola dipende
anche dalla frequenza con cui compare in tutto MEDLINE.
Categoria
Medline
Nucleotidi
Proteine
Struttura
Genoma
Testo
OK
OK
OK
OK
OK
Autore
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
OK
EC numero
OK
OK
OK
OK
Nome chimico
OK
OK
OK
OK
OK
OK
Rivista
Accession Numb
Data
pubblicazione
Medical Subject
Index
Nome
Organismo
Simbolo Gene
Nome proteina
Key words
sequenza
CDS
Proprietà
OK
OK
OK
OK
149
OK
BIOINFORMATICA
Hard Link. È un sistema basato sulla creazione di collegamenti con i data base con semplici
connessioni. Lo schema illustra il meccanismo di funzionamento. Con questo sistema si
ottiene una mole di informazioni notevole con una sola interrogazione, quindi con un
risparmio di tempo.
L'attuale versione disponibile è conosciuta come www Entrez e può essere interrogata
direttamente in rete utilizzando sia Internet Explorer che Netscape. Il sistema o il modello di
ricerca è definito dal NCBI come una classe di oggetti chiamata SeqID, questa necessità
nasce dal dover integrare informazioni ed in particolare sequenze che sono contenute e
archiviate in diversi data base. Come si è facilmente intuito PIR, SWISS-PROT e il data base
delle sequenze nucleotidiche usano il termine accession number con lo stesso formato dei
dati. Ad esempio A10234 di PIR, e A10234 di SWISS-PROT indicano sovente cose diverse,
mentre all'interno di DDBJ, EMBL e GenBank il contenuto di A10234 è lo stesso anche se
possono sussistere differenze riguardo al formato. Esiste quindi un sistema PDB SeqID che
contiene il nome della molecola e la catena ID per identificare una solo ed unica sequenza.
Esistono poi dei sistemi di identificazione delle sequenze che prevedono come ad esempio
nelle mappe genetiche l'assegnazione di un ID generale (SeqID general), mentre nel
processo di introduzione della sequenza nel data base viene inserito un ID locale (SeqID
local).
BIOSEQ. Bioseq letteralmente la sequenza biologica è l'elemento centrale del modello del
NCBI. Per funzionare il Bioseq deve avere almeno un SeqID.
Per utilizzare Bioseq non è necessario avere
tutta la molecola sequenziata, è possibile avere
sequenziato gli esoni e non gli introni. Il
meccanismo di funzionamento è legato alla
creazione di un sistema lineare di coordinate per
la sequenza in esame.
Si presentano quindi due possibilità quando si
effettua una confronto tra due sequenze
Le sequenze sono identiche
Le sequenze sono diverse
La possibilità di analizzare le sequenze utilizzando le relative coordinate può permettere di
utilizzare le differenti classi di Bioseq.
VIRTUAL BIOSEQ - Si utilizza quando conosciamo il
tipo di molecola, la lunghezza e la tipologia (lineare o
circolare) ma non la sequenza. La lunghezza viene
ricavata dall'analisi delle bande sui gel elettroforetici.
RAW BIOSEQ. La lunghezza è conosciuta si
confrontano le diverse righe.
SEGMENTED BIOSEQ. Non sono contenute sequenze
delle righe, ma solo gli esoni sono conosciuti, gli esoni
vengono rappresentati utilizzando un sistema Raw,
mentre gli introni sono rappresentati con Virtual Bioseq.
DELTA BIOSEQ. Si basa su confronti con SeqID.
MAP
BIOSEQ.
È
utilizzata
per
dare
una
rappresentazione fisica della mappa genetica.
Per maggiori informazioni sui programmi si rimanda a:
BLAST. Il programma introduce una
CLUSTAL ftp://ftp.ebi.ac.uk/pub/software/
serie importante di affinamenti per
DOTTER
ftp://ftp.sanger.ac.ak/pub/dotter/
l'analisi dei dati, aumenta la velocità
LALIGN
ftp://ftp.virginia.edu/pub/fasta/
della ricerca e offre un importante
BLAST
ftp://ncbi.nlm.nhi.gov/blast/
supporto statistico alla valutazione
SEG
ftp://ncbi.nlm.nhi.gov/pub/seg/
delle risultanze. Il programma si basa
sulla statistica di Altschul et al.,1990.
Esistono diverse versioni del programma, la 1.4 e successive; dalla versione 2.0 si ha anche
un esplicito trattamento per i gaps. Nel 1997 il programma è stato completamente riscritto e
con un cambiamento dei parametri. Fare attenzione che la versione 2.0 può essere confusa
150
BIOINFORMATICA
con il programma WU-BLAST della Università di Washington che è chiamato BLAST2. In
realtà in BLAST noi possiamo trovare 5 diversi programmi che interrogano banche dati
diverse. Per ricerche di routine possiamo utilizzare un database che contiene la collezione di
DNA e proteine che ha lo scopo di ridurre la ridondanza.
Programma Database Interrogazione Note
Blastp
Proteine
Proteine
Utilizza una matrice di sostituzione per
trovare le relazioni di distanza. È possibile
usare anche filtri SEG.
Blastn
Nucleotidi
Nucleotidi
Non sono determinate le relazioni di distanza.
Blastx
Nucleotidi
Proteine
Tblastn
Proteine
Nucleotidi
Utile per trovare regioni non annotate.
Tblastx
Nucleotidi
Nucleotidi
Utile per le analisi EST.
Utile per l'analisi di nuove sequenze di DNA.
TERMINI E SIGLE UTILIZZATE IN BLAST
Nr
Non ridondante
month
Subset di nr, modificata negli ultimi 30 giorni
swissprot Data base Swiss-Prot
pdb
Sequenze di amino acidi descritte con le coordinate atomiche
yeast
Set di proteine codificate dal genoma di S. cervisiae
ecoli
Set di proteine codificate dal genoma di E. coli
Est
Divisione della GenBank (espressed sequence tags)
Sts
Divisione della GenBank (sequence tagged sites)
htgs
Divisione della GenBank (high throughput genomic sequence)
Gss
Divisione della GenBank (genome survey sequence)
mito
Set di proteine codificate dal genoma mitocondriali di vertebrati
Alu
Collezione di sequenze ripetute
vector
Collezione di vettori di clonaggio
Noi vogliamo determinare quante sequenze omologhe esistono in un database NR (non
ridondante), molto semplicemente possiamo copiare la sequenza nel box di testo del NCBI
BLAST se premere il bottone submit.
La sequenza dei dati è riportata nel formato FASTA
> Dictyostelium discoideum myosin (myoI) gene, exons 1 and 2.
aatcaacaaa acttatcatt caatatctcg ccgcaagaac aaatcgtcat tcccaagtcg
aacaaatgat tgttgaatct tctccaatct tggaagcttt tggtaatgca aaaacaatta
gaaataataa ctcttctaga tttggtaaat ttattgaaat tcaatttaat agagaaggtc
atatttctgg tgctagaatt ataaattgta agtttttcca gaaaaaaaag aaaaaaaaaa
aaaaaaaaaa aaattgagta ttaatatttt tttatttcac tttttttttt catcaaccct
cttgtcaaaa ttttttattt tttttatttc tacaaattct atcaaaccat accaaaaaaa
aaaaagactt attagaaaaa tctagaattt cacatcaagc tagttca
(L35321 nel nostro esempio) mentre il gi è il numero di
formato NCBI, e nella nostra sequenza corrisponde a
608629. Analizziamo ora la tipologia dei risultati
osservando una pagina di BLAST. Successivamente possiamo inserire la parte di una
sequenza, ad esempio possiamo inserire solo le ultime 82 basi di L35321.
A
B
C
D
E
La prima linea indica dove l'algoritmo di BLAT è stato pubblicato
Nota di richiamo
Il nome della richiesta
Nota sul database richiesto (nr)
L'High Score è un numero che viene calcolato seguendo uno schema :
Se esiste una corrispondenza si aggiungere 5
Se non esiste una corrispondenza
151
BIOINFORMATICA
F
G
H
I
L
due caratteri adiacenti sottrarre 4
due caratteri con una regione sottrarre 1
Il valore P(N) offre una indicazione sulla corrispondenza delle sequenze, quindi la probabilità di avere una buona o
cattiva corrispondenza delle sequenze; il valore varia da 0 a 1.
TERMINOLOGIA E SIGLE
gb sequenza ritrovata nel Database GenBank.
L35321 numero di accesso in GenBank.
DDIMYOIA è la sigla di Dictyostelium discoideum myosin (myoI) gene, exons 1 e 2.
lo HighScore è 338
P(N) è un valore piccolo quindi un buon candidato.
N è uno.
emb sequenza ritrovata nel database EMBL.
X07234 è il numero di accesso di EMBL.
SASSV1XX è la sigla del provirus.
Lo HighScore è 112
P(N) è un valore elevato quindi non è un buon candidato.
N è uno.
Le informazioni mostrate in F sono ripetute con delle ulteriori informazioni. La lunghezza completa viene riportato e
nel nostro caso risulta 407. Lo score è di 338. Il valore Expect corrispondente a P(N) corrisponde a 4.0e-19 Ci sono
85% di Identities (in assoluto da 70 of 82). Utilizzando una sequenza di DNA noi osserviamo lo stesso numero di
Positivi e Identità. Solo se utilizziamo una sequenza di aminoacidi possono esistere differenze tra i due
parametri. Valori positivi indicano che gli aminoacidi appartengono allo stesso gruppo. Per ultimo viene mostrata
l'interrogazione. Notare che NNNNs è la sequenza della interrogazione. Questa regione viene identificata come
regione a bassa complessità e viene quindi ignorata nella ricerca per la omologia della sequenza. Possiamo
osservare come la sequenza di interrogazione sia parte della sequenza Sbjct. Questa sequenza parte a 326 e
termina a 407.
Le informazioni riportate in F sono ulteriormente completate: Ad esempio il nome è ora completo. La lunghezza
della sequenza completa è di 15.465. Lo Score è 112. Il valore atteso è Expect (2.5) e risulta maggiore del valore
riportato per P(N): 0.92 Esistono il 60% di Identities (assoluto tra 32 di 53). Si trova lo stesso numero di
Positives. Tutti i positivi provengono dallo stesso gruppo di aminoacidi. Questa regione viene identificata come
regione a bassa complessità e viene quindi ignorata nella ricerca per la omologia della sequenza. Possiamo
osservare come la sequenza di interrogazione NON sia parte della sequenza Sbjct. Questa sequenza parte da 326
e termina a 407. La sequenza di interrogazione corrisponde alle lettere da 3 a 55 collegata alle basi da 5789 a
5841.
In questa sezione appaiono una serie di parametri V-Informazioni relative al massimo numero di hits nel database
che vengono forniti nel programma di output (vedi anche A). Il valore di default nel NCBI è 100. B-Numero
massimo di hits nel database per i quali viene fornito un allineamento nel programma di output (vedi G e H). Il
valore di default è 50. H-Se H è uguale a 1, viene stampato anche un istogramma. Il valore di default è 0 che non
produce istogrammi. Lambda-Lambda è un parametro della statistica di Karlin-Altschul. Dipende dalla matrice
usata per calcolare il punteggio (osserva anche K). K-K è un parametro di Karlin-Altschul che dipende dalla
matrice di scoring utilizzata. Si osserva che nelle interrogazioni per i nucleotidi utilizzando il programma blastn i
valori di K e Lambda non sono importanti in quanto dipendono dalla distribuzione dei residui nella sequenza che
risulta equiprobabile 0.25/0.25/0.25/0.25 per A/C/G/T I valori dei parametri di Karlin-Altschul negli altri casi
dipendono dal sistema di scoring utilizzato (parametri M e N). H-H rappresenta l'entropia e il rumore di fondo della
frequenza dei residui, rappresenta un valore statistico riportato dal programma BLAST. E-Corrisponde al valore
atteso, stabilisce il livello di significatività dell'allineamento. Nel modello di interrogazione di Karlin e Altschul,
indica il numero di corrispondenze che ci si dovrebbe attendere sulla base di una estrazione randomizzata. Il valore
di default è 10, il campo di variazione di E è 0 < E < = 1000. S-Il parametro rappresenta lo score al quale un
singolo allineamento soddisfa il livello soglia di E. Il valore di default dipende dal valore E. T-Rappresenta il valore
limite per la ricerca di parole di lunghezza W in un database. Se il valore T è 0, solo i matches con una distanza 0
vengono ricercati. X-X è un numero positivo che rappresenta il massimo di drop-off. Per blastn, il valore di default
di X è il minimo score che rappresenta 20 bits di informazione, o una riduzione del livello statistico della
significatività di un fattore 2.
Alla fine di una ricerca Blast vengono fornite alcune ulteriori informazioni
DATA BASE UTILIZZATI: Database: Non-redundant GenBank+EMBL+DDBJ+PDB sequences.
QUANDO È STATA FATTA LA RICERCA: Posted date: May 25, 1998 5:31 AM
QUANTE LETTERE SONO CONTENUTE NEL DATABASE: # of letters in database: 709,610,471
QUANTE SEQUENZE SONO CONTENUTE NEL DATABASE: # of sequences in database: 342,388
QUANTI HITS SONO STATI EFFETTUATI (first stage): Number of Hits to DB: 29964 Si ripete il numero delle
sequenze: Number of Sequences: 342388
Si ripete il numero di Hits (first stage): Number of Hits to DB: 29964
QUANTI HITS HANNO AVUTO SUCCESSO (second stage): Number of successful extensions: 3045
QUANTE SEQUENZE HANNO AVUTO UN VALORE SUPERIORE ALL'E(xpected): Number of sequences better
than 10: 2
TECNICHE DI ALLINEAMENTO. Una caratteristica comune a tutte le discipline della
biologia è l'analisi comparativa per mettere in luce delle differenze. È noto a molti come le
intuizioni di Darwin nascessero dal confronto della morfologia degli animali presenti sulle
isole Galapagos e come questi confronti consentissero di postulare la teoria della selezione.
Sostanzialmente e concettualmente lo stesso tipo di analisi viene realizzato oggi per
confrontare le sequenze dei geni e delle proteine.
152
BIOINFORMATICA
Questa analisi viene realizzata a livello di singola base o aminoacido con una finalità di
inferire sulla struttura o sulla funzione di una determinata struttura. Il metodo
maggiormente utilizzato è quello definito come allineamento delle sequenze.
Confronto di sequenze.
Esistono due possibilità: si confrontano solo due sequenze (pairwise alignments), il
confronto avviene con il confronto di diverse sequenze (multiple alignments); dobbiamo
segnalare come negli ultimi 30 anni si è osservata una esplosione delle metodologie di
analisi delle sequenze, tanto che si parla del fenomeno come " big bang of sequence
information expansion".
FINALITÀ. Le finalità dell'allineamento delle sequenze sono quelle di offrire ai ricercatori
elementi sufficienti nella similarità per giustificare la similarità ed inferire sulla omologia o
sull'esistenza di funzione È necessario precisare il significato di alcuni termini:
Similarità (similarity)= rappresenta una quantità, solitamente espressa come %
che indica la percentuale di identità tra due misure.
Omologia (homology) = rappresenta la conclusione e consente di affermare ad
esempio che due geni possiedono una storia ancestrale comune.
Le differenze dell'allineamento possono essere dovute a 3 cause diverse:
SOSTITUZIONE
INSERIMENTO
DELEZIONE
In una situazione ideale il confronto
di
due geni con la tecnica
dell'allineamento se non esiste
identità significa che esiste una
sostituzione.
Le
posizioni
che
vengono
conservate
hanno
o
possono
avere
un
significato
funzionale. L'allineamento consente
di vedere come in certe regioni gli
specifici aminoacidi siano altamente
conservati, e come probabilmente
questi residui siano fondamentali
Struttura modulare di due proteine.
per il mantenimento della funzione
strutturale. Questa strategia di allineamento si definisce come global alignment.
Sfortunatamente non tutte le proteine mostrano un allineamento di tipo globale, ma sembra
esista un sistema definito come a mosaico o a dominio modulare. Se analizziamo la struttura
di due proteine coinvolte nel meccanismo di coagulazione: la prima F12 rappresenta il
fattore di coagulazione XII, mentre il PLAT rappresenta l'Attivatore del Plasminogeno.
153
BIOINFORMATICA
Queste proteine presentano una struttura modulare; F1 e F 2 sono moduli che si ripetono, E
indica un modulo che è simile al Epidermal Growth Factor,
mentre K è un modulo conosciuto come "kringle domain", la
parte definita come catalitica contiene una serie di proteine
coinvolte nel sistema di coagulazione. L'analisi di strutture
proteiche di questo tipo avviene utilizzando un programma
chiamato DOTTER che è utile per individuare complesse
relazioni che interessano regioni multiple di similarità locale
e sfrutta un meccanismo di confronto matriciale.
I METODI PER LO STUDIO DELL'ALLINEAMENTO. I
possibili
e
diversi
allineamenti
possono
diventare
estremamente elevati e quindi è molto importante trovare i
metodi per identificare il migliore allineamento o la serie
degli allineamenti migliori.
A livello di calcolo computazionale si tratta semplicemente di
individuare il miglior percorso possibile. Sono stati sviluppati
in questo settore numerosi algoritmi che si basano sulla
assegnazione di un punteggio (score) ad ogni possibile
percorso (allineamento). Normalmente possiamo sommare
l'incremento del contributo di ogni parte comune del
percorso. Esistono anche sistemi molto sofisticati per
assegnare un certo punteggio, ma consideriamo ora di dare un incremento positivo quando i
residui sono identici e possiamo dare un punteggio negativo quando esiste una sostituzione
o esiste un gap. In funzione di questa definizione il migliore allineamento è associato con un
punteggio più elevato.
Questo algoritmo è conosciuto come algoritmo di Needleman-Wunsch (1970) e si inserisce
in una strategia definita come Dynamic Programming. Una modifica venne proposta nel
1981 da Smith e Waterman. Questo algoritmo ha avuto un ulteriore affinamento con Atschul
e Erikson 1986. Finalmente Huang nel 1990 propone un algoritmo chiamato SIM, che viene
nel 1996 inserito in un programma chiamato LALIGN (distribuito con il pacchetto FASTA).
Il sistema di punteggio per le proteine è concettualmente molto semplice, prevede il
confronto tra gli aminoacidi con una matrice, per aumentare la sensibilità possiamo
introdurre una matrice di sostituzione. È noto come certi aminoacidi possano essere
sostituiti facilmente in una proteina avendo delle proprietà fisiochimiche simili. Si parla in
questo caso di sostituzione conservativa, come nel caso della valina con l'isoleucina (piccole
e idrofobiche), la serina e la treonina (entrambe polari). Quando calcoliamo il punteggio
dell'allineamento, diamo un punteggio maggiore agli aminoacidi identici, ma un punteggio
proporzionalmente maggiore viene assegnato alle sostituzioni conservative rispetto a quelle
non conservative. Possiamo anche attribuire un punteggio diverso per il confronto di
sequenze molto simili in specie molto vicine, rispetto a sequenze divergenti di specie molto
distanti tra di loro. Come intuiamo facilmente con questo approccio possiamo ottenere una
matrice dello score che identifica i punteggi delle diverse combinazioni degli aminoacidi. La
prima matrice di sostituzione fu quella basata sul concetto del modello PAM (point-acceptedmutation) di Dayhoff nel 1978. Una unità PAM viene definita come una unità di divergenza in
cui 1% degli aminoacidi sono cambiati.
154
BIOINFORMATICA
Se il cambiamento degli aminoacidi è
semplicemente casuale, la frequenza di ogni
A
sostituzione viene determinata semplicemente
come somma delle frequenze dei differenti
R
5
aminoacidi. Tale frequenza è definita come
N
6
0
BACKGROUND FREQUENCIES.
D
6
-2 1
In alcune proteine è stato osservato come le
C
-3 -3 -3 9
sostituzioni avvenissero in alcune zone e che
Q
1
0
0 -3 5
queste sostituzioni non compromettevano la
funzionalità della proteina, queste mutazioni
E
5
0
0
2 -4 6
vengono quindi accettate durante il processo di
G
-2 0 -1 -3 -2 -2 5
evoluzione.
H
0
1 -1 -3 0
0 -2 8
Queste sostituzioni vengono chiamate TARGET
FREQUENCIES. Dayhoff fu il primo che impiegò
una matrice in cui il punteggio è proporzionale
A R N D C Q E G H
al logaritmo naturale del rapporto tra TARGET e
A
2
BACKGROUND. A livello operativo si è stabilita
la distanza di 250 PAM. Quindi si è definita una
R
-2 6
matrice PAM250. Come al solito le cose sono
N
2
0
0
complicate, infatti come possiamo immaginare
D
4
0 -1 2
siamo in grado di costruire diverse matrici di
C
-2 -4 -4 -5 12
divergenza con valori di PAM più o meno
Q
0
1
1
2 -5 4
elevati, esiste infatti la possibilità di avere
E
4
0 -1 1
6 -5 2
PAM200 che trovano impiego quando le
sequenze sono supposte molto simili. La
G
5
1 -3 0
1 -3 -1 0
matrice di sostituzione BLOSUM è costruita
H
-1 2
2
1 -3 3
1 -2 6
nello stesso modo, ma con una diversa
strategia nella determinazione della frequenza target.
Queste matrici sono dovute a Henikoff nel 1991, e come nel caso delle matrici PAM si hanno
delle numerazioni. Ad esempio una BLOSUM62, una BLOSUM30, BLOSUM90.
Rimane ancora da risolvere una difficoltà, come valutiamo gli inserimenti e gli eventuali
GAP.
Diverse sono le strategie che possono essere adottate per risolvere questa difficoltà e
penalizzare l'esistenza di GAP. I diversi metodi tendono a penalizzare i GAP introducendo
due parametri: il valore G, spesso chiamato gap opening penality e un parametro L definito
come gap extension penality che tiene conto della lunghezza del GAP. I valori che si
ottengono sono empirici e non esiste una teoria che consenta di effettuare una scelta
ragionata di questi valori solitamente G varia da 10-15, mentre L varia da 1-2 (valori per
BLOSUM62).
A
4
-1
-2
-2
0
-1
-1
0
-2
R
N
D
C
Q
E
G
H
TECNICHE DI ALLINEAMENTO MULTIPLO. Le recenti scoperte nella genetica molecolare
hanno portato alla individuazione di nuove proteine, e come conseguenza è nata la necessità
di allineare le diverse proteine per cercare di comprenderne la funzionalità. La ricerca di
allineamenti multipli scaturisce dalla necessità o dalla volontà di rispondere a molti quesiti
biologici necessari nello sviluppo scientifico della medicina. Possiamo considerare ad esempio
che lo studio degli allineamenti multipli possa offrire informazioni utili per lo studio evolutivo
di una proteina analizzandone l'albero filogenetico. Se immaginiamo la struttura di una
proteina come costituita da una serie di piccoli mattoni, ci è facile dire che le strutture
riportate siano diverse, ma se osserviamo con maggiore attenzione percepiamo che le due
sequenze sono speculari tra di loro.
I biochimici hanno rilevato come in
proteine simili ci possano essere delle
regioni altamente conservate e possiamo
allora
comprendere
come
il
mantenimento di una conformazione
155
Inversione di sequenza.
BIOINFORMATICA
spaziale sia fondamentale per il mantenimento funzionale di una proteina.
Un esempio molto appropriato sull'impiego della bioinformatica genetica è rappresentato
dalla malattia molto nota come il diabete, malattia per la quale
l'organismo umano non è in grado di produrre una quantità
sufficiente di insulina. La cura più efficace è quindi quella di
fornire al malato dell'insulina esogena. Questa insulina veniva
prima estratta dal suino, attualmente possiamo utilizzare i batteri
per produrre l'insulina in quantità e qualità soddisfacenti.
Immagine dell'insulina umana realizzata con il programma
RASMOL. Le due catene vengono colorate con colori diversi. Dati
ricavati da Protein Data Bank, ID codes: 1HIU.
Allineamento della sequenze dell’insulina umana e animale.
Le immagini riportate indicano il motivo per cui si è scelto il suino per estrarre l'insulina.
L'identità delle sequenze è per il 94% con il coniglio, 89% per il suino, e 87% per il bovino.
La comprensione e la costruzione di programmi che consentano di definire l'allineamento di
proteine o delle relative sequenze è una impresa complessa; i programmi attuali si basano
su un concetto molto semplice chiamato progressive alignement, ideato da Sankoff nel
1975. L'idea dell'esistenza di un allineamento dipende dalla contemporanea esistenza di una
relazione biologica fra le proteine, o meglio dall'esistenza di una relazione filogenetica tra le
proteine. Esistono differenti algoritmi che risolvono il problema ma con approcci differenti e
sviluppi nelle procedure di calcolo diversificati. Parliamo di allineamenti multipli quando
confrontiamo più di due sequenze.
La BSE (Bovine Spongiform Encephalopathy) conosciuta anche come malattia della mucca
pazza, scrapie e CJD (Creutzfeldt-Jakob-Disease) sono tre malattie che sono relativamente
simili e possono colpire i bovini, gli ovini e l'uomo (nel dicembre 1997, il premio Nobel venne
conferito a Stanley Prusiner, per le ricerche sul prione). La malattia non sembra essere
156
BIOINFORMATICA
dovuta ad un virus, batterio, fungo ma ad una sorprendente proteina chiamata prione.
Questa proteina corrisponde ad un gene che si trova nel genoma di tutti i vertebrati
dall'uomo al pesce. Normalmente questa proteina agisce a livello del sistema nervoso con un
meccanismo non completamente conosciuto. Il gene è piccolo, consiste in 771 nucleotidi che
producono una proteina di 257 aminoacidi, tale proteina viene espressa in molti, ma non
tutti i tessuti animali, solitamente all'esterno della membrana cellulare. Il gene è stato
sequenziato in circa 70 specie per stabilire quali siano le differenze nella struttura al fine di
comprendere l'esistenza di barriere tra le specie.
Come possiamo ora conoscere le sequenze delle diverse specie.
Colleghiamoci a GenBank
Inseriamo il termine della ricerca 'prion'.
Utilizziamo il bottone
Clicchiamo next sul bottone Retrieve XXX Documents
Possiamo selezionare le sequenze del bovino, della pecora, del topo e dell'uomo, che
osserviamo ora riportate separatamente.
>cow prion
MVKSHIGSWILVLFVAMWSDVGLCKKRPKPGGGWNTGGSRYPGQ
GSPGGNRYPPQGGGGWGQPHGGGWGQPHGGGWGQPHGGGWGQPHGGGGWGQGGSHSQWNKPSKPKTNMKHVAGAAAAG
AVVGGLGGYMLGSAMSRPLIHFGNDYEDRYYRENMHRYPNQVYYRPVDQYSNQNNFVHDCVNITVKEHTVTTTTKGEN
FTETDIKMMERVVEQMC TQYQRESQAYYQRGASVILFSSPPVILLISFLIFLIVG
>sheep prion
MVKSHIGSWILVLFVAMWSDVGLCKKRPKPGGGWNTGGSRYPGQ
GSPGGNRYPPQGGGGWGQPHGGGWGQPHGGGWGQPHGGGWGQPHGGGGWGQGGSHSQWNKPSKPKTNMKHVAGAAAAG
AVVGGLGGYMLGSAMSRPLIHFGNDYEDRYYRENMYRYPNQVYYRPVDQYSNQNNFVHDCVNITVKQHTVTTTTKGEN
FTETDIKIMERVVEQMCI TQYQRESQAYYQRGASVILFSSPPVILLISFLIFLIVG
>mouse prion
MANLGYWLLALFVTMWTDVGLCKKRPKPGGWNTGGSRYPGQGSP
GGNRYPPQGGTWGQPHGGGWGQPHGGSWGQPHGGSWGQPHGGGWGQGGGTHNQWNKPSKPKTNFKHVAGAAAAGAVVG
GLGGYMLGSAMSRPMIHFGNDWEDRYYRENMYRYPNQVYYRPVDQYSNQNNFVHDCVNITIKQHTVVTTTKGENFTET
DVKMMERVVEQMCVTQYQKESQAYYDGRRSSSTVLFSSPPVILLISFLIFLIVG
>human prion
MANLGCWMLVLFVATWSDLGLCKKRPKPGGWNTGGSRYPGQGSPGGNRYP
PQGGGGWGQPHGGGWGQPHGGGWGQPHGGGWGQGGGTHSQWNKPSKPKTNMKHMAGAAAAGAVVGGLGGYMLGSAMSR
PIIHFGSDYEDRYYRENMHRYPNQVYYRPMDEYSNQNNFVHDCVNITIKQHTVTTTTKGENFTETDVKMMERVVEQMC
ITQYERESQAYYQRGSSMVLFSSPPVILLISFLIFLIVG.
Tali sequenze per essere confrontate devono essere allineate ed elaborate trasferendole ad
un appropriato programma.
I PROGRAMMI PER L'ALLINEAMENTO
MULTIPLO.
CLUSTAL W. Analizziamo ora alcuni dei
programmi
maggiormente
utilizzati
iniziando da CLUSTAL W, il programma è
disponibile per molte piattaforme, si basa
sull'allineamento
progressivo,
il
programma prende una serie di sequenze
e calcola per ogni coppia gli allineamenti.
Sulla base di questi confronti si costruisce
una matrice delle distanze basata sulla
distanza di ogni coppia di sequenze. La
matrice delle distanze costituisce la base
per la costruzione di un albero filogenetico
basandosi sul metodo della vicinanza o
prossimità. Come si è visto in precedenza
le
difficoltà
insorgono
quando
si
introducono
gaps
per
"accomodare"
sequenze divergenti, in questo caso
157
BIOINFORMATICA
vengono introdotte delle penalità. CLUSTAL W nasce come programma UNIX, che può essere
lanciato semplicemente digitando al prompt il comando clustalw.
****************************************************************************
CLUSTALW(1.60) Multiple Sequence Alignements
****************************************************************************
1-Sequence Input from disc
2-Multiple Alignements
3-Profile/Structure Alignements
4-Phylogenetic trees
S. Execute a system command
H. Help
X. EXIT (leave program)
Your choice: 1
*******************************************
Le sequenze possono essere allineate, selezionando l'opzione 1, e indicando il nome del file
dove sono contenute le sequenze.
Sequence should be in 1 file
6 formats accepted:
NBRF/PIR, EMBL/SwissProt, Pearson (Fasta), GDE clustal, GCG/MSF
Enter the name of the sequence file: PIPPO.seqs
A questo punto si ritorna al menu principale e si selezione la seconda opzione
Multiple Alignements.
****************************************************************************
******* Multiple Alignements MENU *********
****************************************************************************
1-Do complete multiple alignements now (Slow/Accurate)
2-Produce guide tre file only
3-Do alignement using old guide tree file
4-Toggle Slow/Fast pairwise alignements= SLOW
5-Pairwise alignements parameters
6-Multiple alignements parameters
7-Reset gaps between alignments? = ON
8-Toggle screeb display = ON
9-Output format options
S. Execute a system command
H. Help or press (RETURN) to go back to main menu
X. EXIT (leave program)
Your choice: 1
************************************************
La serie numerosa delle opzioni che possiamo trovare influenza i risultati dell'analisi
dell'allineamento multiplo delle sequenze. Alla opzione 6 possiamo indicare l'utilizzo di una
matrice di scoring (BLOSUM o PAM) e possiamo ad esempio penalizzare in modo diverso la
presenza o l'assenza di specifici residui e la loro eventuale sostituzione.
Alla fine otteniamo una figura come quella riportata precedentemente, le posizioni nelle quali
si ha una assoluta conservazione si indicano con un asterisco *, mente uno o due punti
indicano la presenza di una zona conservata.
MultAlign. Il programma venne ideato nel 1988 da Corpet, e si basa sulla stessa filosofia
del programma Clustal W, si differenzia per il procedimento di calcolo del clustering, viene
creata una prima matrice basata sullo score degli allineamenti e successivamente viene
eseguito un processo di iterazione fino al momento in cui si ottiene il migliore cluster. È
possibile utilizzare questo programma con un collegamento all'INRA di Toulouse. Si possono
utilizzare le sequenze nel formato FASTA, ed inserirle in un apposito box. Una serie di menu
a tendina facilitano l'inserimento dei parametri del programma. In linea generale è
preferibile modificare solamente i parametri relativi alla matrice dello scoring. Quando le
158
BIOINFORMATICA
sequenze vengono sottoposte al server, l'elaborazione dei dati comporta che in output venga
proposta una sequenza definita come consensus.
Se le sequenze vengono mantenute integralmente si adotta la lettera maiuscola, se nelle
sequenze la conservazione è elevata ma non totale si utilizza la lettera minuscola. Il
programma si differenzia dagli altri in quanto adotta nella riga del consesus una simbologia
relativa alle sostituzioni conservative.
I simboli utilizzati sono
!
%
#
$
Evidentemente, date le premesse, i risultati che si possono ottenere con i programmi
menzionati sono differenti.
ESEMPIO DI OUTPUT CON MULTALIGN
Symbol comparison table:
blosum62
Gap weight:12
Gap length weight: 2
Consensus levels: high=90% low= 50%
Consensus symbols:
! is anyone of IV
$ is anyone of LM
% is anyone of FY
# is anyone of NDQEBZ
MOTIVI E MODELLI. Numerosi altri metodi sono stati individuati per esaminare una singola
sequenza, in particolare esistono dei metodi che consentono di valutare la presenza di un
motivo e si rivelano particolarmente utili per costruire delle famiglie di proteine partendo da
una sequenza anche molto piccola. Per queste finalità dei programmi specializzati sono
attualmente disponibili, i principali sono:
PROFILESCAN
BLOCKS
MOST
PROBE
ProfileScan è un programma basato sull'algoritmo di Gribskov (1987), ed utilizza un
metodo chiamato pfscan per trovare le similarità tra una proteina e una sequenza di
interrogazione di una libreria di profili. Le librerie di profili sono contenuti in PROSITE che
utilizza i motivi e il modello con una tecnica conosciuta come fingerprint. La seconda libreria
è Pfam che differisce dalle altre librerie per il particolare che l'allineamento iniziale deve
essere introdotto manualmente. L'utente può selezionare la sensibilità della ricerca e
includerà anche i casi limite.
Blocks utilizza il concetto del blocco per identificare una famiglia di proteine, piuttosto che
utilizzare una sequenza individuale (Henikoffe Henikoff 1996). L'idea del blocco deriva dalla
notazione del motivo, cioè alla presenza di una serie di aminoacidi che si conservano e
conferiscono una specifica funzione o una particolare struttura alla proteina. Il termine
blocco si riferisce all'allineamento non alla sequenza individuale.
Una proteina può quindi contenere uno o più
blocchi, che conferiscono funzioni o che
caratterizzano funzionalmente la proteina.
Quando una ricerca per blocchi viene iniziata
utilizzando una sequenza di interesse, per
ogni specifico allineamento viene utilizzata
una particolare matrice dello scoring chiamata
PSSM. Questa matrice di scoring differisce da
quelle che si sono viste precedentemente, ad
esempio BLOSUM. Se la sequenza di input da
analizzare è il DNA si deve introdurre anche
un numero di codice genetico nella ricerca.
MOST è chiamato anche Motif Search Tool
(Tatusov 1994), è un programma che
159
BIOINFORMATICA
solitamente gira su macchine Unix e viene impiegato per trovare la presenza di motivi
conservati. Il programma utilizza una procedura chiamata alignement block per un numero
qualsiasi di sequenze e per una lunghezza qualsiasi. Il programma non sopporta la presenza
di gaps. I blocchi degli allineamenti vengono usati per generare una matrice pesata. Lo
score viene calcolato per ogni segmento di lunghezza L, sommando in modo appropriato gli
elementi nella matrice pesata. Una indicazione di tipo statistico viene fornita circa la bontà
dell'allineamento dei blocchi e si utilizza una procedura di tipo iterativo per trovare la
migliore soluzione. Un parametro importante da considerare in MOST è il rapporto R che
rappresenta il numero dei falsi positivi diviso per il numero dei veri positivi.
PROBE rappresenta una programma di ultima generazione (Neuwald et al. 1997) molto
simile al MoST in quanto utilizza una strategia di tipo interattivo, ma con differenze nei
meccanismi della ricerca. PROBE utilizza un ricerca per coppie di sequenze, ad esempio la
sequenza A è in relazione con una sequenza B, la sequenza B viene messa in relazione con
una sequenza C, questo implica per una proprietà transitiva che A sia in una certa relazione
con C. Viene così costituita una prima collezione di sequenze, si inizia una nuova ricerca per
trovare sequenze che potrebbero essere sfuggiti al primo passaggio; il programma PROBE
continua fintanto che le collezioni non sono convergenti.
Per maggiori informazioni sui programmi si rimanda a:
CLUSTAL http://www2.ebi.ac.uk/clustalw/
MSA
http://www.ibc.wstl.edu/ibc/msa.html
MultAlign http://toulouse.inra.fr/cgi-bin/multalin.pl
PROSITE http://expasy.hcuge.ch/sprot/prosite.html
PROBE
ftp://ncbi.nlm.nih.gov/pub/newwald/probe1.0/
ANALISI FILOGENETICA. La filogenesi è lo studio delle relazioni evolutive, l'analisi
filogenetica è il modo con cui facciamo delle inferenze su queste relazioni. La filogenesi è un
processo evolutivo degli organismi vegetali e animali dalla loro comparsa sulla Terra a oggi.
(Rita Levi Montalcini, La Galassia Mente, Baldini & Castoldi, Milano, 2001 ).
Nella storia dell'analisi filogenetica si ricorre spesso
ad una rappresentazione grafica ad albero
(treelike) che costituisce una sorta di albero
genealogico o di pedigree. Numerosissimi algoritmi
sono stati proposti, molti programmi per il
calcolatore e sono a disposizione dei ricercatori per
queste finalità, ma in ogni caso i risultati e la
validità delle conclusioni dipendono dalla struttura
e dalle dimensioni del database utilizzato. Il
pericolo di ingenerare risultati non corretti è
maggiormente elevato nell'analisi filogenetica
rispetto alle altre discipline scientifiche. Nel nostro
caso la maggior difficoltà nell'analisi filogenetica è
quella di definire un modello in grado di costruire
un certo albero. Nel XIX secolo fu proposta da
Ernst Haeckel la teoria della ricapitolazione che
recita: Tutte e due le serie dell'evoluzione
organica, l'ontogenesi dell'individuo e la filo-genesi
della stirpe a cui esso appartiene, stanno fra loro
nel più intimo rapporto causale. La storia del germe è un riassunto della storia della stirpe,
o, con altre parole, l'ontogenesi è una ricapitolazione della filogenesi.
Un albero filogenetico è un diagramma che mostra le relazioni di discendenza comune di
gruppi tassonomici di organismi. La rappresentazione delle relazioni in questa forma è tipica
della visione evoluzionistica, secondo la quale lo sviluppo delle forme di vita è avvenuto a
partire da un progenitore comune (il tronco o la base dell'albero, altrimenti detta radice), il
quale ha dato origine per speciazione a diverse linee di discendenza, fino ad arrivare alle
specie attualmente esistenti (le cime dell'albero, denominate ramificazioni terminali). In un
160
BIOINFORMATICA
albero filogenetico, ciascun nodo (o biforcazione) rappresenta l'antenato comune più recente
dei soggetti che si trovano ai nodi successivi e la lunghezza delle ramificazioni può -o menoessere correlata al tempo o ai cambiamenti genetici che intercorrono tra di essi.
Gli alberi filogenetici vengono costruiti in base a dati anatomici, biochimici, genetici e
paleontologici. La branca della scienza che si occupa dello studio di queste informazioni e
della compilazione degli alberi filogenetici prende il nome di filogenetica computazionale. Sia
gli alberi radicati che quelli non radicati possono essere sia biforcati che multiforcati,
un albero biforcato possiede al massimo due
ramificazioni che dipartono da ogni nodo
un albero multiforcato, invece, ne possiede
più di due gli alberi filogenetici, infine,
possono essere sia etichettati che non
etichettati
un albero etichettato mostra valori specifici
assegnati agli elementi che si trovano alle
estremità terminali di ciascuna ramificazione
un albero non etichettato invece non mostra
questi valori e dunque non fornisce
indicazioni aggiuntive oltre a quelle relative
allo spazio topologico tra i membri di
ciascuna ramificazione.
Esempio di albero filogenetico costruito con il programma CLUSTAL per sequenze di 5.8S
DNA di piante funghi e protisti. I taxa e le sequenze corrispondono agli acronimi utilizzati in
ambito filogentico.
Il numero di alberi che è possibile ottenere partendo da un numero dato di elementi posti ai
nodi terminali dipende dal tipo di albero; è sempre comunque possibile ottenere più alberi
multiforcati che biforcati, più alberi etichettati che non etichettati, e più alberi radicati che
alberi non radicati. Quest'ultima osservazione è quella biologicamente più rilevante, ed è
una conseguenza del fatto che, in un albero non radicato esistono molti posti in cui è
possibile identificare una radice, ovvero un gene che può essere definito come un
progenitore comune di quelli posti sulle diverse ramificazioni.
ELEMENTI DEI MODELLI FILOGENETICI. La costruzione di un albero filogenetico
presuppone l'adozione di un modello particolare di evoluzione.
I modelli filogenetici richiedono inoltre una serie di assunzioni di default.
La sequenza è corretta e origina da una specificata sorgente.
Le sequenze sono omologhe (discendono da una sequenza ancestrale).
Ogni posizione in una sequenza è omolga con ogni altra nell'allineamento.
Ogni sequenza multipla inclusa in una analisi comune possiede una storia genetica
comune.
Il campionamento dei taxa deve essere adeguato a risolvere il problema di
interesse.
La variabilità delle sequenze tra i campioni contiene un segnale filogenetico
adeguato per risolvere il problema di nostro interesse.
La sequenza nel campione evolve secondo un semplice modello stocastico.
Tutte le posizioni nella sequenza evolvono secondo un processo stocastico.
Ogni posizione nella sequenza evolve in modo indipendente.
Errori nelle analisi filogenetiche possono essere spesso attribuiti alla violazione di uno o più
dei requisiti, sfortunatamente i metodi in uso non offrono informazioni e indicano la
violazione degli assunti. Sebbene gli alberi filogenetici, costituiti sulla base di dati
provenienti da analisi genomiche costituiscano un importante strumento agli studi
sull'evoluzione e, soprattutto, sulla filogenetica, essi hanno comunque dei limiti. Gli alberi
filogenetici, non rappresentano necessariamente l'esatta storia evoluzionistica di un gene, o
161
BIOINFORMATICA
di un dato organismo, ed in effetti nella maggior parte dei casi non lo fanno. I dati sui cui
essi si basano sono infatti spesso disturbati da diversi fattori: il trasferimento genico
orizzontale, l'ibridizzazione tra specie diverse -situate a grande distanza sull'albero prima
che l'ibirdizzazione stessa avvenisse, l'evoluzione convergente e la conservazione delle
sequenze geniche sono elementi di disturbo che possono facilmente confondere le analisi
basate su principi filogenetici
ANALISI FILOGENETICA DEI DATI. Possiamo indicare in quattro fasi lo studio
filogenetico del DNA, che analizzeremo in modo indipendente ma che rappresentano una
unica componente nell'analisi filogenetica. Le fasi sono:
1- COSTRUZIONE DEL MODELLO DI ALLINEAMENTO
2- MODELLO DI SOSTITUZIONE
3- COSTRUZIONE DELL'ALBERO
4- VALUTAZIONE DELL'ALBERO
I metodi di analisi si possono utilizzare per il DNA, per le proteine data la grande diversità
biochimica degli aminoacidi si devono porre maggiori parametri matematici. Vedremo poi
che esistono diverse modalità con le quali possiamo costruire il nostro albero.
1- ALLINEAMENTO- L'analisi filogenetica è data da un allineamento multiplo delle sequenze,
nella letteratura la base dell'allineamento individuale viene definito come SITES. Questi sites
sono equivalenti a characters.
Unica eccezione è data dal programma STATALING che utilizza
una notazione di diversa. La selezione delle procedure di
allineamento rappresenta il primo passo per l'estrazione dei dati
filogenetici da un data set. A questo punto è necessario
considerare come vogliamo trattare le regioni definite
nell'allineamento come ambigue ed in particolare le inserzioni, le
delezioni o molto più semplicemente i gaps per la costruzione
dell'albero filogenetico.
Dall'analisi filogenetica possiamo ottenere due soluzioni
alternative.
LE PROCEDURE DI ALLINEAMENTO. Le procedure di allineamento
multiplo fanno ricorso solitamente a delle subroutine che costringono
ad utilizzare degli attributi o delle opzioni.
DIPENDENZA DAL COMPUTER
NONE-PARTIAL-COMPLETE
RICHIESTA FILOGENICA
NONE-A PRIORI-RECURSIVE
PARAMETRI DI ALLINEAMENTO
A PRIORI-DYNAMIC-RECURSIVE
RAPPRESENTAZIONE
PRIMARY-HIGHER-OTHERS
OTTIMIZZAZIONE MATEMATICA
STATISTICAL- NON STATISTIC
Una tipica procedura di analisi filogenetica implica inizialmente
l'impiego del programma CLUSTAL W con un allineamento manuale ed
il successivo impiego dei programmi di creazione dell'albero
filogenetico. La procedura che dobbiamo seguire è riportata nello schema seguente, in
questo schema facciamo riferimento alla nomenclatura anglosassone. Computer dependence
- Il manuale indica le procedure adottate in forma implicita per la costruzione dell'albero
filogenetico, queste procedure in generale sono ottimizzate per la costruzione di un albero
secondo la procedura definita come MP.
I criteri per la costruzione possono essere:
1-MP- Maximum parsimony
2-ML- Maximum likelihood
3-DISTANCE
162
BIOINFORMATICA
Questi sono definiti criteri di divergenza che determinano tre tipologie di alberi differenti.
Abitualmente un approccio totalmente dipendente dal computer indica che assumiamo che il
programma produca un allineamento "corretto". In realtà dovremo fare particolare
attenzione nelle scelte in quanto i programmi e gli algoritmi che utilizziamo non sono
ottimizzati per le analisi filogenetiche (Thomson 1994).
Phylogenetic criteria. Molti programmi utilizzano una guida per la costruzione filogenetica
dell'albero (guide tree) che consente sulla base di un esplicito criterio filogenetico di definire
l'allineabilità delle sequenze.
I programmi che consentono di utilizzare questa procedura sono CLUSTAL, PileUp, ALIGN. I
programmi come SAM e MACAW sono esempi di programmi che non richiamano criteri
filogenetici espliciti ma il processo filogenetico può essere mimato manualmente. Alcuni
programmi sono stati concepiti per ottimizzare gli allineamenti ricorrendo a procedure di tipo
ricorsivo e costruire un albero filogenetico (TreeAlign e MALIGN). Dal punto di vista teorico
esiste il problema di valutare un set di soluzioni e definire quella "migliore".
Alignment Parameters Estimation. Dipendono da tutti gli elementi del modello evolutivo,
i parametri sono dinamici e sono direttamente implementati nel programma CLUSTAL.,
mentre nel programma SAM si ricorre ad un sistema di pesi.
Alignement of Primary Versus
Higher
Order
Sequence
Structure. In questo caso si tiene
conto dell'importanza filogenetica
del mantenimento di una certa
omologia della struttura secondaria
e terziaria della sequenza. Un
approccio di tipo strutturale è molto
importante in quanto consente di
analizzare dal punto di vista
funzionale
le
sequenze.
I
programmi sopra menzionati non
sono in grado di effettuare questo
Albero filogenetico evolutivo.
tipo di analisi si deve quindi
"forzare" per avere una evoluzione della struttura consistente con la filogenesi.
Mathematical optimization. Alcuni programmi (SAM e MACAW), ma non tutti sono in
grado di fornire una ottimizzazione in accordo con certo modello statistico. Rimane la
difficoltà che non esiste nessun metodo che possa dirci quale modello di allineamento sia
meglio di un altro (Morrison e Ellis 1997).
DATI FILOGENETICI DELL'ALLINEAMENTO. Un allineamento che include variazioni nella
lunghezza delle sequenze dipende dalle modalità di trattamento con cui vengono considerate
le ambiguità. Il caso estremo può essere rappresentato dall'eliminazione dalla elaborazione
delle zone che presentano un gap, in questo caso noi possiamo considerare un modello
semplice che analizza gli allineamenti come un semplice modello di sostituzione. Lo
svantaggio di questo approccio è che i metodi di MP e ML nella costruzione dell'albero
interpretano i dati mancanti aventi una divergenza di 0, mentre i gaps riflettono una elevata
divergenza. Il programma PAUP 4.0 (Swofford 1997) consente di estrapolare le elaborazioni
delle distanze tra le regioni gap. Il metodo MP (massima parsimonia) è il solo metodo che
consente di incorporare i gaps allineabili come caratteri. Questa possibilità consente due
scelte: o di includere un carattere addizionale (un quinto nucleotide ad esempio), o creare
un nuovo set di caratteri indipendenti per la sostituzione. La scelta della strategia da
adottare è dipendente dalla lunghezza del gap e dalla conservazione delle basi nella
sequenza. Le strategie per la valutazione dei gaps sono assai complicate ed esulano dalle
finalità di questa rassegna, si ricorre a delle tecniche definite come tecniche di post
allineamento.
Il programma MALIGN (Wheeler e Gladstein 1994) non richiede il ricorso a tecniche di
postallineamento, quando si presentano delle zone di ambiguità queste possono essere
estrapolate ed analizzate separatamente con un altro programma. Il programma adotta una
strategia di ottimizzazione ricorsiva in funzione del migliore albero filogenetico basandosi sul
163
BIOINFORMATICA
metodo della Massima Parsimonia. Il programma MALIGN consente di avere degli
allineamenti concatenati ottimizzati sulla base di un range definito come gap cost. Nei sites
delle regioni con allineamenti ambigui, probabilmente non esiste una completa omologia
pertanto il programma introduce un rumore o un errore di fondo nella costruzione
dell'albero.
MODELLO DI SOSTITUZIONE. I modelli con i quali valutiamo le sostituzioni possono
assumere un significato fondamentale in quanto possono influenzare sia l'allineamento sia la
costruzione stessa dell'albero filogenetico. Al momento attuale i modelli di sostituzione sono
ritenuti validi per l'analisi dei nucleotidi, mentre per le proteine non possiamo utilizzare
programmi affidabili. Il concetto di base è dato dall'osservazione che le sostituzioni sono
maggiormente frequenti per le basi ritenute simili.
Nel caso del DNA si possono osservare delle transizioni e delle
A
C
G
T
transversioni come riportato nello schema seguente. Lo schema
2 1 2 con il quale valutiamo le sostituzioni è una semplice matrice.
A
2
2 1 Come potete notare dall'analisi della matrice i valori riportati
C
indicano il "costo" della sostituzione, pertanto una transversione
1 2
G
costa il doppio di una transizione.
2 1 2
T
Un approccio alternativo viene applicato nelle situazioni definite
come non stazionarie, questo modello è chiamato log-det. Il principio è sostanzialmente
simile al precedente, si ricorre ad una matrice 4 x 4 ma la distanza viene misurata come
logaritmo del determinante.
Nell'esempio riportato vengono confrontati 1361 siti del DNA allineati tra gli spinaci e un
fungo. Nelle caselle sono indicate la distribuzione delle basi allineate del fungo verso le basi
allineate degli spinaci.
SCLETOTINUM
A
C
G
T
Totali
A
340
6
13
4
363
C
10
229
6
36
281
G
25
8
229
12
372
T
5
22
6
312
345
Totali
380
265
352
364
I valori delle diagonali indicano i sites in cui esiste una perfetta identità. Notiamo che negli
spinaci i siti che sono C e G sono A e T nel fungo (10 +36 + 25+12) = 83, per contrasto un
numero ridotto di siti C e G nel fungo sono A e T negli spinaci ( 6 + 22 + 13 + 6) = 47.
Notare anche l'elevato numero delle transizioni (13 + 36 + 25 + 22) = 96, mentre il numero
delle transversioni è minore (6 + 4+ 10 + 6 + 8 + 12 + 5 + 6) = 57, il numero totale delle
differenze è di 153 (96 + 57), di queste differenze le transizioni di C con T e di T con C
rappresentano il 38% (58/153).
METODI PER LA COSTRUZIONE DELL’ALBERO FILOGENETICO. Esistono diversi metodi
che possono essere raggruppati secondo due distinti criteri.
Algoritmico. Si tratta di individuare una funzione di ottimizzazione che si genera attraverso
una serie di passaggi. Il metodo più conosciuto è Neighbor Joining (NJ) che crea un albero
che utilizza un approccio basato sulla distanza che viene ottimizzata contando sulla proprietà
della addittività.
Basato sui caratteri. Questo approccio consente di costruire un albero ottimizzando il
pattern dei dati per ogni carattere, la distanza non è fissata ma viene determinata in base
alla topologia dell’albero. I più comuni metodi sono MP (Maximum Parsimony) e ML
(Maximum Likelihood).
CALCOLO DELLA DISTANZA. I metodi basati sul calcolo della distanza impiegano l’analisi
della dissimilarità per derivare l’albero. Il metodo della distanza consente di costruire il vero
albero se tutti gli elementi del calcolo della divergenza vengono accuratamente misurati. Le
difficoltà scaturiscono quando si hanno successive mutazioni che possono mascherare le
precedenti mutazioni. In pratica, l’impiego di una matrice indice delle mutazioni multiple
presuppone che alcune coppie identifichino mutazioni multiple e che queste aumentino in
Spinacia
Olearia
164
BIOINFORMATICA
proporzione con l’aumento della divergenza delle sequenze. Il calcolo della distanza delle
coppie è effettuato con la tecnica definita maximum-likelihood (massima verosimiglianza), il
programma più popolare in questo ambito è PAUP 4.0. I metodi basati sulla distanza non
richiedono in generale elevate capacità di calcolo. Il più comune pacchetto impiegato in
questo settore è UPGMA (Unweighted Pair Group Method with Arithmetic Mean) che è un
programma di clustering che congiunge tre rami con il criterio della più elevata similarità.
Non viene considerato un metodo evolutivo sulle distanze e genera un una accurata
topologia con la lunghezza dei rami solo in particolari condizioni (Swofford 1996).
L’algoritmo di Neighbor Joining (NJ) (unione del vicino) viene comunemente utilizzato
come criterio di ottimizzazione nella costruzione dell’albero. L’albero completo viene
decomposto in una serie di stelle che vengono risolte e successivamente inserite nell’albero.
Si tratta di un programma che risulta molto veloce.
Il
metodo
Fitch-Morgolish
(FM)
utilizza una procedura che cerca di
massimizzare il fit delle distanze
osservate tra le coppie per costruire un
albero basato sui quadrati degli scarti di
tutti i possibili percorsi (lunghezze) nei
rami dell’albero. Alcune delle differenze
nel calcolo della varianza possono
essere pesate. La non completa
indipendenza nella stima della varianza
Scomposizione a stella.
può ingenerare errori nella costruzione
dei rami.
L’algoritmo ME (Minimum Evolution) è basato sullo steso principio del metodo di FitchMorgolish, ma lavora per individuare la minore distanza quadratica tra i dati osservati e
quelli misurati sull’albero, l’inconveniente di questo metodo è che non utilizza tutte le
possibili coppie di possibili percorsi. L’impiego delle procedure ME e FM porta in generale agli
stessi risultati negli studi di simulazione. Il metodo ME viene maggiormente proposto nei
programmi come METREE e PHYLIP che offre un numero considerevole di modelli di
sostituzione, ma non modelli per correggere l’eterogeneità. Il pacchetto MEGA include una
opzione per la correzione gamma delle proteine. Studi di simulazione indicano che la
procedura UPGMA non offre buoni risultati, anche se è il più citato nelle pubblicazioni
scientifiche.
METODI BASTI SUI CARATTERI. Questi metodi sono basati sul calcolo della posizione di
ogni singola base nell’allineamento sulla base delle posizione di tutte le altre basi. I metodi
che possiamo utilizzare sono sostanzialmente il metodo di massima parsimonia e quello di
massima verosimiglianza.
Metodo MP (Maximum Parsimony) viene considerato un metodo molto semplice ed
accurato in molte situazioni, esistono molte varianti al metodo originale proposto da Swoford
et al. 1966. Per ovviare ad uno dei maggiori inconvenienti del metodo, errori nelle
sostituzioni, possono essere introdotti sistemi di ponderazione nella matrice di sostituzione,
questo implica un forte rallentamento nella velocità di calcolo. Analisi e simulazioni hanno
dimostrato che il metodo MP, non offre migliori risultati rispetto ai metodi ME e ML.
Metodo ML (Maximum Likelihood). Il metodo ricerca l’albero filogenetico che è in grado di
offrire la massima verosimiglianza, calcolando la probabilità che un particolare pattern sia
prodotto da un particolare processo di sostituzione. La somma totale delle probabilità è
definita come likelihood of tree e rappresenta la probabilità complessiva dell’albero.
Al fine di comprendere i meccanismi che sono alla base dei metodi sopra menzionati è
necessario offrire la lettore una spiegazione sui principi che sono alla base dei metodi sopra
menzionati.
Il metodo della matrice conta semplicemente il numero delle differenze tra due sequenze. Il
numero si riferisce ad una distanza dell’evoluzione, e la dimensione esatta dipende dal
modello utilizzato per valutare l’evoluzione. L’albero filogenetico è calcolato sulla base della
matrice delle distanze adottando un algoritmo di tipo iterativa che parte con la sequenza
maggiormente simile o minimizzando la distanza dei rami. Il principio che è alla base del
165
BIOINFORMATICA
metodo di parsimonia è un algoritmo che ricerca l’albero filogenetico che richiede il minor
numero di cambiamenti per spiegare le differenze osservate nei taxa oggetto dello studio.
Per contro il modello ML tende come si è visto a valutare in termini probabilistici il modello
che è stato generato dai dati di base. Inizialmente il modello assume che le probabilità di
cambiamento siano le stesse per ogni nucleotide o per ogni aminoacido.
Il numero di alberi filogentici possibili aumenta in modo esponenziale con il numero dei taxa
e diviene astronomico già con sole 50 sequenze. In molti casi, le limitazioni computazionali
permettono l’analisi di un numero limitato di alberi. Gli algoritmi che i genetisti possono
utilizzare variano da quelli che offrono tutti i possibili alberi (algoritmi esaustivi) a quelli che
offrono solo le informazioni su un numero ristretto di alberi filogenetici con un numero
ridotto di modificazioni. Esistono quindi due approcci diversi per l’individuazione dell’albero
filogentico migliore. Il metodo esaustivo e il metodo definito branch-and-bound (BB). La
scelta pratica d adottare dipende dal numero dei taxa e dalla struttura da analizzare, se il
numero dei taxa è inferiore a 20 è da preferire il metodo BB.
Molti metodi impiegano un approccio euristico, cioè utilizzano algoritmi per ricercare delle
famiglie, chiamate anche isole, dove sono presenti alberi non ottimali per una soluzione
ottimale definita come peaks. Come si è intuito esistono diversi algoritmi che permettono
con gradi di rigore diverso di ottenere delle isole e dei picchi. Numerose sono quindi le
strategie che possono essere impiegate per la costruzione di un albero filogenetico, molti
analisti preferiscono ad esempio spendere molto tempo nell’analisi delle isole; questo
comporta che possono essere prodotti molti alberi di partenza. A livello di programmi da
utilizzare molti Autori ritengono che il programma PAUP sia da considerarsi il miglior
programma disponibile.
VALUTAZIONE DEGLI ALBERI E DEI DATI. Diverse sono le procedure disponibili per
valutare il segnale filogenetico e la robustezza dell’albero. I più popolari test di valutazione
sono il test di skewness e il test di permutazione.
Analisi filogenetica delle famiglie di proteine. L’analisi filogenetica si applica a Proteineomologhe – gruppo di proteine di uno e/o diversi organismi, i cui geni nella maggior parte
dei casi hanno una comune origine evolutiva. Le cause della comparsa delle proteineomologhe possono essere diverse: divergenza degli organismi (trasmissione verticale),
duplicazione dei geni e dei genomi, trasmissione orizzontale.
Con il termine famiglie di proteine-omologhe 15-20 anni fa poteva essere intesa tutta
l'aggregazione delle proteine tra di loro omologhe. L'allineamento multiplo delle proteine
(domini) di una famiglia può essere eseguito in modo automatico, per esempio mediante il
programma ClustalW. L'appartenenza di una proteina ad una particolare famiglia implica la
presenza di una specifica, nota o presunta, attività enzimatica (oppure di un'altra funzione
biologica), proprio in base alla quale si dà il nome alla famiglia. Tuttavia, tale ambiguità
spesso porta al caso di due distinte famiglie descritte dal medesimo autore che possono
essere viste da altri ricercatori come una sola famiglia. Dal punto di vista dell'analisi
filogenetica ciò non ha alcun significato intrinseco. Quello che ha più importanza è che le
proteine della stessa famiglia abbiano formato un gruppo monofilogenetico, ed il grado di
somiglianza delle loro sequenze aminoacidiche sia abbastanza elevato da permettere la
costruzione di un allineamento multiplo globale. Attualmente il numero di famiglie di
proteine note è di circa 10 mila, per esempio nel database Pfam è presente una lista di 8183
famiglie. Il database Pfam è una grande collezione di famiglie di proteine, ognuna
rappresentata dalla sequenza di allineamenti multipli e modelli nascosti di Markov (HMMS).
Le proteine sono generalmente composte da una o più regioni funzionali, comunemente
chiamato domini. Combinazioni diverse di domini dar luogo alla vasta gamma di proteine
che si trovano in natura. L'identificazione di domini che si verificano all'interno delle proteine
possono quindi fornire intuizioni la loro funzione. Ci sono due componenti Pfam: Pfam-A e
Pfam-B. Pfam-A le voci sono di alta qualità, a mano a cura delle famiglie. Anche se questi
Pfam-A voci coprono una larga parte delle sequenze nel database sottostante sequenza, al
fine di fornire una copertura più completa di proteine note anche generare un supplemento
utilizzando il database ADDA. Queste voci generate automaticamente sono chiamati Pfam-B.
Sebbene di qualità inferiore, Pfam famiglie B può essere utile per individuare le regioni
funzionalmente conservato quando non si trovano voci Pfam-A. Pfam genera anche un più
166
BIOINFORMATICA
alto livello di raggruppamenti di famiglie imparentate, conosciuto come clan. Un clan è un
insieme di Pfam-A voci che sono legate dalla somiglianza della sequenza, la struttura o il
profilo-HMM. Di regola, la molecola proteica è costituita da alcune centinaia di residui
aminoacidici. È possibile che la proteina in esame (o taluni dei suoi omologhi) sia costituita
da diversi domini strutturali. Tale possibilità cresce rapidamente con l'aumentare della
lunghezza della sequenza aminoacidica (solitamente, un dominio non è mai più di 300
aminoacidi).
A seconda del problema da risolvere può essere necessario:
i. esaminare la filogenia di uno dei domini della proteina in esame, per esempio quello
catalitico;
ii. esaminare tutti i suoi domini;
iii. esaminare tutta la varietà dei domini che si incontrano nei rappresentanti della
corrispondente famiglia di proteine omologhe.
L'analisi filogenetica di ciascun dominio dev'essere condotta in modo indipendente
utilizzando gli allineamenti multipli corrispondenti. Se due qualsiasi domini strutturali
formano un dominio evolutivo comune, allora i loro alberi filogenetici devono avere una
topologia similare. In questa situazione ha senso costruire un albero comune dell'intero
dominio evolutivo. È necessario notare che, la costruzione di alberi filogenetici è possibile
solo in presenza di non meno di quattro rappresentanti proteici (domini) della famiglia
analizzata. Nel caso in cui la struttura di dominio della proteina analizzata non sia nota in
partenza può essere determinata approssimativamente con l'aiuto di un semplice screening
del database di sequenze aminoacidiche del programma blastp. Se, da un allineamento a
due tra la sequenza aminoacidica della proteina ed i suoi omologhi, emerge che alcuni
frammenti della proteina in esame mostrano una similarità con svariate proteine, ed i confini
tra questi frammenti possono essere determinati in modo abbastanza chiaro, allora ciascuno
di questi frammenti può essere visto come un dominio evolutivo a sé stante. È necessario a
questo punto trovare la massima quantità possibile di proteine contenenti domini omologhi
al dominio analizzato. Cioè comporre un elenco completo di rappresentanti della famiglia in
esame. È possibile che la proteine in esame appartenga ad una ben nota famiglia. In questo
caso ci sono buone probabilità di trovare su internet un elenco ben annotato dei suoi
rappresentanti famiglie glicoside-idrolase. In questo caso, è sufficiente rinnovare l'elenco di
proteine della corrispondente famiglia ed aggiungervi i rappresentanti mancanti.
Prevalentemente si tratterà di proteine recentemente apparse nei database che non sono
ancora state associate a famiglie concrete. Se la proteina in esame appartiene ad una
famiglia poco conosciuta allora l'elenco dei suoi omologhi può essere trovato per tentativi in
una delle tante classificazioni globali delle proteine, tra le quali possono servire come
esempio i database:
● Pfam:
● COG/KOG:
● InterPro:
● PUMA2:
● HOMSTRAD:
● SCOP:
● CATH:
In ogni caso, che si riesca a trovare un elenco di proteine abbastanza completo della
famiglia in esame oppure no e si debba cominciare con l'unico rappresentante, è necessario
eseguire lo screening di uno o più database con l'ausilio dei programmi della famiglia blast
(Basic Local Alignment Search Tool). In modo più semplice è possibile cavarsela con il
programma PSI-BLAST (Position-Specific Iterated BLAST), il quale permette, con il risultato
della sua prima iterazione, di trovare nel database di sequenze aminoacidiche GenPept un
elenco proteico abbastanza completo della data famiglia. In pratica un elenco esauriente di
famiglie può essere ottenuto dopo la seconda iterazione (in aggiunta emergeranno i
rappresentanti più divergenti della famiglia). In questo caso, un problema significativo può
presentarsi nella distinzione dei rappresentanti della famiglia in esame dalle proteineomologhe di altre famiglie. La pratica evidenzia che i rappresentanti più prossimi ad una
data famiglia possono essere considerate quelle proteine ottenute dal risultato della prima
167
BIOINFORMATICA
iterazione. Per la composizione di n elenco più completo, ha senso, in termini di domanda
(query) nello screening ei database, utilizzare diverse proteine della famiglia in esame
(preferibilmente le divergenti). Proprio per questo è molto utile avere inizialmente almeno
un elenco incompleto di rappresentanti della data famiglia. Può essere utilizzato 'elenco di
proteine ricavate dalla prima iterazione. È importante non includere erroneamente nella
famiglia in esame proteine con un livello di similarità troppo basso con la proteina iniziale,
utilizzata come “query”. Di conseguenza, in questo caso, occorre utilizzare un livello
statistico di soglia considerevolmente rigido per la distinzione tra “propri - estranei” (per
esempio, E-value < 10-5). Se è necessario trovare un numero aggiuntivo di rappresentanti
della famiglia analizzata ha senso condurre uno screening dei database di sequenze
nucleotidiche GenBank, per mezzo del programma tblastn, e Genomic BLAST. È probabile
che, per il momento, alcuni dei geni codificanti le proteine della famiglia in esame non siano
stati individuati e annotati tra le già note sequenze nucleotidiche (questo riguarda
innanzitutto progetti genomici non completati).
Tuttavia, bisogna considerare con cautela le sequenze ottenute in tal modo, inguanto
possono contenere una percentuale significativamente alta di errori, e alcune di loro possono
appartenere a pseudo geni. Una delle cause è la sovra-valutazione statistica della similarità
con le sequenze aventi la sostanza aminoacidica degenerata – questo problema può essere
parzialmente risolto mediante l'utilizzo del filtro speciale “low complexity” durante lo
screening, per mezzo dei programmi della famiglia blast. Un'attenzione particolare meritano
le proteine che hanno il più basso livello di similarità con gli altri membri della famiglia, ed
anche quelle che riescono ad allineare il settore corrispondente ad almeno una parte del
dominio in esame. Un buon test di appartenenza alla data famiglia per una qualsiasi
concreta proteina (dominio) è quello che la vede impiegata come domanda durante lo
screening dei database di sequenze aminoacidiche per mezzo del programma blastp. Tutti i
migliori risultati statistici dello screening devono riferirsi alle proteine di questa famiglia.
Diversamente, ha senso escludere dalle successive osservazioni la proteina in esame.
Tra le proteine individuate nella famiglia in esame quasi sicuramente vi sono proteine molto
simili. Per esempio copie della stessa proteina in diverse colture dello stesso tipo di batterio
oppure di varianti alleliche. Per l'analisi filogenetica della famiglia questi doppioni non
presentano valore ed è preferibile in questa fase rimuoverli. Tuttavia, occorre ricordare che
in un genoma possono essere codificati alcuni paraloghi, sequenza aminoacidiche che si
differenziano significativamente. Per questo è proibita la rimozione formale delle proteine
che fanno riferimento ad un organismo già presentato nell'elenco della famiglia. Come
criterio per la rimozione di proteine molto vicine in termini di sequenze aminoacidiche può
servire la soglia di identità dal 95% in su.
Le strutture di dominio delle proteine vengono meglio distinte attraverso l'analisi della loro
struttura spaziale. L'esistenza di dati sperimentali di strutture tridimensionali permette di
individuare il numero dei domini e le zone di confine fra di loro nella struttura primaria della
proteina. Come è solito, domini di struttura diversi eseguono funzioni biologiche diverse,
rivelandosi essere proprio i domini funzionali. L'assenza di informazione sulla struttura
spaziale della proteina complica considerevolmente l'identificazione della sua struttura di
dominio. Spesso domini diversi della stessa proteina hanno una storia evolutiva
indipendente. In questo caso, essi risultano essere anche domini evolutivi. È comunemente
accettato suddividere le grandi famiglie di proteine omologhe in sottofamiglie, sulla base del
confronto dei livelli di similarità delle loro sequenze aminoacidiche; tuttavia, regole comuni
speciali non esistono. Le famiglie evolutivamente imparentate vengono spesso riunificate in
super famiglie (oppure clan). Per esempio, nel database Pfam, in 206 clan sono raggruppate
1396 famiglie.
Tuttavia questo allineamento sarà più vicino all'optimum solo in presenza di un alto livello di
identità di tutte le sequenze analizzate (più del 50%) e dall'assenza in esse di una
significativa quantità di inserzioni/cancellazioni. Nei casi seguenti:
● con un grado di allineamento inferiore al 30%,
● in presenza di inserzioni estese,
168
BIOINFORMATICA
● in presenza dei settori facoltativi con N-terminale gli allineamenti automatici ottenuti non
sono adatti ad una analisi filogenetica corretta e
l'allineamento deve essere fatto (o redatto)
manualmente. In qualità di programma-redattore
adatto a tale scopo può essere raccomandato
BioEdit. In questo caso, ha senso utilizzare come
base gli allineamenti a due o quelli multipli
ottenuti
automaticamente.
L'allineamento
multiplo delle proteine (domini) di una famiglia
può essere eseguito in modo automatico, per
esempio mediante il programma ClustalW.
Tuttavia questo allineamento sarà più vicino
all'optimum solo in presenza di un alto livello di
identità di tutte le sequenze analizzate (più del
50%) e dall'assenza in esse di una significativa quantità di inserzioni/cancellazioni. Nei casi
seguenti:
● con un grado di allineamento inferiore al 30%,
● in presenza di inserzioni estese,
● in presenza dei settori facoltativi con N-terminale
gli allineamenti automatici ottenuti non sono adatti ad una analisi filogenetica corretta e
l'allineamento deve essere fatto (o redatto) manualmente. In qualità di programmaredattore adatto a tale scopo può essere raccomandato BioEdit. In questo caso, ha senso
utilizzare come base gli allineamenti a due o quelli multipli ottenuti automaticamente.
Programmi per l’analisi filogenetica.
PHYLIP creato da Joe Felsenstein dell’Università di Washington, è in realtà è un raccolta di
oltre 30 programmi che coprono tutti gli aspetti dell’analisi; il programma è gratuito e
disponibile per diverse piattaforme (Mac, Unix, Dos…) PROTPARS (Protein Sequence
Parsimony method è un programma che utilizza il principio della parsimonia) e NEIGHBOR
(Neighbor-Joining method) del pacchetto PHYLIP, permettono di eseguire un'analisi con
bootstrap. È conveniente utilizzare come minimo due diversi algoritmi per la costruzione
degli alberi della stessa famiglia di proteine. In questo modo le caratteristiche topologiche
comuni ad entrambi gli alberi risulteranno essere affidabili criteri per la deduzione delle
interrelazioni filogenetiche tra le corrispondenti proteine. L'analisi con bootstrap permetterà
di valutare l'affidabilità statistica di ciascuno dei nodi dell'albero costruito. Per delle
deduzioni preliminari è più che sufficiente ottenere 100 pseudo repliche di ciascun albero,
sebbene le pubblicazioni scientifiche tendono ad illustrare alberi aventi 1000 pseudo
repliche. Piccoli cambiamenti sul set delle sequenze e/o sul numero delle posizioni
dell'allineamento multiplo permetteranno ulteriormente di verificare la stabilità degli alberi.
PROTDIST è un programma dedicato al calcolo della matrice delle distanze delle proteine,
dispone di tre modelli per la costruzione dell’albero filogenetico, ed è un programma veloce
e realistico.
DNADIST calcola la distanza in termini matriciali di una sequenza di nucleotidi.
PAUP viene considerato nella versione 4 molto completo, esiste per molte piattaforme DOS,
Mac, Win e Sun Sparc. Il programma utilizza uno stano formato chiamato NEXUS, ma è in
grado di importare file da altri programmi come Phylip, NBRF-PIR.
Esistono altri programmi che risultano più limitati nelle procedure e nella portabilità. Questi
programmi sono:
FastDNAml, MACCLADE, MEGA plus METREE, MOLPHY e PAML..
Per maggiori informazioni sui programmi si rimanda a:
PHILIP
http://evolution.genetics.washington.edu/philip/software.html
TREE-OF-LIFE http://phylogeny.arizona.edu/tree/programs/programas.html
TreeWiew
http://taxonomy.zoology.gla.ac.uk/rod/rod.html
ReadSeq
http://dot.imgen.bcm.tmc.edu:9331/seq-util/Options/readseq.html
SEQUIO
http://wwwcsif.ucdavis.edu/-kknight/sequio.html
169
BIOINFORMATICA
170
BIOINFORMATICA
GRAFICA MOLECOLARE
La modellistica molecolare è nata nella seconda metà dello scorso secolo quando alcuni
chimici, tra cui il tedesco Friederich August Kekulè e l'olandese Jacobus H. Van't Hoff,
cominciarono ad avvalersi di modellini in legno e metallo per rendere più agevole la
comprensione delle strutture molecolari. Oggi questa disciplina fa largo uso del computer ed
è utilizzata sia per la rappresentazione grafica delle molecole in campo didattico e
pubblicistico sia per la realizzazione di simulazioni (reazioni chimiche, effetti del solvente e
della temperatura sulla stabilità molecolare, docking, ecc.) utilissime nella ricerca scientifica,
dove sono impiegate per la scoperta di nuovi farmaci, per lo studio di composti utili come
pesticidi e diserbanti, per le indagini di complesse interazioni molecolari che sono alla base
dei processi metabolici. Roger Sayle è stato il creatore di Rasmol, un programma vero e
proprio di grafica molecolare concepito per la visualizzazione di proteine, acidi nucleici e
piccole molecole. Il programma aiuta a visualizzare, insegnare e generare immagini
pubblicabili di alta qualità. La peculiarità di questo programma è che opera su una vasta
gamma di sistemi operativi. Prima di incominciare è necessario scaricare Rasmol da internet.
Il programma funziona senz’altro meglio con Netscape, ma anche con l’ ultima versione di
internet Explorer. I siti per scaricare il programma sono molti http://www.umass.edu/
microbio/rasmol/ getras.htm; per avere però pieno accesso al programma è necessario
scaricare dei plug –in, chime, per l’esattezza, dal sito http://www.mdlchime.com/chime/,
altrimenti non si riescono a visualizzare le molecole. Una volta scaricati i programmi si può
procedere.
Il programma legge file di coordinate molecolari e mostra in modo interattivo la molecola
sullo schermo con la possibilità di operare svariate modifiche sia del tipo di rappresentazione
che dei colori. I files supportati da questo programma sono principalmente i PDB (Protein
Brookheaven Databank); Mol2 formats; MDL (Molecular Design Limited) e Mol file formats,
per creare molecole in 3D. La molecola caricata può essere mostrata solo con legami,
lineari, cilindrici, con sfere, con eliche solide o parallele, con legami ad idrogeno etc. È chiaro
che l’utilizzo del programma per costruire molecole da zero richieda una conoscenza di tipo
chimico strutturale non indifferente; ma tale interfaccia può risultare molto utile anche a chi
di chimica strutturistica mastica poco ma necessita un ausilio visivo veloce ed efficace per
comprendere una molecola semplice o molecole complesse come le proteine.
Perciò questo capitolo ha lo scopo di fornire sommariamente una guida semplice all’utilizzo
di questa interfaccia per capire le potenzialità di questo strumento, sfruttandolo anche per
eventuali pubblicazioni che sicuramente si arricchiscono e si abbelliscono se posseggono
immagini in 3d.
Seguiranno adesso degli esempi esplicativi su come utilizzare il programma per la semplice
visualizzazione. Si tratterà prima una molecola semplice, per la precisione la glicina; poi il
DNA e infine una molecola complessa proteica, l’emoglobina.
ESEMPIO 1. Prendiamo ad esempio la glicina, che è l’amminoacido più semplice.
Questo rappresentazione, in codice chiamata ball and stick, (sinistra) non rappresenta in
realtà la vera taglia molecolare e la forma della molecola.
171
BIOINFORMATICA
A destra il modo di rappresentare la molecola viene chiamato spacefilling, dà un’idea
dell’ingombro sterico reale della molecola ma nasconde la struttura dietro alla superficie.
Infine, sotto a sinistra, in questa rappresentazione viene evidenziato solo lo scheletro del
peptide (backbone). La visualizzazione solo in stick mostra solo i legami ed è la migliore
per guardare i legami attraverso molecole complesse.
ESEMPIO 2. Analizziamo ora le potenzialità che il programma offre per la comprensione e la
visualizzazione tre D della molecola del DNA.
Questo esempio in particolare è stato tratto da uno dei numerosi tutorial di rasmol che
esistono on-line, infatti solitamente ci si trova l’immagine da sola su sfondo nero e le
modifiche si possono attuare solamente dal menù a cascata che si attiva con il tasto destro
del mouse.
Cliccando sulle lettere si ottiene la legenda delle stesse,
che poi è quella dei simboli della tavola periodica degli
elementi, (C= carbonio, H idrogeno e così via) e quella
dei colori utilizzati. CPK, così viene chiamato questa
attribuzione cromatica acronimo che deriva da Corey,
172
BIOINFORMATICA
Pauling, Koltun. Premendo X spin si ottiene la rotazione della doppia elica intorno all’asse
delle ascisse; mentre con Y spin si ottiene la rotazione della stessa sull’asse delle ordinate,
ottenendo la situazione seguente:
La funzione end dà una visione
della doppia elica in sezione e la
visione side la vista laterale, infine
½ e 2X permettono lo zoom o la
visione ridotta dell’intera molecola.
Con backbone si evidenzia appunto
lo scheletro che forma la doppia
elica.
Cliccando sul tasto bases invece si
evidenziano (sempre in modalità
sticks)
le
basi
puriniche
e
pirimidiniche del DNA.
H
bonds
invece
permette
ovviamente
di
evidenziare
gli
importantissimi legami ad idrogeno
che permettono alla doppia elica di
esistere in tale conformazione.
Le funzioni thin e thick permettono
di visualizzare l’intera molecola
senza spessore o con spessore
tridimensionale; spacefill invece
visualizza la molecola con il relativo
reale ingombro sterico. Infine AT e
GC permettono di visualizzare
rispettivamente solo il legame tra
le basi accoppiate, adenina timina/
guanina citosina.
In qualsiasi momento, cliccando col
tasto destro del mouse, è possibile
modificare l’aspetto della molecola,
sia dal punto di vista “colorimetrico”
che dal punto di vista grafico, nonché
evidenziare determinati atomi o
residui, colorarli in modo diverso, e
vedere ruotare la molecola nello
spazio.
ESEMPIO 3. L’emoglobina è una proteina formata da
quattro distinte catene polipetidiche, che con rasmol si
possono facilmente distinguere per colore, Alfa 1, Beta
1, Alfa 2, B
B
2
Beeetttaaa 2
2... Ci sono anche 4 complessi eminici
(col ferro, evidenziati in rosso). Questo modo di
colorare la struttura dell’emoglobina si ottiene cliccando
sempre col tasto di destra del mouse, dove viene
mostrato il menù a cascata; si sceglie la modalità Van
der Waals radii, per ottenere il reale ingombro sterico; dopodiché si colora per catena
(chain). In rosso si evidenziano i gruppi eme.
173
BIOINFORMATICA
Un altro modo di visualizzare l’emoglobina evidenziando le sue peculiarità strutturali è quello
di rendere globosi, selezionandoli, i gruppi eme, e lasciando nella modalità stick e colorando
per catene il resto della molecola.
Nella figura accanto invece si sono evidenziati solo i quattro gruppi eme con l’atomo di ferro,
oscurando il resto della molecola con l’opzione change color to black dopo averla selezionata
opportunamente.
Infine si possono tra le altre opzioni visualizzare le eliche della strutture primarie: display
cartoons, che con delle frecce dà anche l’orientamento
delle eliche; mentre ribbons dà le eliche senza le frecce.
Altri modi di studiare una molecola d’interesse con rasmol
sono ad esempio evidenziare la carica e la sua
distribuzione spaziale, oppure visualizzare tutti gli
amminoacidi che la compongono. Per concludere questo
breve excursus sul programma, è possibile esportare le
immagini nella maniera in cui si sono elaborate con un
formato gif. Se invece si salvano con l’estensione PDB
(Save Molecole As) o MOL format, si può accedere al file
tramite il programma salvato rasmol, ma la molecola
viene visualizzata nel formato standard originale, e non
con le modificazione che eventualmente si sono operate. Inoltre è possibile trasferire
molecole semplici, se si possiede un computer discreto, al programma ISIS DRAW (Transfer
to ISIS DRAW dal menù a cascata) che è un programma freeware, in grado di costruire le
molecole piane. Sculpt invece è un programma di
accesso limitato (la versione demo dura circa tre
mesi) e permette di ruotare solo parti della molecola
in questione.
Per accedere facilmente ai databases di proteine o di
enzimi,
basta
andare
sul
ricchissimo
sito
http://www.biochem.ucl.ac.uk/, cliccare su research
groups, e poi su CATH (Protein Structure
Classification & Prediction Group).
A questo punto si ottiene la seguente schermata:
Dopodiché andando in alto a sinistra, nel riquadro
rosa, si digita il nome della proteina che si desidera visualizzare (esempio lactoferrin) e
quindi la chiave di ricerca è come general text, altrimenti Il PDB code (protein data base se
si conosce o il cath code) e cliccando su Go! si visualizza la
seguente pagina:
Che dà una lista di tutte le proteine che sono state caricate sul
database e cristallizzate in modi diversi, se ne sceglie una
cliccando sul link prescelto (di solito la sigla è a tre lettere) e si
ottiene la visualizzazione standard in rasmol della proteina
prescelta. A questo punto la proteina può essere visualizzata nel
modo che più interessa, tramite i canoni dettati prima.
174
BIOINFORMATICA
MOLECULAR DOCKING. Molte funzioni biologiche sono mediate da interazioni tra molecole.
Queste interazioni possono essere di due tipi: fisiche (una molecola forma un complesso con
un'altra molecola) o logiche (una molecola controlla il comportamento di un'altra molecola
senza però stabilire nessuna interazione fisica con essa, ad esempio, come spesso avviene
per le proteine, regolandone l'espressione o modificando la concentrazione di un fattore che
è percepito dalla molecola target). Due approcci sono particolarmente popolari nella
comunità di utenti del docking molecolare. Un approccio utilizza una tecnica di matching che
descrive la proteina e il ligando come superfici. Complementari. Il secondo approccio simula
l'effettivo processo di attracco in cui il ligando-proteina energie di interazione a due a due
sono calcolati.
Entrambi gli approcci hanno significativi vantaggi così come alcune
limitazioni.
Il Molecular Docking è una complessa tecnica computazionale multi-step, orientata alla
predizione ed alla valutazione dell'interazione fisica strutturale tra due molecole.
Possiamo distinguere diverse tipologie di Docking, sulla base delle differenti interazioni
molecolari possibili. Nel campo della modellistica molecolare, docking è un metodo che
prevede l'orientamento preferito di una molecola in un secondo momento legati l'uno
all'altro per formare un complesso stabile. La conoscenza dell'orientamento preferito a sua
volta, può essere usata per predire la resistenza di associazione o di affinità di legame tra
due molecole utilizzando, ad esempio uno score. Le associazioni tra molecole biologicamente
rilevanti quali proteine, acidi nucleici, carboidrati, lipidi svolgono un ruolo centrale nella
trasduzione del segnale. Inoltre, l'orientamento relativo dei due molecole che interagiscono
possono influenzare il tipo di segnale prodotto (ad esempio, l'antagonismo vs agonismo).
Docking quindi è utile per predire sia la forza e il tipo di segnale prodotto tra molecole
diverse. Il focus di docking molecolare è quello di simulare il processo computazionalmente
riconoscimento molecolare. L'obiettivo di docking molecolare è quello di raggiungere una
conformazione ottimizzata sia per la proteina e ligando e l'orientamento relativo tra proteina
e ligando in modo tale che l'energia libera del sistema globale sia ridotta al minimo.
Diversi motivi tecnici ci spingono a focalizzare l’attenzione esclusivamente verso la terza
tipologia di Docking (Proteina-Ligando), spesso utilizzata per cercare di rispondere alle
seguenti domande: dove si legano determinate molecole all'interno della proteina? con quale
orientamento? con quale affinità? Docking viene spesso utilizzato per prevedere
l'orientamento vincolante di farmaci candidati piccole molecole per i loro obiettivi di proteine
al fine di prevedere, a sua volta l'affinità e l'attività della molecola di piccole dimensioni.
Quindi docking svolge un ruolo importante nella progettazione razionale dei farmaci. Dato il
significato biologico e farmaceutico di docking molecolare, notevoli sforzi sono stati diretti a
migliorare i metodi utilizzati per prevedere docking. Quando le condizioni lo consentono, il
Docking può addirittura fornire preziose informazioni su come modificare la molecola ligando
per aumentarne la sua affinità di legame e la sua specificità verso il recettore, processo noto
sotto il nome di Ligand Design. I programmi di Docking offrono una predizione del
complesso strutturale Proteina-Ligando andando alla ricerca del "corretto modo di legame",
tramite due passi:
Il campionamento dello spazio conformazionale, attraverso l'implementazione di specifici
algoritmi di ricerca.
La successiva valutazione dell'energia di legame (Binding) per ogni conformazione del
complesso, stimata attraverso opportune funzioni (dette di scoring).
175
BIOINFORMATICA
Limiti ed Approssimazioni. Attualmente il Docking rappresenta un settore "di frontiera" in
forte sviluppo anche grazie all'elevatissimo numero di strutture 3D disponibili nelle banche
dati (ad oggi più di 51.000). Il processo si basa su di una approfondita conoscenza
strutturale (a livello atomico), sia della componente proteica che della componente non
proteica (ligando). L'assenza di informazione strutturale dettagliata, in special modo della
componente proteica, è forse uno dei più grandi limiti della procedura. Le banche dati
strutturali rappresentano quindi uno strumento insostituibile che ha positivamente
incrementato lo sviluppo di questa tecnica computazionale in diversi settori della moderna
ricerca scientifica. Molte di queste molecole proteiche giocano infatti ruoli critici in diversi
pathways metabolici e possono essere utilizzate come potenziali target terapeutici,
favorendo la progettazione di nuovi farmaci ad azione molecolare mirata (Drug Design).
Il Docking molecolare può essere pensato come un problema di "un lucchetto ed una
chiave", in cui si è interessati a trovare il corretto orientamento relativo della "chiave" che
aprirà il "lucchetto" (in cui sulla superficie del blocco è dal buco della serratura, in quale
direzione girare la chiave dopo che è stato inserita). La proteina può essere pensata come il
"blocco" e il ligando può essere pensato come una "chiave". Docking molecolare può essere
definito come un problema di ottimizzazione, che descrivono il "best-fit" di orientamento di
un ligando che si lega a una proteina di particolare interesse. Tuttavia, poiché sia il ligando e
la proteina sono flessibili, una "mano-nel-guanto" analogia è più appropriata l’analogia con il
lucchetto e la chiave. Nel corso del processo, il ligando e la proteina adeguare le loro
conformazione per conseguire un obiettivo complessivo definito come "best-fit". In molte
tecniche di Docking automatico, il Ligando (flessibile) viene generalmente posizionato in una
macromolecola proteica a conformazione bloccata (rigida). Questo perché la difficoltà di
effettuare analisi considerando anche la flessibilità della componente proteica, rende
impossibile l'ottenimento di risultati in tempi ragionevoli. Diversi lavori, tra i quali ricordiamo
quello di A.R. Leach nel 1994, hanno cercato di trattare il problema della flessibilità della
componente proteica, sviluppando metodi in grado di consentire variazioni conformazionali
almeno ad un sottoinsieme limitato di catene laterali, ritenute significative nell'interazione.
Questo rimane ancora oggi un problema di difficile soluzione ed anche se è noto che, in
numerosi casi, l'interazione Proteina-Ligando viene accompagnata da ampie variazioni
conformazionali della componente proteica, la capacità di predire tali cambiamenti risulterà
di fondamentale importanza nella comprensione dei meccanismi di attivazione recettoriale e
trasduzione del segnale. Infine, la presenza di molecole di solvente all'interno del sito attivo
della proteina, l'aumento delle dimensioni del ligando, l'impossibilità nel simulare la
formazione e/o la rottura di legami covalenti ed i complessi calcoli energetici richiesti dalle
funzioni di scoring, introducono difficoltà aggiuntive che possono, molte volte, allontanare i
risultati ottenuti dalla realtà.
PROGRAMMI DI DOCKING. Il numero di software in grado di effettuare docking di piccole
molecole (ligandi) all’interno di strutture proteiche è ampio e diversi metodi, più o meno
efficaci, sono stati messi a punto e testati negli ultimi anni. Questo non sorprende affatto se
si considera che lo studio dei complessi di interazione Proteina-Ligando è oggi di estremo
interesse, specie nel settore bio-tecnologico e farmaceutico. Parecchi studi mostrano
comparazioni dei diversi programmi di docking in termini di accuratezza, capacità nel
riprodurre i risultati sperimentali, capacità nella selezione delle migliori pose in funzione
della loro energia libera di legame ed abilità nel discriminare rapidamente migliaia di
molecole teoricamente interessanti (generalmente selezionate da una banca dati),
individuando quelle più affini al sito attivo della proteina di interesse (virtual screening).
Risulta quindi veramente difficile esprimere giudizi che abbiano una validità generale.
Nel ricco scenario dei Molecular Docking Programs, AutoDock gode di ottima reputazione.
La licenza libera per uso accademico, la buona affidabilità e l’alta versatilità, hanno fatto di
AutoDock uno dei programmi di docking più apprezzati e questo spiega l’alto numero di
citazioni in diversi lavori scientifici. Il moderno AutoDock 4.0 implementa un robusto e
collaudato metodo di docking automatico chiamato Lamarckian Genetic Algorithm (LGA),
includendo anche un Monte Carlo Simulated Annealing (SA) ed un tradizionale Genetic
Algorithm (GA), entrambi meno efficienti ed affidabili rispetto al primo. Il programma utilizza
176
BIOINFORMATICA
inoltre una funzione di scoring calibrata (AMBER Force Field), per il calcolo dell’energia
libera.
AutoDock è costituito da due programmi: Il motore di docking (AutoDock) che esegue il
docking del ligando basandosi su un set di griglie descriventi la proteina target ed AutoGrid,
che pre-calcola queste griglie. Rispetto alle precedenti versioni, AutoDock 4.0 si mostra ricco
di perfezionamenti. Il docking risulta essere più accurato ed affidabile, il programma è
adesso capace di tenere in considerazione, oltre la flessibilità del ligando, anche la flessibilità
della componente proteica e questo abilità AutoDock verso la possibilità di effettuare studi di
interazione proteina-proteina. Infine, AutoDock è dotato di una comoda interfaccia grafica
multipiattaforma chiamata AutoDock Tools (ADT), sviluppata dagli stessi autori del
programma.
ALGORITMI DI RICERCA. La simulazione del processo di docking in quanto tale, è un
processo molto complicato. In questo approccio, la proteina e il ligando sono separati da una
certa distanza fisica, e il ligando trova la sua posizione nel sito attivo della proteina dopo un
certo numero di "muoves" nello spazio conformazionale. Le mosse integrare le
trasformazioni del corpo rigido, come le traduzioni e le rotazioni, così come i cambiamenti
interni alla struttura del legante tra cui la rotazione di torsione. Ognuno di questi si muove
nello spazio conformazione del ligando induce un costo energetico totale del sistema, e
quindi dopo ogni mossa l'energia totale del sistema viene calcolata. L'evidente vantaggio di
questo metodo è che è più suscettibile di integrare la flessibilità legante nella sua
modellazione che le tecniche di complementarità di forma è necessario utilizzare alcuni
metodi ingegnosi per incorporare la flessibilità in leganti. Un altro vantaggio è che il
processo è fisicamente più vicino a ciò che accade nella realtà, quando la proteina e
l'approccio ligando vicenda, dopo il riconoscimento molecolare. Un chiaro svantaggio di
questa tecnica è che ci vuole più tempo per valutare la soluzione ottimale, poiché essi hanno
di esplorare un panorama piuttosto ampio di energia. Tuttavia le tecniche grid-based di così
come i metodi di ottimizzazione veloce hanno notevolmente migliorato questi problemi.
Per eseguire una schermata di attracco, il primo requisito è una struttura della proteina di
interesse. Di solito la struttura è stato determinato utilizzando una tecnica analitica come
cristallografia a raggi X, o meno spesso, la spettroscopia NMR. Questa struttura di proteine e
un database di potenziali ligandi utilizzati come input. Il successo di un programma di
docking dipende da due componenti: l'algoritmo di ricerca e la funzione di scoring. Sofisticati
algoritmi di ricerca sono stati proposti negli ultimi anni per cercare di migliorare le
performance dei programmi di Docking.
Genetic Algorithms. Molta attenzione viene oggi rivolta al metodo "ibrido" conosciuto sotto
il nome di Lamarckian Genetic Algorithm, implementato in AutoDock a partire dalla versione
3.0 e rivelatosi uno dei più efficienti metodi oggi a disposizione. Considerata la complessità e
la continua evoluzione di questi studi, quanto descritto non pretende di essere esaustivo
sull'argomento. Si tratta di algoritmi stocastici intelligenti, descritti per la prima volta nel
1975 da John H. Holland ed utilizzati per l'ottimizzazione di determinati problemi. La ricerca
delle soluzioni è condotta imitando il comportamento degli organismi viventi che hanno una
riproduzione sessuata: si generano delle popolazioni di soluzioni e si selezionano, secondo
un criterio prestabilito, i migliori individui, analogamente a quanto avviene in natura secondo
la teoria evolutiva di Charles Darwin. L'ottimizzazione mediante Genetic Algorithms è
dunque un processo scandito dalle fasi dell'evoluzione: si parte da una popolazione iniziale
di possibili soluzioni ed alcuni "Operatori Genetici" agiscono sulle popolazioni generandone
continuamente di nuove. Le soluzioni che mostrano essere più adatte delle altre,
sopravvivono alla prossima generazione e si riproducono di nuovo. Le soluzioni ritenute
peggiori vengono scartate, e non hanno quindi discendenza. Il processo ha termine quando
gli Operatori Genetici non riescono a migliorare ulteriormente le soluzioni trovate. Una
funzione di Mapping trasforma gli stati variabili di un individuo (genotipo), nel suo fenotipo,
ovvero nel suo corrispondente set di coordinate atomiche. Questo permette la successiva
valutazione della fitness, definita come l'energia minima globale di interazione del sistema
Proteina-Ligando, valutata utilizzando una opportuna funzione energetica.
Una nuova visone del sistema molecolare Proteina-Ligando è rappresentata da un percorso
attraverso un complesso paesaggio energetico ad imbuto, alla ricerca della sua
177
BIOINFORMATICA
conformazione più stabile, ad energia più bassa (figura a lato). Questo paesaggio
energetico, specifico per ogni sistema considerato, si presenta piuttosto tormentato, ricco di
introflessioni e comprende generalmente, oltre ad un minimo assoluto (globale), anche
molti minimi energetici locali. Questi rappresentano alcuni possibili stati di interazione
molecolare transitori (non ottimali), che resistono fino a quando la relativa barriera
energetica non viene superata, solo in quel caso, il sistema può procedere verso una
conformazione più stabile, ad energia più bassa.
Un algoritmo di ricerca "ideale" dovrebbe condurre ad una soluzione ottimale, come quella
rappresentata nella figura in basso.
Pur mostrando spiccate capacità nel fornire soluzioni adeguate rispetto a molti algoritni
applicati in principio nelle procedure di Molecular Docking, i Genetic Algorithms hanno
mostrato di non essere capaci di convergere verso un ottimo globale se non si introducono al
loro interno, determinate procedure di ricerca locale. In effetti, la caratteristica dei GA non
sta tanto nel fatto di ritrovare soluzioni ottime globali, ma bensì nella loro capacità di
produrre molte soluzioni comunque buone.
Lamarckian Genetic Algorithm. La combinazione di un Genetic Algorithm (GA) con un
metodo di Local Search (LS), come ad esempio quello di
Solis e Wets, costituiscono un nuovo algoritmo ibrido
chiamato: Lamarckian Genetic Algorithm (LGA), in
grado di ottenere performance superiori rispetto ai due
metodi da soli. L'algoritmo è sviluppato in analogia con
uno dei principi cruciali della teoria evolutiva di JeanBaptiste Lamarck: Le caratteristiche fenotipiche,
acquisite durante la vita di un individuo, possono
riflettersi all'interno del suo genotipo e diventare tratti
ereditabili. Nell'algoritmo ibrido GA + LS, il risultato
della ricerca locale è utilizzato per migliorare la fitness
associata ad un individuo, ottenuta mediante una
ricerca globale.
Immaginiamo lo spazio genotipico, definito in termini di
caratteristiche intrinseche dell'individuo, come una linea
orizzontale più bassa mentre lo spazio fenotipico come una linea orizzontale più alta
(Garretti M. Morris, 1998). La ricerca locale è normalmente condotta a livello dello spazio
fenotipico ed è influenzata dalle informazioni dettate dall'ambiente (paesaggio energetico).
Dopo un certo numero di iterazioni di ricerca locale si arriva ad un minimo locale ed una
funzione di "Mapping inversa" è generalmente utilizzata per convertire il miglior fenotipo
trovato, nel suo corrispondente genotipo (in accordo con il principio di Lamarck). Una nuova
caratteristica di questo algoritmo è data dal metodo di ricerca locale detto di Solis e Wets.
Questo metodo, implementato in AutoDock, ricerca attraverso lo spazio genotipico piuttosto
che nel più tipico spazio fenotipico. Questo vuol dire che l'algoritmo non necessita di una
funzione di Mapping inversa in quanto l'influenza dell'ambiente si ripercuote direttamente sul
genotipo e gli adattamenti ambientali acquisiti dall'individuo durante la ricerca locale,
saranno direttamente ereditati dalla discendenza.
178
BIOINFORMATICA
179
BIOINFORMATICA
PATTERN RECOGNITION
SISTEMI DI RICONOSCIMENTO AUTOMATICO. Approfondiremo, ora, i sistemi di
riconoscimento basati su immagini (che utilizzano, in genere, un mix di tecniche presentate
nel seguito), visto che al giorno d’oggi viene prodotta una sempre maggiore quantità di
documenti multimediali (immagini, filmati ecc.), per lo più memorizzati in forma digitale..
L’uso efficace di immagini in vari domini applicativi è ostacolato dalla difficoltà di classificare
e gestire questi dati in modo efficiente. Per digitalizzare un'immagine, il primo passo è
proprio quello di sovrapporre all'immagine analogica (ad esempio una fotografia) una griglia
fittissima di minuscole cellette. Ogni celletta sarà considerata come un punto dell'immagine,
chiamato pixel (picture element). Naturalmente, a parità di immagine, più fitta è la griglia,
più piccole saranno le cellette, e migliore sarà l'illusione di un'immagine continua. In questo
modo, abbiamo sostanzialmente 'scomposto' l'immagine in tanti puntini, abbiamo cioè
operato l’operazione di campionamento. Ma non abbiamo ancora risolto il problema della
quantizzazione e codifica digitale. Per farlo, occorre un passo ulteriore: rappresentare i
puntini attraverso numeri. Come procedere? L'idea di base è semplice: utilizzare anche qui
una tavola di corrispondenza, che faccia corrispondere numeri a colori diversi, o a sfumature
diverse di colore. In definitiva, si ha che il prodotto tra risoluzione dello schermo e numero
di colori utilizzabili fornisce la quantità di memoria necessaria per rappresentare
graficamente il contenuto dello schermo del computer. I primi personal computer con
capacità grafiche, all'inizio degli anni '80, utilizzavano griglie molto larghe (i pixel sullo
schermo del computer più che a minuscoli puntini corrispondevano a grossi quadrati) e i
colori codificati erano molto pochi (solo il bianco e nero, o al più 8 o 16 colori diversi).
L'effetto non era un ottimale, ma i bit utilizzabili per rappresentare l'immagine non erano
troppo numerosi. Ad esempio, una griglia di 80 colonne per 60 righe comprende
80x60=4800 pixel, e se ci limitiamo a due colori (bianco e nero) possiamo rappresentare
ogni pixel attraverso un solo bit: l''1' potrà rappresentare il nero e lo '0' il bianco. Con 4800
bit avremo dunque codificato un'immagine, anche se solo in bianco e nero, e ben poco
definita. Se abbiamo a disposizione un numero maggiore di bit, potremo rendere più fine la
griglia, oppure aumentare il numero dei colori, o fare tutte e due le cose insieme. Così, se
ad esempio per ogni celletta decidiamo di spendere 8 bit (e dunque 1 byte) anziché 1 bit
soltanto, anziché usare solo il bianco e nero potremo codificare 256 colori diversi. Sebbene
la “navigazione” di sequenze di immagini sia un tema importante in molte applicazioni nelle
quali si richiede all’utente di selezionare poche sequenze tra molte, o quando deve trovare
un punto particolare all’interno di una sequenza, gli strumenti a disposizione per eseguire
tali attività rimangono piuttosto primitivi.
Formati Immagine. Tutte le immagini digitali possono essere raggruppate in due categorie
principali: Vettoriali o Raster. Nella grafica ad oggetti detta anche grafica vettoriale,
un’immagine consiste di oggetti grafici (punti, linee, curve…) ognuno dei quali è definito da
un’equazione matematica. I vantaggi di questa rappresentazione sono:
Non viene persa risoluzione aumentando l’ingrandimento, perché l’immagine ingrandita
viene ricreata in base alle suddette equazioni.
Ogni oggetto può essere spostato, portato in primo piano, modificato, indipendentemente
dagli altri.
Gli svantaggi sono tuttavia che immagini in questi formati non sono adatti alla
rappresentazione di scene complesse. I file vettoriali sono più indicati se si desidera
realizzare illustrazioni che richiedono specifiche misure o che saranno stampate su supporti
di dimensioni notevoli (anche teloni di 10m x 10m). I contro di questo formato sono
facilmente intuibili; il vettoriale non è indicato per rappresentare fotografie o immagini foto
realistiche che di per se non presentano curve e forme ben definite.
180
BIOINFORMATICA
È qui che interviene la grafica Raster, di cui ci siamo occupati
nel presente contesto.
Formati Raster. Nella grafica a punti (bitmap graphics),
l'immagine è una griglia rettangolare (Raster) di pixel
colorati: è un po’ come un grande mosaico le cui tessere
(pixel) sono molto piccole. La grafica bitmap più semplice è
quella in bianco-nero. Ogni pixel dell'immagine può trovarsi in
due soli stati bianco o nero appunto. È dunque sufficiente un
bit per ogni pixel e un'immagine bitmap B/N di r righe per c
colonne richiede esattamente rc bit ovvero rc/8 bytes di memoria. Nel riquadro a lato il
disegno bianco e nero è scomposto in 10 righe di 11 colonne ciascuna dunque in totale
11x10 = 110 quadratini (detti pixel). Il disegno può memorizzarsi p.es. usando 1 per ogni
pixel nero e 0 per ogni pixel bianco, come nel disegno. È pertanto necessaria una memoria di
110 bit che equivalgono a 110/8 = 13,7 bytes. Un'immagine B/N 640x400 richiede 256000
bit ovvero 256000/8= 16000 bytes (circa 16K). Un'immagine B/N 800x600 richiede 480000
bit ovvero 480000/8= 60000 bytes (circa 60K). Questo tipo di grafica è più che sufficiente
per rappresentare disegni al tratto e testi scritti; si potrebbero ottenere anche sfumature di
grigio dosando opportunamente pixel neri e bianchi, ma questo porterebbe di fatto ad una
perdita di risoluzione: per ottenere un pixel grigio occorrerebbero infatti n pixel B/N. La
grandezza della griglia dipende dalla risoluzione dell'immagine. Per esempio, un'immagine
bitmap di 1cm x 1cm con una risoluzione di 600 punti per cm sarà definita da una griglia di
600 x 600 pixels (360000 pixels) dove ogni pixel avrà un suo specifico valore di colore. I
vantaggi di questo tipo di grafica consistono nel fatto che lavorando con i singoli pixels si
possono ottenere effetti simili a quelli della pittura e grafica tradizionale (pennello, matita,
carboncino). Il più grande problema che si presenta ai grafici quando si lavora con questo
tipo di immagini è che le stesse non sono facilmente scalabili (intendiamo ingrandibili) senza
che vi sia una qualche perdita di qualità e di nitidezza delle forme fino a creare effetti
sgradevoli (pixelizzazione).
Per quanta riguarda i vantaggi delle immagini raster possiamo quindi dire che:
-sono codificabili in mappe di bit
-sono lette da molti tipi di software (portabilità)
-sono adatte a rappresentare immagini fotografiche
-sono facilmente modificabili
Per quanto riguarda gli svantaggi:
-immagini molto pesanti
-poco scalabili ogni modifica provoca la perdita di informazioni
Ogni bitmap è caratterizzata da due principali caratteristiche:
-risoluzione
-profondità di colore
Risoluzione. Le immagini digitali sono costituite da una matrice di punti detti pixel: questo
termine è l'abbreviazione di picture element, che tradotto in italiano vuol dire elemento di
immagine. Un concetto legato ai pixels è quello di risoluzione. Il numero di pixel visualizzato
per unità di lunghezza in un'immagine è chiamato risoluzione dell'immagine, solitamente
misurata in punti per pollice (dot per inch - dpi; 1 inch= 2.54 cm). Naturalmente, più il
numero di pixel per pollice è alto, più l'immagine è nitida. Tuttavia, una volta che l'immagine
è stata digitalizzata o creata con una determinata risoluzione, l'aumento della risoluzione
non produce un miglioramento della qualità; la stessa informazione viene semplicemente
distribuita tra un numero maggiore di pixel. Un'immagine ad alta risoluzione contiene più
pixel, più piccoli rispetto ad un'immagine delle stesse dimensioni con una risoluzione
inferiore. Ad esempio, un'immagine di 1 pollice per 1 pollice con una risoluzione di 72 dpi
contiene complessivamente 5184 pixel (72 pixel di larghezza x 72 pixel di altezza = 5184).
La stessa immagine di 1 pollice x 1 pollice a 300 dpi conterrebbe 90.000 pixel. Per capire di
quanti pixel deve essere composta un'immagine digitale dobbiamo sapere innanzitutto in
che contesto dobbiamo utilizzarla. Se, ad esempio, vogliamo usare un'immagine all'interno
di una pagina web, non avrebbe senso usare una risoluzione maggiore di la risoluzione 72 o
96 dpi, perché la maggior parte dei monitor non è predisposta per visualizzare un numero
181
BIOINFORMATICA
maggiore di pixel per pollice. Se l'immagine deve essere stampata, al fine di ottenere la
migliore qualità possibile, è utile aumentare la risoluzione in modo proporzionale, ma non
uguale, a quella supportata dalla stampante che dovrà riprodurla, tenendo presente che una
risoluzione troppo bassa darà all'immagine un effetto di pixel grandi e grossolani, mentre
una risoluzione troppo elevata (pixel più piccoli di quelli supportati dalla periferica di output)
aumenta la dimensione del file e rallenta la stampa dell'immagine e, inoltre, la periferica non
sarà in grado di stampare l'immagine ad alta risoluzione.
Profondità di colore. La profondità di colore di un'immagine, detta anche profondità di bit,
determina tanto la dimensione del file che l'intervallo dinamico (sfumature) dalle zone scure
a quelle chiare, nonché il numero massimo di colori presenti. Ad esempio, le immagini al
tratto o bitmap sono costituite solo da pixels bianchi e neri. Ogni pixel contiene solo 1 bit di
informazione e proprio per questo la dimensione del file è la più contenuta e le immagini non
saranno di buona qualità. Le immagini a mezza tinta o a toni di grigio riproducono le tonalità
e le sfumature utilizzando 256 toni di grigio. Ogni pixel contiene 8 bit di informazione e
quindi i file sono otto volte più grandi delle immagini a tratto. Quindi più è elevata la
profondità di bit e migliore è il colore a discapito però della dimensione del file. Per la
visualizzazione on-line è più che sufficiente una scansione a 8 bit.
La codifica "bitmap" è la scelta ideale per la memorizzazione di immagini fotografiche: il
numero dei pixel (Risoluzione) ed il numero di colori associato ad ogni pixel (Profondità
colore) sono i due elementi fondamentali che definiscono la qualità dell'immagine. La
risoluzione e la profondità colore forniscono, a prescindere dal formato di stampa o di
visualizzazione, una indicazione della ricchezza di dettagli complessiva dell'immagine e della
sua capacità di raffigurare la realtà. Più è alta la qualità, sia sotto il profilo della risoluzione
che della profondità colore, tanto più numerosi saranno i bit necessari per la
rappresentazione dell'immagine stessa. La risoluzione deve essere precisata al momento
della creazione di un’immagine; infatti, se successivamente si decide di ingrandire un’
immagine, i pixel, mancanti verranno interpolati da quelli vicini e per quanto possa essere
"sofisticato" l'algoritmo d'interpolazione utilizzato, raramente il risultato sarà soddisfacente
ma, anzi, la qualità dell'immagine risulterà quasi sempre compromessa. La dimensione dei
pixel relativa al supporto su cui l'immagine viene stampata o visualizzata, è l'ulteriore
parametro che ci permette di valutare la qualità finale, così come verrà percepita
dall'osservatore.
Compressione Lossless e Lossy. L'obiettivo della compressione delle immagini è quello di
ridurre quanto più possibile il numero di bit necessari per la rappresentazione e la
ricostruzione di un duplicato identico (o quanto meno fedele) dell'immagine originale. A
questo punto entrano in gioco gli algoritmi di compressione che possono essere di due tipi:
lossy o lossless. Per esempio se voglio comprimere la stringa aaabbbcceccddddfdd un
algoritmo lossless mi restituirà 3a3b2ce2c4df2d facendomi risparmiare 4 caratteri. Con un
algoritmo lossy invece un risultato potrebbe essere 3a3b4c6d, facendomi perdere il
“dettaglio” della ‘e’ e della ‘f’ ma risparmiando ben 9 caratteri. La compressione lossy viene
attuata nel formato JPEG mentre la lossless nei formati Tiff, PNG. La compressione dati
lossless è quella classe di algoritmi di compressione che non comportano perdite di dati,
che consentano quindi di recuperare tutta l'informazione e ricostruire esattamente i dati
originali partendo dai dati compressi. Un esempio di questo tipo di compressione è dato dai
formati zip, gzip, bzip2, rar, 7z. I file per cui non è accettabile una perdita di informazione,
come i testi o i programmi, utilizzano questo metodo. Per le immagini fotografiche
generalmente non si usano algoritmi lossless in quanto sarebbero veramente poco efficienti,
ma per le immagini che contengono schemi o disegni realizzati al PC spesso la compressione
lossless non solo è applicabile, ma anche conveniente (GIF, PNG, MNG, TIFF). La tecnica di
compressione che consente di recuperare esattamente i dati originali viene detta senza
perdite (lossless), in contrapposizione alle tecniche con perdita (lossy) che permettono di
riottenere solo copie approssimativamente identiche all'originale. Entrambe le tecniche si
basano sul fatto che i dati generati da un’ immagine reale non possono essere considerati
casuali: campioni adiacenti hanno difatti valori di intensità simili e vi si possono trovare
significative ed importanti correlazioni spaziali; è chiaro che, se tali correlazioni vengono
esaltate in modo appropriato, il numero totale di bit può essere drasticamente ridotto.
182
BIOINFORMATICA
In accordo con la teoria dell'informazione, i dati-immagine vengono dunque convertiti in
sequenze di messaggi, le quali a loro volta vengono compresse assegnando loro dei codici di
lunghezza tanto minore quanto maggiore è la loro probabilità di apparizione (cioè quanto
minore è l'informazione da essi trasportata). È altresì facilmente intuibile che le tecniche
lossy consentono fattori di compressione difficilmente raggiungibili con le tecniche lossless a
parità di complessità computazionale, ed è questa la ragione per cui le tecniche lossless
sono scarsamente utilizzate in pratica.
La classe di tecniche lossy più comunemente usata è quella della codifica per trasformate
(transform coding). Tale metodo consiste essenzialmente nel trasformare l'insieme di pixel
in un altro insieme di coefficienti che presenti una correlazione minore, e che possa dunque
essere codificato in maniera più efficiente. L'immagine originale può essere recuperata, dopo
opportuna decodifica dei coefficienti in questione, mediante trasformazione inversa.
Lossless significa in inglese "senza perdita" ed infatti questa compressione non comporta
alcuna perdita di dati. Il dato compresso può quindi essere ricostruito nella sua interezza
senza perdere nemmeno un byte, per questo motivo tali algoritmi hanno largo impiego nella
gestione dei dati (testi o database). Tra gli algoritmi di questo tipo troviamo quello di
Huffman, utilizzato per i file di tipo testuale, e il cosiddetto LZW (Lempel-Ziv-Welch) che ha
la caratteristica di non richiedere la conoscenza a priori della distribuzione di probabilità dei
simboli dell'alfabeto, ma riesce a modellare dinamicamente le caratteristiche statistiche dei
dati da comprimere e adegua di conseguenza la codifica.
Quest'algoritmo non distruttivo fu inventato nel 1952 dal matematico D.A. Huffman ed è un
metodo di compressione particolarmente ingegnoso. Funziona in questo modo:
1. analizza il numero di ricorrenze di ciascun elemento costitutivo del file da
comprimere: i singoli caratteri in un file di testo, i pixel in un file grafico.
2. Accomuna i due elementi meno frequenti trovati nel file in una categoria-somma
che li rappresenta entrambi. Così ad esempio se A ricorre 8 volte e B 7 volte, viene
creata la categoria-somma AB, dotata di 15 ricorrenze. Intanto i componenti A e B
ricevono ciascuno un differente marcatore che li identifica come elementi entrati in
un'associazione.
3. L'algoritmo identifica i due successivi elementi meno frequenti nel file e li riunisce in
una nuova categoria-somma, usando lo stesso procedimento descritto al punto 2. Il
gruppo AB può a sua volta entrare in nuove associazioni e costituire, ad esempio, la
categoria CAB. Quando ciò accade, la A e la B ricevono un nuovo identificatore di
associazione che finisce con l'allungare il codice che identificherà univocamente
ciascuna delle due lettere nel file compresso che verrà generato.
4. Si crea per passaggi successivi un albero costituito da una serie di ramificazioni
binarie, all'interno del quale appaiono con maggiore frequenza e in combinazioni
successive gli elementi più rari all'interno del file, mentre appaiono più raramente
gli elementi più frequenti. In base al meccanismo descritto, ciò fa sì che gli
elementi rari all'interno del file non compresso siano associati ad un codice
identificativo lungo, che si accresce di un elemento ad ogni nuova associazione. Gli
elementi invece che si ripetono più spesso nel file originale sono anche i meno
presenti nell'albero delle associazioni, sicché il loro codice identificativo sarà il più
breve possibile.
5. Viene generato il file compresso, sostituendo a ciascun elemento del file originale il
relativo codice prodotto al termine della catena di associazioni basata sulla
frequenza di quell'elemento nel documento di partenza.
Il guadagno di spazio al termine della compressione è dovuto al fatto che gli elementi che si
ripetono frequentemente sono identificati da un codice breve, che occupa meno spazio di
quanto ne occuperebbe la loro codifica normale. Viceversa gli elementi rari nel file originale
ricevono nel file compresso una codifica lunga, che può richiedere, per ciascuno di essi, uno
spazio anche notevolmente maggiore di quello occupato nel file non compresso.
Dalla somma algebrica dello spazio guadagnato con la codifica breve degli elementi più
frequenti e dello spazio perduto con la codifica lunga degli elementi più rari si ottiene il
coefficiente di compressione prodotto dall'algoritmo Huffman. Da quanto detto si deduce che
questo tipo di compressione è tanto più efficace quanto più ampie sono le differenze di
183
BIOINFORMATICA
frequenza degli elementi che costituiscono il file originale, mentre scarsi sono i risultati che
si ottengono quando la distribuzione degli elementi è uniforme. L'algoritmo non distruttivo
che va sotto il nome di LZW è il risultato delle modifiche apportate nel 1984 da Terry Welch
ai due algoritmi sviluppati nel 1977 e nel 1978 da Jacob Ziv e Abraham Lempel, e chiamati
rispettivamente LZ77 e LZ78. Il funzionamento di questo metodo è molto semplice: viene
creato un dizionario delle stringhe di simboli ricorrenti nel file, costruito in modo tale che ad
ogni nuovo termine aggiunto al dizionario sia accoppiata in modo esclusivo un'unica stringa.
Esiste un dizionario di partenza costituito dai 256 simboli del codice ASCII, che viene
incrementato con l'aggiunta di tutte le stringhe ricorrenti nel file, che siano maggiori di un
carattere. Ciò che viene memorizzato nel file compresso è un codice breve che rappresenta
in modo inequivocabile la stringa inserita nel dizionario così creato.
Esiste, naturalmente, un insieme di regole non ambigue per la codifica del dizionario, che
permetterà in seguito al sistema di decompressione di generare un dizionario esattamente
uguale a quello di partenza, in modo tale da poter effettuare l'operazione inversa a quella di
compressione, consistente nella sostituzione del codice compresso con la stringa originale.
La reversibilità completa e precisa dell'operazione è indispensabile al fine di riottenere
l'esatto contenuto del file originale. L'insieme di tecniche basate sulla visione "classica"
(legata cioè alla teoria dell'informazione) del problema della codifica delle immagini viene
detto di prima generazione. Quelle tecniche che tentano di adattare il problema della codifica
a quelle che sono le caratteristiche intrinseche del sistema visivo umano sono dette di
seconda generazione.
L'immagine viene partizionata in una serie di regioni, ognuna dotata di caratteristiche
peculiari, separate tra di loro da contorni, in modo che tali regioni coincidano il più
fedelmente possibile con gli oggetti presenti nella scena di interesse. La maggiore efficienza
di compressione che ne può conseguire deriva sia dall'esistenza di metodi molto efficienti
per la codifica dei contorni, sia dal fatto che le regioni all'interno dei contorni hanno in
generale un contenuto informativo molto basso e possono quindi essere rappresentate da un
numero relativamente basso di bit. L'inconveniente principale di tali tecniche risiede tuttavia
nella loro enorme complessità computazionale, che risulta per di più legata in maniera
essenziale al contenuto informativo dell'immagine.
Il formato Jpeg. JPEG usa una compressione di tipo "lossy", cioè, per diminuire la
dimensione dell'immagine, alcuni pixel vengono eliminati, per poi essere ricostruiti (non
esattamente uguali) in fase di decompressione e quindi l'immagine risultante non è più
quella originale. Esistono anche tecniche di compressione “lossless”, cioè senza perdita di
pixel (un esempio è LZW) ma JPEG non ne fa uso. JPEG tuttavia è stato progettato in modo
tale che i pixel eliminati siano quelli meno percettibili all'occhio umano. L'occhio umano è
meno sensibile alle piccole variazioni di colore che alle piccole variazioni di luminosità, e così
JPEG se trova due pixel di minima variazione di luminosità li conserva, ma se trova due pixel
di minima variazione di colore ne tiene uno solo. Infine, JPEG tuttavia non usa un metodo
fisso di compressione ma l'utente può scegliere il grado di compressione che desidera
purché tenga ben presente che: più si comprime un'immagine, più piccolo diventa il file e
più si riduce la qualità dell'immagine stessa.
Il formato Jpeg2000. La tecnica che utilizza JPEG 2000 è analoga alla compressione JPEG.
Tuttavia, mentre JPEG utilizza la DCT, JPEG2000 utilizza la DWT (Discrete Wavelet
Transform). Sue caratteristiche sono:
-può essere lossy o lossless,
-degrada la qualità molto meno del classico JPEG.
Può generare immagini compresse scalabili sia in risoluzione sia in livello di dettaglio,
lasciando la libertà di scegliere quanta informazione e quali parti dell'immagine utilizzare per
la decompressione.
Il processo di compressione è analogo a quello utilizzato nel JPEG, ma la trasformata
applicata all’immagine è diversa. Una delle caratteristiche più importanti dello standard
JPEG2000 è la possibilità di definire aree dell'immagine che saranno codificate con qualità
più alta rispetto al resto dell'immagine. Queste aree sono dette Regions Of Interest (ROI),
mentre le parti rimanenti sono indicate come background (sfondo).
184
BIOINFORMATICA
Il formato Djvu. DjVu è una tecnologia di compressione d'immagine, un formato file e una
piattaforma per la distribuzione via rete di documenti. Si fonda sul modello MRC, uno
standard dal formato standard e aperto (grazie al progetto DjVuLibre), che propone la
segmentazione dell'immagine in livelli, ciascuno dei quali viene compresso con algoritmi
specifici. Separando gli elementi di sfondo, la texture della carta e le foto e comprimendoli
con un algoritmo di tipo wavelet (lo stesso alla base del formato JPEG 2000), Djvu può
garantire un'elevata risoluzione del livello del testo. Con questa tecnica si possono ottenere
file molto leggeri, veloci da visualizzare anche su computer di vecchia generazione. Per
quanto riguarda le prestazioni possiamo dire che i file DjVu sono in grado di ottenere fattori
di compressione, su documenti a colori, dalle cinque alle dieci volte migliori rispetto ad altri
formati concorrenti quali JPEG e GIF e, su documenti in bianco e nero, fattori dalle tre alle
otto volte migliori rispetto al formato TIFF G4. All'estero già moltissimi istituiti di ricerca,
biblioteche, archivi, agenzie governative e società hanno deciso di rendere accessibili in rete
i loro fondi documentali adottando questo formato; in Italia è ancora poco diffuso, ma già
oggi gli archivi di alcune biblioteche sono consultabili direttamente da casa grazie a DjVu.
Il formato PDF. Il PDF (Portable Document Format) è uno dei più importanti formati per la
creazione e la visualizzazione di documenti elettronici ed e-book al mondo. Creato dalla
Adobe all’inizio degli anni Novanta, esso ha avuto subito una buona diffusione grazie alla sua
grande versatilità. È il formato più usato per lo scambio di documenti, moduli e per la
creazione di libri elettronici. Infatti, è un formato di file universale che permette di
conservare, indipendentemente dal creatore o dal destinatario, tutti i font, gli elementi
grafici e l’impaginazione del documento originale senza che esso venga alterato. Infine, i file
in questo formato, compatti e leggeri, possono essere facilmente visualizzati da chiunque
grazie alla possibilità di scaricare gratuitamente il software di lettura Adobe Reader dal
relativo sito. Ormai, il formato PDF è considerato lo standard anche per gestire
documentazione di primaria importanza. Basti pensare che numerosi enti governativi,
aziende e amministrazioni lo usano per lo scambio e l'archiviazione dei propri documenti.
Un file in PDF può essere reso modificabile oppure no, tutto dipende dal tipo di protezione
che i vuole dare al documento. Esiste la possibilità di proteggerlo in modo da renderlo, ad
esempio, non stampabile o stampabile solo in parte. Si può anche proteggere il testo da
modifiche o si può proibire di estrapolarne alcune sue parti. Consentendo di creare
documenti accessibili solo a chi vogliamo noi, ne favorisce una sempre più ampia diffusione
nelle amministrazioni e nelle aziende.
IMMAGINI DIGITALI. Insieme di azioni compiute da appositi algoritmi su una
immagine numerica per modificarla in modo da raggiungere un prefissato obiettivo,
producendo un risultato che è ancora una immagine. Questa definizione è limitativa e non
riscuote l’approvazione di tutti gli studiosi. Sono oggi considerati temi di image processing:
Compressione di immagini (image coding), Analisi di immagini (image analysis),
Trattamento di video (video processing) e Riconoscimento di forme (pattern recognition).
La domanda che sorge spontanea nel descrivere la pattern recognition (PR), è: cos’è
esattamente un pattern? Watanabe descrive un pattern come “l’opposto del caos; ovvero
un’entità, generalmente definita a cui si può dare un nome”. Per esempio, un pattern può
essere l’immagine di una impronta digitale, una parola scritta in corsivo, l’immagine di un
volto, o un segnale acustico. Gran parte dei fenomeni dell’esistenza umana si manifestano
sotto forma di pattern; i simboli della scrittura, gli elementi costitutivi del parlato, disegni e
immagini, i volti delle persone conosciute. L’importanza del PR è legata non solo alla
percezione, ma anche alla conoscenza: gli esseri umani valutano le situazioni in termini di
pattern e agiscono in base alla loro valutazione di tali pattern. L’estensione al computer di
capacità di riconoscimento di pattern può renderlo in grado di svolgere compiti percettivi e
cognitivi. Obiettivo ultimo del PR: costruire macchine che possiedano le nostre stesse
capacità di riconoscimento di pattern. L’uomo attraverso la visone esegue il riconoscimento
mediante una classificazione dei pattern. Il mapping è “opaco”, i dettagli del processo sono
inaccessibili agli osservatori e quasi sempre anche alla persona stessa. L’implementazione su
computer di un metodo di PR richiede che il mapping opaco sia sostituito da uno
“trasparente”, di cui sia possibile dare una descrizione precisa sottoforma di algoritmo. Il
185
BIOINFORMATICA
riconoscimento delle immagini è un ramo della branca dell'informatica detta "visione
artificiale" (Computer Vision), scopo della Visione artificiale è sviluppare algoritmi e
metodologie per la riproduzione automatica o semi-automatica di meccanismi tipici dei
sistemi di visione biologici, come ad esempio il nostro sistema visivo. La visione nell’uomo è
un processo con cui uno stimolo esterno viene portato all’interno del sistema nervoso e
quindi:
-campionato
-filtrato
-elaborato
Il risultato di questo processo è la percezione visiva, la visione non è un processo passivo di
riproduzione dell’immagine, ma un processo attivo che, a seconda delle richieste, privilegia
alcuni tipi di informazione e ne mette altri in secondo piano.
La luce raggiunge lo strato dei fotorecettori dopo aver attraversato gli strati antistanti
costituiti dalle cellule retiniche. I coni sono tra 6 e 7 milioni, concentrati nella parte centrale
della retina (fovea), Sono sensibili al colore presentano una
elevata soglia di soglia di attivazione (110 fotoni), per cui hanno
bassa sensibilità. Mentre l’alta velocità di risposta, per cui
permettono di vedere oggetti in rapido movimento e di percepire
rapidi cambi di intensità. I coni sono attivi per alti livelli di
luminanza (visione fotopica) e consentono di risolvere dettagli fini
in quanto generalmente ogni cono è collegato ad una sola
terminazione nervosa. Mentre i bastoncelli sono tra 75 e 150
milioni, distribuiti sulla superficie retinica, non sono sensibili al
colore e sono caratterizzati da bassa soglia di attivazione (1
fotone), per cui hanno un’elevata sensibilità.
1. Epitelio dei pigmenti
2. Estremità fotosensibile dei fotorecettori: coni e bastoncelli
3. Membrana esterna
4. Nuclei esterni delle cellule visive bipolari
5. Strato esterno di fibre nervose
6. Nuclei interni delle cellule visive bipolari
7. Strato interno di fibre nervose
8. Cellule gangliari
9. Strato di fibre del nervo ottico
10. Membrana interna
La bassa velocità di risposta, per cui non percepiscono correttamente rapide modifiche della
scena e sono attivi per bassi livelli di luminanza (visione scotopica). Non garantiscono una
buona risoluzione in quanto più bastoncelli sono collegati ad una stessa terminazione
nervosa.
Questi meccanismi consentono il riconoscimento di
forme e di colori, l'estrazione di informazioni
spaziali e geometriche, o la capacità di segmentare
ed inseguire oggetti in movimento. Mentre per il
riconoscimento delle immagini in maniera digitale,
l'immagine viene trasformata da segnale analogico
(di corrente) a valore numerico corrispondente
(digitale), memorizzando poi lo stesso in matrice.
Un'immagine digitalizzata è la trasformazione di
un'immagine
reale
in
una
corrispondente
rappresentazione numerica della stessa. Nella fase di digitalizzazione, l'immagine viene
trasformata da punti ottici (pixel) a valori digitali in memoria, con corrispondenza in matrice.
Fra il pixel fisico nella matrice del CCD della telecamera ed il relativo valore numerico nella
matrice di memoria, non esiste solo una corrispondenza di coordinate, ma anche un
186
BIOINFORMATICA
rapporto fra luminosità letta dal pixel durante la fase di acquisizione ed il valore digitale
memorizzato per lo stesso. Un'immagine digitale monocromatica è una matrice Y(i,j) di
valori discreti di intensità luminosa (livelli di grigio). È costituita da M*N pixel (picture
elements), ciascuno dei quali ha un valore
appartenente all'intervallo [0, 2b-1]. Per esempio,
con 8 bit si ha la possibilità di rappresentare un
numero di livelli (256) tale da consentire una
discriminazione dei grigi accettabile nella maggior
parte delle applicazioni, in quanto abbastanza
prossima a quella dell'occhio umano. Una immagine
monocromatica di dimensioni tipiche (512 * 512 *
8) occupa pertanto 256 Kbyte di memoria.
Nella acquisizione dell’immagine si ha anche la
quantizzazione della luminanza, oltre ad una discretizzazione spaziale, si effettua una
quantizzazione della luminanza Yd(i,j,t) e [0,1,…,2b-1] dove b è il numero di bit usato per
codificare i valori di Y(.) I valori [0,1,…,2b-1] si definiscono livelli di grigio. Tipicamente: 0
tende nero 2b-1 tende bianco. In senso ampio, riconoscere l'immagine in maniera
automatica significa utilizzare algoritmi che ricevono in input e sono in grado di estrarre da
essa varie informazioni. Le informazioni estratte possono collocarsi su più livelli: basso livello
(come le statalistiche sulla presenza dei vari toni di grigio o colori, sui bruschi cambiamenti
di luminosità, ecc.); livello intermedio (caratteristiche relative a regioni dell'immagine e a
relazioni tra regioni) o ad alto livello (determinazione di oggetti con valenza semantica).
Esistono sistemi in grado di riconoscere due immagini come simili che sono basati
unicamente sulla estrazione di caratteristiche di basso livello, mentre sono tuttora oggetto di
ricerca algoritmi che siano in grado di dare una interpretazione semantica del contenuto di
una immagine, pur ristretti a certi domini. ll riconoscimento automatico di oggetti (pattern)
e la loro descrizione, classificazione e raggruppamento (clustering) sono temi importanti in
una grossa varietà di problemi sia nell’area ingegneristica che scientifica, quali: la biologia,
la psicologia, la medicina, il marketing, la visione artificiale, l’intelligenza artificiale fino alla
fusione di dati (meglio conosciuta come data fusion).
Un problema classico nella visione artificiale è quello di determinare se l'immagine contiene
o no determinati oggetti (Object recognition) o attività. Il problema può essere risolto
efficacemente e senza difficoltà per oggetti specifici in situazioni specifiche per esempio il
riconoscimento di semplici oggetti geometrici come poliedri, riconoscimento di volti o
caratteri scritti a mano. Le cose si complicano nel caso di oggetti arbitrari in situazioni
arbitrarie.
Nella letteratura troviamo differenti aspetti del problema:
Recognition: uno o più oggetti prespecificati o memorizzati possono essere
ricondotti a classi generiche usualmente insieme alla loro posizione 2D o 3D nella
scena.
Identification: viene individuata un'istanza specifica di una classe. Es.
Identificazione di un volto, impronta digitale o veicolo specifico.
Detection: L'immagine e scansionata fino all'individuazione di una condizione
specifica. Es. Individuazione di possibili cellule anormali o tessuti nelle immagini
mediche.
Altro compito tipico è la ricostruzione della scena: dati 2 o più immagini 2D si tenta di
ricostruire un modello 3D della scena. Nel caso più semplice si parla di un set di singoli punti
3D. Casi più complessi tentano di generare superfici 3D complete. Generalmente è
importante trovare la matrice fondamentale che rappresenta i punti comuni provenienti da
immagini differenti.
Implementazione. L'organizzazione di un sistema di visione artificiale dipende fortemente
dall'applicazione in cui viene utilizzato. Alcuni sistemi sono semplici applicazioni stand-alone
(a sé stanti) che risolvono specifici problemi di misurazione o individuazione, mentre altri
costituiscono un sotto-sistema in un disegno più grande, che per esempio contiene anche
altri sottosistemi per il controllo di attuatori meccanici ecc... Ci sono tuttavia delle funzioni
187
BIOINFORMATICA
tipiche presenti nella maggior parte dei sistemi. Si riporta un esempio di approccio tipico ad
un problema di visione artificiale.
Acquisizione immagine (image acquisition). Un'immagine digitale è prodotta da vari tipi di
sensori come sensori sensibili alla luce, sensori tomografici, radar, sensori ad ultrasuoni. In
base al tipo di sensore l'immagine può assumere la rappresentazione di un ordinaria
immagine 2D, un volume in 3D o una sequenza di immagini. Il valore tipico di un pixel può
corrispondere all'intensità di luce in una o più bande spettrali ma può essere anche dedotto
dall'assorbimento sonico o delle onde elettromagnetiche.
Preelaborazione (pre-processing). Prima che una immagine venga trattata da un metodo
della visione artificiale è solitamente necessario elaborare i dati in modo da verificare che
questi soddisfino specifiche regole necessarie al metodo. Per esempio:
-Ricampionare per assicurarsi che le informazioni non siano ridondanti o insufficienti.
-Togliere eventuale rumore che introduce informazioni false.
-Modificare il contrasto per assicurarsi che le informazioni rilevanti vengano individuate.
Estrazione proprietà (feature extraction). Le caratteristiche dell'immagine sono estratte
dai dati dell'immagine ad esempio:Linee e bordi, Punti di interesse locale (Es: angoli)
Caratteristiche più complesse possono essere il riconoscimento di movimento, forme e
texture.
Individuazione/segmentazione (detection/segmentation). In qualche punto del processo
viene presa la decisione di quali aree saranno rilevanti per l'ulteriore elaborazione. Ad
esempio la selezione di un set di punti di interesse oppure la segmentazione dell'immagine
in più regioni che contengono un oggetto di interesse.
Elaborazione di alto livello (high-level processing). A questo punto l'input è tipicamente
un piccolo insieme di punti o regione di immagine che si presuppone debba contenere un
oggetto specifico. Gli obiettivi del restante processo sono:Verificare che il modello contenuto
nell'input possieda le specifiche del modello base o della classe, stimare i parametri specifici
tipo la posizione o la dimensione.
Classificare oggetti in più categorie. Dato un pattern, il suo riconoscimento (detto anche
classificazione) può essere principalmente effettuato in due modi:
1. supervisionato, in cui il pattern in input viene identificato come membro di una classe tra
quelle predefinite, ovvero viene classificato in maniera supervisionata avendo l’utente o il
progettista definito a priori le classi di interesse;
2. non supervisionato, in cui il pattern in input viene assegnato ad una classe sconosciuta a
priori, ovvero i pattern vengono raggruppati nei cosiddetti cluster (tecniche di clustering).
Il problema della pattern recognition quindi viene posto nella forma di classificazione o
identificazione delle categorie di appartenenza, dove le classi o categorie possono essere sia
definite dal progettista del sistema (nei metodi supervisionati), sia apprese dalle similarità
tra i pattern (nei metodi non supervisionati). I sistemi di pattern recognition creano,
chiaramente, nuovi scenari applicativi sia a livello accademico che industriale. Si pensi, per
esempio, ai vantaggi per un processo industriale che, impiegando il riconoscimento
automatico di oggetti, può beneficiare di un controllo qualità automatizzato. Sempre
nell’ambito industriale, l’impiego di algoritmi di riconoscimento automatico, portano ad
arricchire le funzionalità dei robot impiegati, come ad esempio la possibilità di muoversi in
determinati ambienti riconoscendo automaticamente gli ostacoli. Altre applicazioni di
interesse, sono quelle di video sorveglianza automatizzata. Pensiamo, ad esempio, ad una
stazione ferroviaria o ad un aeroporto ed a come, vista la mole di persone in transito, un
riconoscimento automatico di oggetti incustoditi possa essere cruciale per le funzionalità di
sorveglianza. Il riconoscimento di volti, è un’altra area di applicazione che consente di
aumentare notevolmente la sicurezza sia in ambito pubblico che aziendale. Un ulteriore
scenario, molto interessante, riguarda la cosiddetta “Realtà Aumentata” dove informazioni
reali percepite da utenti umani vengono arricchite da informazioni sull’ambiente estratte
automaticamente da un sistema automatizzato. Un esempio tipico è quello militare con la
possibilità di avere visori che includono tracciamento automatico dei soggetti individuati e
stima della distanza dall’osservatore. Già da questi primi esempi è chiaro come l’uso di
tecniche di riconoscimento automatico possa notevolmente migliorare le attuali applicazioni
tecnologiche in diversi campi, dal settore scientifico a quello sociale ed industriale.
188
BIOINFORMATICA
Le principali aree di applicazione della Pattern Recognition sono:
Automazione dei processi industriali.
•Riconoscimento di oggetti, ispezioni visuali, controlli di qualità.
•Navigazione e coordinazione di robot. Sorveglianza e tracking.
•Traffico, sicurezza.
Interazione uomo-computer.
•Rilevamento e riconoscimento di volti.
•Assistenza ai disabili.
Realtà virtuale e visualizzazione.
•Ricostruzione di scene e modelli 3D.
•Fotometria.
Applicazioni spaziali e militari.
Tra i campi più innovativi nell’applicazione del riconoscimento di pattern, c’è ad esempio
l’affective computing, identificato da Picard, che introduce la possibilità da parte del sistema
di riconoscere e esprimere emozioni, al fine di rispondere in maniera intelligente alle
espressioni umane.
In genere, un sistema di pattern recognition, riceve in ingresso la descrizione di un oggetto,
ovvero un insieme di misure che lo caratterizzano (feature) e sulla base di queste “decide” a
quale classe l’oggetto appartiene. La decisione della classe di appartenenza ha un costo
associato all’assegnazione dell’oggetto alla classe sbagliata e l’obiettivo con cui realizzare un
buon sistema di pattern recognition è quello di minimizzare il costo di classificazione.
Comunque, la caratteristica comune a tutti questi sistemi e domini applicativi è che le
misure caratteristiche (feature) non sono
suggerite o identificate dagli esperti di
dominio, ma vengono estratte ed ottimizzate
da procedure che elaborano dati; questo
avviene perché in genere abbiamo migliaia di
misure possibili anche per un singolo pattern.
La crescente disponibilità di risorse per il
calcolo automatico non solo consente di
elaborare contemporaneamente grosse moli di
dati, ma permette anche l’analisi e la
classificazione di grandi insiemi di pattern. Allo
stesso tempo, la domanda di applicazioni di
pattern recognition cresce continuamente
grazie alla disponibilità di grosse basi di dati e
del
calo
dei
costi
dei
supporti
di
memorizzazione.
Tuttavia, in molte delle applicazioni di pattern recognition risulta evidente che non esiste un
approccio “ottimale” e “generale” alla classificazione e che la scelta di integrare diversi
metodi e approcci è la migliore da perseguire. La progettazione di un sistema di pattern
recognition richiede essenzialmente di affrontare i seguenti aspetti:
1. Acquisizione e pre-elaborazione (e normalizzazione) dei dati.
2. Rappresentazione e classificazione dei dati o pattern.
3. Decisione e classificazione.
Il dominio di applicazione, in pratica, influenza enormemente la scelta dei sensori (nel senso
generale del termine), delle tecniche di pre-elaborazione e di normalizzazione dei dati, della
rappresentazione degli stessi e del modello decisionale di classificazione.
È noto che per i problemi di riconoscimento ben definiti e quindi condizionati
opportunamente (esempio: piccole variazioni nei valori appartenenti alla stessa classe e
grosse variazioni in quelli appartenenti a classi diverse) esistono soluzioni efficienti e buone
strategie decisionali di classificazione.
189
BIOINFORMATICA
La tabella 1 illustra, in sintesi i principali domini applicativi dei sistemi di riconoscimento.
Per esempio, usare approcci orientati all’apprendimento, basandosi su un insieme di dati per
l’addestramento automatico del sistema (training set) consente la necessaria flessibilità del
sistema, che addestrato con dati diversi, può reagire a situazioni diverse con un margine di
errore controllabile.
I quattro principali approcci alla Pattern recognition sono:
1. approcci basati su modello (Template Matching);
2. approcci con classificazione statistica (Statistical Classification);
3. approcci sintattici o strutturali (Syntactic or Structural Matching);
4. approcci basati su reti neurali (Neural Networks).
Questi approcci non sono necessariamente separati ed indipendenti, infatti a volte lo stesso
metodo può essere usato nei diversi approcci con diverse interpretazioni. Esistono anche
tentativi di progettazione e realizzazione di sistemi ibridi che introducono e integrano più
modelli all’interno dello stesso sistema.
SISTEMI DI PATTERN RECOGNITION BASATI SUL MODELLO.
Uno dei primi e più semplici degli approcci alla pattern recognition è quello basato sul
modello, il cosiddetto template matching. Nel contesto dell’interpretazione delle immagini,
l’obiettivo centrale è quello di riconoscere gli oggetti presenti all’interno di un’immagine.
“Riconoscere” un oggetto significa verificare che nell’immagine è presente un’istanza
dell’oggetto di cui è memorizzata una rappresentazione. I sistemi di pattern recognition
basati sul modello utilizzano la cosiddetta tecnica del “matching”; il matching è definito
come l’operazione che viene usata per determinare la similarità tra due entità dello stesso
tipo: punti, curve o forme ad esempio.
190
BIOINFORMATICA
Nell’approccio
basato
su
modello,
quest’ultimo (il modello) è tipicamente un
prototipo del pattern od oggetto da
riconoscere e classificare, tipicamente una
forma bidimensionale. L’oggetto da riconoscere (il pattern) viene
confrontato con tutti i modelli memorizzati nel sistema considerando i
cambiamenti di scala e le possibili invarianze per rotazione o traslazione.
Naturalmente ci saranno casi in cui sarà utile l’invarianza di scala, cioè ci
interessa riconoscere l’oggetto semplicemente dalla forma, mentre in altri
casi sarà necessario distinguere non solo rispetto alla forma ma anche
rispetto alla dimensione.
La misura di similarità utilizzata nei sistemi basati su modello, è solitamente una
correlazione statistica e può essere ottimizzata apprendendo i parametri dal training set,
ovvero da un insieme di esempi di oggetti forniti in input al sistema. I sistemi basati su
modello sono computazionalmente inefficienti, richiedono molte risorse di calcolo per
confrontare il modello del pattern in input con tutti gli altri presenti nella base dati, ma
grazie alla continua crescita della potenza di calcolo questo approccio viene sempre più
utilizzato soprattutto in ambito industriale.
Per come abbiamo definito il modello fino ad ora si dovrebbe parlare di sistemi basati su
modelli rigidi, ovvero sistemi dove il modello è descritto con parametri ed insiemi di valori
fissati. Questo tipo di sistemi tende a non essere efficiente in presenza di distorsioni dovute
all’acquisizione dell’oggetto (per esempio: effetti di errori sulle immagini), cambiamento dei
punti di vista, o grosse variazioni di valori delle caratteristiche all’interno della stessa classe
(interclass variance). In questi ultimi casi si tende utilizzare tecniche di modelli deformabili o
elastici al fine di consentire un confronto di similarità (matching) tra modelli le cui
deformazioni non possono essere rappresentate esplicitamente a priori. Per intenderci,
questi sistemi sono utili quando non possiamo modellare a priori tutte le possibili
deformazioni che un oggetto possa avere, ed allora si agisce creando un modello
dell’oggetto e studiando quali agenti esterni lo possono deformare (modellando quindi le
possibili deformazioni) a volte simulano anche forze fisiche.
SISTEMI DI PATTERN RECOGNITION CON CLASSIFICAZIONE STATISTICA.
Nell’approccio statistico ogni pattern è rappresentato in termini di un vettore di lunghezza d,
dove d indica il numero di misure caratteristiche o feature dello stesso e viene rappresentato
come un punto nello spazio d-dimensionale delle caratteristiche (feature o vector space).
L’obiettivo, quindi, è quello di selezionare un insieme di feature che consenta a vettori
appartenenti a categorie differenti di occupare spazi compatti in regioni disgiunte dello
spazio d-dimensionale delle feature.
L’efficacia della rappresentazione spaziale delle feature (feature set) è rappresentata da
come i pattern delle diverse classi sono ben separati nello spazio. Dato un insieme di
addestramento (esempi di pattern) per ogni classe, l’obiettivo è quello di stabilire delle
regioni di decisione nello spazio delle feature che consenta di separare i pattern appartenenti
a classi diverse. Nell’approccio statistico, le regioni di decisione sono determinate dalle
distribuzioni di probabilità per ogni pattern di appartenere ad una delle classi; le distribuzioni
vanno quindi specificate (anche parametricamente) oppure apprese mediante
addestramento del sistema (machine learning). Uno degli approcci più utilizzati è quello
dell’analisi dei discriminanti per la classificazione:
-prima di tutto si sceglie, sulla base dell’esperienza una forma parametrica per la regione di
decisione, per esempio lineare o quadratica;
-successivamente si sceglie, sulla base dell’insieme di addestramento, la migliore regione di
decisione ai fini della classificazione.
In genere si usano metodi statistici per la stima degli errori per determinare le regioni di
decisione. Il motivo di questa scelta si basa sul fatto che la migliore regione di decisione è
quella che minimizza l’errore nell’assegnare il pattern alla classe sbagliata.
Uno degli altri principali approcci alla costruzione delle regioni di decisione, l’approccio
diretto, nasce dalla cosiddetta filosofia di Vapnik. Questa si basa sull’idea che se si possiede
191
BIOINFORMATICA
un insieme ridotto di informazioni sul problema che si sta affrontando, è meglio cercare di
risolvere il problema direttamente, senza affrontare generalizzazioni dello stesso
come passo intermedio. È possibile, infatti, che in questo caso si posseggano informazioni
sufficienti solo per una soluzione diretta dello stesso, ma che le stesse siano insufficienti
per una soluzione più generale.
SISTEMI DI PATTERN RECOGNITION CON APPROCCI SINTATTICI.
In molti problemi di pattern recognition che coinvolgono oggetti complessi, una soluzione
può essere quella di considerare una prospettiva gerarchica, dove i pattern vengono visti
come composti da subpattern più semplici
I pattern elementari o subpattern sono chiamati primitivi e i pattern complessi da
riconoscere sono rappresentati sotto forma di insiemi e relazioni tra primitivi. Nei sistemi di
pattern recognition sintattici si crea un’analogia formale fra la struttura dei pattern
complessi e la sintassi di un linguaggio. I pattern vengono visti come frasi di un linguaggio,
mentre le primitive vengono rappresentate come l’alfabeto del linguaggio, e le frasi quindi
sono generate a partire da una grammatica per questo linguaggio.
Quindi un pattern viene riconosciuto o classificato se la rispettiva frase appartiene al
linguaggio specificato per quella classe ed è quindi accettata dalla grammatica specificata.
Quindi un grosso insieme di pattern-complessi può essere descritto da un semplice insieme
di primitive e regole grammaticali.
La grammatica per ogni classe di pattern può essere inferita o appresa dall’insieme di
pattern di addestramento o di esempio per ognuna delle classi di interesse.
La pattern recognition strutturale (o sintattica) è molto interessante perché, oltre alla
classificazione dei pattern, fornisce anche una descrizione di come essi siano costruiti a
partire dalle primitive, da qui l’uso della parola strutturale.
Questo approccio è molto usato in situazioni in cui la struttura dei pattern può essere
catturata da insiemi di regole, come per le forme d’onda degli elettrocardiogrammi, le
texture o trame (rappresentazioni foto realistiche applicate ad un modello sintetico
d’immagine) e l’analisi dei contorni.
L’implementazione di un approccio sintattico alla pattern recognition è in generale piuttosto
complessa e questo è dovuto per esempio al problema della segmentazione delle
immagini al fine di estrarre le primitive ed all’inferenza per estrarre la grammatica
dall’insieme di pattern di addestramento. Negli anni ottanta, Fu introdusse la nozione di
grammatica con attributi che unifica i concetti di pattern recognition sintattico con quello
basato su classificazione statistica. In effetti, un problema dell’approccio sintattico è che può
generare una esplosione di combinazioni da investigare per inferire dalle primitive e dalle
loro relazioni la grammatica conseguente; per cui necessita di grandi insiemi di pattern per
l’apprendimento e quindi grosse risorse di elaborazione dati.
SISTEMI DI PATTERN RECOGNITION BASATI SU RETI NEURALI.
Le reti neurali possono essere considerate come un sistema computazionale fortemente
parallelo costituito da un grande numero di processori estremamente semplici ma
intensamente interconnessi fra loro.
I modelli basati su reti neurali cercano di utilizzare principi di organizzazione dei dati, come:
addestramento, generalizzazione, tolleranza ai guasti e distribuzione dei dati, in una rete di
grafi pesati; i nodi sono rappresentati da neuroni artificiali e gli archi diretti (pesati)
rappresentano le connessioni tra l’output di un livello di neuroni e l’input del successivo
livello. La caratteristica principale delle reti neurali è la loro capacità di addestrarsi, mediante
procedure iterative, e gestire relazioni non lineari fra l’input e l’output, adattandosi ai
pattern di esempio. Le reti neurali vengono divise in famiglie a seconda della loro struttura e
del tipo di connessioni tra i neuroni artificiali; la famiglia di reti neurali più utilizzata per i
sistemi di pattern recognition, e quindi per la classificazione, è quella basata sulle cosiddette
feed-forward network, che includono tra gli altri i Multi-Layer Perceptron (MLP) e le RadialBasis Functions (RBF). Queste reti sono organizzate per livelli e hanno connessioni
unidirezionali tra i neuroni appartenenti ai differenti livelli.
192
BIOINFORMATICA
Un altro insieme, molto usato, di reti neurali è costituito dalle Self-Organizing Map (SOM), o
anche reti di Kohonen, che sono principalmente usate per il raggruppamento automatico di
pattern, chiamato data cluster. Il processo di addestramento nelle reti neurali, consiste
nell’aggiornare i pesi di connessione sugli archi dei neuroni artificiali al fine di migliorare la
precisione dei risultati della rete a seconda del compito assegnatole, di classificazione o di
raggruppamento (clustering).
Il crescente utilizzo dei modelli per la pattern recognition basati su reti neurali è dovuto
principalmente alla caratteristica per cui sembra che le reti neurali siano indipendenti dal
dominio applicativo del sistema di pattern recognition, in contrasto con quanto invece
avviene per i sistemi basati su modello o con approccio sintattico/strutturale. In più, per le
reti neurali sono disponibili algoritmi efficienti per l’apprendimento da insiemi di esempio dei
pattern da classificare. In definitiva le reti neurali forniscono un insieme di algoritmi non
lineari per l’estrazione delle feature dai pattern (mediante l’utilizzo del livello nascosto o
hidden layer) e per la classificazione dei pattern (per esempio i multi-layer perceptron).
In più, gli algoritmi di estrazione delle featu In un sistema per l’interrogazione di immagini è
necessario stabilire:
1. quale rappresentazione adottare per descrivere il contenuto delle immagini,
2. in quale modo organizzare le informazioni estratte per poi memorizzarle,
3. che tipo di strategie utilizzare per il recupero e la visualizzazione delle immagini
memorizzate.
Nella selezione del tipo di rappresentazione delle immagini, si deve tentare di trovare un
insieme di caratteristiche che descrivano nella maniera più completa possibile le immagini
presenti nella base dati. Molte delle tecniche adottate per rappresentare il contenuto delle
immagini si basano sulla conoscenza, cioè utilizzano informazioni note a priori sul dominio
specifico a cui è rivolta l’applicazione, non facilmente utilizzabili per il recupero di immagini
in basi dati generiche. In genere gli oggetti possono essere caratterizzati mediante: la loro
forma (contorno, baricentro ecc.), le regioni omogenee (segmentazione), o caratteristiche
geometriche di vario tipo (esempio, scheletro – tecnica che consiste nel rimuovere
ripetutamente i pixel del contorno fino a ridurre l’oggetto a uno “scheletro” largo un pixel).
La memorizzazione del contenuto delle immagini è organizzata mediante indici per rendere
più efficiente la successiva fase di recupero. La capacità di recupero delle informazioni in una
base dati multimediale è strettamente legata anche al linguaggio per le interrogazioni
fornito con essa. Esistono svariate forme di interrogazione su immagini, come ad esempio le
interrogazioni tramite identificatori, le interrogazioni testuali, le interrogazioni basate su
regioni (viene scelta una regione dell’immagine e tutte quelle che la intersecano vengono
selezionate) ecc.. Infine per ottenere i risultati (le immagini), gli indici delle immagini
memorizzate sono confrontati con i parametri estratti dalla descrizione dell’immagine fornita
in input dall’utente. La rappresentazione visuale dei risultati, quindi, consente all’utente di
valutare i risultati ottenuti e di variare gli intervalli entro i quali devono essere compresi i
parametri legati ai modelli degli oggetti recuperati, in modo da ottenere risultati più o meno
precisi a seconda del grado di accuratezza desiderato. Per quanto riguarda i video, la
descrizione delle entità “sequenze video” dipende dal contesto del filmato in esame e
dall'ambito cognitivo in cui viene utilizzata. Per questi motivi, la fase di indicizzazione dei
documenti deve sfruttare il contenuto della sequenza video in base alle caratteristiche
tipiche del dominio applicativo. Per esempio, può essere interessante effettuare ricerche per
soggetto (singolo attore, particolare scenografia), tipo di inquadratura (primo piano, quadro
d’insieme), tipo di azione (entrata in scena, uscita dalla scena, coro d’insieme). Per facilitare
la navigazione e il reperimento di sequenze video digitali, è utile descrivere i filmati in
termini di dati strutturati e riconoscere le interruzioni logiche al loro interno. Tale tecnica è
detta shot boundary detection e il suo compito è quello di segmentare lunghe sequenze, in
modo automatico, sfruttando una analisi basata sul contenuto. Il rilevamento e la
classificazione di interruzioni di scene è un primo passo nel processo di annotazione
automatica di sequenze video digitali.
Una volta eseguita la segmentazione, il video originale può essere pensato come suddiviso
in porzioni internamente uniformi e ininterrotte, sulle quali è possibile effettuare ricerche più
specifiche.re e di classificazione dei pattern possono essere direttamente applicati
193
BIOINFORMATICA
(matematicamente) su realizzazioni hardware delle reti neurali ai fini di incrementarne
l’efficienza. Diversamente da quello che sembra, molti dei più noti modelli di reti neurali
sono implicitamente equivalenti o molto simili ai metodi di pattern recognition basati su
modelli statistici. Ma indipendentemente dalle similitudini, le reti neurali offrono molti
vantaggi ai progettisti di sistemi di pattern recognition, quali: un approccio unificato alla
selezione ed estrazione delle feature, ed una strategia generale e flessibile per trovare
soluzioni ai problemi di classificazione in cui le regioni di decisione siano non lineari.
194
BIOINFORMATICA
APPROFONDIMENTI
SISTEMA DI NUMERAZIONE. Il problema fondamentale della numerazione è sempre stato
quello di rappresentare con un numero limitato di segni particolari, detti cifre, l’infinità dei
numeri. Come noto, noi usiamo un sistema decimale, con 10 cifre-base che vanno da 0 a 9.
Il numero 0, chiamato dagli arabi "vuoto" e dagli orientali "circolo", fu introdotto in Italia dal
pisano Leonardo Fibocacci, nel 1223, col nome che dura ancora oggi e che proviene da
"zefiro" (dolce venticello). Insomma, fu con l’uso della numerazione scritta posizionale
arabica, che, a sua volta, rifletteva quella indiana, che l'Europa aveva scoperto la grande
importanza dello zero.
Nella memoria di un calcolatore e sui dischi tutte le informazioni sono rappresentate come
una lunga sequenza di zeri e uno, vale a dire in forma binaria.
Ogni singolo 0 e 1 è un bit, cioè la più piccola unità informativa manipolabile. Il termine bit
venne coniato dal gruppo di ricercatori capeggiato da Claude Shannon come contrazione di
“binary digit”. Verso la fine degli anni 40, Claude Shannon dimostrò che utilizzando un
circuito elettrico dotato di un interruttore era possibile definire le condizioni VERO per il
circuito aperto e FALSO per circuito chiuso. Era possibile dunque effettuare delle operazioni
logiche associando il numero 1 a vero e il numero 0 a FALSO. Questa scoperta rappresenta
la base della teoria dell’informazione e, dunque, pose in quegli anni le basi per la nascita
degli elaboratori.
Quindi, un documento, scritto con un programma di videoscrittura, viene salvato in memoria
in forma binaria ed è visibile come sequenza di caratteri solo attraverso un monitor o una
stampante: è l’hardware, cioè il livello fisico, di questi due componenti che trasforma codici
binari in simboli. Così come all’interno di CPU e RAM i valori 0 e 1 vengono rappresentati in
forma elettrica mentre sui dischi in forma magnetica.
In un elaboratore le informazioni vengono codificate come sequenza di singole unità ognuna
delle quali rappresentata da un codice binario, cioè da un gruppo di bit. La più piccola unità
di informazione memorizzabile (e quindi utilizzabile) è il bit, che può assumere quindi valore
0 o 1. Il dispositivo utilizzato per memorizzare un bit è un elemento bistabile, cioè un
dispositivo elettronico che può assumere uno tra due stati stabili (es. due livelli differenti di
tensione), ognuno dei quali viene fatto corrispondere a 0 o a 1 (cella di memoria).
Nell’ottica dei calcolatori l’informazione viene classificata in numerica e testuale. Con
informazione numerica si intendono dati su cui poter compiere operazioni aritmetiche, quindi
i numeri, che si dividono in interi e reali (o floating-point). L’informazione testuale, invece, è
una sequenza di singoli caratteri e viene chiamata alfanumerica se i caratteri
rappresentano sia numeri che lettere dell’alfabeto. Le operazioni possibili su una cella di
memoria sono operazione di scrittura quando la cella di memoria viene caricata con un
determinato valore che permane memorizzato finché:
- la cella viene alimentata elettricamente
- non si esegue un’altra operazione di scrittura che modifica il valore precedentemente
memorizzato. Mentre nell’operazione di lettura si accede alla cella di memoria per
consultarne il valore e copiarlo su un’altra cella di memoria. Un insieme di N celle elementari
può assumere uno tra 2N stati possibili. Un tale insieme è organizzato in un registro di
memoria. Il registro costituisce un supporto per la memorizzazione di un’informazione che
può assumere uno tra 2N valori possibili. In particolare un insieme di 8 bit forma un byte.
Sul registro sono possibili operazioni di lettura e scrittura che interessano
contemporaneamente tutte le celle di memoria contenute nel registro.
195
BIOINFORMATICA
Prima di approfondire le regole con cui un elaboratore partendo dal sistema binario
costruisce codici che rappresentano informazioni è necessario aprire una parentesi sui
sistemi di numerazione posizionali.
Il sistema di numerazione binario. Un generico sistema di numerazione è costituito da:
un insieme finito di simboli dette cifre,
un insieme di regole per associare un valore numerico ad una combinazione di cifre,
un insieme di procedure per svolgere le operazioni fondamentali sull’insieme numerico
definito.
In particolare nei sistemi di numerazione posizionali, come quello decimale, le cifre hanno
valore posizionale nel senso che il valore numerico di una cifra dipende dalla sua posizione
all’interno della sequenza. In un sistema posizionale un numero N si può scrivere come:
N = cn-1 * bn-1 + cn-2 * bn-2 + .... + c1 * b1 + c0 * b0
dove n = numero cifre numero, ci = i-esima cifra, b = base del sistema di numerazione.
Il peso viene associato alle cifre da destra verso sinistra, a partire dal valore 0. Così, nel
sistema decimale, il numero 152 si può scrivere come 1 * 10 2 + 5 * 101 + 2 * 100.
Anche il sistema binario è posizionale, quindi partendo dalla formula generale e impostando
la base a 2, si ha che il numero binario 0101 1110 può essere scritto come
01011110 = 0*27+1*26+0*25+1*24+1*23+1*22+1*21+0*20
Il bit più a sinistra viene detto bit più significativo o MSB (Most Significant Bit) mentre
quello più a destra è il bit meno significativo o LSB (Less Significant Bit) in base al fatto che
hanno rispettivamente il peso più alto (2n-1, con n=numero di bit) e quello più basso (0).
Conversione da decimale a binario. Per effettuare la conversione si divide ripetutamente
il numero da convertire per la base di arrivo (due, in questo caso) e il resto di ogni divisione
rappresenta una cifra del nuovo numero; il processo si conclude quando il numero da
convertire diventa 0. I resti, presi dall’ultimo al primo, rappresentano lo stesso valore
numerico ma espresso nel sistema binario.
Es:
Sia N = 59. Divido ripetutamente per due conservando i resti.
59 : 2 resto 1
29 : 2 resto 1
14 : 2 resto 0
7 : 2 resto 1
3 : 2 resto 1
1 : 2 resto 1
0
Si leggono i resti dal basso verso l'alto.
N= (59)10 = (111011)2
Il numero 111011 rappresenta un numero binario senza segno. Il metodo descritto può
essere utilizzato per rappresentare un qualsiasi numero intero senza segno.
Un numero pari termina con un bit 0; un numero dispari termina con un bit 1. Un numero
multiplo di due si converte rapidamente ponendo un 1 davanti ad un numero di zeri pari
all’esponente di 2. Ad esempio, 16, che è 24 è 10000 e 128 (27) è 10000000.
Conversione di un numero binario in decimale. In base alle regole dei sistemi di
numerazione posizionali, possiamo scrivere il numero 10100101 di 8 bit come:
(10100101)2 = 1*27+ 1*25+ 1*22+ 1*20 = (128)10 + (32)10 + (4)10 + (1)10 = (167)10
Le operazioni con il sistema binario.
Addizione. L'addizione tra numeri binari segue le regole generali dell'addizione nel sistema
decimale, quindi è necessario applicare le regole per la somma tra singoli bit (tabella
seguente) e applicare la tecnica del riporto
+
0
1
0
0
1
1
1
10
Es. Si voglia ottenere la somma dei numeri 1011 (11 in base 10) e 1101 (13 in base 10). Si
ha:
1 0 1 1 +
196
BIOINFORMATICA
1 1 0 1 =
1 1 0 0 0
Moltiplicazione. La moltiplicazione tra numeri binari si effettua basandosi sulle regole
usuali della moltiplicazione e sulla tabella riportata di seguito.
*
0
1
0
0
0
1
0
1
Es. Si vogliono moltiplicare i due numeri binari 1011 e 101. Si ha:
1 0 1 1 X
1 0 1 =
1 0 1 1
0 0 0 0 1 0 1 1 1 1 0 1 1 1
Le operazioni di sottrazione e divisione sono definite come inverse di addizione e
moltiplicazione, analogamente al sistema decimale. In particolare il prestito della sottrazione
è definito come inverso del riporto. Nonostante il calcolatore lavori esclusivamente nel
sistema binario, per ovviare alla difficoltà di usare lunghe sequenze di bit, si usano altri
sistemi di numerazione. In particolare si preferisce usare un sistema la cui base sia un
multiplo di due per rendere immediata la conversione. Due sistemi di numerazione
comunemente usati sono l’esadecimale e l’ottale.
Il sistema ottale. Si basa sulla numerazione in base 8, le cifre vanno da 0 a 7.
Per rappresentare le cifre di questo sistema ci vogliono 3 bit (2 3 = 8), dunque raggruppando
un numero binario in gruppi di tre bit e convertendo i singoli gruppi si ottiene un numero
espresso in ottale. Le corrispondenze tra i due sistemi sono:
binario Ottale
000
0
001
1
010
2
011
3
100
4
101
5
110
6
111
7
Per cui il numero binario 101 110 si scrive (56)8.
Sistema esadecimale. si tratta di un sistema di numerazione che si basa su un alfabeto a
16 cifre, da 0 a 9 e da A a F. Le cifre AF corrispondono ai valori 1015 del sistema
decimale. Per rappresentarne le cifre sono necessari 4 bit (24 = 16), dunque dividendo un
numero binario in gruppi di 4 bit e convertendo ogni gruppo nella corrispondente cifra
esadecimale, si esegue facilmente la conversione. Con questo sistema un numero binario a
32 bit può essere scritto come numero esadecimale a 8 cifre ed uno a 8 bit con due sole
cifre esadecimali, semplificando notevolmente il lavoro di un utente: questo è il principale
motivo di applicazione del sistema a base 16.
Decimale Esadecimale Binario
Decimale Esadecimale Binario
0
0
0000
8
8
1000
1
1
0001
9
9
1001
2
2
0010
10
A
1010
3
3
0011
11
B
1011
197
BIOINFORMATICA
4
4
0100
12
C
1100
5
5
0101
13
D
1101
6
6
0110
14
E
1110
7
7
0111
15
F
1111
Ad esempio, dato il numero 1011 1001, si divide in due gruppi e si traduce in B9 in base alla
tabella. Per convertire in decimale, invece, si sfruttano ancora le proprietà dei sistemi
posizionali, così, ad esempio si ottiene:
(FB3)16 = F*162 + B*161 + 3*160 = 15*162 + 11*161 + 3*160 = (3840)10+(176)10+(3)10 =
(4019)10
Rappresentazione dei numeri negativi. Fino ad ora si sono trattati solo numeri positivi.
La rappresentazione di numeri negativi implica un sistema di codifica, che prevede l'utilizzo
di un bit per rappresentare il segno. Sono due i metodi principali di rappresentazione dei
numeri negativi:
con modulo e segno;
in complemento a 2.
Nel primo caso, il bit più significativo viene utilizzato per rappresentare il segno (0 –
positivo, 1 – negativo) e i rimanenti per il modulo, così in una rappresentazione a 8 bit
possiamo codificare i valori da –127 (1111 1111) a +127 (0111 1111).
Questo metodo presenta però diversi inconvenienti, fra cui il fatto che esistano due codifiche
per lo zero (1000 0000 e 0000 0000) per cui è scarsamente utilizzato per i calcolatori.
Complemento a 2. Si utilizza ancora il MSB come bit di segno nel senso che: nel caso dei
numeri positivi si comporta come il metodo precedente, quando il bit del segno è 1, allora i
bit rimanenti non rappresentano più direttamente il modulo del numero.
Ad esempio il numero –1 viene rappresentato come 1111 1111 mentre il valore –128
(massimo valore negativo rappresentabile con 8 bit) corrisponde a 1000 0000 (prima 0),
risolvendo così il problema della doppia codifica dello zero.
Dal punto di vista dei sistemi posizionali si può interpretare il complemento a 2 come un
sistema che pesa la cifra più significativa con un valore negativo, quindi, nel caso di 8 bit, il
MSB avrà peso –27, cioè –128.
Ad esempio, dato il numero 11001001 in complemento a 2, si ha:
1100 1001 = 1*(–27)+ 1*26+1*23+ 1*20 = -128 + 64 + 8 + 1 = -55
Il numero complessivo di numeri rappresentabili è 256, da –128 a +127.
byte
senza segno complemento a 2
0000 0000
0
0
0000 0001
1
+1
0000 0010
2
+2
...
.....
.....
0111 1110
126
+126
0111 1111
127
+127
1000 0000
128
-128
....
....
....
1111 1110
254
-2
1111 1111
255
-1
Il metodo più rapido per calcolare il complemento a 2 di un numero è quello di convertire gli
zeri in uno e viceversa (operazione chiamata complemento a 1) e sommare il valore 1 al
risultato ottenuto.
Ad esempio, se consideriamo il numero binario 01111010 (122 in base 10) si ha:
198
BIOINFORMATICA
complemento a 1 10000101
complemento a 2 10000101 + 1 = 10000110 pari a (-128 + 4 + 2) = - 122.
Rappresentazione dei numeri reali in virgola mobile (cenni). Un numero reale può
essere espresso come
m x r esp
dove:
m = mantissa, r = radice e esp = esponente. Dato che in un calcolatore si usa solo il
sistema binario (radice = 2) è necessario memorizzare solo mantissa e esponente.
Secondo questa definizione, però, un numero può essere rappresentato in diversi modi. Ad
esempio, in decimale, il numero 1984.128 può essere rappresentato come
19.84128 x 102
0.1984128 x 104
1984128 x 10-3
Si osserva che la virgola varia al variare della potenza del 10 utilizzata. Definiremo una
rappresentazione normalizzata quella che consente di avere la virgola in posizione tale che
la prima cifra significativa sia a destra della virgola.
Ad esempio 0.11011101 x 25 è una rappresentazione normalizzata.
In generale possiamo rappresentare un numero in virgola mobile riservando un gruppo di bit
per l'esponente e uno per la mantissa. Ad esempio, in una codifica a 32 bit, un possibile
formato prevede un bit per il segno, 23 bit per la mantissa e 8 bit per l’esponente. Entrambi
i numeri sono generalmente rappresentati in complemento a 2, quindi nel caso del numero
0.1101 1011 x 23 si ha:
segno esponente
mantissa
0
0000 0011 000 0000 0000 0000 1101 1011
Rappresentazione dei caratteri. I codici ASCII (American Standard Code for Information
Interchange) sono utilizzati per rappresentare i caratteri all’interno di un computer. I codice
ASCII standard sono sequenze di 7 bit, dunque complessivamente è possibile rappresentare
128 caratteri tra lettere dell'alfabeto (maiuscole e minuscole), numeri, segni di
punteggiatura e caratteri speciali. Esiste anche un codice ASCII non standard a 8 bit che
permette di arrivare a 256 caratteri. Per alcuni alfabeti l’uso di 1 byte per rappresentarne i
simboli è troppo limitante e attualmente si sta diffondendo lo standard Unicode, una
codifica a 16 bit che con i suoi 65.000 caratteri permette di rappresentare anche alfabeti
molto complessi come quello cinese. I mainframe IBM utilizzano una rappresentazione
diversa detta codifica EBCDIC (Extended Binary Coded Decimal Interchange Code) che
utilizza 8 bit.
A conclusione del capitolo viene riportata la tabella dei codici ASCII standard.
199
BIOINFORMATICA
Char
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
__
Binary
100 0000
100 0001
100 0010
100 0011
100 0100
100 0101
100 0110
100 0111
100 1000
100 1001
100 1010
100 1011
100 1100
100 1101
100 1110
100 1111
101 0000
101 0001
101 0010
101 0011
101 0100
101 0101
101 0110
101 0111
101 1000
101 1001
101 1010
101 1011
101 1100
101 1101
101 1110
101 1111
Hex
40
41
42
43
44
45
46
47
48
49
4A
4B
4C
4D
4E
4F
50
51
52
53
54
55
56
57
58
59
5A
5B
5C
5D
5E
5F
Dec
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
200
Char
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
DEL
Binary
110 0000
110 0001
110 0010
110 0011
110 0100
110 0101
110 0110
110 0111
110 1000
110 1001
110 1010
110 1011
110 1100
110 1101
110 1110
110 1111
111 0000
111 0001
111 0010
111 0011
111 0100
111 0101
111 0110
111 0111
111 1000
111 1001
111 1010
111 1011
111 1100
111 1101
111 1110
111 1111
Hex
60
61
62
63
64
65
66
67
68
69
6A
6B
6C
6D
6E
6F
70
71
72
73
74
75
76
77
78
79
7A
7B
7C
7D
7E
7F
Dec
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
BIOINFORMATICA
IL LINGUAGGIO BASIC. Il nome è l'acronimo di Beginner's All purpose Symbolic
Instruction Code è stato sviluppato inizialmente al Darmouth College (Ohio) da Thomas
Kurtz e John Kemeny nel 1962. Il BASIC è un linguaggio di programmazione di alto livello di
tipo iterativo ed interpretato, vale a dire che ogni istruzione
viene tradotta in linguaggio macchina ed eseguita
immediatamente nel caso in cui venga riconosciuta
correttamente. Kurtz dichiarò che il BASIC era stato
previsto per fare risparmiare tempo all’utente, anche se
risultava
evidente
che
veniva
sciupato
tempo
all’elaboratore. Il BASIC inoltre risulta indipendente dal
calcolatore con il quale sono stati scritti i programmi. In
effetti il BASIC è un linguaggio relativamente facile da
apprendere anche se presenta alcuni limiti come ad
esempio la strutturazione dei programmi, e che i
programmi in BASIC sono più lenti rispetto ad altri
linguaggi.
Il Basic è un linguaggio di programmazione nato solo per scopi didattici, anche se ormai
non si può più considerare tanto adatto neanche per questo. La semplicità di questo
linguaggio è tale per cui si trovano quasi sempre solo interpreti e non compilatori, e in ogni
caso, la natura stessa del linguaggio è tale per cui questo dovrebbe sempre essere solo
interpretato. Venne implementato per il computer GE 225, con lo scopo di fornire un
linguaggio veramente molto semplice da imparare e facile da tradurre.
BASIC consente di realizzare un'ampia gamma di applicazioni e dispone di molte versioni.
Comunque, più si pone attenzione alle tecniche di programmazione e alla soluzione di
problemi e più la sintassi specifica è facile da seguire.
Funzioni principali del linguaggio BASIC
- loops
- input da tastiera
- applicazioni guidabili da menu
- comandi di sistema: utilizza parole atte a fare svolgere immediatamente uno specifico
task
- programmazione strutturata
- subroutines
- funzioni integrate nel linguaggio
- funzioni definibili dall'utente
- Schiere, sorting e ricerche
Un breve richiamo alla storia; Paul Allen e Bill Gates dettero in licenza il loro BASIC alla
M.I.T.S. per il computer Altair. La versione occupava un totale di 4Kb di memoria,
compreso il codice e i dati usati per il codice sorgente. Successivamente Gates e Allen
portarono il loro BASIC si altre piattaforme, tra cui Apple, Commodore e Atari. Alla fine
degli anni '70 è la volta del MS DOS che viene fornito con un interprete BASIC.L'IBM aveva
una sua versione denominata BASICA, mentre la versione fornita con MS DOS si chiamava
GW-BASIC e girava su qualsiasi macchina che potesse far girare anche il DOS. Ma non
c'erano differenze tra i due linguaggi, solo che IBM voleva proteggere i suoi personal
computer dai cloni in circolazione. Microsoft decise di realizzare anche un compilatore in
modo da far girare i programmi senza il ricorso all'interprete BASIC. La nuova soluzione si
chiamò QuickBasic, che venne distribuito fino alla versione 4.5.
Poi Microsoft volle implementare ulteriormente il linguaggio e iniziò a distribuire il PDS
BASIC (Professional Development System), che terminò con la versione 7.1. Ma il PDS
BASIC non venne sfruttato appieno per le sue notevoli capacità e Microsoft era ormai
impegnata sulle interfacce grafiche, cosicché realizzò un Visual BASIC sia per DOS che per
Windows. Le differenze tra il QuickBASIC e il VB per DOS erano assolutamente minime. Nel
frattempo Robert S. Zale aveva progettato un suo compilatore BASIC che fu poi distribuito
dalla Borland Inc. come TurboBASIC, ma Zale si mise a distribuire il prodotto anche per
conto suo, chiamandolo PowerBASIC, che ora è arrivato alla versione a 32 bit. PowerBASIC
201
BIOINFORMATICA
è uno dei compilatori più potenti sul mercato, che comprende idee come le variabili senza
segno, un Inline Assembly Language Code e svariate altre implementazioni al linguaggio
BASIC.
L'interprete Basic tradizionale è una sorta di shell che riconosce una serie di comandi interni,
oltre alle istruzioni Basic vere e proprie. In pratica, attraverso il prompt di questa shell si
possono eseguire singole istruzioni Basic, oppure comandi utili a gestire il file di un
programma completo. Per esempio, avviando il Chipmunk BASIC, si ottiene quanto segue.
$ basic[Invio]
Chipmunk BASIC 1.0
>
Il simbolo > rappresenta il prompt. L'esempio seguente mostra l'inserimento di alcune
istruzioni Basic, allo scopo di eseguire la moltiplicazione 6*7.
>A=6[Invio]
>B=7[Invio]
>B=A*B[Invio]
>PRINT C[Invio]
42
Di linguaggi Basic ne esistono di tanti tipi, anche con estensioni che portano il linguaggio
molto lontano rispetto all'impostazione originale, facendone in realtà un linguaggio
completamente diverso. La sintassi del linguaggio si definisce con l'ausilio di un metalinguaggio che precisa gli oggetti della lingua e le loro relazioni, cioè le regole che
consentono la costruzione di parole e di frasi. Il meta-linguaggio più utilizzato è quello di
Backus Naur.
I metasimboli utilizzati sono rappresentati dai caratteri
: = indica una definizione
< > indica un meta oggetto definito
indica una alternativa allorquando sussistano diverse possibilità.
Se un metaoggetto è opzionale lo si indica con una parentesi quadra.
Esempio: < Numero> := 1 2 3 4 5 6 7 8 9
Vengono riportate alcune definizioni
< Istruzione di fine > : = END
< Istruzione di arresto > : = STOP
< Istruzione di lettura di dati> : = READ
< Istruzione ingresso dati > : = INPUT : = GET
< Istruzione di test > : = IF < condizione > THEN < istruzione >
< Istruzione iterazione > : = FOR
< Istruzione iterazione > : = TO
< Istruzione iterazione > : = STEP
< Istruzione iterazione > : = NEXT
< Istruzione di stampa > : = PRINT
< Annotazioni > : = REM
< Istruzione di legame > : = GO TO
< Istruzione di legame > : = GO SUB
Lo studio di un linguaggio di programmazione deve passare per una definizione arbitraria di
un alfabeto e di regole lessicali. Le regole sintattiche non sono arbitrarie ma devono
permettere di definire un algoritmo. Le regole sintattiche devono essere scelte in modo tale
da eliminare tutte le ambiguità nella costruzione di frasi corrette nella lingua. La grammatica
precisa consente di individuare e riconoscere facilmente una frase corretta da una errata.
L'alfabeto del BASIC comprende
le lettere maiuscole da A-Z (26 caratteri)
carattere bianco (1 carattere)
le cifre decimali (10 caratteri)
simboli speciali, operatori, segni di punteggiatura
Per un totale di 53 caratteri. Il ritorno a capo di una linea non rappresenta un carattere.
Regole di formazione delle parole della lingua
202
BIOINFORMATICA
Le parole della lingua sono essenzialmente
- Identificatori definiti dal programmatore
- Le costanti definite dal programmatore
- Parole chiave: riservate alla lingua (DIM, GO TO, FOR…)
Più in particolare avremo la possibilità di utilizzare
Operatori relazionali <> (DIVERSO) = (UGUALE) < (MINORE)
Operatori logici AND, OR, NOT
Operatori aritmetici +,-, / (divisione), *(moltiplicazione)
Operatori di assegnazione =
Nomi di variabili ed etichette sono definiti dall’utente (massimo 8 caratteri alfanumerici).
COMANDI TIPICI DELL'INTERPRETE. Il tipico interprete Basic mette a disposizione alcuni
comandi, che risultano essenziali per la gestione di un programma Basic.
LIST. LIST [<riga-iniziale>[-<riga-finale>]][,...] Elenca le righe del programma selezionate
dagli intervalli indicati come argomento. Se non viene indicato alcun argomento, la
visualizzazione viene fatta a partire dalla prima riga; se viene indicata solo la riga iniziale, la
visualizzazione riguarda esclusivamente quella riga. L'esempio seguente serve a visualizzare
la riga 100, e poi l'intervallo da 150 a 200.
LIST 100, 150-200
RUN. RUN [<riga-iniziale>] Il comando RUN viene usato normalmente senza argomenti, per
avviare il programma caricato nell'interprete. Se si aggiunge il numero di una riga, quel
punto verrà utilizzato per iniziare l'interpretazione ed esecuzione del programma.
NEW. Cancella il programma eventualmente caricato nell'interprete.
LOAD. LOAD <file> Carica il programma indicato dal nome del file posto come argomento.
Se precedentemente esisteva un programma in memoria, quello viene eliminato.
Solitamente, il nome del file deve essere indicato delimitandolo tra doppi apici. È probabile
che l'interprete aggiunga una estensione predefinita o obbligatoria.
SAVE. SAVE <file> Salva il programma con il nome specificato come argomento.
Solitamente, il nome del file deve essere indicato delimitandolo tra doppi apici. È probabile
che l'interprete aggiunga una estensione predefinita o obbligatoria.
DEL. DEL <riga-iniziale>[-<riga-finale>][,...] Elimina le righe indicate dall'argomento. Può
trattarsi di una sola riga, o di un intervallo, o di una serie di intervalli.
RENUM. RENUM [<riga-iniziale>[,<incremento>]]
Rinumera le righe del programma, aggiornando i riferimenti alle subroutine. È possibile
indicare il numero iniziale e anche l'incremento. Di solito, se non viene specificato alcun
argomento, la riga iniziale ha il numero 10, e l'incremento è sempre di 10.
BYE, QUIT. BYE | QUIT Termina il funzionamento dell'interprete Basic.
L'inserimento delle righe di programma attraverso l'interprete Basic, avviene iniziando le
istruzioni con il numero di riga in cui queste devono essere collocate. Ciò permette così di
inserire righe aggiuntive anche all'interno del programma. Se si utilizzano numeri di righe
già esistenti, queste righe vengono sostituite. Quando una istruzione Basic viene inserita
senza il numero iniziale, questa viene eseguita immediatamente.
ISTRUZIONI. Le istruzioni Basic, oltre al fatto di iniziare con il numero di riga, non hanno
altre caratteristiche particolari. Generalmente utilizzano una riga e non richiedono la
conclusione finale con un qualche simbolo di interpunzione. È interessante notare invece che
i commenti vanno espressi con l'istruzione REM, seguita da qualcosa che poi viene ignorato,
e che le righe vuote non sono ammissibili in generale, anche se iniziano regolarmente con il
numero di riga. La natura del linguaggio Basic è tale per cui le istruzioni e i nomi delle
variabili dovrebbero essere espressi sempre utilizzando le sole lettere maiuscole.
Numerazione delle righe. La caratteristica tipica di un programma Basic è quella di avere
le righe numerate. Infatti, non gestendo procedure e funzioni, l'unico modo per accedere a
una subroutine è quella di fare riferimento alla riga in cui questa inizia. In pratica, le
istruzioni iniziano con un numero di riga, progressivo, seguito da almeno uno spazio, e
quindi continuano con l'istruzione vera e propria.
110 PRINT "ciao a chi legge"
120 PRINT "come va?"
203
BIOINFORMATICA
Si può intendere che questa dipendenza dalla numerazione delle righe costituisca poi un
problema per il programmatore, perché il cambiamento di questa numerazione implica la
perdita dei riferimenti alle subroutine.
IDENTIFICATORI DI VARIABILI NUMERICHE. Le regole di formazione degli identificatori
è molto semplice nel BASIC standard; sono delle parole di due caratteri; una lettera e una
cifra. Nel BASIC si possono utilizzare solo 286 nomi di variabili.
A A0 A1 ..................................................................... A9
B B0 B1 ..................................................................... B9
...................................................................................
Z Z0 Z1 ..................................................................... Z9
Nei BASIC evoluti può essere utilizzato un secondo carattere alfanumerico aumentando in tal
modo le possibilità. Nel BASIC non esistono dichiarazioni esplicite per definire una variabile
intera o una variabile reale. Per definire una variabile intera si associa un identificatore che è
il carattere %. Cosi N% viene considerato come una variabile intera. Queste variabili
vengono rappresentate nella macchina in Bit, se disponiamo di una macchina con 8 bit
possiamo rappresentare i numeri da 0 a 28, quindi 255, ma se consideriamo i positivi e i
negativi dobbiamo considerare il campo tra -128 e +127. Mentre utilizzando una macchina
con 16 bit si possono rappresentare i numeri tra -32768 e +32767. Le variabili reali sono
definite da identificatori normali (N, X...). Contengono dei valori reali che comprendono una
parte intera e una parte decimale. Per molti microordinatori si può avere un campo di
variazione tra 1038 e 10-38 con 9 cifre significative.
%
Per numeri interi compresi tra –32768 e 32767
#
Numeri reali in singola precisione (numeri con virgola e con 7 cifre
significative).
!
Numeri reali in doppia precisione (15 cifre significative).
$
Variabili alfanumeriche.
LE VARIABILI INTERE. I numeri vengono indicati senza l'uso di delimitatori, e se
necessario è possibile rappresentare valori decimali con l'uso del carattere punto (.); inoltre
è generalmente ammissibile la notazione esponenziale. L'esempio seguente mostra due
modi di rappresentare lo stesso numero.
123.456
1.23456E+2
Le stringhe si rappresentano delimitandole attraverso doppi apici (possono essere ammessi
anche gli apici singoli, ma questo dipende dall'interprete), e sono soggette a un limite di
dimensione che dipende dall'interprete (spesso si tratta di soli 255 caratteri).
L'assegnamento di una variabile avviene attraverso l'operatore =, secondo la sintassi
seguente.
[LET] <variabile>=<valore>
L'uso esplicito dell'istruzione LET è facoltativo.
- Le operazioni aritmetiche sono eseguite in reale e i valori interi sono convertiti in reali
prima dei calcoli.
- L'argomento delle funzioni matematiche (trigonometriche, esponenziali,....) sono
convertite in reale.
- Il passaggio di un valore reale a un valore intero implica una troncatura della parte
decimale.
ad esempio
10 N%=4.556
20 PRINT N%
si ottiene
4.
10 N%=0,98
20 PRINT N%
si ottiene
0.
Ma se
204
BIOINFORMATICA
10 N% =-0,5
20 PRINT N%
si ottiene
-1
ESPRESSIONI NUMERICHE. Identificatori di variabili catene di caratteri, si realizzano
ponendo il carattere $ dopo l'identificatore. Ad esempio A$, B$..., si ha quindi la possibilità
di avere da 26 a 286 identificatori. Le variabili sono distinte in base al fatto che servano a
contenere numeri o stringhe.
Per la precisione, le variabili che contengono stringhe, hanno un nome che termina con il
simbolo dollaro ($). I nomi delle variabili, a parte l'eventuale aggiunta del dollaro per le
stringhe, sono soggetti a regole differenti a seconda dell'interprete; in particolare occorre
fare attenzione al fatto che l'interprete potrebbe distinguere tra maiuscole e minuscole. In
origine, si poteva utilizzare una sola lettera alfabetica!
Gli operatori tipici che intervengono su valori numerici, e restituiscono valori numerici.
Operatore e operandi
Descrizione
<var> = <valore>
Assegna alla variabile il valore alla destra.
- <op1>
Inverte il segno dell'operando.
<op1> + <op2>
Somma i due operandi.
<op1> - <op2>
Sottrae dal primo il secondo operando.
<op1> * <op2>
Moltiplica i due operandi.
<op1> / <op2>
Divide il primo operando per il secondo.
<op1> MOD <op2>
Modulo: il resto della divisione tra il primo e il secondo operando
<op1> ^ <op2>
Esponente: eleva il primo operando alla potenza del secondo.
SQRT <op1>
Calcola la radice quadrata dell'operando.
SIN <op1>
Calcola il seno dell'operando.
COS <op1>
Calcola il coseno dell'operando.
TAN <op1>
Calcola la tangente dell'operando.
ARCTAN <op1>
Calcola l'arcotangente dell'operando.
LOG <op1>
Calcola il logaritmo naturale dell'operando.
ABS <op1>
Calcola il valore assoluto dell'operando.
LE COSTANTI. Le costanti possono essere di due tipi o numeriche o catene di caratteri. Le
costanti numeriche possono essere numeri interi, frazionari con segno + e -. Le cifre
decimali sono rappresentate da una parte intera e da
una parte decimale separata da un punto. La
rappresentazione avviene ricorrendo agli esponenti. In
effetti il numero 459.67 può essere rappresentato da
45967 x 10-2 oppure 0.45967 x 103. Si può quindi
moltiplicare per una potenza del 10.
Esiste una forma normalizzata in modo che la mantissa
sia compresa tra 0.1 e 0.99...
Per indicare una virgola mobile si impiegherà il
carattere E come separatore tra la mantissa e
l'esponente.
0.314 E1 corrisponde a 3.14
147.68 E3 corrisponde a 147680
.5 E0 corrisponde a 0.5
.25 E-2 corrisponde a 0.0025
LE COSTANTI STRINGHE DI CARATTERI. Si presenta la necessità di scrivere un testo; le
regole vogliono che il testo venga racchiuso tra caratteri speciali " ".
Esempio " FRASE DA STAMPARE".
205
BIOINFORMATICA
Conosciuto l'alfabeto, gli identificatori, gli elementi di base di un linguaggio è necessario ora
servirsene per creare delle frasi o delle istruzioni che siano corrette sintatticamente.
Successivamente dobbiamo creare un programma che abbia un senso.
Esistono diversi tipi di istruzioni nel BASIC, possiamo suddividere le istruzioni in:
-Istruzioni di dichiarazione (DIM, DATA)
-Istruzioni di assegnazione (LET)
-Istruzioni di test (IF THEN GO TO)
-Istruzioni di iterazione (FOR)
-Istruzioni di ingresso ed uscita (INPUT, PRINT, READ, WRITHE)
La concatenazione avviene per unire due catene di caratteri e si ottiene ponendo il simbolo
+.
L'istruzione "LUIGI" + " E" + "MARCO" verrà stampata come LUIGI E MARCO.
L'esempio seguente emette semplicemente la stringa "Ciao Amico" attraverso lo standard
output.
10 print "Ciao amico"
Per eseguire il programma basta utilizzare il comando RUN.
RUN[Invio]
Ciao Amico
Uso di variabili.
10 A$ = "Ciao"
20 B$ = "Amico"
30 PRINT A$; " "; B$
Uso del concatenamento di stringa.
10 A$ = "Ciao"
20 B$ = "Amico"
30 PRINT A$+" "+B$
Uso di una costante e di una variabile numerica.
10 A$ = "Ciao"
20 B$ = " Amico"
30 N = 1000
40 PRINT N; "volte "; A$; " "; B$
Il risultato che si ottiene dovrebbe essere il seguente.
1000 volte Ciao Amico
Si voglia costruire un programma che consenta di scrivere BUONGIORNO SIGNORE o
BUONGIORNO SIGNORA se si risponde alla domanda Maschio o Femmina.
10 INPUT S$
20 B$ =" BUONGIORNO"
30 M$ = " SIGNORE"
40 F$ = "SIGNORA"
50 IF S$= "F" THEN GO TO 80
60 R$ =B$+ " " + M$
70 GO TO 90
80 R$ =B$+ " " + F$
90 END
ESPRESSIONI CONDIZIONALI. Sono istruzioni che offrono diverse possibilità, nel BASIC
esistono
6 operatori condizionali.
= uguaglianza
<> differente
> maggiore
< minore
> = maggiore o uguale
< = minore o uguale
206
BIOINFORMATICA
Espressioni condizionali complesse o espressioni booleane. Se la condizione 1 e la condizione
2 sono vere allora....
Se la condizione 1 o 2 è vera allora.....
Se la condizione 1 ma non la 2 sono verificate allora....
Si deve ora definire cosa significa o come si chiama una variabile logica. É un valore che può
assumere unicamente la condizione di vero o falso. L'operatore logico di negazione è NOT.
Se si considera una variabile logica A, il non A è una variabile logica che è vera quando A è
falso e inversamente. Tale situazione si può rappresentare con una tabella di verità.
A
NON A
Vero
Falso
Falso
Vero
A ad esempio rappresenta B<C, non A rappresenta la condizione inversa B>C.
L'OPERATORE LOGICO AND. Nel caso si presentino 2 variabili logiche A e B, l'espressione
logica A AND B si realizza se simultaneamente A e B sono veri.
B VERO
B FALSO
A VERO
vero
falso
A FALSO
falso
falso
L'OPERATORE LOGICO OR. Nel caso si presentino 2 variabili logiche A e B, l'espressione
logica A o B si realizza se almeno una delle due variabili logiche è vera
B VERO
B FALSO
A VERO
vero
vero
A FALSO
vero
falso
Gli operatori dell'algebra booleana possono essere rappresentati in vari modi, oltre a quello
adottato in precedenza consistente nel servirsi dei loro nomi AND, OR, NOT. Le diverse
simbologie sono scelte in base al campo in cui si lavora.
I matematici usano spesso il simbolo + per l'OR, e × per l'AND, in quanto per alcuni versi
questi operatori lavorano in modo analogo alla somma e alla moltiplicazione. La negazione
NOT viene rappresentata spesso da una linea disegnata sopra l'argomento della negazione,
cioè dell'espressione che deve essere negata.
Nella progettazione di circuiti elettronici, vengono utilizzati anche gli operatori brevi NAND
(AND negato), NOR (OR negato) e XNOR (XOR negato); questi operatori, come XOR, sono
delle combinazioni dei tre operatori base e quindi non costituiscono un arricchimento della
specie di strutture, vengono usati solo per rendere la notazione più semplice.
Operatori:
NOT - simboli alternativi: x, ~, ¬, !
AND - simboli alternativi: AND: *, AND, ^, BUT (usato nella logica booleana
insieme al NOT)
OR - simboli alternativi: OR: +, OR, v
XOR - simboli alternativi: XOR: +, ⊕, ∨ , ^, EOR, orr
NAND - simboli alternativi: NAND, ↑
NOR - simboli alternativi: NOR, ↓
XNOR
Valori:
vero - simboli alternativi: tru, 1, ON, SI (YES)
falso - simboli alternativi: false, 0, OFF, NO
NOT L'operatore NOT restituisce il valore inverso di quello in entrata. Una concatenazione di
NOT è semplificabile con un solo NOT in caso di dispari ripetizioni o con nessuno nel caso di
pari.
A NOT A Spesso, per semplificare espressioni complesse, si usano operatori brevi che
uniscono l'operazione di NOT ad altre, questi operatori sono NOR (OR + NOT),
1
0
NAND (AND + NOT), XNOR (XOR + NOT). La negazione, in questi casi, viene
0
1
applicata dopo il risultato dell'operatore principale (OR, AND, XOR).
207
BIOINFORMATICA
1.
OR [modifica]
L'operazione logica OR restituisce 1 (vero) se almeno uno degli elementi è 1; altrimenti
restituisce 0 (falso) solo se tutti gli operandi sono 0 (falso). Tale operazione è anche detta
somma logica.
A B A OR B Nella teoria degli insiemi corrisponde all'unione.
AND. L'operazione AND da come valore 1 (vero) solo se tutti gli operandi
0 0
0
hanno valore 1, altrimenti restituisce 0 (falso). Tale operazione è anche detta
0 1
1
prodotto logico.
1 0
1
A B A AND B È possibile realizzare un'operazione logica AND con un
1 1
1
numero di proposizioni arbitrarie concatenando varie AND a
0 0
0
due ingressi, per esempio:
0 1
0
p1 AND (p2 AND (p3 AND p4))
1 0
0
Nei circuiti digitali, la porta logica AND è un meccanismo
1 1
1
comune per avere un segnale di vero se un certo numero di
altri segnali sono tutti veri.
Nella teoria degli insiemi corrisponde all'intersezione.
A B A XOR B
0 0
0
0 1
1
1 0
1
1 1
0
AB = A * B' +
L'operatore XOR (detto anche EX-OR, OR esclusivo o somma modulo 2)
nella sua versione a due elementi restituisce 1 (vero) se e solo se un unico
dei due operandi è 1, mentre restituisce 0 (falso) in tutti gli altri casi.
Nella teoria degli insiemi corrisponde alla differenza simmetrica.
Per passare nella forma canonica SP (somma di prodotti) basta applicare la
seguente regola:
A' * B (dove ⊕ è il simbolo di XOR)
A
0
0
1
1
B A NOR B
0
1
1
0
0
0
1
0
A
0
0
1
1
B A NAND B
0
1
1
1
0
1
1
0
NAND L'operatore NAND (cioè la negazione del risultato dell'operazione
AND) restituisce 0 (falso) se e solo se tutti gli elementi sono 1, mentre
restituisce 1 (vero) in tutti gli altri casi.
A
0
0
1
1
B A XNOR B
0
1
1
0
0
0
1
1
XNOR L'operatore XNOR (detto anche EX-NOR, cioè la negazione del
risultato dell'operazione XOR) nella sua versione a due elementi restituisce
1 se: tutti gli elementi sono uguali a 1, oppure se tutti gli elementi sono
uguali a 0.
L'operatore NOR, (cioè la negazione del risultato dell'operazione OR)
restituisce 1 (vero) se e solo se tutti gli elementi sono 0, mentre restituisce
0 (falso) in tutti gli altri casi.
Simboli
Simbolo di una porta AND,
Simbolo di una porta NAND composta da
208
,
BIOINFORMATICA
Simbolo di una porta OR,
Simbolo di una porta NOR composta da
Simbolo di una porta XOR,
Simbolo di una porta XNOR composta da
Simbolo di una porta NOT.
GLI OPERATORI LOGICI IN BASIC. Si consideri di dovere verificare che un numero è
compreso tra un valore inferiore a I e superiore a S avremo
IF N> I AND N < S THEN
Lo stesso procedimento lo possiamo applicare a delle catene di caratteri. Se volessimo
controllare come nell'esempio precedente il sesso avremo:
10 INPUT S$
20 IF S$ ="F" OR S$= "M$" THEN 50
30 PRINT "ERRORE"
40 STOP
50 PRINT "GIUSTO"
60 END
Oppure si può porre una condizione negativa
10 INPUT S$
20 IF S$ ="F" AND NOT S$= "M$" THEN 10
30 PRINT "GIUSTO"
40 END
Esistono delle istruzioni condizionali strutturate che consentono diverse opzioni, se la
condizione si verifica allora si passa alla prima istruzione, altrimenti si passa alla istruzione
2.
ISTRUZIONE DI ITERAZIONE. Il vantaggio della programmazione è che consente di
effettuare delle operazioni in modo ripetitivo. Le possibilità di fare eseguire dei calcoli
ripetitivi è quello di conoscere il numero delle iterazioni, avremo un contatore che si
arresterà di procedere quando il numero delle iterazioni è raggiunto. Oppure si può
conoscere semplicemente il momento di arresto del processo senza conoscere esattamente il
numero delle interazioni necessarie.
L'espressione generale è la seguente:
FOR V=<espressione aritmetica> A <espressione aritmetica> STEP <espressione
aritmetica>
ISTRUZIONE NEXT. Nel caso in cui non venga dichiarato il passo, l'ordinatore lo considera
come unità.
Esempio si voglia calcolare la somma dei primi N numeri.
10 INPUT N
20 S=0
30 FOR I=1 TO N
40 S=S+I
50 NEXT I
60 PRINT S
70 END
209
BIOINFORMATICA
La possibilità di ottenere i risultati di una funzione, dove il numero dei punti, l'incremento di
X e il valore iniziale di X sono dei dati forniti in input.
Esempio si voglia calcolare la somma dei primi N numeri.
10 INPUT I, N, X
20 FOR V =1 TO I + N*X STEP X
30 PRINT V, LOG (V)
40 NEXT V
50 END
Analogamente potremmo costruire un programma per i numeri fattoriali.
Esempio si voglia calcolare la somma dei primi N numeri.
10 F=1
20 INPUT N
30 FOR I =1 TO N
40 F=F*I
50 PRINT F
60 NEXT I
70 END
Per N=12 ; avremo come stampa 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233
ISTRUZIONI. Basic è un linguaggio di programmazione molto povero dal punto di vista
delle strutture di controllo. In modo particolare sono assenti funzioni e procedure. Per fare
riferimenti a porzioni di codice occorre sempre indicare un numero di riga, attraverso le
istruzioni GOTO o GOSUB.
GOTO
GOTO <riga>
Si tratta dell'istruzione di salto incondizionato e senza ritorno. In pratica, l'esecuzione del
programma prosegue dalla riga indicata come argomento, perdendo ogni riferimento al
punto di origine.
GOSUB
GOSUB <riga>
Istruzione di salto incondizionato con ritorno. L'esecuzione del programma prosegue dalla
riga indicata come argomento, e quando poi viene incontrata l'istruzione RETURN, il
programma riprende dalla riga successiva a quella in cui era avvenuta la chiamata. Questo è
l'unico modo offerto dal Basic tradizionale per la realizzazione di subroutine L'esempio
seguente mostra un programma completo che visualizza il messaggio "Ciao" e poi il
messaggio "Amico".
10 GOTO 50
20 A$ = "Ciao"
30 PRINT A$
40 RETURN
50 GOSUB 20
60 B$ = "Amico"
70 PRINT B$
La sintassi di ingresso dei dati è semplice e permette di inserire variabili numeriche e non
numeriche.
INPUT N, M, N$, PR$
Durante l'esecuzione del programma questa istruzione comporta che sullo schermo compaia
un punto interrogativo. Se l'inserimento del dato non corrisponde alla variabile assegnata
nella istruzione di input avremo una segnalazione del tipo:
INPUT ERROR TYPE
REDO FROM START (ritorno alla partenza)
INPUT | ?
INPUT [<prompt>;] <variabile>[,<variabile>]...
? [<prompt>;] <variabile>[,<variabile>]...
Attraverso questa istruzione è possibile inserire un valore in una variabile, o una serie di
valori in una serie di variabili. Se viene indicata la stringa del prompt, questa viene
210
BIOINFORMATICA
visualizzata prima di attendere l'inserimento da parte dell'utente; altrimenti viene
visualizzato semplicemente un punto interrogativo.
Se si indica un elenco di variabili, queste devono essere dello stesso tipo (tutte numeriche o
tutte stringa), e il loro inserimento viene atteso in modo sequenziale da parte dell'utente.
L'esempio seguente rappresenta l'inserimento di una stringa senza prompt e di una coppia di
numeri con prompt. Si ha la possibilità di inserire anche delle label per facilitare la
comprensione dei dati di input.
Ad esempio potremo avere INPUT "Data di Nascita" G, M, A
Avremo come risposta Data di Nascita ?, 18, 5, 1978
10 INPUT A$
20 INPUT "Data di nascita "; G, M, A
PRINT. L'istruzione PRINT permette di emettere sullo schermo una stringa corrispondente
agli operandi utilizzati come argomenti. Eventuali valori numerici vengono convertiti in
stringhe automaticamente. Gli operandi possono essere elencati utilizzando la virgola o il
punto e virgola.
PRINT <operando>[{,|;}...]
Gli esempi seguenti sono equivalenti.
10 PRINT 1234, "saluti"
10 PRINT 1234; "saluti"
10 A = 1234
20 PRINT A; "saluti"
10 A = 1234
20 M$ = "saluti"
30 PRINT A; M$
L'ISTRUZIONE READ. Con questa istruzione diamo delle indicazioni affinché il programma
esegua in maniera non iterativa ma sulla base di precise disposizioni. La sintassi è semplice:
READ lista di variabili.
Potremo avere: READ A, B$, C, D
La dichiarazione di lettura è associata sempre ad una dichiarazione DATA.
10 READ A,B,C,D
20 DATA 7,8,9, 10
30 PRINT A,B,C,D
Avremo A=7, B=8,C=9,D=10
L'istruzione DATA può essere collocata all'interno dl programma in qualsiasi posizione.
LA LISTA E LA TABELLA. Spesso esiste la necessità di trattare un insieme di dati
strutturati; ad esempio una serie di numeri o una serie di parole. In matematica è ricorrente
l'impiego di strutture quadrate o rettangolari con delle righe e delle colonne ed ogni
elemento può essere facilmente identificato con degli indici.
Una variabile indicizzata viene scritta come A(I); dove A e I sono indicatori ed A(I)
rappresenta un elemento generico di una lista di valori numerici. Si può avere anche una
doppia indicizzazione; una variabile B (I,J) in questo caso I e J sono variabili numeriche
intere e B (I,J) rappresenta un elemento generico di una tabella.
B(1,1) B(2,1) ..........
B(1,N)
B(2,1) B(2,2) ..........
B(2,N)
B(M,1) B(M,2)......….
B(M,N)
Questa tabella non è necessariamente una matrice in quanto possiamo definire anche una
tabella di caratteri quando consideriamo degli indicatori che terminano con $. Per la gestione
di una lista è necessario effettuare una dichiarazione che deve precedere l'utilizzazione della
lista. Tale dichiarazione è:
DIM.
DIM A(10), A$(20)
Significa che ho una lista che contiene 10 elementi numerici ed una che contiene 20 catene
di caratteri. Possiamo anche definire delle dimensioni diverse per una variabile numerica
considerando che la dimensione verrà fornita nel corso dell'esecuzione del programma.
211
BIOINFORMATICA
I SOTTOPROGRAMMI. Si definiscono sottoprogrammi una serie di istruzioni che
consentono un trattamento e che possono essere richiamati da un altro programma o
sottoprogramma ma che terminano con una istruzione di ritorno al programma principale. Il
vantaggio dei sottoprogrammi è quello di evitare la duplicazione di istruzioni quando nel
corso del programma si debba prevedere di effettuare lo stesso trattamento. Con i
sottoprogrammi possiamo utilizzare dei programmi che sono già stati testati, oppure
possiamo ricorrere a dei moduli già predisposti. La sintassi è GOSUB NN; al termine del
sottoprogramma è necessario indicare RETURN.
TRATTAMENTO DELLE MATRICI. Prende nome di matrice una serie di numeri disposti
secondo righe e colonne e che si scrivono tra parentesi tonde, quadre o graffe e si indica con
A (una lettera maiuscola in grassetto). Se il numero delle righe (r) è uguale al numero delle
colonne (c) la matrice è detta quadrata, altrimenti è detta rettangolare. L'ordine della
matrice è definito dal numero delle righe e delle colonne. Una matrice unità è caratterizzata
dal fatto di avere la diagonale uguale all'unità.
1
0
0
A=
0
1
0
0
0
1
Nel BASIC possiamo scrivere un programma per definire una matrice unità:
10 DIM A(10,10)
20 FOR I=1 TO 10
30 FOR J=1 TO 10
40 A(I,J) =0
50 IF I= J THEN A (I,J)+1
60 PRINT A (I,J)
70 NEXT J
80 PRINT
90 NEXT I
100 END
Le operazioni sulle matrici possono essere svolte con l'ausilio di programmi scritti in BASIC.
Si abbia ad esempio C(I,J)= A(I,J) +B(I,J).
132 241 373
051
302
353
323 450 773
In BASIC:
10 DIM A(3,3), B(3,3), C(3,3) 110 C (I,J)=A(I,J)+B(I,J)
20 N=3
30 FOR I=1 TO N
40 FOR J=1 TO N
50 READ DATA
60 NEXT I,J
70 DATA 1,3,2,0,5,1,3,2,3
80 DATA 2,4,1,3,0,2,4,5,0
90 FOR I=1 TO N
100 FOR J=1 TO N
120 NEXT I,J
130 FOR I=1 TO N
140 FOR J=1 TO N
150 PRINT C (I,J)
160 NEXT J
170 END
La matrice per uno scalare. Quando una matrice A (N,N) viene moltiplicata per uno
scalare si ottiene una matrice B(N,N) =K x A (N,N) dove tutti gli elementi di A vengono
moltiplicati per K.
In BASIC:
212
BIOINFORMATICA
90 FOR I=1 TO N
100 FOR J=1 TO N
110 B(I,J) = K*A (I,J)
120 NEXT I,J
Moltiplicazioni di matrici. L'operazione di moltiplicazione è più complessa in quanto un
elemento della matrice prodotto comporta il calcolo dei prodotti degli elementi della linea I e
della colonna J.
90 FOR I=1 TO N
100 FOR J=1 TO N
110 C(I,J) =0
110 FOR K=1 TO N
120 C(I,J) = C(I,J) + A (I,K)* B (K,J)
130 NEXT K,I,J
Esistono delle istruzioni specifiche che consentono la manipolazione delle matrici senza
dover programmare direttamente ogni operazione calcolo per calcolo. Per leggere i
coefficienti di una matrice A(N,M) è sufficiente scrivere MAT READ A
Esempio:
10 DIM B (3,4)
20 MAT READ B
30 DATA 5,10,15,20,4,8,12,15,3,6,10,10
40 MAT PRINT DATA
Si otterrà in stampa:
5
4
3
10
8
6
15
12
10
20
15
10
Operazioni sulle matrici
Somma di matrici
MAT C = A+B
Sottrazione di matrici
MAT C = A-B
Inizializzazione a zero di una matrice
MAT A = ZER o MAT A = ZER (N,M)
Inizializzazione a uno
MAT A = CON o MAT A = CON (N,M)
Matrice identità
MAT A = IDN
Matrice per uno scalare
MAT A =<espressione aritmetica> *B
Matrice per matrice
MAT C = A * B
Matrice trasposta
MAT B = TRN (A)
Inversione di matrice
MAT B = INV (A)
Esempio di risoluzione di un sistema di equazioni a due variabili: siano
3x + 4 y = 10
x+5y=7
Espresse in forma matriciale
3 4 x 10
1 5 y
7
Le matrici X e B sono matrici particolari di dimensione (2,1) e sono chiamate anche vettori.
Utilizzando la notazione matriciale, si suppone che esista una matrice inversa A-1, si ha
quindi come soluzione.
X= A-1 B
per definizione la matrice inversa è tale che
34 10
a
a
11
12
15 01
a
a
21
22
da cui si giunge a
3 a11 + a12
=1
4 a11 + 5a12
=0
sostituendo si ottiene
3a21 + a22
4a21 + 5a22
=0
=0
213
BIOINFORMATICA
a11 = 5/11
a12 =-4/11
a21 =-1/11
a22 = 3/11
per cui sostituendo avremo
5
/
11
4
/
11
10
1
/
11
3
/
11 7
che ha come soluzione 2 e 1
In linguaggio BASIC:
10 DIM A(2,2),B(2,1), X(2,1), AI (2,2)
20 MAT READ A
30 DATA 3,4,1,5
40 MAT READ B
50 DATA 10,7
60 MAT AI=INV(A)
70 MAT X =AI*B
80 PRINT X
90 END
LISTATI
Somma tra due numeri positivi
1010 REM somma
1020 REM Somma esclusivamente valori positivi.
1040 REM
1050 INPUT "Inserisci il primo valore "; X
1060 INPUT "Inserisci il secondo valore "; Y
1070 LET Z = X
1080 FOR I = 1 TO Y
1090 LET Z = Z + 1
1100 NEXT
1110 PRINT X; "+"; Y; "="; Z
1120 END
Moltiplicazione di due numeri positivi attraverso la somma
1020 REM Moltiplica esclusivamente valori positivi.
1050 INPUT "Inserisci il primo valore "; X
1060 INPUT "Inserisci il secondo valore "; Y
1070 LET Z = 0
1080 FOR I = 1 TO Y
1090 LET Z = Z + X
1100 NEXT
1110 PRINT X; "*"; Y; "="; Z
1120 END
Divisione intera tra due numeri positivi
1020 REM Divide esclusivamente valori positivi.
1050 INPUT "Inserisci il primo valore "; X
1060 INPUT "Inserisci il secondo valore "; Y
1070 LET Z = 0
1080 LET I = X
1090 IF I < Y THEN GOTO 1130
1100 LET I = I - Y
1110 LET Z = Z + 1
1120 GOTO 1090
1130 PRINT X; "/"; Y; "="; Z
1140 END
1150
214
BIOINFORMATICA
Elevamento a potenza
1010 REM exp.bas
1020 REM Eleva a potenza.
1040 REM
1050 INPUT "Inserisci il primo valore "; X
1060 INPUT "Inserisci il secondo valore "; Y
1070 LET Z = 1
1080 FOR I = 1 TO Y
1090 LET Z = Z * X
1100 NEXT
1110 PRINT X; "^"; Y; "="; Z
1120 END
Radice quadrata
1010 REM radice.bas
1020 REM Radice quadrata intera.
1050 INPUT "Inserisci il valore "; X
1060 LET Z = 0
1070 LET T = 0
1080 REM Inizio del ciclo di calcolo
1090 LET T = Z * Z
1100 IF T > X THEN GOTO 1130
1110 LET Z = Z + 1
1120 GOTO 1080
1130 REM Riprende il flusso normale
1140 LET Z = Z - 1
1150 PRINT "radq("; X; ") ="; Z
1160 END
Fattoriale
1010 REM fatt.bas
1020 REM Fattoriale.
1050 INPUT "Inserisci il valore "; X
1060 LET Z = X
1070 FOR I = (X - 1) TO 1 STEP -1
1080 LET Z = Z * I
1090 NEXT
1100 PRINT "fatt("; X; ") ="; Z
1110 END
215
BIOINFORMATICA
216
© Copyright 2026 Paperzz