90
Quaderni di Informatica Pensiero Computazionale Luigino Calvi Istituto Superiore di Feltre 2018

Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

Quaderni di Informatica

Pensiero Computazionale

Luigino Calvi

Istituto Superiore di Feltre2018

Page 2: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

ii

Una grande scoperta risolve un grande problema ma c’è un granello discoperta nella soluzione di ogni problema.

Il tuo problema può essere modesto; ma se esso sfida la tua curiosità e mettein gioco le tue facoltà inventive, e lo risolvi con i tuoi mezzi, puoi

sperimentare la tensione e godere del trionfo della scoperta.Questa esperienza ad una età suscettibile può creare un gusto per il lavoromentale e lasciare un’impronta nella mente e un carattere per tutta la vita.

G. Polya, How to solve it

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 3: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

Indice

1 Problemi 11.1 Problemi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 La risoluzione dei problemi . . . . . . . . . . . . . . . . . . . . . . 31.3 Problemi ben formulati . . . . . . . . . . . . . . . . . . . . . . . . 41.4 Formalizzazione dei problemi . . . . . . . . . . . . . . . . . . . . . 51.5 Dati e risultati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.6 Risolvibilità dei problemi . . . . . . . . . . . . . . . . . . . . . . . 81.7 Tipologie dei problemi . . . . . . . . . . . . . . . . . . . . . . . . . 9

1.7.1 Problemi computazionali . . . . . . . . . . . . . . . . . . . 101.7.2 Problemi decisionali . . . . . . . . . . . . . . . . . . . . . . 101.7.3 Problemi esecutivi . . . . . . . . . . . . . . . . . . . . . . . 11

1.8 Istanze e classi di problemi . . . . . . . . . . . . . . . . . . . . . . 111.9 Generalizzazione dei problemi . . . . . . . . . . . . . . . . . . . . 131.10 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

2 Macchine 212.1 Uomini e macchine . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.2 Macchine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222.3 Macchine combinatorie . . . . . . . . . . . . . . . . . . . . . . . . 232.4 Macchine sequenziali . . . . . . . . . . . . . . . . . . . . . . . . . . 252.5 Macchine programmabili . . . . . . . . . . . . . . . . . . . . . . . 272.6 Macchine virtuali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.7 Il principio di complessità . . . . . . . . . . . . . . . . . . . . . . . 282.8 Macchine e linguaggi . . . . . . . . . . . . . . . . . . . . . . . . . . 312.9 Linguaggi e traduttori . . . . . . . . . . . . . . . . . . . . . . . . . 342.10 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3 Algoritmi 393.1 Formule risolutive . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

iii

Page 4: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

iv INDICE

3.2 Algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413.3 Algoritmi come funzioni . . . . . . . . . . . . . . . . . . . . . . . . 423.4 Tavola di traccia di un algoritmo . . . . . . . . . . . . . . . . . . 443.5 Livelli descrittivi degli algoritmi . . . . . . . . . . . . . . . . . . . 453.6 Forme descrittive degli algoritmi . . . . . . . . . . . . . . . . . . . 453.7 Analisi degli algoritmi . . . . . . . . . . . . . . . . . . . . . . . . . 473.8 Complessità di un algoritmo . . . . . . . . . . . . . . . . . . . . . 473.9 Complessità dei problemi . . . . . . . . . . . . . . . . . . . . . . . 513.10 Problemi facili e difficili . . . . . . . . . . . . . . . . . . . . . . . . 513.11 Problemi intrattabili . . . . . . . . . . . . . . . . . . . . . . . . . . 543.12 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

4 Linguaggi 594.1 Livello dei linguaggi . . . . . . . . . . . . . . . . . . . . . . . . . . 604.2 Linguaggi di basso livello . . . . . . . . . . . . . . . . . . . . . . . 614.3 Linguaggi di alto livello . . . . . . . . . . . . . . . . . . . . . . . . 644.4 Notazioni grafiche . . . . . . . . . . . . . . . . . . . . . . . . . . . 654.5 Notazioni testuali . . . . . . . . . . . . . . . . . . . . . . . . . . . 694.6 Notazioni visuali . . . . . . . . . . . . . . . . . . . . . . . . . . . . 694.7 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

5 Controlli 715.1 Algoritmi e processi . . . . . . . . . . . . . . . . . . . . . . . . . . 725.2 Controlli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735.3 Limiti dei linguaggi a salti . . . . . . . . . . . . . . . . . . . . . . 745.4 La programmazione strutturata . . . . . . . . . . . . . . . . . . . 755.5 Controlli generalizzati . . . . . . . . . . . . . . . . . . . . . . . . . 775.6 Notazioni testuali . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

5.6.1 Controllo sequenziale . . . . . . . . . . . . . . . . . . . . . 785.6.2 Controllo condizionale . . . . . . . . . . . . . . . . . . . . 785.6.3 Controllo ciclico . . . . . . . . . . . . . . . . . . . . . . . . 79

5.7 Altri controlli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805.8 Il teorema di Böhm-Jacopini . . . . . . . . . . . . . . . . . . . . . 815.9 Esercizi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 5: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

Capitolo 1

Problemi

Sentiamo in noi l’eterno richiamo: ecco ilproblema, cercane la soluzione.D. Hilbert

Il matematico David Hilbert, al Congresso Internazionale di Matematicatenutosi a Parigi nell’agosto del 1900, si espresse con le parole riportate nellacitazione sopra per sottolineare che nell’uomo è connaturata la propensionea risolvere le questioni ed i problemi che gli si presentano. In quell’occa-sione Hilbert presentò una lista di 23 problemi all’epoca non ancora risolti,proponendoli come sfida per i matematici e con la speranza che potessero es-sere risolti nel secolo che stava per iniziare. I problemi di quella lista hannoresistito per molti decenni ed alcuni attualmente non sono stati ancora risolti.

In questo capitolo viene definito il contesto di quanto seguirà: si formu-lano i problemi che opportunamente generalizzati costituiscono delle classi diproblemi che vengono risolti dal solutore che descrive un algoritmo che vie-ne eseguito da un esecutore che, in base ai dati forniti, genera il risultato diun’istanza di problema della classe.

1

Page 6: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2 CAPITOLO 1. PROBLEMI

1.1 ProblemiPer quanto sarà detto nel seguito, fra le tante possibili, adotteremo la seguentedefinizione di problema:

Un problema è un quesito a cui si vuole dare risposta o unobiettivo che si intende perseguire.

Da questa definizione risulta implicitamente che ogni problema sottintendeuno sforzo volontario per il raggiungimento del risultato finale; pertanto nonconsidereremo come problemi quelli che ammettono palesemente la risposta oquelli ai quali non siamo interessati. Coerentemente con queste ipotesi, unproblema è tale relativamente ad un dato soggetto che lo considera. Ad esem-pio, possiamo considerare come problema il seguente: Determinare le intensitàdelle correnti in un dato circuito. Al contrario, per noi non sarà un problemail seguente (essendo evidente la risposta): Decidere se un dato numero natura-le è pari o dispari. Analogamente, possiamo non considerare come problemail seguente (in quanto non ci interessa): Determinare un numero naturale pri-mo composto da cento cifre decimali. Nonostante l’apparente stravaganza,questioni di questo ultimo tipo rappresentano degli effettivi problemi praticiche si incontrano in applicazioni di codifica/decodifica di informazioni cifratenella cosiddetta crittografia a chiave pubblica.

Nel seguito considereremo solo problemi che sono definibili in modo preciso,univoco e non ambiguo, e che si prestano, quindi, ad essere risolti in modoautomatico. Con questa ipotesi si potrà ambientare i problemi in appositicontesti formali, all’interno dei quali la soluzione può essere descritta in modorigoroso. Rimane così definita una prima classificazione dei problemi, comedescritto nella figura 1.1.

'

&

$

%

problemi

problemi risolvibili in modo automatico��

��

Figura 1.1: Una classificazione dei problemi.

Esempio 1. Storicamente i primi problemi si sono presentati quando l’uomoha iniziato ad operare con i numeri e con le figure elementari del piano. Aseguire è riportata una lista di classici problemi che sono stati considerati edaffrontati dai greci più di 2000 anni fa.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 7: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.2. LA RISOLUZIONE DEI PROBLEMI 3

1. Stabilire se un numero naturale è primo.

2. Scomporre un numero naturale in fattori primi.

3. Determinare il massimo comune divisore fra due numeri naturali.

4. Determinare la lunghezza della diagonale di un quadrato di lato unitario.

5. Disegnare un poligono regolare di 17 lati con il solo uso di riga e com-passo.

1.2 La risoluzione dei problemiRisolvere un problema significa ricercare e descrivere un procedimento che,eseguito, consenta, a partire da delle informazioni iniziali (dati), di otteneredelle informazioni finali (risultati) soddisfacenti ad un criterio di verifica,secondo lo schema descritto nella figura 1.2.

dati risultati

criterio di verifica

6

-

Figura 1.2: Schema del processo risolutivo di un problema.

Il solutore è il soggetto (in genere l’uomo) che descrive le azioni da esegui-re per risolvere un problema. L’esecutore è l’entità (in genere una macchina)che esegue le azioni descritte dal solutore. La soluzione di un problema èla descrizione delle azioni (istruzioni), da parte del solutore e rivolte all’e-secutore, che, eseguite, forniscono i risultati del problema. I dati sono leinformazioni iniziali in base alle quali ricavare i risultati, che rappresentanogli oggetti o l’effetto che si ottiene mediante l’esecuzione delle istruzioni checostituiscono la soluzione. Qui i termini dati e risultati sono da intendersiin senso lato: possono essere un numero, una sequenza di numeri, la rispostaad un quesito, un disegno o qualcos’altro di più generale ancora. Notiamoche la ricerca e la descrizione della soluzione di un problema è un’attività delsolutore (e non dell’esecutore, il quale esegue il procedimento risolutivo manon lo costruisce).

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 8: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

4 CAPITOLO 1. PROBLEMI

Esempio 2. Consideriamo il problema della risoluzione di un’equazione di se-condo grado ax2

� bx � c � 0. Un procedimento risolutivo di questo problemaè fornito dalla ben nota formula risolutiva delle equazioni di secondo grado:

x1, x2 ��b �

ºb2 � 4ac

2aCon riferimento a questo problema, il solutore è colui che ha ideato la formularisolutiva delle equazioni di secondo grado, mentre chi la applica per trovare,con carta e penna, le radici di una particolare equazione assume il ruolo diesecutore. Nel caso venga utilizzato un programma su calcolatore per trovarele radici di un’equazione, l’esecutore è rappresentato dal calcolatore (e chiutilizza il programma assume il ruolo di semplice utente). Un criterio diverifica consiste nella sostituzione diretta dei valori trovati delle radici e nellaverifica dell’identità.

Osservazione. L’impostazione basata sui termini chiave problema, soluto-re, soluzione, esecutore, risultato è tipica del cosidetto paradigma imperativo,secondo il quale il solutore specifica all’esecutore delle direttive di come de-ve agire per ottenere il risultato finale. Un’impostazione alternativa, tipicadel cosidetto paradigma dichiarativo, consiste nel descrivere, con informazio-ni e vincoli stringenti, da parte del solutore all’esecutore, in cosa consiste ilrisultato, delegando all’esecutore il compito di trovare i passi da eseguire perdeterminarlo.

1.3 Problemi ben formulatiAi fini della loro risolvibilità i problemi che considereremo devono soddisfareai vincoli precisati nella seguente definizione. Si afferma che un problema èben formulato o formalmente definito se soddisfa alle seguenti specifiche:

1. Il problema è formulato in una forma comprensibile dal solutore

2. I dati sui quali si deve cercare la soluzione sono completi e coerenti

3. È univoco il criterio di verifica della soluzione

Esempio 3. Consideriamo il seguente problema:

Determinare il barimetro di un poliangolo.

Questo è un chiaro esempio di problema mal formulato in quanto nella suaformulazione compaiono dei termini che non hanno alcun significato.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 9: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.4. FORMALIZZAZIONE DEI PROBLEMI 5

Esempio 4. Consideriamo il seguente problema:

Risolvere la seguente situazione di gioco:

j Ì j

Ì j

Ì j

Questo è un altro esempio di problema mal formulato in quanto non è precisatoqual è il gioco, quali sono le possibili mosse e qual è il criterio per determinarese una data posizione finale è vincente. Sono invece ben formulati gli usualiproblemi di scacchi che si trovano sui giornali di enigmistica, in quanto leregole del gioco sono ben definite ed è univoco il criterio per valutare se unadata posizione finale sia vincente, in base alle regole del gioco degli scacchi,anche se tali ipotesi sono assunte implicitamente e non direttamente riportatenella formulazione del problema.Esempio 5. Un altro problema mal formulato è il seguente:

Determinare l’area di un trapezio rettangolo sapendo che lebasi maggiore e minore misurano rispettivamente 18 e 12unità.

In questo caso i dati sono insufficienti.Esempio 6. Consideriamo un altro caso di problema mal formulato:

Calcolare il valore dell’espressione 1 � 1.

Nonostante la banalità del quesito, si può osservare che si possono accettarepiù risposte a seconda del contesto che si considera: 0 se il quesito è formulatonel contesto dell’addizione fra numeri interi modulo 2; 1 in un contesto dialgebra booleana; 2 nell’usuale contesto dei numeri naturali. In questo casoviene a cadere la condizione che impone l’univocità del criterio di verifica dellasoluzione, mancando la specifica dell’ambiente in cui si opera.

1.4 Formalizzazione dei problemiIl processo di formalizzazione o modellizzazione di un problema consiste neltradurre un problema reale in una sua formulazione alternativa, semplificatama equivalente per quanto riguarda la tematica di interesse, in modo tale cheesso possa essere risolto automaticamente.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 10: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

6 CAPITOLO 1. PROBLEMI

Esempio 7. Consideriamo il seguente problema:Si ha un bersaglio delimitato da 3 cerchi concentrici. Il cer-chio più interno vale 19 punti, mentre le due corone esternevalgono rispettivamente 13 e 5 punti. Il raggio del cerchio in-terno e lo spessore delle corone sono di 7 cm. Decidere se, edeventualmente come, è possibile totalizzare 100 punti, in piùtiri.

Filtrando i dettagli superflui (raggio e spessore delle corone), tale problemapuò essere formalizzato mediante un’equazione diofantea, ossia mediante un’e-quazione avente coefficienti interi e le cui radici devono essere numeri interi;l’equazione è la seguente:

Risolvere l’equazione diofantea 19x � 13y � 5z � 100.

In questo caso, data la particolare formulazione del problema, si deve imporreil vincolo che le incognite x, y, z debbano essere numeri naturali. Risolvendoquesta equazione si trova la soluzione �x � 3, y � 1, z � 6�. Questo risultatoammette la seguente interpretazione:

Ci si può chiedere se questa sia l’unica soluzione; la risposta è evidente-mente no in quanto si nota la soluzione �x � 0, y � 0, z � 20�. Il problemadiventa allora più interessante se si impone il vincolo di ridurre al minimo ilnumero di tiri necessari per totalizzare 100 punti.

Ogni formalizzazione e schematizzazione comporta una certa semplifica-zione, riduzione ed idealizzazione della realtà: nella soluzione sopra non siconsidera il caso che delle frecce vadano proprio su una linea di separazionefra due zone.

Notiamo che se il problema consistesse nel determinare i punti da assegnarealle varie corone del bersaglio, dato il numero di tiri in ciascuna corona ed iltotale dei punti da ottenere, il problema potrebbe essere formalizzato medianteun’equazione diofantea simile a quella riportata sopra.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 11: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.5. DATI E RISULTATI 7

1.5 Dati e risultatiUn passo fondamentale del processo di risoluzione di un problema consistenell’individuazione dei dati e dei risultati. Questa fase costituisce l’anello dicongiunzione fra il problema e la sua soluzione; in alcuni casi è definita com-piutamente la formulazione del problema; in altri casi può rimanere implicitao latente e richiedere una fase di analisi da parte del solutore. In alcuni casiquesta fase può essere offuscata dalla formulazione del problema, in altre puòinvece essere suggerita dalle classiche parole Dati ... e Determinare ... .

La descrizione dei dati e dei risultati può essere fatta a diversi livelli didettaglio che dipendono dal contesto della situazione del problema e, in defini-tiva, dalle capacità possedute dall’esecutore al quale verrà rivolto l’algoritmorisolutivo del problema.Esempio 8. Consideriamo il seguente problema:

Dati nel piano un punto ed una retta, determinare il più brevesegmento che unisce il punto alla retta.

Dalla formulazione stessa del problema si evidenziano i seguenti dati e risultati:

Dati: retta r, punto PRisultati: segmento s

Questa formulazione risulta ancora inadeguata in base alla seguente osser-vazione. Un segmento nel piano è individuato dai suoi estremi; il segmentos ha come estremo il punto P che è noto; pertanto l’unico risultato da de-terminare è l’estremo Q che sta sulla retta. Questa osservazione porta allaseguente formulazione:

Dati: retta r, punto PRisultati: punto Q

Questa descrizione dei dati e dei risultati può essere adeguata per un ese-cutore in grado di operare con i tradizionali strumenti delle costruzioni geo-metriche come una riga (non graduata) ed un compasso. Se l’esecutore è ingrado di operare con i numeri, si può ambientare il problema in un sistema diassi cartesiani ortogonali, nel qual caso un punto risulta individuato dalla cop-pia delle sue coordinate ed una retta individuata da un’equazione della formaax � b y � c � 0; a sua volta un’equazione di questa forma risulta individuatadai tre coefficienti a, b, c. Pertanto, i dati ed i risultati possono essere precisaticome segue:

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 12: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

8 CAPITOLO 1. PROBLEMI

Dati: coefficienti (a, b, c) dell’equazione cartesiana della retta,coordinate �x, y� del punto

Risultati: coordinate �x1, x2� del punto sulla retta

Anche questa formulazione può essere limata, osservando che le coordinate�x1, x2� definiscono un punto sulla retta; pertanto è sufficiente precisare l’or-dinata del punto (e determinare la corrispondente ascissa dall’equazione dellaretta). Questa formulazione, benché minimale, si espone al caso particolareche la retta sia parallela all’asse y, nel quale caso la conoscenza dell’ascissanon individua più il punto. Per questo motivo ritorna ad essere preferibile laprecedente formulazione.

Osservazione. L’esempio appena riportato evidenzia che la corretta efunzionale detrminazione dei dati e dei risultati di un problema è a sua voltaun problema.

1.6 Risolvibilità dei problemiUn procedimento risolutivo di un problema può essere efficacemente raffiguratocome un cammino che congiunge i dati iniziali ai risultati finali. È statoosservato precedentemente che per alcuni problemi non si conosce oppure nonesiste alcun cammino risolutivo. A seconda che questo cammino esista o no,si possono classificare i corrispondenti problemi come segue:

1. problemi risolvibili: sono quei problemi che ammettono un procedi-mento risolutivo. Questi problemi possono essere descritti dal seguenteschema:

dati risultati-

Appartiene a questa classe il problema di risolvere un’equazione algebricapolinomiale di secondo grado, della forma ax2

� bx � c � 0.

2. problemi risolvibili? : sono quei problemi per i quali non è noto seesista un procedimento risolutivo. Possono essere descritti dal seguenteschema:

dati risultati-?

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 13: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.7. TIPOLOGIE DEI PROBLEMI 9

Un esempio di problema di questa classe è costituito dalla congettura cheesistano infinite coppie di numeri primi gemelli, ossia numeri naturaliche differiscono per due unità (esempi di coppie di numeri primi gemelli:�3,5�, �5,7�, �11,13�, �17,19�).

3. problemi irrisolvibili: sono quei problemi per i quali è noto che non esi-ste alcun procedimento risolutivo. Possono essere descritti dal seguenteschema:

dati risultati-//

La soluzione di una generica equazione algebrica polinomiale di gradomaggiore di 4 in un’incognita è un esempio di problema irrisolvibile.

Osservazione. Il concetto di problema risolvibile è tutt’altro che ovvioe scontato; in realtà sottende due diverse impostazioni filosofiche di fondo:nel XX secolo, quando i problemi considerati erano di tipo prevalentementematematico, i matematici consideravano risolvibile un problema per il qualeera stato trovato un procedimento risolvibile o anche quando era stato provatoche un tale procedimento esisteva; non era necessario, e quasi era una questionemarginale, che il procedimento venisse esibito esplicitamente. A partire dalXXI secolo, sotto la sollecitazione del pragmatismo informatico, un problemaviene considerato risolvibile se ne è stato descritto un procedimento risolutivoeffettivo.

1.7 Tipologie dei problemi

I problemi presentano delle analogie rispetto ad alcune caratteristiche qualila forma del problema, la sua risolvibilità, la tipologia dei dati e dei risultati,l’ambiente di operatività (aritmetico, geometrico, grafico, . . . ). La variega-ta gamma dei problemi che si incontrano può essere pertanto classificata incategorie rispetto ad una di queste caratteristiche. Classificare un problemacostituisce un primo passo verso la sua comprensione e, quindi, verso la suasoluzione.

Molto spesso i problemi rappresentano delle analogie con riferimento alleinformazioni iniziali che si dispongono ed all’obiettivo finale che si intenderaggiungere. Come si vedrà più avanti, queste tre classi di problemi verranno

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 14: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

10 CAPITOLO 1. PROBLEMI

risolte mediante delle corrispondenti classi di algoritmi (funzioni, predicati,procedure). In base a questo criterio i problemi che più frequentemente siincontrano nella programmazione possono essere partizionati nelle classi diseguito descritte.

1.7.1 Problemi computazionali

Una delle categorie più tradizionaali di problemi ammette delle soluzioni cherichiedono di eseguire calcoli su dei dati che sono dei numeri. Questi proble-mi vengono classificati come problemi computazionali e vengono formulatisecondo il seguente schema:

A partire da dei dati iniziali noti,mediante dei calcoli,determinare dei risultati.

dati risultaticalcolo -

Esempio 9. Determinare il fattoriale di un numero naturale n, ossia il valore,indicato con n!, uguale al prodotto 1.2.

�.�n�1�.n dei primi n numeri naturali.

1.7.2 Problemi decisionali

Una vasta classe di problemi rientra nell’insieme dei problemi di decisioneche hanno il caratteristico incipit Decidere se . . . ed hanno come risultato veroo falso. Questi problemi spaziano dall’ambito della logica, alla matematicaed includono molte questioni tipiche dell’informatica.

Un problema decisionale ha la seguente struttura:

Fissate delle ipotesi iniziali,attraverso calcoli e deduzioni logiche,stabilire se una data proposizione è vera.

dati vero/falsodecisione -

Esempio 10. Data una sequenza �a1, a2,�, an� ordinata, ossia tale che a1 B

a2 B � B an, stabilire se nella sequenza è presente un dato elemento x.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 15: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.8. ISTANZE E CLASSI DI PROBLEMI 11

1.7.3 Problemi esecutivi

I problemi di tipo esecutivo si formulano come segue:

Fissata una situazione iniziale di partenza,eseguire una sequenza di trasformazioniin modo da ottenere una situazione finale obiettivo.

situazione iniziale situazione finaletrasformazione

-

Esempio 11. Il problema della torre di Hanoi consiste nello spostare da unpiolo ad un altro, usando come appoggio ausiliario un terzo piolo, una pila din dischi, di dimensioni decrescenti dal basso verso l’alto. È ammesso spostareun solo disco alla volta, con il vincolo che ogni disco non può essere appoggiatosopra uno più grande.

1.8 Istanze e classi di problemi

Nel suo percorso scolastico uno studente incontra varie tipologie di problemi.Nei primi anni di scuola si imbatte in problemi come il seguente:

Moltiplicare 7413 � 938.

In una situazione come questa, l’allievo assume il ruolo di esecutore, eseguen-do la moltiplicazione in colonna seguendo il procedimento insegnatogli dallamaestra.

In un problema apparentemente simile come il seguente:

Calcolare l’area di un rettangolo avente la base e l’altezza dilunghezza pari a 420 e 112 cm.

allo studente viene implicitamente richiesto, prima di mettersi nella veste diesecutore dei calcoli, di individuare la corretta operazione da eseguire.

Un po’ più avanti affronta problemi della seguente forma:

Calcolare il massimo comune divisore fra 798 e 242.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 16: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

12 CAPITOLO 1. PROBLEMI

Anche in questo caso lo studente, sempre in veste di esecutore, applica il proce-dimento che l’insegnante gli ha precedentemente spiegato; in questa situazio-ne il procedimento si fonda sull’ipotesi che lo studente abbia preventivamenteacquisito la capacità di moltiplicare due numeri.

Dopo aver maturato delle ulteriori conoscenze sui numeri e sulle proprietàdelle figure del piano, lo studente si trova ad affrontare problemi della forma

Determinare il raggio della circonferenza inscritta nel triangolorettangolo avente le misure dei cateti pari a 72 e 45 cm.

In questo caso il risultato viene ottenuto mediante una serie di passaggi ese-guendo operazioni ed applicando delle formule e proprietà. In questo casolo studente assume il doppio ruolo di solutore (individuando il procedimentoguida) ed esecutore (eseguendo le operazioni descritte nel procedimento).

Tutti i casi di problemi precedentemente analizzati sono caratterizzati dal-l’avere come dati dei valori particolari. Si parla in questo caso di istanzedi problemi. Un netto cambio di contesto avviene considerando dei datigenerici, denominati mediante degli identificatori. Ad esempio: Determinareil massimo comune divisore fra due numeri naturali m ed n. In questo modosi evidenzia un insieme di problemi aventi la stessa struttura, detto classe diproblemi, i cui elementi (istanze problemi) si ottengono per particolari valoriassunti dai dati. È in questa situazione che si evidenziano in modo distintoi ruoli del solutore che descrive il procedimento e dell’esecutore che esegue ilprocedimento su una particolare istanziazione dei valori dei dati.

Le classi di problemi ammettono un procedimento risolutivo generale in-dipendente dalle particolari istanziazioni dei dati. Ad esempio, un metododi soluzione per la ricerca del massimo comune divisore di due numeri natu-rali m e n deve essere valido per qualsiasi coppia di valori assunti da m e n.Risulta dunque evidente che un metodo risolutivo di un problema deve essereapplicabile ad un’intera classe di problemi le cui istanze differiscono soltantoper i particolari valori assunti dai dati iniziali. Con queste premesse, quandonel seguito si userà il termine soluzione di un problema ci si riferirà ad unprocedimento risolutivo generale, valido per un’intera classe di problemi allaquale appartiene il problema considerato.

Lo schema attraverso il quale si ricava il risultato di una particolare istanzadi problema si sviluppa attraverso le seguenti fasi successive:

1. considerazione dell’istanza P del problema

2. individuazione di una classe C alla quale appartiene il problema P

3. ricerca e descrizione di un procedimento risolutivo A per la classe C

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 17: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.9. GENERALIZZAZIONE DEI PROBLEMI 13

4. applicazione del procedimento risolutivo A all’istanza P

Graficamente, queste fasi sono evidenziate mediante lo schema riportato infigura 1.3.

soluzione istanza I procedimento per C

classe C di problemigeneralizzazionedel problema

particolarizzazione delprocedimento risolutivo

soluzione dellaclasse C

di problemi

istanza I di problema -

?

Figura 1.3: Schema delle fasi per la soluzione di un’istanza di problema.

1.9 Generalizzazione dei problemiData un’istanza di problema si può ottenere immediatamente una classe diproblemi denotando i valori dei dati con dei nomi generici.Esempio 12. L’ultima istanza di problema descritta nel precedente paragrafopuò essere generalizzata nella seguente istanza:

Determinare il raggio della circonferenza inscritta nel triangolorettangolo avente le misure dei cateti pari a a e b.

Come è stato sopra suggerito, quando ci si imbatte in un problema par-ticolare (ad esempio, trovare le radici dell’equazione x2

� 3x � 5 � 0) primadi impostare la soluzione è conveniente, per fare un buon investimento dellosforzo che ci si appresta a compiere, trovare una opportuna generalizzazionedel problema. La generalizzazione di un problema specifico individua unaclasse di problemi della quale il problema originale costituisce una particolareistanza. Il punto centrale del procedimento di generalizzazione riguarda leseguenti questioni:

• Come generalizzare?

• Fino a che punto generalizzare?

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 18: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

14 CAPITOLO 1. PROBLEMI

Un po’ di buon senso (all’inizio) ed un po’ di esperienza (quando sarà statamaturata) saranno sufficienti come guida per individuare una buona genera-lizzazione. La figura 1.4 descrive lo schema di successive generalizzazioni diun’istanza di problema.

Y istanza classe C1

��

��Y

classe C1

��

��Y

classe C2

'

&

$

%- -

Figura 1.4: Passi di generalizzazione di un’istanza di problema.

Esempio 13. Consideriamo la seguente istanza di problema:Determinare la distanza fra i due punti del piano cartesianoP �1,2�, Q�4,3�.

Una prima generalizzazione consiste nel prendere dei valori generici per i datidelle coordinate dei punti:

Determinare la distanza fra i due punti del piano cartesianoP �x1, y1�, Q�x2, y2�.

Per individuare delle successive generalizzazioni è sufficiente considerare itermini del problema che si prestano ad essere generalizzati:

2 � n

punti � elementipiano � insieme E generico

distanza � distanza d generica

Adottando queste generalizzazioni si ottiene la seguente formulazione moltogenerale del problema:

Determinare il diametro della più piccola sfera contenente undato insieme E � �a1, ..., an� di n elementi di uno spaziometrico �E,d�.

Per il momento questa formulazione potrà risultare oscura ma, una volta ri-solta questa classe di problemi, avremo trovato una soluzione per moltissimesottoclassi, appartenenti a contesti molto diversi.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 19: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.10. ESERCIZI 15

1.10 Esercizi

1. Spiegare la differenza fra i termini soluzione e risultato.

2. Spiegare il significato dei termini solutore ed esecutore.

3. Spiegare perché non ha senso considerare un procedimento risolutivosenza fare riferimento alle capacità dell’esecutore.

4. Spiegare se i problemi risolvibili? possono essere classificati con il ter-mine irrisolvibili?.

5. Fissato un dato problema P, si considerino i seguenti due problemi:

P1: Il problema P ammette soluzione ?P2: Risolvere il problema P .

Classificare i problemi P1 e P2 in base alla loro forma. Stabilire, infunzione della risolvibilità di P , la risolvibilità dei problemi P1 e P2.

6. Determinare per quali valori di n il seguente problema ammette un unicorisultato:

Fissati sul piano un insieme di n punti distinti P1, . . . , Pn, dise-gnare un poligono di n lati non intrecciati, aventi P1, . . . , Pn comevertici.

7. Stabilire se i seguenti problemi sono ben formulati:

(a) Una classe è formata da s studenti. Di questi m sono maschi. Cisono k studenti che portano gli occhiali. Determinare quante sonole femmine che portano gli occhiali.

(b) Di un rettangolo si conosce la lunghezza d della diagonale e l’areaa. Determinare il perimetro del rettangolo.

(c) È noto il perimetro p e l’area a di un triangolo. Determinare lemisure dei lati.

8. Completare con delle domande la seguente formulazione di problema, inmodo da costituire dei problemi ben formulati:

Di un triangolo si conosce la lunghezza di ciascuno dei lati.Determinare ...

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 20: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

16 CAPITOLO 1. PROBLEMI

9. Definire delle ipotesi in modo che il seguente problema risulti ben for-mulato:

Ordinare una sequenza di triangoli.

10. Spiegare perché, senza assumere tacite ipotesi, i seguenti problemi sonomal formulati. Ridefinirli in modo che risultino ben formulati. Conriferimento al problema ben formulato, individuare quali sono i dati edi risultati e specificare il loro tipo.

(a) Risolvere l’equazione di secondo grado ax2� bx � c � 0.

(b) Determinare il numero delle cifre di un numero naturale.(c) Determinare la somma delle cifre di un numero naturale.(d) Determinare la somma delle cifre di un numero naturale considerato

in base 10.(e) Rovesciare un numero naturale di tre cifre.(f) Determinare i più piccoli dieci numeri naturali che si leggono indif-

ferentemente da sinistra a destra e da destra a sinistra.(g) Date le misure dei lati di un triangolo acutangolo, determinare il

più piccolo rettangolo che lo ricopre.(h) Date le misure di un lato e della diagonale di un triangolo rettan-

golo, determinarne l’area ed il perimetro.(i) Date le misure dei lati di un quadrilatero, decidere se il quadrilatero

è convesso.(j) Date le misure dei 6 segmenti congiungenti in tutti i modi possibili i

vertici di un quadrilatero, determinare il perimetro del quadrilatero.(k) Fissati sul piano 4 punti distinti e non allineati, disegnare il qua-

drilatero non intrecciato avente per vertici i 4 prefissati punti.

11. È assegnato un insieme A � �P1, P2, ..., Pn� di n punti del piano. Sta-bilire se i seguenti due problemi sono ben formulati; in caso affermativodire in cosa consistono i dati, i risultati ed il criterio di verifica.

(a) Determinare l’area del poligono di vertici A.(b) Determinare l’involucro convesso dell’insieme dei punti A, ossia il

più piccolo poligono convesso contenente i punti dati.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 21: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.10. ESERCIZI 17

12. Determinare per quali valori di n il seguente problema è ben formulato:

Determinare l’area di un poligono di n lati conoscendone lamisura dei lati, in ordine in base alla consecutività dei lati.

13. Individuare i dati ed i risultati dei seguenti problemi:

(a) Determinare le radici di un’equazione di secondo grado.(b) Determinare il numero delle radici reali distinte di un’equazione di

secondo grado.(c) Stabilire se un’equazione di secondo grado ammette soluzioni reali.(d) Stabilire se un valore è soluzione di un’equazione di secondo grado.

14. Individuare i dati ed i risultati dei seguenti problemi:

(a) Determinare il numero di cifre necessarie per scrivere un numeronaturale.

(b) Scrivere un numero in una data base.(c) Convertire un numero naturale da una base ad un’altra.

15. I seguenti tre problemi sono apparentemente simili ma, ad una attentaanalisi, si capisce che sono di differenti complessità:

(a) Determinare un numero primo di k cifre decimali.(b) Decidere se un dato numero naturale n è primo.(c) Scomporre in fattori primi un dato numero naturale n.(d) Determinare la somma dei reciproci di tutti i numeri primi.

Assumendo in modo intuitivo il concetto di complessità di un proble-ma, intesa come una misura del tempo di esecuzione della miglior so-luzione del problema, discutere questi problemi in riferimento alla lorocomplessità, ordinandoli dal più semplice al più difficile.

16. Descrivere una classe di problemi che includa le seguenti tre classi diproblemi sui numeri naturali:

(a) Numerare per n da p a q.(b) Determinare i numeri minori di n.(c) Determinare i multipli di un numero contenuti in un intervallo.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 22: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

18 CAPITOLO 1. PROBLEMI

17. Definire una classe di problemi alla quale appartengano le seguenti dueistanze:

(a) Valutare log2 9871(b) Valutare log8 24364

18. Individuare i dati ed i risultati delle seguenti classi di problemi nelcontesto del piano della geometria descrittiva e nel contesto del pianocartesiano:

(a) Determinare la circonferenza circoscritta ad un triangolo.(b) Determinare la retta passante per due punti.(c) Determinare il punto di intersezione fra due rette.(d) Determinare la circonferenza passante per tre punti.(e) Stabilire se un punto è interno ad una circonferenza.

19. Generalizzare le seguenti istanze di problemi, proponendo delle classi diproblemi via-via più generali:

(a) Determinare l’area di un quadrato di lato 2 cm.(b) Determinare la lunghezza della diagonale di un quadrato di lato

2 cm.(c) Trovare il lato del triangolo equilatero inscritto in un cerchio di

raggio 8 cm.(d) Ordinare i tre numeri 5, 4, 6.(e) Nel piano cartesiano, determinare la distanza fra i due punti P �

�1,2�, Q � �3,4�.(f) Determinare l’area di un quadrato inscritto in una circonferenza di

lato 4 unità.(g) Disegnare un quadrato rosso di lato 1 cm.(h) Determinare la distanza del punto di coordinate �1,2� dall’origine

degli assi cartesiani.(i) Decidere se ci sono domeniche comprese nel periodo dal 30 ottobre

2018 al 2 novembre 2018.(j) Risolvere l’equazione 2x � 8 � 0 nell’insieme dei numeri naturali. 1

Per ciascuna classe di problemi che si è individuata, si precisino qualisono i dati e quali i risultati.

1Suggerimento: si possono ottenere delle generalizzazioni sia ampliando l’insieme dove sicercano le soluzioni, sia generalizzando la forma dell’equazione.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 23: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

1.10. ESERCIZI 19

20. Motivando le affermazioni, dire se i seguenti problemi sono ben formulati.Nel caso che il problema non sia ben formulato, riformularlo adeguata-mente in modo che risulti ben formulato. Classificare il problema inbase alla sua forma (computazionale, ...). Con riferimento al problemaben formulato, specificare in cosa consistono i dati, i risultati ed un cri-terio di verifica della soluzione. Generalizzare il problema, proponendopiù generalizzazioni successive.

(a) Dire se il punto del piano cartesiano avente per coordinate le radicidell’equazione 6x2

� 5x � 1 � 0 è vicino all’origine degli assi.(b) Conoscendo le misure dei lati di due triangoli, stabilire se un trian-

golo è più piccolo dell’altro.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 24: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

20 CAPITOLO 1. PROBLEMI

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 25: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

Capitolo 2

Macchine

L’informatica non riguarda i computer piùdi quanto l’astronomia riguardi i telescopi.Edsger Wybe Dijkstra(informatico olandese) [1930-2002]

Per ottenere i risultati dei problemi risolvibili automaticamente, l’uomoha costruito degli esecutori automatici: robot meccanici, elaboratori elettro-nici, calcolatori biologici ed altre tipologie di marchingegni. A prescinderedalle particolari tecnologie realizzative, tali esecutori vengono genericamentedenominati macchine.

21

Page 26: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

22 CAPITOLO 2. MACCHINE

2.1 Uomini e macchine

Un tratto caratterizzante l’evoluzione dell’uomo è rappresentato dalla costru-zione di strumenti sempre più sofisticati e potenti che potessero aiutarlo nellosvolgimento delle sue attività. Questa tendenza si è sviluppata fino ad inva-dere gli aspetti più speculativi del pensiero umano. Addirittura, specialmentenell’alveo della cultura occidentale, si è assistito al tentativo, parzialmente con-seguito, di costruire sistemi artificiali in grado di riprodurre comportamentied attività mentali che sembravano prerogativa precipua dell’uomo. In modoampio e generico questi strumenti vengono detti macchine; in ambito scienti-fico, nel caso che vengano adibiti per qualche forma di elaborazione di dati,vengono detti computer.

Il computer ha avuto negli ultimi decenni un fortissimo impatto sull’e-voluzione delle scienze, dell’ingegneria ed in alcuni settori della matematica,aprendo varchi di indagine su aspetti altrimenti impenetrabili, assumendo unruolo simile al microscopio per le scienze biologiche. I frattali, oggetti mate-matici definiti mediante funzioni, hanno potuto essere studiati solo grazie alcomputer che ha reso possibile una mole di calcoli preclusi alla sola operativitàdell’uomo; vengono solitamente rappresentati in forma grafica trasformando irisultati dei calcoli in immagini di alta suggestione; furono visti per la primavolta nel 1980: penso che, a quell’epoca, quei primi esploratori del mondofrattale abbiano provato un’emozione simile a quella degli speleologi che sco-prono una grotta carsica ricca di meravigliose stallattiti e stallagmiti o a quelladei primi archeologi che nel XIX secolo entrarono per primi nelle tombe dellepiramidi dei faraoni egizi o a quella degli esploratori subacquei che scopronoun fondale ricco di stupende e colorate varietà marine.

Una delle più stimolanti sfide che l’uomo si è posto consiste nel tentativo dicostruire delle macchine che, in qualche modo e con gli inevitabili limiti, pos-sano essere ritenute intelligenti, ossia capaci di replicare le facoltà intellettivee pensanti dell’uomo. Sebbene tale sfida sia lungi dall’essere vinta (ma, in de-finitiva, tutto dipende da cosa si voglia intendere con il termine intelligente),purtuttavia essa rappresenta un polo attrattore degli sforzi dell’uomo.

2.2 Macchine

Dal punto di vista di un utente, astraendo da qualsiasi dettaglio implementati-vo e considerando solamente la sua funzionalità verso l’esterno, una macchinapuò essere considerata come una scatola nera, schematizzabile come descrittonella figura 2.1. Coerentemente con quanto avviene usando un generico elabo-

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 27: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2.3. MACCHINE COMBINATORIE 23

ratore, la macchina manifesta all’esterno, verso l’utente, i risultati attraversodei dispositivi di output, in una qualche modalità (testo, grafica, audio, . . . ).

macchina- -ingressi uscite

Figura 2.1: Schema di una generica macchina: l’utente sollecita la macchi-na fornendo in ingresso valori, espressioni, comandi, interrogazioni, regole,istruzioni e la macchina risponde fornendo dei risultati in uscita.

Per realizzare una macchina si possono sostanzialmente adottare due stra-tegie: assemblare opportunamente dei componenti elementari di base (dotatidi una loro ben determinata funzionalità) oppure prendere una macchina giàcostruita, non dotata di alcuna specifica funzionalità, ma in grado di recepi-re un insieme di istruzioni (programmi) che ne regoleranno il funzionamento.La versatilità di questa seconda tipologia di macchine si fonda proprio sullapossibilità variare il loro modo di agire cambiando il programma che ne regolale modalità di funzionamento. Queste due strategie possono essere adotattecontemporaneamente, costruendo delle macchine programmabili.

2.3 Macchine combinatorieUna macchina combinatoria è caratterizzata dal fatto che le uscite dipen-dono unicamente dagli ingressi e non sono influenzate dalla storia degli ingressiprecedenti; in altri termini, una macchina combinatoria è senza memoria.Esempio 14. Consideriamo una delle più semplici macchine combinatorie: unamacchina in grado di addizionare due numeri in ingresso e dare in uscita laloro somma, come descritto nella figura 2.2.

�b

aa � b

Figura 2.2: Macchina addizionatrice a 2 ingressi.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 28: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

24 CAPITOLO 2. MACCHINE

Costruiamo ora una macchina addizionatrice a 3 ingressi, avente la specificafunzionale descritta dalla figura 2.3.

�3cb

a

a � b � c

Figura 2.3: Macchina addizionatrice a 3 ingressi.

L’idea di costruire un’altra macchina, con una struttura interna specificacorrispondente alla funzionalità che deve espletare, risulta poco produttiva.La strategia migliore consiste nel costruire piccole macchine specializzate (adesempio per addizionare 2 numeri) e di comporle per costruire macchine piùcomplesse. La costruzione della macchina addizionatrice a 3 ingressi può av-valersi della precedente macchina a 2 ingressi. Una possibile implementazioneè riportata nella figura 2.4.

� �

�3

cb

aa � b � c

Figura 2.4: Macchina addizionatrice a 3 ingressi.

Osservazione. La strategia costruttiva descritta nel precedente esempioè tipica dell’informatica (sia per l’hardware che per il software): si costrui-scono piccole macchine o funzioni software elementari componendo le quali sirealizzano macchine o programmi complessi.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 29: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2.4. MACCHINE SEQUENZIALI 25

2.4 Macchine sequenziali

Nella sua essenza, una macchina sequenziale è un sistema con stato descri-vibile mediante lo schema riportato nella figura 2.5 dove gli ingressi modificanolo stato ed i risultati dipendono dagli ingressi e dallo stato della macchina.

stato

sequenzialemacchina

- -ingressi uscite

Figura 2.5: Schema di una macchina sequenziale.

Adottando l’impostazione tipica dei linguaggi di programmazione di tipoimperativo, si dispone di una macchina con memoria alla quale vengono rivoltidei comandi che, eseguiti, modificano lo stato della macchina stessa in unmodo che dipende dallo stato precedente della macchina.Esempio 15. Una tipica istruzione che permette di modificare lo stato di unamacchina sequenziale è l’assegnazione che consiste nel memorizzare all’inter-no della macchina un valore, assegnandogli un nome identificativo medianteil quale tale valore potrà essere successivamente recuperato. Ad esempio,l’istruzione di assegnazione

x� 100

memorizza il valore 100 e permette di accedervi successivamente mediantel’identificatore x.Esempio 16. Un interessante e noto esempio di macchina sequenziale è costi-tuito dalla tartaruga dell’omonima della grafica. La tartaruga è un automache si muove su un piano, lasciando una linea dove passa; ha attaccata unapenna che può essere alzata ed abbassata sul piano di disegno; ha una direzio-ne di avanzamento e può essere manovrato mediante degli appositi comandi,alcuni dei quali sono elencati a seguire:

forward(n) avanza di n passileft(a) gira a sinistra di un angolo aright(a) gira a destra di un angolo apenup alza la penna dal fogliopendown abbassa la penna sul foglio

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 30: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

26 CAPITOLO 2. MACCHINE

Il comando forward(n) ha l’effetto di tracciare un segmento di lunghezzan a partire dalla posizione corrente e lungo la direzione di avanzamento dellatartaruga. L’angolo a di rotazione nei comandi left(a) e right(a) viene espres-so in gradi sessagesimali. Usando questo automa è possibile disegnare figureanche molto complesse. Limitandosi ad utilizzare i pochi comandi elencatisopra, mediante l’algoritmo 1 si può disegnare la figura composta da 10 trian-goli equilateri di lato 100, incentrati in uno stesso punto, ciascuno ruotato di36 gradi rispetto al successivo (figura 2.6).

Figura 2.6: Figura composta da 10 triangoli equilateri di lato 100.

La figura 2.6 può essere generata mediante l’algoritmo 1.

Algoritmo 1 - Disegno di una stella di triangoli equilateri1: repeat 102: repeat 33: forward(100)4: left(120)5: end repeat6: left(36)7: end repeat

Il controllo della forma repeat n azioni end repeat che compare nell’al-goritmo 1 ha il significato di far ripetere ciclicamente per n volte le azioniriportate all’interno del ciclo.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 31: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2.5. MACCHINE PROGRAMMABILI 27

2.5 Macchine programmabiliConsideriamo una macchinaM del tipo di quelle esaminate nei paragrafi pre-cedenti, che risolve dei problemi. Se M fosse in grado di risolvere tutti iproblemi (risolvibili) risulterebbe troppo complicata. Se risolvesse solo i pro-blemi di una classe ben determinata, per risolvere tante classi di problemiservirebbero troppe macchine (una per ciascuna classe di problemi). La stra-tegia vincente consiste nell’avere un’unica macchina universale MU che, divolta in volta, viene istruita a risolvere una ben specifica classe di problemi.Per far sì che la macchina universale si adegui alla soluzione di diverse classidi problemi, anziché dotarla di un meccanismo intrinseco che ne governi il suofunzionamento, viene fornita alla macchina, dall’esterno, una sequenza A diistruzioni, detta solitamente programma, che risolve una classe C di problemi.Un programma può essere visto come una scheda intercambiabile da inserire inuna macchina universale in modo da renderla capace di risolvere una specificaclasse di problemi. Tali macchine vengono dette macchine programmabilie costituiscono una naturale evoluzione delle macchine sequenziali con stato:al momento dell’attivazione iniziale le macchine programmabili vengono do-tate di uno specifico programma che ne definisce lo stato iniziale ed inoltredetermina le successive fasi dell’elaborazione.

La struttura di una macchina programmabile che risolve una classe diproblemi alla quale appartiene l’istanza di problema P della classe C puòessere descritta mediante lo schema riportato nella figura 2.7.

macchina MU

macchina MA

programma A risolventela classe C di problemi

- -

?

dati delproblema P

risultati delproblema P

Figura 2.7: Schema di una macchina programmabile.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 32: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

28 CAPITOLO 2. MACCHINE

Nella figura 2.7 il blocco tratteggiato costituito dal programma A unita-mente alla macchina universale MU può essere pensato come una macchinaMA (a logica cablata) univocamente individuata dal programma A.

Per le macchine programmabili si presenta l’esigenza di avere un linguaggiomediante il quale descrivere alla macchinaMU il programma A. Ovviamente,in questo caso il programma A deve essere descritto nel linguaggio L compresodalla macchina MU .

2.6 Macchine virtuali

Con riferimento ad una macchina programmabile, se il programma A vieneconsiderato come facente parte della macchina che lo esegue, la macchinasi configura come una macchina virtuale in grado di risolvere i problemidella classe della quale il programma A costituisce una soluzione. È questala situazione in cui si trova un utente di un dato programma applicativo.Una macchina virtuale è costituita da un insieme di risorse hardware cherappresentano la macchina fisica e da un programma o insieme di programmiche costituiscono il software mediante il quale si riesce a far eseguire allamacchina le azioni per raggiungere i risultati desiderati. Ad un utente ladistinzione fra la macchina fisica ed i programmi che la controllano risulta deltutto trasparente: le risorse hardware (macchina fisica) e software (programmi)si configurano come un esecutore virtuale che agisce in base a quanto definitodal programma che si sta utilizzando. Il punto di vista più interessante epositivo di questa impostazione sta nel fatto che un utente di una macchinavirtuale non si deve preoccupare (e dal punto di vista logico non dovrebbeneanche pensare) di come è fatta la macchina virtuale che utilizza, ma devesolamente sapere cosa fa. Naturalmente, la macchina virtuale vista dall’utentepuò essere composta da più strati. La suddivisione in strati risulta comunquetrasparente all’utente, il quale vede un’unica macchina virtuale.

L’idea di macchina virtuale ha trovato di recente importanti realizzazioninelle macchine virtuali Java, Python ed altre, sulle quali si basano gli omologhilinguaggi.

2.7 Il principio di complessità

In questo paragrafo, prendendo spunto da un esempio, si analizzerà la relazioneche intercorre tra la potenza di un esecutore e la complessità della soluzioneper risolvere un dato problema.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 33: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2.7. IL PRINCIPIO DI COMPLESSITÀ 29

Esempio 17. Consideriamo il problema di trasformazione di una configurazionedi blocchi, come illustrato dallo schema che segue:

ABCD

CDBA

-

Possiamo pensare che qui l’esecutore sia una persona, un robot o qualcos’altro.Per rendere il problema un po’ interessante supponiamo, per il momento, chel’esecutore abbia la capacità di spostare un solo blocco alla volta. Con questaipotesi, una soluzione del problema è fornita dall’algoritmo 2.

Algoritmo 2 - Algoritmo spostamento blocchi (caso a)1: sposta il blocco D sul piano2: sposta il blocco C sul piano3: sposta il blocco D sopra a C4: sposta il blocco B sopra a D5: sposta il blocco A sopra a B

In questo contesto, il solutore è colui che ha scritto la sequenza delle azio-ni, l’esecutore è l’entità che effettua lo spostamento dei blocchi, gli oggettiche vengono manipolati sono costituiti dai blocchi, le azioni consistono nellospostare i blocchi, i dati sono rappresentati dalla configurazione iniziale ed irisultati dalla configurazione finale che si vuole ottenere.

Se ammettiamo che l’esecutore abbia la capacità di spostare una qualsia-si pila di blocchi, senza capovolgerla, la soluzione del problema può essereformulata come descritto nell’algoritmo 3.

Algoritmo 3 - Algoritmo spostamento blocchi (caso b)1: sposta la pila di blocchi CD sul piano2: sposta il blocco B sopra a D3: sposta il blocco A sopra a B

Da questa semplice variazione abbiamo la riconferma che la soluzionedipende dalle capacità dell’esecutore.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 34: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

30 CAPITOLO 2. MACCHINE

Se ammettiamo che l’esecutore abbia anche la capacità di spostare unaqualsiasi pila di blocchi e possa, eventualmente, appoggiarla capovolta, unasoluzione può essere più semplicemente espressa come descritto nell’algorit-mo 4.

Algoritmo 4 - Algoritmo spostamento blocchi (caso c)1: sposta la pila di blocchi CD sul piano (senza capovolgerla)2: sposta la pila di blocchi AB sopra D capovolgendola

Le diverse soluzioni presentate nell’esempio precedente evidenziano chela soluzione di un problema non solo dipende dalle capacità dell’esecutorema che la soluzione è tanto più breve e semplice quanto più potenti sono lecapacità dell’esecutore. La lunghezza di una soluzione, misurata come numerodelle istruzioni elementari che la compongono, rappresenta un’indicazione dellacomplessità della soluzione. Se la soluzione viene espressa in una forma nonsequenziale ma strutturata mediante delle strutture (condizionali e/o cicliche)di controllo delle azioni, il concetto di complessità deve essere espresso in unmodo più elaborato. Assumendo in modo intuitivo il concetto di complessitàdi una soluzione, possiamo affermare il seguente principio:

PROPRIETÀ 1. (Principio di complessità della soluzione). La complessitàdella soluzione di un problema diminuisce all’aumentare della potenza delleazioni che l’esecutore è in grado di compiere.

In base a questo principio possiamo dedurre che è molto più laborioso fareseguire una moltiplicazione fra due numeri naturali ad un esecutore che ècapace solamente di addizionare un’unità alla volta che non ad un esecutorecapace di addizionare due numeri qualsiansi. Il caso estremo è quando l’esecu-tore è capace di moltiplicare due numeri; in tale caso la soluzione del problemapuò essere espressa semplicemente in una forma del tipo moltiplica x per y.Il discorso può essere generalizzato come segue. Dato un problema P , l’idealesarebbe disporre di un esecutore così potente da poter esprimere la soluzionemediante la sola istruzione Risolvi il problema P . Evidentemente, la realtà èben diversa; inoltre, il procedimento risolutivo è tanto più lungo e complessoquanto più il linguaggio con il quale ci si rivolge all’esecutore è ”lontano” dalproblema trattato. Per diminuire la distanza fra il linguaggio usato e proble-ma trattato, i linguaggi di programmazione offrono degli strumenti appositi:definizioni di sottoprogrammi, definizioni di tipi di dato, definizioni di classied altro ancora.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 35: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2.8. MACCHINE E LINGUAGGI 31

2.8 Macchine e linguaggiL’ambito in cui vengono risolti i problemi è caratterizzato dal seguente scena-rio:

Il solutore descrive, mediante un linguaggio,la soluzione del problema ad un esecutoreche è capace di eseguire un insieme di operazioni elementarisu un insieme di oggetti elementari.

In questo contesto è consuetudine usare interscambievolmente le due locuzioniDisponendo della macchina M e Usando il linguaggio L. Questa abitudineè coerentemente fondata sul fatto che un linguaggio definisce univocamentel’esecutore che comprende il dato linguaggio ed opera in base a quanto è de-scrivibile con il linguaggio da esso compreso. Viceversa, se una macchina Mè in grado di eseguire dei programmi, questi dovranno necessariamente esseredescritti nello specifico linguaggio L compreso dalla macchina. Si stabiliscecosì una corrispondenza biunivoca fra macchina e linguaggio. In base a questacorrispondenza, dato un linguaggio L, si parla anche di macchina L e, datauna macchina M, si parla di linguaggio M. Per denotare che una macchinaM è in grado di comprendere il linguaggio L si scriverà ML.

Definire il linguaggio di una macchina (o di un generico esecutore) significadescrivere gli oggetti che la macchina è in grado di gestire, stabilire le azioniche essa è in grado di eseguire su di essi ed il formato per richiamare le azioni.Esempio 18. Nelle costruzioni geometriche con riga e compasso si hanno adisposizione degli enti primitivi costituiti dai punti del piano e degli strumentidi disegno (matita, riga e compasso). A partire dagli enti primitivi si possonocostruire altre entità geometriche quali segmenti, rette e circonferenze, condelle azioni della forma:

- tracciare il segmento congiungente due dati punti- tracciare la retta passante per due dati punti- tracciare la circonferenza di dato centro e punto di passaggio

Eseguendo delle operazioni sugli elementi geometrici (primitivi e non) sipossono generare altri elementi con delle operazioni come le seguenti:

- selezionare un punto su un’entità- determinare il punto di intersezione fra due rette- determinare i punti di intersezione fra due circonferenze- determinare i punti di intersezione fra una retta ed una circonferenza

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 36: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

32 CAPITOLO 2. MACCHINE

Per descrivere dei procedimenti nel contesto delle costruzioni geometricheè necessario formalizzare mediante un linguaggio preciso tutte le precedentioperazioni. Due componenti fondamentali per definire un linguaggio sonocostituite dagli enti primitivi predisposti dal linguaggio e dalle operazioni am-messe su questi enti. Gli enti fondamentali della geometria delle costruzionigeometriche sono i punti del piano. Sui punti sono previste delle operazio-ni che vengono suddivise in costruttori, selettori ed operatori: i costruttori(riportati nella tabella 2.1) permettono di costruire nuovi enti componendodegli enti elementari; i selettori (tabella 2.2) hanno una funzione inversa aicostruttori e permettono di accedere alle componenti delle entità; gli operato-ri (tabella 2.3) costituiscono le operazioni fra entità e generano nuove entitàcome risultato.

Costruttore DescrizioneSegment�A,B� segmento di estremi i punti A e BLine�A,B� retta passante per i due punti A e BCircle�C,P � circonferenza di centro C e passante per P

Tabella 2.1: Costruttori per un linguaggio delle costruzioni geometriche.

Selettore Descrizionehead�a� primo estremo del segmento atail�a� secondo estremo del segmento acenter�α� centro della circonferenza αpoint�α� punto casuale sull’entità α

Tabella 2.2: Selettori per un linguaggio delle costruzioni geometriche.

Operatore Descrizioneinters�r, s� punto di intersezione fra le rette r ed sinters�α,β� punti di intersezione fra le circonferenze α e βinters�α, r� punti di intersezione fra la circonferenza α e la retta r

Tabella 2.3: Operatori per un linguaggio delle costruzioni geometriche.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 37: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2.8. MACCHINE E LINGUAGGI 33

Con il linguaggio descritto nelle tabelle 2.1, 2.2 e 2.3 determiniamo il puntomedio di un segmento. Il procedimento si basa sull’usuale metodo di costru-zione manuale con riga e compasso, è descritto nella figura 2.8 ed è formalizzatonell’algoritmo 5. In questo algoritmo le istruzioni della forma x�esp hannol’effetto di assegnare alla variabile x il valore ottenuto dalla valutazione del-l’espressione esp, mentre l’istruzione return ha l’effetto di precisare il risultatodell’algoritmo.

A

B

P

Q

M

αβ

r

s

Figura 2.8: Procedimento grafico con riga e compasso per costruire il puntomedio M del segmento di estremi A e B.

Algoritmo 5 - Determinazione del punto medio di un segmentoInput: segmento aOutput: punto medio M del segmento a

1: A� head�a�2: B � tail�a�3: α � Circle�A,B�4: β � Circle�B,A�5: �P,Q�� inters�α,β�6: r � Line�A,B�7: s� Line�P,Q�8: M � inters�r, s�9: return M

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 38: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

34 CAPITOLO 2. MACCHINE

2.9 Linguaggi e traduttori

In generale una macchina non comprende direttamente il linguaggio del solu-tore ma fra il solutore e la macchina vengono interposti degli opportuni inter-preti che traducono alla macchina le direttive impartite dal solutore. Questoè proprio quello che avviene in realtà usando i calcolatori. Per una stessamacchina si hanno generalmente a disposizione più interpreti per colloquiarecon la macchina, mediante diversi linguaggi di programmazione. Altrimentisi può pensare che l’interprete faccia parte della macchina la quale può esserepensata come una macchina che comprende il linguaggio del solutore tramitela mediazione dell’interprete. È facilmente riconoscibile che queste diverseimpostazioni sono fra loro equivalenti; pertanto non dovremmo preoccuparcidi quale stiamo adottando.

Per far comprendere i linguaggi alle macchine vengono utilizzati degli ap-positi programmi di traduzione (compilatori, interpreti, macroespansori, ...).La possibilità di traducibilità automatica da forme di alto livello ad equivalentiforme di basso livello, mediante degli schemi di traduzione o mediante apposi-ti programmi di traduzione, consente ad un solutore di problemi di esprimeregli algoritmi in forme adeguate al problema in esame e di disinteressarsi del-la traduzione in forme più elementari effettivamente eseguibili dall’esecutore.Come strategia generale, un solutore di problemi dovrebbe pensare al più altolivello possibile, compatibilmente con il problema in questione, e di tradurresuccessivamente nel linguaggio dell’esecutore (virtuale) che si dispone. Questoapproccio trova concretezza nella metodologia di sviluppo della soluzione diun problema nota come metodologia top-down o metodologia dei raffinamentisuccessivi.

Nei casi pratici l’esecutore è costituito da un elaboratore elettronico che èin grado di eseguire istruzioni in un linguaggio macchina L (ossia il linguaggiodirettamente eseguibile dall’hardware della macchina); poiché tale linguaggiomal si presta (per l’uomo) a descrivere i programmi, risulta più comodo de-scrivere il programma A in un opportuno linguaggio di programmazione L�

e si dota l’esecutore di un traduttore TL��L che traduce dal linguaggio L� al

linguaggio L (figura 2.9).Il blocco costituito dalla macchinaML e dal traduttore TL�

�L (parte costi-tuita dal riquadro più esterno nella figura 2.9) diventa così una macchinaM�

L�

capace di eseguire programmi scritti nel linguaggio L�. In base all’equivalenzafra esecutori e linguaggi, le due locuzioni Scrivere un traduttore del linguaggioL� al linguaggio L e Implementare la macchina virtuale ML� sono equivalenti.

L’idea di dotare una macchina di un traduttore può essere generalizzata;ad esempio, disponendo di un traduttore TL”�L� si può costruire una macchina

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 39: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2.9. LINGUAGGI E TRADUTTORI 35

macchina ML

traduttore TL��L

programma A scrittonel linguaggio L�

- -

?

dati risultati

Figura 2.9: Schema di una macchina programmabile dotata di un traduttore.

M”L” secondo lo schema illustrato nella figura 2.10.

macchina ML

traduttore TL���L�

traduttore TL��L

Figura 2.10: Struttura a strati di una macchina programmabile dotata di piùtraduttori.

Poichè ogni traduttore è anch’esso un programma, risulta legittima ed in-teressante la domanda “In quale linguaggio viene scritto il traduttore?”. Ov-viamente il traduttore TL�

�L del linguaggio L� non può essere scritto (com-pletamente) in linguaggio L� poiché al momento dell’implementazione dellamacchina ML non si dispone della macchina ML� . La soluzione adottata èquella di implementare la macchina virtuale L� su una macchina virtuale dilivello più basso. L’implementazione di una macchina virtuale M1 su unamacchina virtuale M0 di livello inferiore avviene, in generale, attraverso unprocesso di traduzione del linguaggio L1 della macchinaM1 nel linguaggio L0della macchinaM0. In questo modo però il problema risulta solo rinviato. In

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 40: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

36 CAPITOLO 2. MACCHINE

generale, si ha una sequenza gerarchica di macchine virtuali di livello più bas-so, ciascuna implementata sulla macchina virtuale direttamente sottostante.Questa gerarchia di macchine virtuali viene chiusa, al livello più basso, da unamacchina reale fisica (composta di circuiti integrati e microprocessori vari) laquale interpreta ed esegue direttamente gli ordini impartiti dalla macchina dilivello direttamente superiore.

Osservazione. Se le fasi di scrittura (utilizzando un linguaggio di pro-grammazione), di traduzione ed uso di un programma vengono assommate eviste globalmente, la situazione che si evidenzia è quella di un utente che usauna macchina virtuale che comprende il dato linguaggio di programmazioneutilizzato. Mediante una tale macchina virtuale, un solutore può descrivereun programma nel linguaggio della macchina virtuale e tale programma puòessere eseguito dalla macchina virtuale. In questo caso il passo di tradu-zione dello specifico linguaggio del solutore al linguaggio macchina può essereignorato dall’utente della macchina virtuale. Ad un opportuno livello di astra-zione, per un utente dell’esecutore virtuale la distinzione fra macchina fisica eprogramma traduttore è del tutto trasparente: le risorse hardware (macchinafisica) e software (programmi) si configurano come un esecutore virtuale ca-pace di comprendere il linguaggio ad alto livello e capace di eseguire le azionielementari sugli oggetti elementari predisposti dal particolare ambiente di pro-grammazione in cui ci si pone, ossia dal linguaggio utilizzato. Qui il terminevirtuale è da intendere nel senso che è come se si disponesse di una macchinacapace di capire il linguaggio L ad alto livello e capace di agire nell’ambientefornito dal linguaggio di programmazione. A seconda del linguaggio L utiliz-zato si parla di macchina virtuale L. Al posto del termine macchina virtualesi parla anche di macchina astratta volendo evidenziare il fatto che un utentedella macchina può astrarre dalla particolare implementazione della macchinastessa.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 41: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

2.10. ESERCIZI 37

2.10 Esercizi1. Determinare le informazioni interne all’automa tartaruga che ne costi-

tuiscono lo stato.

2. Definire una classe di problemi corrispondente all’istanza di figura di-segnata nell’esempio 16 mediante l’algoritmo algoritmo 1. Scrivere unalgoritmo per disegnare una generica figura della classe.

3. Determinare, senza provare al computer, la figura che viene disegnatamediante algoritmo 1 mettendo 1 al posto di 3 nell’istruzione 2.

4. Descrivere la struttura di una macchina addizionatrice a 4 ingressi.

5. Descrivere la struttura di una macchina a 4 ingressi in grado di calcolareil valore di un’espressione della forma a � b � c � d.

6. Descrivere il procedimento grafico ed il corrispondente algoritmo persuddividere un dato segmento in 4 parti isometriche.

7. Descrivere il procedimento grafico ed il corrispondente algoritmo perdeterminare il quadrato del quale è data una diagonale.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 42: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

38 CAPITOLO 2. MACCHINE

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 43: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

Capitolo 3

Algoritmi

Per troppo tempo, la gente ha tentato diformulare gli algoritmi in un linguaggio diprogrammazione, piuttosto che decompor-re attentamente il problema in problemipiù semplici e verificare le loro relazioni pri-ma di procedere ad una specificazione piùdettagliata. [...] L’esperienza ha dimostra-to che [il secondo approccio] permette disviluppare algoritmi con molti meno erroriche non il vecchio metodo linea-per-linea.S.Alagic, M.A.Arbib,The design of well-structured and correctprograms

Nelle pagine seguenti sarà definita e precisata la nozione di procedimen-to risolutivo per la soluzione di un problema, in modo che sia adattabile aicalcolatori. Sarà presentato il concetto di algoritmo che rappresenta un’evo-luzione in senso dinamico del concetto di formula risolutiva della matematica.I primi algoritmi furono ideati per risolvere problemi di tipo numerico: molti-plicazione e divisione fra due numeri, massimo comune divisore fra due numerinaturali. Oggigiorno gli algoritmi vengono applicati per risolvere problemi divaria natura ed operano sulle più svariate tipologie di entità.

39

Page 44: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

40 CAPITOLO 3. ALGORITMI

3.1 Formule risolutiveConsideriamo il seguente problema:

Determinare l’area di un trapezio date le misure B della basemaggiore, b della base minore ed h dell’altezza.

Per questo problema il procedimento risolutivo è immediato e può essereespresso per mezzo della semplice formula

area � �B � b�h~2Anche qui, comunque, la formula risolutiva maschera un procedimento risolu-tivo che può essere esplicitato in modo discorsivo come segue:

Considera i valori delle misure delle basi e dell’altezza; sommale misure delle due basi; moltiplica il risultato per l’altezza;dividi il risultato per 2; il risultato ottenuto rappresenta l’areadel trapezio.

Il precedente procedimento viene solitamente scritto in una notazione piùprecisa, come descritto nell’algoritmo 6.

Algoritmo 6 - Area di un trapezioInput: misure B e b delle basi ed h dell’altezzaOutput: area a del trapezio

1: s� B � b2: d� s � h3: a� d~24: return a

È noto però che i procedimenti risolutivi di molti problemi, anche limitan-dosi ai problemi di tipo computazionale, non possono essere espressi medianteun’unica formula risolutiva né mediante un’elencazione sequenziale di passi.Servono, in generale, dei costrutti linguistici più articolati. In altre parole,non esiste più una corrispondenza biunivoca fra le frasi della descrizione delleistruzioni e l’esecuzione delle istruzioni. Per convincersi di quanto appenaaffermato consideriamo il seguente altro problema:

Determinare il massimo comune divisore di due numeri natu-rali m ed n, ossia il più grande numero naturale che divide siam che n.

In questo caso il risultato non è direttamente ricavabile mediante una singolaformula risolutiva come nell’esempio precedente, ma necessita di un procedi-mento risolutivo più articolato detto algoritmo. Questo problema sarà ripresoe risolto in più modi nel seguito.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 45: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.2. ALGORITMI 41

3.2 AlgoritmiLa parola "algoritmo" deriva dal nome del matematico persiano Abu Ja’farMuhammad ibn Musa al-Khwarizmi che nell’anno 825 d.C. scrisse un impor-tante ed influente testo di matematica. Dalla storpiatura latina medievale delsuo nome derivò il termine "algorismus" e successivamente la parola moderna"algoritmo". Nel medioevo il termine algoritmus indicava un procedimento dicalcolo, basato sull’uso delle cifre arabe, descritto mediante un numero finitodi regole esplicite che conducono al risultato finale dopo un numero finito diapplicazioni delle regole. Con lo sviluppo dei calcolatori il termine algoritmoè stato utilizzato per indicare la descrizione di una sequenza di istruzioni che,eseguite da parte di un sistema di calcolo, permette di risolvere un problema.Più in generale e più precisamente si assume la seguente definizione.

DEFINIZIONE 1. Un algoritmo è la descrizione della soluzione di unaclasse di problemi, ossia la descrizione delle azioni, da eseguirsi da parte di undato esecutore, mediante le quali si risolve una classe di problemi; inoltre, unalgoritmo deve soddisfare alle seguenti condizioni:

- definitezza: ogni azione deve essere deterministica ed univocamente inter-pretabile dall’esecutore.

- eseguibilità: ogni azione deve essere effettivamente eseguibile da parte del-l’esecutore.

- finitezza: le istruzioni devono essere in numero finito, ciascuna azione deveessere eseguita in un tempo finito ed ogni azione deve essere eseguita unnumero finito di volte.

- generalità: la descrizione del procedimento risolutivo deve applicarsi a tuttele istanze della classe dei problemi.

Le stringenti condizioni elencate nella precedente definizione differenzianoquelli che genericamente sono dei procedimenti risolutivi da quei procedimentiche possono essere classificati come algoritmi. Ad esempio, una ricetta dicucina può essere classificata come un procedimento risolutivo ma non come unalgoritmo. Comunque, quando nel seguito si utilizzerà il termine procedimentorisolutivo, tale termine è da intendersi con significato di algoritmo, secondo ladefinizione data sopra.

Questa definizione di algoritmo è una fra le tante possibili. Tutte le altreche si possono trovare sui testi di informatica, anche se apparentemente diverseed espresse in modo più formale (ad esempio, macchina di Turing, sistemacanonico di Post, lambda-calcolo di Church) sono equivalenti a questa.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 46: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

42 CAPITOLO 3. ALGORITMI

Osserviamo che, con le condizioni di generalità e finitezza, si impone cheun algoritmo termini per ogni istanziazione dei dati di ingresso. Nonostanteche nella definizione di algoritmo si imponga che la descrizione delle istruzionisia finita, non si esclude il caso che le istruzioni possano essere eseguite unnumero infinito di volte. In molti casi quest’ultima condizione di finitezzarisulta troppo forte e, per poter trattare una classe più ampia di procedimentirisolutivi, risulta conveniente alleggerire la condizione di finitezza relativamen-te al numero di volte che viene eseguita ogni singola istruzione, ammettendoche delle istruzioni possano essere eseguite per un numero infinito di volte. Intali condizioni un procedimento risolutivo è detto metodo computazionale.

'

&

$

%

'

&

$

%'&

$%algoritmi

procedimenti risolutivi

metodi computazionali

Figura 3.1: Algoritmi, metodi computazionali e procedimenti risolutivi.

La nozione di algoritmo è strettamente connessa con la nozione di ese-cutore: basta considerare i termini univocamente interpretabile e realmenteeseguibile. È evidente quindi che un algoritmo presuppone che esista unesecutore che lo interpreti ed esegua le istruzioni specificate.

Anche se la finalità di un algoritmo è quella di essere eseguito da un calco-latore e necessita pertanto di essere tradotto in uno specifico linguaggio di pro-grammazione, un algoritmo è indipendente dal linguaggio di programmazionenel quale verrà tradotto.

3.3 Algoritmi come funzioniRisolvere un problema significa sostanzialmente definire una funzione che operasui dati iniziali di input e produce dei risultati finali di output. Ad esempio, nelcaso del problema dell’area di un trapezio esaminato nel precedente paragrafo,

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 47: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.3. ALGORITMI COME FUNZIONI 43

la soluzione può essere espressa mediante l’espressione funzionalearea � f�B, b, h� � �B � b�h~2

Anche quando l’algoritmo non sia esprimibile mediante una singola espres-sione, esso può sempre comunque essere considerato come una funzione che,operando sui dati di input, costruisce i risultati di output (in questo caso èsolo più laboriosa la descrizione e la valutazione della funzione). Adottandoquesta impostazione, ed usando la tradizionale convenzione di denotare con iltermine Input l’insieme dei dati e con il termine Output l’insieme dei risultati,descriveremo un algoritmo mediante uno schema a blocchi come il seguente:

Input Outputalgoritmo- -

oppure

Input Outputalgoritmo -

Nel primo caso si vuole mettere in evidenza che l’algoritmo si comportacome una macchina che trasforma i dati che riceve in ingresso nei risultati inuscita. Nel secondo caso viene sottolineato il ruolo dell’algoritmo che stabiliscel’associazione fra dati e risultati; in questo caso l’algoritmo viene visto comeuna funzione che, in base ai dati iniziali di input, genera i risultati finali dioutput.

L’interpretazione di un algoritmo come funzione porta a delle naturalidefinizioni e concetti.DEFINIZIONE 2. Due algoritmi A1 ed A2 si dicono funzionalmenteequivalenti se hanno lo stesso dominio e calcolano lo stesso risultato y perogni possibile istanziazione dei dati di input x, ossia

A1�x� � A2�x� � y per ogni input xDue algoritmi si dicono equivalenti se fanno compiere all’esecutore la stes-sa sequenza di azioni. È evidente che l’equivalenza implica l’equivalenzafunzionale.

Data la definizione di equivalenza fra algoritmi, acquista importanza pra-tica il seguente problema: Decidere se due dati algoritmi sono equivalenti. Lasoluzione di questo problema dovrebbe essere un algoritmo che, dati due algo-ritmi come suoi dati di input, decida se questi algoritmi sono equivalenti. Èstato dimostrato che un tale algoritmo di decisione non esiste.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 48: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

44 CAPITOLO 3. ALGORITMI

3.4 Tavola di traccia di un algoritmo

Consideriamo ora un algoritmo per moltiplicare due numeri naturali. Il pro-cedimento, noto con il nome di algoritmo del contadino russo, consiste nelraddoppiare iterativamente un fattore mentre si dimezza l’altro, tenendo contodove il valore del primo fattore è dispari. Il passo finale consiste nell’addi-zionare i multipli del fattore che è stato raddoppiato, in corrispondenza deipunti in cui il valore del primo fattore è dispari. Ad esempio, l’applicazionedi questo algoritmo per calcolare il prodotto fra i due numeri m � 22 e n � 13è descritto tabella riportata nella figura 3.2.

m m dispari ? n

22 no 1311 si 265 si 522 no 1041 si 2080

prodotto: 286

Figura 3.2: Tavola di traccia del calcolo 22 � 13 mediante l’algoritmo del con-tadino russo. I numeri sottolineati corrispondono alla condizione m dispari ecostituiscono gli addendi che, sommati, producono il risultato finale 286.

Una tabella come questa è detta tavola di traccia; corrisponde all’algorit-mo applicato ad un’istanza di problema e descrive nel tempo i valori asso-ciati alle entità coinvolte nell’algoritmo. La tavola di traccia è paragonabilead una sequenza di fotogrammi che descrive l’avanzamento del processo dielaborazione.

Notiamo che le fasi operative per l’applicazione di questo procedimentosono (specialmente se i fattori sono grandi) più laboriose rispetto all’usualemetodo di moltiplicazione, ma in questo procedimento le capacità coinvoltesono più elementari. Un esecutore deve infatti essere in grado di eseguire leseguenti operazioni:

• duplicare un numero naturale

• dimezzare un numero naturale

• decidere se un numero naturale è dispari

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 49: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.5. LIVELLI DESCRITTIVI DEGLI ALGORITMI 45

• addizionare numeri naturali

Notiamo inoltre che questo procedimento di moltiplicazione non è commutativoe che, poiché l’operazione di moltiplicazione è commutativa, in un prodotto èpreferibile prendere come fattore da dimezzare quello minore, per ottimizzarel’efficienza del procedimento.

3.5 Livelli descrittivi degli algoritmiGli algoritmi vengono descritti con un linguaggio e con livello di dettaglio delleazioni da eseguire che dipendono dalle capacità dell’esecutore.Esempio 19. Consideriamo il seguente problema:

Note le misure a e b dei due lati di un rettangolo, determinarela misura d della diagonale.

Se l’esecutore è uno studente che abbia frequentato almeno le scuole medieinferiori, un procedimento risolutivo potrebbe essere:

Determina d usando il teorema di Pitagora.

Se l’esecutore non conosce il teorema di Pitagora, un procedimento risolutivo,espresso in modo algebrico, potrebbe essere:

d �ºa2 � b2

Se l’esecutore non conosce nemmeno il simbolismo algebrico che compare nel-la formula precedente o non è in grado di eseguire le operazioni indicate,il procedimento risolutivo dovrebbe essere descritto ad un livello ancora piùelementare.

Questo semplice esempio evidenzia che uno stesso algoritmo, pur risolvendolo stesso problema, può essere espresso con notazioni ed a livelli descrittividiversi, in funzione delle capacità e delle conoscenze dell’esecutore al quale èrivolto.

3.6 Forme descrittive degli algoritmiUn algoritmo nelle sue fasi prototipali può essere descritto in modo discorsivo.Ne è un esempio la seguente formulazione del procedimento per la determina-zione della radice quadrata, ideato dai babilonesi ancora nel XVIII secolo a.C.e più recentemente analizzato da Newton alla fine del 1600. Il procedimentopuò essere espresso come segue:

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 50: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

46 CAPITOLO 3. ALGORITMI

Per determinare la radice quadrata di un numero naturale ndeterminiamo inizialmente due valori a1 ed a2 che siano un’ap-prossimazione di

ºn e tali che sia a1 @

ºn @ a2. Successi-

vamente calcoliamo la media m �a1�a2

2 e verifichiamo se mè minore o maggiore di

ºn; questa verifica può essere fatta

confrontando m2 con n (visto cheºn non è noto). Se m è

maggiore diºn, allora m sostituirà il valore in eccesso; se è

minore sostituirà l’altro valore. Si ripete questo procedimentofino a che si ottiene un valore approssimato soddisfacente.

Prima di procedere oltre si consiglia di leggere con attenzione il procedi-mento e di applicarlo al calcolo di

º7 utilizzando una semplice calcolatrice

dotata delle 4 operazioni aritmetiche di base.La precedente formulazione del procedimento di calcolo della radice qua-

drata risulta soddisfacente per un operatore umano, ma inadeguata per esseretradotta mediante un linguaggio di programmazione al fine di essere sotto-messa ad un calcolatore digitale, in quanto molti aspetti rimangono ambigui(scelta dei valori iniziali di a1 ed a2, numero di volte da ripetere il ciclo delcalcolo). In una forma più precisa, l’algoritmo può essere espresso come segue:

Algoritmo 7 - Radice quadrata di un numero naturaleInput: numero naturale nOutput: radice quadrata approssimata di n

1: a1 � 02: a2 � n3: while �a2 � a1� A 10�5 do4: m� �a1 � a2�~25: if �m �m� @ n then6: a1 �m7: else8: a2 �m9: end if

10: end while11: return m

Osservazione. Aprendo un libro che tratta di problemi ed algoritmi trovia-mo degli algoritmi descritti in modo preciso, sintetico ed esaustivo. Ma ancheun algoritmo, analogamente ad ogni altro prodotto finale come un teoremadella Matematica o un progetto esecutivo di tipo industriale non emerge al-l’improvviso ma è un distillato purificato di idee e tentativi che hanno trovato,alla fine, una loro coerente e precisa organizzazione.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 51: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.7. ANALISI DEGLI ALGORITMI 47

3.7 Analisi degli algoritmi

L’analisi e la valutazione della qualità degli algoritmi in relazione alla quantitàdi risorse impiegate viene detta complessità computazionale. I criteri in baseai quali stabilire la qualità di un algoritmo non vengono basati sulle carat-teristiche intrinseche dell’algoritmo (lunghezza, leggibilità) bensì sulle risorserichieste dall’algoritmo (tempo impiegato, memoria occupata). Fra questi ilfattore più significativo è costituito dal tempo di elaborazione impiegato perl’esecuzione dell’algoritmo. Il parametro tempo risulta però poco espressivoin quanto fa riferimento ad una particolare esecuzione di una istanza del pro-blema su una data macchina. È chiaramente poco significativa, infatti, unafrase del tipo: L’algoritmo di ordinamento A impiega 6.2 secondi ad essereeseguito in quanto non è precisato né il numero di elementi che vengono ordi-nati, né la loro disposizione iniziale, né il linguaggio di programmazione usatoper codificare l’algoritmo in un programma, né la macchina sulla quale vieneeseguito il programma. Questo approccio richiederebbe sempre delle proveper poter confrontare due algoritmi. Il problema della valutazione della com-plessità degli algoritmi non ammette una soluzione di tipo pragmatico dellaforma ”prova e vedi” ma deve essere affrontato sulla carta; in questo modosi riesce a valutare la qualità di un algoritmo indipendentemente dal sistemadi elaborazione, anche nei casi in cui il tempo di esecuzione è elevato (un’orao addirittura un secolo!). Ed è proprio in questi casi estremi che è utile sa-pere (senza provare!) la complessità di un algoritmo per stimare il tempo diesecuzione, senza eseguire l’algoritmo. Per stimare il tempo di esecuzione diun algoritmo senza fare riferimento ad alcuna macchina particolare si assumel’ipotesi (plausibile) che il tempo di esecuzione di un imprecisato numero k dioperazioni elementari sia proporzionale a k e che il numero k sia una funzionef crescente della misura n dei dati da elaborare. Pertanto, tale funzione f�n�può essere assunta come misura del tempo impiegato. Il problema viene cosìricondotto al conteggio dei passi elementari che vengono svolti nell’algoritmo.

3.8 Complessità di un algoritmo

Riassumendo quanto detto nel precedente paragrafo, la complessità compu-tazionale di un algoritmo esprime il numero di passi elementari svolti nell’e-secuzione dell’algoritmo e rappresenta indirettamente, senza riferirsi ad unaparticolare macchina, una stima del tempo di elaborazione impiegato perl’esecuzione dell’algoritmo.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 52: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

48 CAPITOLO 3. ALGORITMI

Spesso negli algoritmi si incontrano dei passi elementari di diversa naturae computazionalmente non uniformabili; ci possono essere delle assegnazio-ni, delle addizioni, delle moltiplicazioni, delle valutazioni di condizioni. Persemplificare la valutazione della complessità si prende in considerazione l’o-perazione che più incide sul tempo di elaborazione, come specificato nelladefinizione che segue.

DEFINIZIONE 3. Si chiama operazione dominante di un algoritmo l’o-perazione che viene eseguita con maggiore frequenza; nel caso di operazionieseguite con la stessa frequenza si considera quella più onerosa in termini ditempo impiegato per la sua esecuzione.

In molti casi l’operazione dominante è individuabile già dal problemain quanto tutti i possibili algoritmi che lo risolvono avranno questa comeoperazione dominante.Esempio 20. Nella tabella che segue sono riportati alcuni problemi e la corri-spondente operazione dominante.

Problema Operazione dominantecalcolo del fattoriale di un numero moltiplicazione fra due numeriricerca in una sequenza confronto fra due elementiordinamento di una sequenza confronto fra due elementimoltiplicazione fra due matrici moltiplicazione fra due numeritorre di Hanoi spostamento di un disco

Tabella 3.1: Problemi e corrispondenti operazioni dominanti.

Per un dato algoritmo il numero di passi elementari che vengono eseguitidipende quasi sempre dalla quantità e dalla grandezza dei dati coinvolti nellaspecifica istanza di problema che si considera. Per tener conto di questoparametro si fa riferimento alla seguente definizione.

DEFINIZIONE 4. La dimensione di un problema è un numero naturaleche esprime un’opportuna misura dei dati di input del problema.

Nonostante l’apparente vaghezza del termine opportuna che compare nelladefinizione precedente, la dimensione di un problema è facilmente identifica-bile, come riportato nell’esempio che segue.Esempio 21. La tabella 3.2 descrive la dimensione di alcuni importanti pro-blemi.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 53: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.8. COMPLESSITÀ DI UN ALGORITMO 49

Problema Dimensione del problemacalcolo del fattoriale di un numero numero di cui si calcola il fattorialericerca in una sequenza numero di elementi della sequenzaordinamento di una sequenza numero di elementi della sequenzamoltiplicazione fra due matrici dimensione delle matricitorre di Hanoi numero di dischi da spostare

Tabella 3.2: Problemi e corrispondenti dimensioni.

In funzione dell’operazione dominante e della dimensione di un problemasi definisce la complessità di un algoritmo.

DEFINIZIONE 5. La complessità di un algoritmo è una funzione cheesprime il numero di operazioni dominanti in funzione della dimensione delproblema.

Esempio 22. Il problema della moltiplicazione fra due matrici quadrate di laton ha dimensione n. L’operazione dominante è la moltiplicazione (l’addizio-ne non viene considerata in quanto è computazionalmente meno onerosa intempo rispetto alla moltiplicazione). Il tradizionale algoritmo di moltipli-cazione righe-per-colonne ha complessità n3 in quanto richiede l’esecuzionedi n moltiplicazioni per il calcolo di ciascuno degli n2 elementi della matricerisultante.

Poiché la complessità di un algoritmo risulta importante e decisiva pervalori grandi della dimensione del problema, si danno le seguenti definizioni.

DEFINIZIONE 6. Date due funzioni f e g, reali a valori reali, si dice chela funzione f è O grande di g, e si scrive f è O�g� oppure f > O�g�, se esisteuna costante reale c A 0 ed un numero reale x0 tale che per x C x0 si abbiaf�x� B c g�x�.

Esempio 23. Con la notazione O grande una funzione della forma f�n� definitacome somma di più addendi risulta caratterizzata dall’addendo che per valorigrandi di n risulta prevalente, trascurando eventuali coefficienti moltiplicatividegli addendi. Ad esempio, la funzione f�n� � 3n5

� 72n3� 106 è O�n5�; la

funzione f�n� � 4n2�100n log2 n è O�n2�; la funzione f�n� � 2n

�n100 è O�2n�.

DEFINIZIONE 7. La complessità asintotica di un algoritmo o di unproblema è la complessità per valori grandi della dimensione del problema;viene denotata con la notazione O (o grande).

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 54: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

50 CAPITOLO 3. ALGORITMI

Il tecnicismo matematico della notazione O grande può essere evitato ac-contentandosi di una riformulazione più approssimativa; ad esempio la fraseL’algoritmo A ha una complessità asintotica O�f�n��. significa che per valorigrandi della dimensione n del problema il numero di passi elementari richiestidall’algoritmo è proporzionale a f�n�.

Spesso la precisazione dell’operazione dominante e della dimensione delproblema sono sottaciuti in quanto sono deducibili dalla formulazione del pro-blema stesso. Ad esempio, affermare che un algoritmo di ordinamento hacomplessità asintotica pari a O�n2� significa che l’algoritmo svolge un numerodi confronti proporzionale a n2 per ordinare una sequenza di n elementi.Esempio 24. La seguente tabella riporta una lista di problemi e le loro corri-spondenti complessità asintotica.

Problema Complessità asintotica del problemacalcolo del fattoriale di un numero O�n�ricerca in una sequenza O�n�ordinamento di una sequenza O�n logn)moltiplicazione fra due matrici non è notatorre di Hanoi O�2n�

Esempio 25. Analizziamo la complessità del seguente schema di algoritmo,dove n denota la dimensione del problema ed op l’operazione dominante.

1: repeat n2: repeat 2n3: op4: end repeat5: op6: end repeat7: repeat 3n8: op9: end repeat

La complessità è data dal numero di operazioni op che vengono eseguitedall’algoritmo ed è pari a

n�2n � 1� � 3n � 2n2� 4n

Di conseguenza la complessità asintotica è pari aO�n2�

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 55: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.9. COMPLESSITÀ DEI PROBLEMI 51

3.9 Complessità dei problemiBasandosi sul concetto di complessità di un algoritmo si definisce la comples-sità di un problema, come segue.

DEFINIZIONE 8. La complessità di un problema è la complessità delmiglior algoritmo che lo risolve.

Esempio 26. Il problema della torre di Hanoi per lo spostamento di una pila din dischi ha dimensione n. L’operazione dominante è data dallo spostamentodi 1 disco da un piolo ad un altro. Il miglior algoritmo che risolve il problemarichiede lo spostamento di 2n

�1 dischi. Pertanto la complessità del problema è2n� 1. L’affermazione: "Il problema della Torre di Hanoi ha una complessità

computazionale asintotica pari a O�2n�. significa che per spostare n dischida un piolo ad un altro, per n grande, si esegue un numero di spostamentiproporzionale a 2n.Esempio 27. Il problema dell’ordinamento di una sequenza di dimensione n hacomplessità pari a n log2 n, in quanto esistono algoritmi di ordinamento chehanno una tale complessità, ossia che richiedono n log2 n confronti per ordinareuna sequenza di n elementi; d’altra parte si può dimostrare che, in generale,non si può ordinare una sequenza con meno di n log2 n confronti.Esempio 28. Il problema della moltiplicazione di due matrici quadrate di ordi-ne n ha una complessità non nota. Il tradizionale algoritmo di moltiplicazionerighe-per-colonne ha una complessità asintotica pari a n3; il migliore algoritmoconosciuto ha una complessità asintotica pari a n2,78 ma attualmente non siconosce una limitazione inferiore per la complessità asintotica degli algoritmidi moltiplicazione di matrici.

3.10 Problemi facili e difficiliUn problema viene classificato come facile o difficile non in base alla difficoltàche incontra l’esecutore per escogitare una soluzione, bensì in base alla com-plessità del problema, ossia in base alla complessità del miglior algoritmo chelo risolve. Nel contesto della complessità computazionale i problemi facilivengono detti trattabili mentre i problemi difficili vengono detti intrattabili.I risultati dei problemi trattabili si ottengono in tempi ragionevoli mentre iproblemi intrattabili superano la potenza di calcolo di ogni calcolatore esi-stente e futuro. La linea di demarcazione fra problemi trattabili e problemiintrattabili dipende dalla tipologia della funzione di complessità: i problemitrattabili sono caratterizzati da funzioni di complessità polinomiali, mentre i

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 56: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

52 CAPITOLO 3. ALGORITMI

problemi intrattabili hanno funzioni di complessità di categoria esponenziale.La figura 3.3 dispone in linea di complessità crescenti un insieme di funzioniche si incontrano spesso nell’analisi degli algoritmi e definisce una linea di se-parazione fra problemi trattabili ed intrattabili. Esistono problemi per i qualinon è attualmente noto a quale di queste due categorie appartengono.

complessità polinomiali complessità esponenziali

lognºn n n logn n2 n3 n10 2n n! nn

Figura 3.3: Complessità polinomiali ed esponenziali di alcune funzioni che siincontrano frequentemente nell’analisi degli algoritmi.

Nella tabella 3.3 è riportato il tempo in secondi che impiega un calcola-tore che esegue 1 milione di operazioni al secondo a risolvere un problema didimensione n. L’analisi dei dati riportati nella tabella motiva che è coerentedesignare come polinomiali i problemi trattabili e come esponenziali i problemiintrattabili.

f�n� n � 10 n � 20 n � 30 n � 40 50 n � 100log2 n 3.3 µs 4.3 µs 4.9 µs 5.3 µs 5.6 µs 6.6 µsº

n 3.1 µs 4.5 µs 5.5 µs 6.3 µs 7.0 µs 10 µsn 10 µs 20 µs 30 µs 40 µs 50 µs 100 µs

n log2 n 33 µs 86 µs 147 µs 213 µs 282 µs 664 µsn2 100 µs 400 µs 900 µs 1600 µs 2500 µs 10000 µsn3 1 ms 8 ms 27 ms 64 ms 125 ms 1 sec2n 1 ms 1 sec 17 min 12 g 35 a 4 � 1016 an! 3.6 sec 8 � 104 a 8 � 1018 a 3 � 1034 a 9 � 1050 a 3 � 10154 ann 2.8 h 3 � 1012 a 6 � 1035 a 4 � 1050 a 3 � 1071 a 3 � 10186 a

Tabella 3.3: Tempi delle funzioni di complessità di alcune funzioni. Le unitàdi misura dei tempi sono: µs � microsecondi, ms � millisecondi, sec � secondi,min � minuti, g � giorni, a � anni.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 57: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.10. PROBLEMI FACILI E DIFFICILI 53

Nella tabella 3.4 è riportata la dimensione del problema risolvibile in unadata quantità di tempo, sempre nell’ipotesi di disporre di un calcolatore cheesegue 1 milione di operazioni al secondo. Un’analisi, anche superficiale, diquesta tabella evidenzia che l’evoluzione tecnologica dei calcolatori non potràintaccare il carattere di intrattabilità dei problemi.

f�n� 1 sec 1 min 1 ora 1 giorno 1 mese 1 anno 1 secolo

log2 n 10400000 10107 10109 101010 101012 101013 101015

ºn 1012 4 � 1015 1019 7 � 1021 7 � 1024 1027 1031

n 106 6 � 107 4 � 109 9 � 1010 3 � 1012 3 � 1013 3 � 1015

n log2 n 9 � 104 106 2 � 108 4 � 109 1011 1012 1014

n2 103 8 � 103 6 � 104 3 � 105 2 � 106 6 � 106 6 � 107

n3 100 392 1533 4414 13715 31551 1464522n 20 26 32 36 41 45 51n! 10 11 13 14 15 16 18nn 7 8 9 10 11 12 13

Tabella 3.4: Dimensioni dei problemi risolvibili in una data quantità di tempoin funzione della complessità f�n� dei problemi.

La figura 3.4 descrive una classificazione dei problemi in funzione del lorocarattere di risolvibilità, evidenziando, all’interno dei problemi risolvibili, iproblemi trattabili e quelli intrattabili.

'

&

$

%

problemirisolvibili

����

problemitrattabili

����

problemiintrattabili

probleminon risolvibili

Figura 3.4: Una classificazione dei problemi in funzione del loro carattere dirisolvibilità.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 58: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

54 CAPITOLO 3. ALGORITMI

3.11 Problemi intrattabiliIl più potente calcolatore che si possa immaginare di costruire non potrà esserepiù grande dell’universo, non potrà essere fatto di componenti di elaborazio-ne più piccoli dei protoni, non potrà trasmettere le informazioni fra le suecomponenti ad una velocità superiore alla velocità della luce. Un semplicecalcolo porta alla conclusione che un tale ipotetico calcolatore non potrebbeessere composto da più di 10126 componenti. Anche ammettendo che le in-formazioni di questo calcolatore venissero trasmesse fra le sue componenti aduna velocità uguale a quella della luce, esistono numerosi problemi di grandeinteresse pratico che, anche per moderati valori della dimensione del proble-ma, tengono in scacco questo calcolatore estremo per decine di miliardi dianni, ossia per un tempo paragonabile a quello dell’età dell’universo. Esisto-no problemi che, pur risolvibili sul piano teorico in quanto si conoscono deglialgoritmi risolutivi, non sono effettivamente risolvibili in quanto richiedereb-bero tempi esagerati anche per il più potente calcolatore immaginabile; perquesto motivo vengono detti intrattabili.

L’esistenza di problemi intrattabili può sembrare, a prima vista, un aspettonegativo, un’evidenziazione di un limite della scienza e della tecnica. Sembraparadossale ma, invece, questi problemi costituiscono l’elemento fondante dialcune tecnologie: l’intrattabilità del problema della fattorizzazione in primidi un numero naturale è alla base di tutti i sistemi basati sulla crittografia;l’esplosione dell’albero delle mosse del gioco degli scacchi comporta l’intratta-bilità del problema di determinare una strategia vincente nella conduzione delgioco in una partita a scacchi a causa dell’intrattabilità del problema di un’ana-lisi esaustiva dell’albero delle mosse e questo, nonostante l’eccezionale velocitàe complessità dei calcolatori attuali, lascia margini di battaglia alla pari al-l’uomo che gioca a scacchi contro il computer, almeno ai grandi maestri degliscacchi; ed anche se un computer batte agevolmente anche un buon scacchista,le mosse brillanti, ingegnose, artistiche rimangono prerogativa dell’uomo.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 59: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.12. ESERCIZI 55

3.12 Esercizi1. Si ha un sacco pieno di chicchi di grano ed uno pieno di chicchi di fru-

mento. Il problema consiste nel decidere quale dei due sacchi contienepiù chicchi. Con riferimento a questo problema:

(a) Si precisi in cosa consistono i dati ed i risultati del problema.(b) Descrivere un algoritmo che richieda all’esecutore delle capacità il

più possibile elementari. Precisare le capacità minime richiesteall’esecutore dall’algoritmo che si è descritto. Suggerimento: nonserve che l’esecutore sappia contare.

2. Per i problemi che seguono si individuino i dati ed i risultati e si stabiliscase il problema è ben formulato o meno. Nel caso il problema sia benformulato, descrivere un algoritmo, evidenziando quali devono essere lecapacità dell’esecutore al quale è rivolto.

(a) Dato il perimetro e l’area di un triangolo, decidere se esso è untriangolo rettangolo.

(b) Data l’area ed il perimetro di un rettangolo, determinarne la dia-gonale.

(c) Dato il perimetro di un rettangolo, determinarne l’area.(d) Data l’area e la base di un rettangolo, determinarne l’altezza.(e) Data l’area ed il perimetro di un rettangolo, determinarne i lati.(f) Dati le lunghezze dei cateti di un triangolo rettangolo, determinarne

l’altezza relativa all’ipotenusa.

3. Dire, motivando le affermazioni, perchè il seguente problema non è benformulato: Determinare l’area di un quadrilatero note le misure a, b, c,d dei lati. Riformulare il problema in modo da renderlo ben formulato.Disponendo di un esecutore in grado di eseguire le usuali operazioniaritmetiche (�, �, �, ~, º, . . . ) descrivere un algoritmo per risolvere ilproblema in questione.

4. Si consideri la seguente istanza di problema:

Suddividere un segmento di 10 cm in 2 parti di cui una sia i 3~7dell’altra. Si supponga di disporre degli usuali attrezzi da dise-gno: due squadrette a 45o e 30o, 60o, una matita, un compasso,con l’ipotesi che le squadrette siano sufficientemente lunghe manon siano graduate.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 60: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

56 CAPITOLO 3. ALGORITMI

(a) Generalizzare il problema proposto.(b) Descrivere un procedimento, da riportare su un testo scolastico di

disegno tecnico, per risolvere la classe di problemi che si è indivi-duata.

(c) Motivare perchè nella formulazione del quesito precedente si è sen-tita l’esigenza di precisare “da riportare su un testo scolastico didisegno tecnico”?

5. Supponendo di disporre di un esecutore capace di applicare il teorema diPitagora, descrivere un procedimento risolutivo per determinare la dia-gonale di un parallelepipedo rettangolo di cui si conoscono le lunghezzedegli spigoli.

6. Definire in modo preciso e non ambiguo le operazioni lecite nelle costru-zioni con riga e compasso. Con le operazioni definite, determinare unsegmento avente per misura la radice quadrata della misura di un datosegmento.

7. Si è in un deserto e si dispone di una corda lunga 47 metri e delle forbici.Costruire un recinto di forma quadrata.

8. Siano A1 ed A2 due algoritmi funzionalmente equivalenti aventi rispetti-vamente complessità f1�n� � n logn e f2 � n

º2. Stabilire quale dei due

algoritmi è preferibile, per n sufficientemente grande.

9. Determinare per quale valore n0 (punto di taglio) della dimensione ndel problema un algoritmo A1 di complessità polinomiale f1�n� � n10

risulta preferibile rispetto ad un equivalente algoritmo A2 di complessitàesponenziale f2�n� � �1.1�n. Fare delle considerazioni in merito allaconclusione.

10. Ordinare le seguenti funzioni di complessità:ºn logn10 n! n logn nn 10n 10n logn n10 10100 log2 n

11. Valutare la complessità e la complessità asintotica delle seguenti porzionidi algoritmi, essendo op l’operazione dominante ed n la dimensione delproblema.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 61: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

3.12. ESERCIZI 57

1: repeat n2

2: repeat 2n3: op4: end repeat5: op6: end repeat7: repeat n8: op9: end repeat

1: for i from 1 to n do2: for j from i to n do3: op4: end for5: op6: end for

1: k � n2: while k A 0 do3: for i from 1 to n do4: op5: end for6: k � k~27: end while

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 62: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

58 CAPITOLO 3. ALGORITMI

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 63: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

Capitolo 4

Linguaggi

Il linguaggio ci permette di trattare i nostripensieri più o meno come se fossero cosequalsiasi.M. Minsky, La società della mente

Per utilizzare una macchina programmabile è necessario tradurre l’algorit-mo ed i dati dallo spazio dei problemi del solutore allo spazio delle soluzionidove opera la macchina. Per comunicare alla macchina il programma daeseguire ed i dati da elaborare serve un linguaggio.

59

Page 64: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

60 CAPITOLO 4. LINGUAGGI

4.1 Livello dei linguaggiUna tradizionale classificazione dei linguaggi di programmazione e dei linguag-gi utilizzati per descrivere un algoritmo, distingue i linguaggi di basso livellodai linguaggi di alto. I primi descrivono istruzioni molto elementari, diretta-mente eseguibili dalle macchine. I secondi, invece, sono linguaggi più aderentialle modalità di ragionamento dell’uomo e richiedono delle successive fasi ditraduzione per essere comprensibili dalle macchine.

L’elemento che più caratterizza un linguaggio di programmazione è datodalla forma delle direttive di controllo delle azioni, ossia dalle istruzioni chespecificano all’esecutore la sequenzialità delle azioni da eseguire. La deter-minazione del livello di un linguaggio (basso/alto) avviene proprio sulla basedelle direttive di controllo. I linguaggi che forniscono dei controlli a salti, ossiadella forma "continua l’esecuzione all’istruzione scritta al punto α" vengonogeneralmente detti linguaggi di basso livello; l’aggettivo basso deriva dal fattoche questi linguaggi, rivolti a degli esecutori rappresentati dai calcolatori, sonomolto aderenti alla modalità di esecuzione delle azioni da parte della macchina,e quindi, in definitiva, alla struttura fisica della macchina esecutrice.

Osservazione. Il concetto di livello di un linguaggio è relativo e non hasenso parlare in termini assoluti di alto livello e basso livello quanto piuttostoin termini relativi, quali livello x più alto/basso di ..., livello x adeguatoal problema y. Più che di una classificazione dicotomica, si tratta di unagradazione fine fra due poli estremi: da un lato le modalità operative dellamacchina e dall’altro le modalità di ragionamento dell’uomo. In altri terminiil livello di un linguaggio specifica il grado di distanza del linguaggio dal mododi operare dell’esecutore. Per inciso osserviamo che il livello più basso dilinguaggio è rappresentato dal linguaggio dell’esecutore che si dispone e che illivello più alto nella soluzione di un dato problema P può essere consideratoquello costituito da frasi della forma Risolvi il problema P.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 65: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

4.2. LINGUAGGI DI BASSO LIVELLO 61

4.2 Linguaggi di basso livelloLe notazioni dei linguaggi nelle forme di basso livello riflettono le modalità fisi-che di esecuzione degli attuali elaboratori; queste forme si basano sul seguenteinsieme minimale e completo di controlli:

• goto α (salto incondizionato)

• if C goto α (salto condizionato)

dove α è un indicatore di posizione che individua un’istruzione (esecutiva o dicontrollo) di un algoritmo, e C è una condizione booleana.

In notazione grafica i due controlli di salto goto e if-goto vengono indicaticon le notazioni riportate nella figura 4.1.

����α-

goto α

?

��

@@

@@

��C -����V

F

α

?

if C goto α

Figura 4.1: Controlli di basso livello.

Gli esempi di seguito riportati illustrano i controlli delle azioni nelle formedi basso livello precedentemente descritte. In questi esempi le etichette deisalti incondizionati e condizionati sono sostituite dai numeri identificativi diciascuna linea dell’algoritmo.Esempio 29. Consideriamo il seguente problema:

Determinare la distanza fra due numeri a e b.

Ammettendo che il campo di appartenenza dei numeri coinvolti nell’algoritmosia costituito dai numeri interi e supponendo che l’esecutore sia in grado dieseguire solamente le seguenti azioni elementari:

• applicare le quattro operazioni aritmetiche

• confrontare due numeri

un effettivo procedimento risolutivo può essere formulato come riportato nel-l’algoritmo 8.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 66: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

62 CAPITOLO 4. LINGUAGGI

Algoritmo 8 - Distanza fra due numeri interiInput: numeri interi a e bOutput: distanza fra a e b

1: d� a � b2: if d C 0 goto 43: d� �d4: return d

Vincolando ad usare solamente numeri naturali, il che equivale a supporreche l’esecutore conosca e sappia manipolare solo i numeri naturali, la sequenzadi istruzioni precedenti non rappresenta più un algoritmo corretto in quantorisulta uguale a 0 l’esito dell’operazione a� b, ed in ogni caso non avrebbe piùsenso l’operazione unaria �d. Poiché il risultato che si cerca (d) è un numeronaturale, è plausibile pensare che esista un algoritmo risolutivo per il qualesia sufficiente un ambiente di variabilità degli oggetti non più ampio dellospazio delle soluzioni. Questa supposizione è confermata dall’algoritmo 9 chedetermina la distanza fra due generici numeri naturali a e b, con la condizioneche l’esecutore sia in grado di manipolare soltanto numeri naturali.

Algoritmo 9 - Distanza fra due numeri naturaliInput: numeri naturali a e bOutput: distanza fra a e b

1: if a C b goto 42: d� b � a3: goto 54: d� a � b5: return d

La situazione appena presentata richiama, pur nella sua banalità, gli sforzidegli algebristi italiani del Cinquecento che cercavano dei procedimenti risolu-tivi per determinare le radici reali delle equazioni polinomiali di terzo e quartogrado, evitando di passare ed operare nel campo (allora minato, perchè pococonosciuto) dei numeri complessi.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 67: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

4.2. LINGUAGGI DI BASSO LIVELLO 63

Esempio 30. L’algoritmo del contadino russo per il calcolo del prodotto fradue numeri naturali m ed n, descritto nella tabella 3.2, può essere espresso, inuna forma di basso livello come descritto nell’algoritmo 10.

Algoritmo 10 - Algoritmo del contadino russoInput: numeri naturali m e nOutput: prodotto fra m ed n

1: inizializza p a 02: if m � 0 goto 83: if m è pari goto 54: incrementa p di n5: dimezza m6: raddoppia n7: goto 28: return p

Introducendo il concetto di assegnazione nella forma α � β, che denota"assegna ad α il valore ottenuto da β", l’algoritmo 10 può essere raffinatocome riportato nell’algoritmo 11.

Algoritmo 11 - Algoritmo del contadino russoInput: numeri naturali m e nOutput: prodotto fra m ed n

1: p� 02: if m � 0 goto 113: q �m~24: p�m � 25: r �m � p6: if r � 0 goto 87: p� p � n8: m�m~29: n� n � 2

10: goto 211: return p

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 68: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

64 CAPITOLO 4. LINGUAGGI

4.3 Linguaggi di alto livelloDal precedente esempio 30 si evidenzia che, avendo a disposizione controllidelle azioni descritti mediante dei salti, lo sviluppo di algoritmi si presentaabbastanza difficoltoso in quanto ci obbliga, in veste di solutori, ad uno sfor-zo di traduzione dell’idea originale di soluzione per esprimerla nel linguaggioimposto, il quale risulta alquanto innaturale per l’uomo. La descrizione de-gli algoritmi mediante questi linguaggi è adeguata solo per piccoli algoritmi emal si presta allo sviluppo di algoritmi complessi. Il supporto della metodo-logia top-down (soluzione dei sottoproblemi incrementa, dimezza, raddoppia)ci aiuta solo parzialmente. Finché i problemi sono piccoli tale metodo puòessere applicato con successo, mentre, quando i problemi sono più complessie richiedono, quindi, degli algoritmi più complessi, si sente maggiormente lanecessità di poter usare un linguaggio più evoluto e più aderente al modo dipensare dell’uomo.

Le forme algoritmiche di basso livello, caratterizzate da istruzioni di salto,possono essere espresse, equivalentemente, in forme di alto livello con strutturedi controllo più vicine al nostro modo di pensare. L’algoritmo 12 è la tra-duzione in una forma di alto livello dell’algoritmo 11. Questi due algoritmi,pur espressi con notazioni di diverso livello, descrivono le stesse operazioni.Dal loro confronto si evidenzia che la notazione strutturata di alto livello ri-sulta molto più comprensibile, nella sua logica, rispetto alla corrispondentenotazione a basso livello.

Algoritmo 12 - Algoritmo del contadino russo (notazione di alto livello)Input: numeri naturali m e nOutput: prodotto fra m e n

1: inizializza p a 02: while m x 0 do3: if m è dispari then4: incrementa p di n5: end if6: dimezza m7: raddoppia n8: end while9: return p

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 69: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

4.4. NOTAZIONI GRAFICHE 65

4.4 Notazioni graficheConsideriamo ora una tipica situazione costituita da una sequenza di espressio-ni, ossia da un insieme di espressioni descritte sequenzialmente. Per descriverei potenziali flussi esecutivi possiamo unire le espressioni con delle linee, comeevidenziato nella figura 4.2.

?αn?

��QQQQ��c1

?

e1

?��QQQQ��c2

?

e2

-

n

n

?

?

-

βne3

γn

δne4?

?

α �

if c1 goto δ

e1

if c2 goto β

e2

goto γ

β �

e3

γ �

goto α

δ �

e4

Figura 4.2: Notazione grafica di un algoritmo e sua corrispondente notazionetestuale.

Dal grafico riportato nella figura 4.2 si può notare che le linee di suppor-to dei potenziali flussi esecutivi sono connesse fra loro mediante le quattrotopologie di nodi descritti nella figura 4.3.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 70: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

66 CAPITOLO 4. LINGUAGGI

E nodo esecutivo (comando)

����α nodo collettore (etichetta)

���� nodo deviatore (salto incondizionato)

��QQQQ��C nodo selettore (salto condizionato)

Figura 4.3: Le varie tipologie di nodi dei controlli.

Con riferimento all’algoritmo descritto nella figura 4.2, si può notare chel’indicazione dei punti di salto α e β non risulta più necessaria, essendo diret-tamente derivabile dalla struttura grafica bidimensionale del diagramma. Inforza di questa osservazione semplificativa, il linguaggio a salti, oltre alla no-tazione lineare fin qui adottata, può essere descritto mediante un formalismografico bidimensionale, detto linguaggio dei diagrammi a blocchi o flowcharts, icui elementi di base sono costituiti dai simboli grafici riportati nella figura 4.4.

?

E

?

nodo esecutivo

?

���

HHH

HHH

���

? ?

V FC

nodo selettore

@@@R

���

?

nodo collettore

Figura 4.4: Le diverse tipologie dei nodi dei diagrammi a blocchi.

Il significato dei simboli sopra descritti è il seguente:

• nodo esecutivo : elabora l’espressione E

• nodo selettore : se la condizione C è falsa continua sul ramo V altrimentisul ramo F

• nodo collettore : continua al punto indicato

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 71: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

4.4. NOTAZIONI GRAFICHE 67

Le frasi del linguaggio dei diagrammi a blocchi vengono costruite con-nettendo i vari nodi sopra descritti mediante delle linee. Viene adottata laconvenzione che un nodo elaborativo sul quale non confluisca alcun ramo è ilprimo da essere elaborato (punto di entrata) mentre un nodo elaborativo dalquale non si diparta alcun ramo segnala la fine delle elaborazioni (punto diuscita). Per rendere deterministicamente elaborabili le espressioni descritte,si impone che ogni diagramma a blocchi abbia un solo punto d’entrata. Inol-tre, poiché, come si vedrà nel seguito, risulterà necessario concatenare fra lorosequenzialmente più diagrammi a blocchi, si impone la condizione che ognidiagramma a blocchi abbia un solo punto d’uscita. Un diagramma che godedi queste due proprietà dicesi proprio.

La regola che segue permette di identificare univocamente le frasi corret-te del linguaggio dei diagrammi a blocchi (più avanti saranno limitate, con-siderandone solo un sottoinsieme ben formato, costituito dai controlli dellaprogrammazione strutturata). Viene fornita una definizione costruttiva, nondicendo quali sono le frasi corrette ma dicendo come si costruiscono le frasicorrette mediante il formalismo dei diagrammi a blocchi.

REGOLA di costruzione dei diagrammi a blocchi. Le frasi corrette siottengono unendo fra loro, mediante delle linee, dei nodi (elaborativi, selettori,collettori), in modo da ottenere un diagramma proprio (avente un unico puntodi entrata ed un unico punto di uscita) connesso (costituito di un unico pezzo).

Osserviamo che un diagramma a blocchi viene rappresentato mediante ungrafo connesso in cui i nodi elaborativi hanno il significato di espressione (daelaborare), mentre i nodi alternativi hanno il significato di controllo.Esempio 31. L’algoritmo del contadino russo (algoritmo 10) può essere de-scritto mediante il diagramma a blocchi riportato nella figura 4.5.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 72: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

68 CAPITOLO 4. LINGUAGGI

risultato: p

raddoppia n

dimezza m

incrementa p di n

m pari?

m � 0?

inizializza p a 0

Dati: m,n

����

HHHH

HHHH

����

����

HHHH

HHH

H

����

?

?

?

?

?

?

?

-

vero

falso

vero

falso

Figura 4.5: Diagramma a blocchi dell’algoritmo del contadino russo.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 73: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

4.5. NOTAZIONI TESTUALI 69

4.5 Notazioni testualiPer facilitare la scrittura ed in linea con lo svilupo storico dei linguaggi di pro-grammazione, gli algoritmi ed i programmi vengono spesso scritti in modalitàtestuale.Esempio 32. La porzione di programma che segue descrive una funzione in lin-guaggio Python che calcola il prodotto di due numeri naturalim ed nmediantel’algoritmo del contadino russo.

def russo(m,n):p = 0while m != 0:

if m%2 == 1:p += n

m //= 2n *= 2

return p

4.6 Notazioni visualiNegli ultimi anni stanno sempre più prendendo piede degli ambienti di pro-grammazione visuale (fra questi, Scratch e Snap!). Questi linguaggi hannoil pregio, specialmente per chi inizia a programmare, di suggerire la scritturadei programmi, favorendo un approccio intuitivo e semplificato alla program-mazione.Esempio 33. La figura che segue descrive un blocco in linguaggio Snap! checalcola il prodotto di due numeri naturali m ed n mediante l’algoritmo delcontadino russo.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 74: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

70 CAPITOLO 4. LINGUAGGI

4.7 EserciziUsando le forme di controllo di basso livello (salti condizionati ed incondizio-nati), risolvere i seguenti esercizi.

1. Dati due numeri, determinarne il massimo.

2. Dati tre numeri, determinare il massimo. Suggerimento: utilizzare lasoluzione dell’esercizio precedente.

3. Dati tre numeri, determinare la somma dei due numeri più piccoli.Suggerimento: utilizzare la soluzione dell’esercizio precedente.

4. Dati tre numeri, determinare se essi possono costituire le lunghezze deilati di un triangolo. Suggerimento: utilizzare le soluzioni degli eserciziprecedenti.

5. Ordinare due numeri.

6. Ordinare tre numeri.

7. Date le misure dei lati di due rettangoli, stabilire se essi sono simili.

8. Dati quattro numeri, determinare se essi possono costituire i membri diuna proporzione.

9. Date le misure dei lati di due rettangoli, stabilire se uno dei due puòricoprire completamente l’altro.

10. Fra i seguenti problemi uno non è risolvibile con i mezzi finora visti.Individuare qual è. Risolvere gli altri. Acquisire in input ciclicamen-te dei numeri, terminando la lettura quando viene letto il numero 0.Terminata la fase di lettura, dare in output le seguenti quantità:

(a) il massimo(b) il minimo ed il massimo(c) il numero e la somma dei numeri letti(d) la somma dei numeri pari(e) la media dei valori(f) i due valori più grandi(g) il valore più vicino alla media(h) decidere se la sequenza è ordinata decrescentemente

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 75: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

Capitolo 5

Controlli

La vecchietta, sull’autobus: “Ragazzino,sai dirmi quando devo scendere per andarea via Pasadena?”Il ragazzino: “Guarda proprio me, e scendidue fermate prima che scenda io”.D. Knuth,The Art of Computer Programming

L’elaborazione sequenziale delle espressioni è quella più naturale e viene in-trapresa dagli esecutori in assenza di altre direttive esplicite. Questa semplicestruttura sequenziale di elaborazione risulta però inadeguata per la descrizionedegli algoritmi in quanto comporta che l’elaborazione delle espressioni avven-ga solo in modo sequenziale, e che, quindi, ogni espressione specificata in unalgoritmo venga elaborata una sola volta. Per superare questi limiti e rendereil linguaggio per la descrizione degli algoritmi più potente servono dei controlliche consentano di ripetere alcune espressioni e di evitarne altre.

71

Page 76: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

72 CAPITOLO 5. CONTROLLI

5.1 Algoritmi e processiIn prima approssimazione, un algoritmo è la descrizione sulla carta delleespressioni da elaborare, mentre un processo consiste nell’elaborazione nel tem-po delle espressioni. Per comprendere la sostanziale differenza esistente fra ilconcetto di algoritmo e di processo basta riflettere sulla differenza che esistefra i due termini descrizione ed elaborazione: la prima attività si svolge nellospazio, la seconda nel tempo. In altri termini si può dire che un processo èuna particolare sequenza di elaborazione delle espressioni, compatibile con lastruttura dell’algoritmo. In termini figurati si può affermare che l’algoritmodescrive le possibili strade che connettono le espressioni, mentre un processoè il compimento di un particolare percorso lungo le strade tracciate dall’al-goritmo. I due grafici riportati nella figura 5.1 descrivono le linee del flussopotenziale dell’algoritmo e le linee del flusso esecutivo di un processo.

(a) (b)

� ��

� ��

� ��

� ��

� ��

?

?

?

?

?

?

--

� ��

� ��

� ��

� ��

� ��?

Figura 5.1: Comparazione fra algoritmo e processo: (a) linee del flussopotenziale dell’algoritmo; (b) linee del flusso esecutivo del processo.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 77: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

5.2. CONTROLLI 73

5.2 ControlliLa forma più elementare di algoritmo corrisponde al caso di espressioni de-scritte sequenzialmente (sulla carta) dal solutore ed elaborate sequenzialmente(nel tempo) dall’esecutore. Questa modalità di descrizione ed elaborazio-ne degli algoritmi è troppo povera e non consente la descrizione di algoritmiinteressanti che possano dar vita a processi complessi per i quali non esistauna corrispondenza biunivoca fra la sequenza delle espressioni descritte nel-l’algoritmo e la sequenza di elaborazione del processo. La possibilità di avereflussi esecutivi più articolati che non la semplice elaborazione sequenziale sifonda sull’uso combinato della possibilità di evitare, in base a delle condizio-ni, l’elaborazione di alcune espressioni e sulla possibilità di ripetere più voltel’elaborazione di alcune espressioni. A questo scopo vengono utilizzati deicontrolli, ossia delle particolari direttive che, opportunamente intercalate frale espressioni dell’algoritmo, specificano le possibili linee di percorrenza deiflussi elaborativi definendo molti (anche infiniti) potenziali percorsi; in fasedi elaborazione sarà intrapreso uno di questi percorsi e si darà vita ad unprocesso.

I potenziali flussi esecutivi di un algoritmo possono essere descritti me-diante pochi e ben fatti schemi, descrivibili graficamente come riportato nellafigura 5.2, dove lungo le linee ci possono essere delle espressioni da elaboraree dei controlli.

controllosequenziale

?

controllocondizionale

?

-

s

controllociclico

?

-

s

Figura 5.2: Schemi fondamentali dei controlli.

L’assunzione dell’ipotesi che, in assenza di altre indicazioni, implicitamentele espressioni vengano elaborate sequenzialmente, come sono descritte, com-porta che un salto abbia il significato fortemente diverso a seconda che sitratti di un salto in avanti o di un salto all’indietro. Nel primo caso l’effettoè di evitare delle espressioni mentre il secondo caso permette di ripetere delleespressioni.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 78: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

74 CAPITOLO 5. CONTROLLI

5.3 Limiti dei linguaggi a salti

Il linguaggio di basso livello, con controlli delle azioni mediante dei salti, comedescritto nel capitolo precedente, è molto semplice e molto potente. Qui conil termine semplice si intende che le regole che generano le frasi corrette (ossiala grammatica) sono poche e facilmente applicabili. Con il termine potente siindica il fatto che con tale linguaggio si può descrivere ogni cosa che sia fattibilemediante le potenzialità base dell’esecutore. Tale potenza rappresenta peròpiù un difetto che un pregio del linguaggio, in quanto è possibile costruiredei diagrammi a blocchi della forma riportata nella figura 5.3 per i quali èdifficilmente comprensibile la logica dei potenziali flussi di elaborazione; questoinconveniente emerge con più evidenza quando l’algoritmo è lungo e complesso.

��

@@

@@

��

��

@@

@@

��

��

@@

@@

��

-

?

?

?

?

-

6

?

Figura 5.3: Esempio di diagramma a blocchi non strutturato.

L’aspetto negativo dei diagrammi a blocchi non strutturati consiste nelfatto che essi risultano poco comprensibili e quindi difficilmente adattabili ecorreggibili; in gergo tecnico si afferma che tali programmi sono difficilmentemanutenibili. Per queste forme di programmazione primitiva è stato coniato iltermine dispregiativo di programmazione a spaghetti che ben rende il senso delcaotico sviluppo del flusso dell’elaborazione delle espressioni. Per escluderequesti casi, conviene limitare l’insieme delle frasi costruibili ad un piccolosottoinsieme di frasi ben fatte, che soddisfino a degli schemi più restrittivi.Con queste limitazioni si vedrà che, comunque, non si limiterà le possibilità diesprimere tutto ciò che è realizzabile da un generico esecutore ed esprimibile

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 79: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

5.4. LA PROGRAMMAZIONE STRUTTURATA 75

altrimenti in termini di un linguaggio di basso livello; è questo il risultatostabilito dal teorema di Böhm-Jacopini.

Una delle fasi più elementari dell’evoluzione dei linguaggi di programma-zione verso forme più evolute è consistita nell’individuazione di alcuni costruttifondamentali per il controllo delle azioni, sui quali si fonda la programmazio-ne strutturata. Questi controlli fondamentali sono disponibili in tutti i piùrecenti linguaggi di programmazione, detti linguaggi di alto livello, in con-trapposizione a quelli di basso livello, proprio per evidenziare la loro strutturapiù evoluta rispetto al modo di agire della macchina e più vicina al modo dipensare dell’uomo.

I linguaggi di programmazione attuali predispongono i controlli tipici dellaprogrammazione strutturata. Qualora fosse necessario o si volesse utilizza-re comunque i controlli di basso livello risulta comodo partire dall’algoritmoespresso in notazione strutturata e poi tradurlo in forme di basso livello. L’im-postazione corretta è dunque quella di esprimere l’algoritmo, in prima istanza,in una forma a noi più congeniale e più aderente al nostro modo di pensare, edi rinviare a fasi successive lo sviluppo dei dettagli e la traduzione verso formecomprensibili all’esecutore. La traduzione in una forma di basso livello risul-ta meccanica e non richiede alcuno sforzo supplementare che non sia quellodi traduzione di una forma sintattica di alto livello in una equivalente formasintattica di basso livello, indipendentemente dal significato delle frasi.

5.4 La programmazione strutturata

Nel 1968, in un battagliero articolo 1 considerato una sorta di manifesto dellaprogrammazione strutturata, Dijkstra, uno dei pionieri della programmazione,denunciava i pericoli a cui può portare l’uso indisciplinato delle istruzioni disalto, che può compromettere la comprensibilità di un programma da partedel suo stesso autore. Sulla spinta di queste critiche e sulla base del risultatopositivo stabilito dal teorema di Böhm-Jacopini, fin dalla fine degli anni ’60si sono sviluppate delle metodologie di programmazione strutturata, aventil’obiettivo di permettere solo un insieme organico di regole di programma-zione basate su dei controlli di alto livello. Al di là di un’astiosa e talvoltasterile polemica sull’uso dei goto, la programmazione strutturata risulta parti-colarmente efficace come strumento di sviluppo degli algoritmi, fondato sullametodologia di scomposizione dei problemi in sottoproblemi.

1E.W.Dijkstra, Go To Statement Considered Harmful, in Communication ACM, Vol.11,No.3, pp.147-148, 1968.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 80: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

76 CAPITOLO 5. CONTROLLI

Per ottenere dei diagrammi più strutturati è necessario limitare le possi-bilità di costruzione degli stessi, ossia limitare le possibilità della Regola dicostruzione dei diagrammi a blocchi. Tali limitazioni definiranno implicita-mente un altro linguaggio. Sarà adottata la seguente

REGOLA di costruzione dei diagrammi a blocchi strutturati.Un diagramma a blocchi è strutturato se è composto da un’espressione

elementare (assioma).Se E , E1, E2 sono diagrammi strutturati e C è una condizione, allora anche

i cstrutti descritti nella figura 5.4 sono diagrammi strutturati.

E2

E1

?

?

?

controllosequenziale

E

��

@@

@@

��C

?

?

?�

controllocondizionale

E

��

@@

@@

��C

?

?

?

-

controllociclico

Figura 5.4: Controlli fondamentali della programmazione strutturata.

In altri termini, un diagramma a blocchi è strutturato se è composto dauna singola istruzione oppure è composto unendo dei blocchi strutturati inuna delle tre forme strutturate descritte nella nella figura 5.4. La regoladi costruzione dei diagrammi a blocchi strutturati può essere espressa equi-valentemente affermando che espandendo dei blocchi strutturati mediante deicontrolli strutturati si ottengono dei diagrammi a blocchi strutturati.

Le tre forme base dei diagrammi a blocchi sopra descritte corrispondonoa delle strutture di alto livello per il controllo delle azioni, caratteristiche delmodo di ragionare degli uomini per l’organizzazione delle azioni. Degli esempicorrispondenti a queste forme sono i seguenti:

• Versa il caffè e poi aggiungi lo zucchero.

• Se il caffè è doppio allora aggiungi un altro cucchiaino di zucchero.

• Finché lo zucchero non è disciolto continua a mescolare.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 81: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

5.5. CONTROLLI GENERALIZZATI 77

5.5 Controlli generalizzatiI tre controlli fondamentali della programmazione strutturata descritti nel pa-ragrafo precedente vengono spesso usati in combinazione fra loro. Medianteopportune combinazioni degli stessi, dei formati di frase generalizzati, moltousati nella descrizione degli algoritmi. Tali controlli sono riportati nella figu-ra 5.5. Questi controlli sono strutturati in quanto sono (facilmente) esprimibilicome composizione dei controlli fondamentali. In base a questa osservazioneed alla regola di programmazione strutturata, questi controlli possono essereusati come componenti per la costruzione di algoritmi strutturati. Questeforme generalizzate sono così frequentemente utilizzate da essere consideratefondamentali, mentre le forme analoghe definite precedentemente, dalle qualiessi derivano, vengono considerate come dei casi particolari di queste formegeneralizzate.

E1

E2

En

?

?

?�

?

?

controllosequenzialemultiplo

E1 E2

��

@@

@@

��C

?

?

?

-

?

controlloalternativo

E

��

@@

@@

��C

?

?

?

-

controllociclico

postcondizionato

Figura 5.5: Controlli generalizzati della programmazione strutturata.

Osservazione. L’enfasi che le moderne metodologie di programmazionepongono sulla programmazione strutturata è dovuta al fatto che la scomposi-zione di un problema mediante la metodologia top-down e lo sviluppo medianteraffinamenti successivi (strutturati) porta automaticamente a dei programmistrutturati. Questa impostazione ha sminuito notevolmente l’importanza deidiagrammi a blocchi, i quali non vengono più usati come metodologia o sempli-cemente come strumento per lo sviluppo degli algoritmi, ma solo per descriverela semantica dei controlli fondamentali. Una diretta conseguenza del fatto chela scomposizione di un problema in modo strutturato porta a forme strutturateè che l’algoritmo risolutivo finale è anch’esso strutturato.

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 82: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

78 CAPITOLO 5. CONTROLLI

5.6 Notazioni testualiA seguire sono indicate le notazioni testuali dei controlli della programmazionestrutturata descritti nei paragrafi precedenti.

5.6.1 Controllo sequenziale

Il controllo per elaborare sequenzialmente delle espressioni E1, . . . ,En vieneespresso come descritto nell’algoritmo 13.

Algoritmo 13 - Controllo sequenziale1: espressione E12: . . .3: espressione En

Esempio 34. Movimento di un robot su un percorso quadrangolare, a partiredalla posizione corrente del robot:

Algoritmo 14 - Movimento di un robot su un percorso quadrangolare1: P � posizione corrente2: avanza di 10 passi3: ruota a sinistra di 110o

4: avanza di 25 passi5: ruota a sinistra di 45o

6: avanza di 12 passi7: vai al punto P

5.6.2 Controllo condizionale

Il controllo di elaborazione condizionale, che a parole si esprime nella forma Sela condizione C è vera elabora le espressioni E1 altrimenti elabora le espressioniE2. è descritto nell’algoritmo 15.

Algoritmo 15 - Controllo condizionale1: if condizione C then2: espressioni E13: else4: espressioni E25: end if

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 83: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

5.6. NOTAZIONI TESTUALI 79

Esempio 35. Esecuzione di un movimento elementare da parte di un robot:

Algoritmo 16 - Movimento elementare di un robot1: if c’è spazio davanti then2: avanza di 1 passo3: else4: ruota a sinistra di 45o

5: end if

5.6.3 Controllo ciclico

L’algoritmo 17 riporta la notazione testuale del controllo ciclico Finché lacondizione C è vera continua ad elaborare le espressioni E .

Algoritmo 17 - Controllo ciclico1: while condizione C do2: espressioni E1 . . .En

3: end while

Esempio 36. Raggiungimento dell’obiettivo da parte di un robot:

Algoritmo 18 - Controllo ciclico1: while non hai raggiunto l’obiettivo do2: avanza di 1 passo3: valuta la distanza dall’obiettivo4: aggiusta la direzione di avanzamento5: end while

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 84: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

80 CAPITOLO 5. CONTROLLI

Esempio 37. I controlli descritti sopra compaiono solitamente combinati as-sieme, come mostra l’algoritmo 19.

Algoritmo 19 - Percorso di un robot1: inizializza il robot2: while non hai raggiunto l’obiettivo do3: if c’è spazio davanti then4: memorizza la posizione5: avanza di poco6: memorizza la nuova posizione7: else8: ruota a destra di poco9: end if

10: aggiusta la direzione di avanzamento11: end while

5.7 Altri controlli

Oltre ai controlli (fondamentali e derivati) precedentemente descritti, moltilinguaggi di programmazione prevedono degli ulteriori controlli. Anche sequesti possono essere espressi in termini dei controlli fondamentali, la ricchez-za dei controlli utilizzabili, pur non aumentando la potenza espressiva di unlinguaggio, permette di migliorare la compattezza e leggibilità dei programmi.

Oltre al controllo ciclico while, in molti linguaggi di programmazione vienepredisposto il controllo ciclico repeat che, pur essendo potenzialmente equiva-lente al controllo while, viene solitamente utilizzato, per semplicità, nei casiin cui il numero di iterazioni sia noto a priori; nel caso in cui le espressioniE debbano essere elaborate un prefissato numero k di volte, si può usare laforma di controllo descritta nell’algoritmo 20.

Algoritmo 20 - Controllo ciclico ripetitivo1: repeat k times2: espressioni E3: end repeat

Un’altra forma, più generale, di ciclo predeterminato è il ciclo for cherisulta comodo qualora serva sapere internamente al ciclo il numero dell’ite-razione corrente. In molti linguaggi, il ciclo for viene solitamente espresso

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 85: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

5.8. IL TEOREMA DI BÖHM-JACOPINI 81

come descritto nell’algoritmo 21, essendo e1 ed e2 due espressioni intere ed iuna variabile che assume consecutivamente i valori interi da e1 a e2.

Algoritmo 21 - Controllo ciclico iterativo1: for i from e1 to e2 do2: espressioni E3: end for

L’algoritmo 21 può essere generalizzato con l’algoritmo 22, dove �e1, . . . , ek�è un generico insieme di espressioni. In questi due algoritmi, generalmente,le espressioni E contengono la variabile i.

Algoritmo 22 - Controllo ciclico enumerativo1: for i in �e1, . . . , ek� do2: espressioni E3: end for

5.8 Il teorema di Böhm-JacopiniUna prima questione sulla programmazione strutturata riguarda l’eseguibi-lità dei tre controlli fondamentali, supponendo di disporre di un esecutorecapace di eseguire gli algoritmi descritti con il linguaggio a salti di basso livel-lo. Per dimostrare tale eseguibilità è sufficiente dimostrare che i tre controllifondamentali sono esprimibili in termini del linguaggio di basso livello. Ladimostrazione discende dalle seguenti considerazioni. Il controllo sequenzialeè direttamente traducibile in quanto il flusso dell’esecuzione di un algoritmodescritto mediante il linguaggio elementare è proprio quello sequenziale. Ilcontrollo condizionale if C then E1 else E2 endif può essere tradotto con

Algoritmo 23 - Traduzione a basso livello del controllo if-then-else1: if C goto 42: E13: goto 54: E25: . . .

L. Calvi - Pensiero Computazionale - Feltre - 2018

Page 86: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

82 CAPITOLO 5. CONTROLLI

Il controllo ciclico while C do E endwhile può essere tradotto con

Algoritmo 24 - Traduzione a basso livello del controllo while-do1: if C goto 42: espressioni E3: goto 14: . . .

La seconda questione che si pone riguarda il seguente quesito: I controllidella programmazione strutturata sono sufficienti ad esprimere qualsiasi cosache sia esprimibile in termini di un linguaggio ”a salti”) ? La risposta (affer-mativa) a questo quesito venne data (e dimostrata) nel 1966 da due ricercatoriitaliani. Tale risultato è noto con il nome di

TEOREMA 1 (di Böhm-Jacopini). Per ogni programma non strutturato(espresso mediante i controlli a salti) si può costruire un equivalente pro-gramma strutturato (espresso mediante i soli controlli della programmazionestrutturata). 2

Il teorema di Böhm-Jacopini ha un significato molto profondo in quantoafferma che ogni algoritmo, espresso organizzando in un qualche modo delleazioni elementari di base, può essere riformulato equivalentemente medianteun algoritmo che contenga le azioni elementari di base organizzate tra loro me-diante i soli tre controlli fondamentali previsti dal teorema. Questo risultatoespresso dal teorema di Böhm-Jacopini si traduce nella possibilità di mini-mizzare un linguaggio algoritmico, senza limitarne la potenza espressiva. Ilteorema costituisce, dunque, una legittimazione teorica alla programmazionestrutturata ma non evidenzia perché siano preferibili i programmi struttura-ti rispetto a quelli non strutturati. Le motivazioni, che saranno ancora piùevidenti quando sarà riconsiderata la metodologia top-down per lo sviluppodegli algoritmi, risiedono nel fatto che i tre controlli strutturati ricalcano ilprocesso generativo dello sviluppo degli algoritmi. Notiamo che dal puntodi vista teorico ci si potrebbe accontentare della forma debole del teorema,ossia della formulazione in cui al posto di “è possibile costruire” si sostituiscala locuzione “esiste”. Anche questo risultato sarebbe sufficiente a legittimarel’uso dei soli tre controlli fondamentali; ma la dimostrazione del teorema è ditipo costruttivo e fornisce anche la descrizione del metodo di traduzione.

2Per una dimostrazione del teorema si veda: C.Böhm-G.Jacopini, Flow Diagrams, TuringMachines and Languages with only two Formation Rules, in Communication ACM, No.9,1966.

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 87: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

5.9. ESERCIZI 83

5.9 Esercizi1. Esprimere in notazione algoritmica, utilizzando i controlli della program-

mazione strutturata, la seguente porzione di ricetta: Dopo aver preparatol’impasto ed averlo messo in una casseruola, cuocere per 30 minuti me-scolando per un minuto ogni 5 minuti, aggiungendo un cucchiaio d’acquaall’occorrenza.

2. Risolvere gli esercizi del capitolo precedente usando i controlli dellaprogrammazione strutturata.

3. Tradurre le seguenti porzioni di algoritmo mediante i controlli dellaprogrammazione strutturata:

(a) 1: if C goto 42: E3: goto 14: . . .

(b) 1: if C1 goto 42: E3: if C2 goto 24: . . .

(c) 1: if C1 goto 42: E3: if C2 goto 14: . . .

(d) 1: if C1 goto 32: E3: if C2 goto 2

(e) 1: E12: if C1 goto 13: if C2 goto 64: E25: goto 16: . . .

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 88: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

84 CAPITOLO 5. CONTROLLI

(f) 1: E12: if C1 goto 53: if C2 goto 64: E25: goto 16: . . .

4. Tradurre il seguente schema di controllo in notazione di basso livel-lo:

1: while C1 do2: if C2 then3: E14: endif5: E26: endwhile

5. Tradurre i seguenti schemi di controllo condizionali, usando i controllidi basso livello ed i controlli fondamentali della programmazione strut-turata, senza ricorrere all’uso di operatori logici:

(a) 1: if C1 - C2 then2: E13: else4: E25: end if

(b) 1: if C1 , C2 then2: E13: else4: E25: end if

(c) 1: if C1 , �C2 - C3� then2: E13: else4: E25: end if

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 89: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

5.9. ESERCIZI 85

6. Tradurre i seguenti schemi di controllo usando solo i controlli fondamen-tali della programmazione strutturata (k, k1 e k2 sono delle genericheespressioni intere ed E un generico blocco di istruzioni):

(a) 1: repeat k times2: E

3: end repeat

(b) 1: for i from k1 to k2 do2: E

3: end for

7. Tradurre i seguenti schemi di controllo ciclici in notazione di bassolivello ed usando solo i controlli fondamentali della programmazionestrutturata:

(a) 1: ciclo2: E13: se C allora esci fine se4: E25: fine ciclo

(b) 1: ciclo2: E13: se C1 allora esci fine se4: E25: se C2 allora esci fine se6: fine ciclo

(c) 1: per sempre2: E

3: fine per sempre

8. Usando solo i controlli fondamentali della programmazione struttura-ta, scrivere una porzione di algoritmo in grado di generare i seguentiprocessi:

P1 � � � (processo nullo)P2 � �E1�P3 � �E1,E2,E1,E1,E2�P4 � �E1,E1,E1,E1�

L.Calvi - Pensiero Computazionale - Feltre - 2018

Page 90: Pensiero Computazionalelnx.istitutosuperiorefeltre.it › wp › wp-content › ...Sentiamo in noi l’eterno richiamo: ecco il problema,cercanelasoluzione. D.Hilbert Il matematico

86 CAPITOLO 5. CONTROLLI

P5 � �E1,E3,E1,E2,E1,E2,E1,E3,E2�9. Scrivere il controllo ripeti k volte E fineripeti usando

(a) i controlli di basso livello(b) i controlli fondamentali della programmazione strutturata

(k denota una generica espressione intera ed E un generico blocco diistruzioni).

10. Descrivere in notazione di basso ed alto livello un algoritmo per calcolarela somma dei numeri naturali compresi fra due dati numeri naturali.

L. Calvi - Pensiero Computazionale - Feltre - 2018