Corso di Informatica
per Giurisprudenza
Matteo Cristani
Dipartimento di Informatica
Facoltà di Scienze MM. FF. NN.
Università degli Studi di Verona
http://www.sci.univr.it/~cristani
1
Agenda

Concetto di algoritmo:

Algoritmi e programmi



Macchina a stati
Linguaggi e calcolabilità
Linguaggi di Programmazione




Semantica operazionale
Funzioni e denotazione
Equivalenza funzionale e computazionale
Codifica dei dati


Tipi elementari
Strutture di dato
2
Macchina a stati (1)
Formalizzazione del concetto di calcolo
 Operazioni base di una macchina a stati:

 Lettura
dell’input
 Scrittura dell’output
 Transizione di stato
 Memorizzazione dati
3
Macchina a stati (2)

Calcolo:
 Stato
iniziale
 Sequenza di caratteri di input
 Sequenza di stati ed azioni di trasformazione
dell’input
 Sequenza di scritture dell’output
 Stati finali
4
Rappresentazione a grafo
Read x
Write g(x) on the memory
Write f(x) on the output
5
Esempio di macchina a stati (1)

Un apparecchio telefonico può essere riguardato
come una macchina a stati




Stato iniziale: segnale assente
Stati intermedi: segn. di linea
segn. di libero
segn. di occupato
segn. di assenza
di linea
Stato finale:
conversazione
conclusa
(s0)
(s1)
(s2)
(s3)
(s4)
(s5)
Linguaggio riconosciuto: Attivazione di una
conversazione telefonica
6
Esempio di macchina a stati (2)

Modello di funzionamento
 Stato
iniziale:
 Sequenza:
segnale assente
Accesso
 Se linea Componi
 Se libero Conversazione
se occupato Concludi

(a);
(c);
(p) altrimenti
(e)
7
Esempio di macchina a stati (3)
p
c
s2
e
a
s5
s1
c
s3
e
s0
a
s4
e
8
Il concetto di linguaggio (1)

Alfabeto
 Un
insieme finito e non vuoto i cui elementi
sono detti SIMBOLI

Stringa
 Una
sequenza di lunghezza qualsiasi di simboli
di un alfabeto

Stringa vuota
 La
sequenza di lunghezza zero su un qualsiasi
alfabeto (è denotata con )
9
Il concetto di linguaggio (2)

Sia  un alfabeto,
 *
denota l’insieme delle stringhe su 
 + denota l’insieme delle stringhe su  tranne la
stringa vuota
 + = * - {}

Linguaggio
 Sottoinsieme
L
delle stringhe su di un alfabeto
*
10
Un esempio

= {a,b,c}

* = {, a, b, c, aa, ab, ac, ba, bb, bc, ca, cb,
cc, aaa, aab, aac, …}

Un linguaggio
L=
{a, aa, aaa, aaaa, aaaaa, …}
11
Grammatiche (1)





Dato un alfabeto VT detto alfabeto terminale,
un alfabeto VN detto alfabeto nonterminale,
un elemento s dell’alfabeto nonterminale detto
simbolo distinto,
un insieme P di regole di produzione che
trasformano stringhe di (VT ∪ VN)* in stringhe
nonvuote su VT ∪ VN,
la quadrupla < VT,VN,s,P> è detta una grammatica
12
Grammatiche (2)

Date due stringhe  e  di (VT ∪ VN)*
diremo che  deriva  ( ⇒ )se e solo se
scrivesi

= xy;
  = xy
 Con x, y, ,  in (VT ∪ VN)*
 C’è una regola di produzione  → 
13
Grammatiche (3)



Una stringa è derivata indirettamente da un’altra
quando si può compiere una sequenza di passi di
derivazione che conduce dalla prima alla seconda
stringa
Il linguaggio generato da una grammatica è
costituito dalle stringhe terminali derivate
indirettamente dal simbolo distinto
Ogni stringa del linguaggio generato da una
grammatica si dice sinttaticamente corretta per la
grammatica stessa
14
Grammatiche (4)

Un linguaggio generato da una grammatica
si dice grammaticale

IMPORTANTISSIMO:

Un linguaggio è grammaticale se e solo se è
riconoscibile da una macchina a stati
15
Osservazioni (1)

Nonostante gli alfabeti siano insiemi finiti i
linguaggi possono essere infiniti

La stringa vuota è uguale per qualsiasi
alfabeto
16
Osservazioni (2)


Le lettere dell’Italiano sono simboli di un alfabeto
Possiamo vedere come linguaggio:



Il lessico (radici e desinenze delle parole)
Il vocabolario (l’insieme delle parole italiane)
Le strutture frasali (sintagmi) italiane:




“Il giovane biologo veronese”;
“L’arguto giurista in erba scaligero”;
“L’interessante corso di Informatica”
Le frasi ed i periodi Italiani:


“La lezione si fece stimolante”;
“La pausa per il caffè era peraltro cogente”
17
Problemi (1)
Chiamiamo
PROBLEMA DI RICONOSCIMENTO
di un linguaggio L su di un alfabeto , il
problema di stabilire se una data stringa 
in * sia in L o no
 Ogni stringa  si dice una istanza del
problema

18
Generalità sulle funzioni (1)



Siano A e B due insiemi, diciamo
Prodotto Cartesiano A╳B
l’insieme delle coppie ordinate di elementi
di A e B
Chiamiamo relazione tra A e B un sottoinsieme del
prodotto cartesiano di A e B
Per una relazione r definita tra A e B definiamo A
il dominio di r, e B il codominio di r
19
Generalità sulle funzioni (2)
Una funzione è una relazione univoca, cioè
una relazione che ad ogni elemento del
dominio associa al più un elemento del
codominio
 Una funzione che associa sempre ad un
elemento del dominio un elemento del
codominio si dice totale

20
Generalità sulle funzioni (3)
Dato un elemento x del dominio l’elemento
in relazione f con x nel codominio si indica
con f(x) e si dice l’immagine di x
 Dato un elemento y nel codominio, se vale
y = f(x), allora si dice che x è la
controimmagine di y secondo f

21
Generalità sulle funzioni (4)

Una funzione f si dice iniettiva se ad elementi
distinti del dominio associa elementi distinti del
codominio:
x ≠ y → f(x) ≠ f(y)

Una funzione si dice suriettiva se ogni elemento
del codominio ha controimmagine
∀y∃x[y = f(x)]

Una funzione sia iniettiva che suriettiva si dice
biiettiva o biunivoca
22
Esempi (1)

A={0,1}; B={a,b}
A╳B = {(0,a);(0,b);(1,a);(1,b)}

Relazione determinata da 1 va con b
R={(0,a);(0,b);(1,b)}
23
Esempi (2)


Sia A=naturali (ℕ) e B=naturali
Funzione f(n)=n2

Proprietà:



Iniettiva
Non suriettiva
Funzione f(n) = maxdiv(n) [che trova il massimo
divisore di n strettamente minore di n]

Proprietà:


Non iniettiva
Suriettiva
24
Problemi (2)
Sia f una funzione dai numeri naturali in se
stessi (f: ℕ  ℕ)
 Dato un numero naturale n chiamiamo
PROBLEMA DI CALCOLO

 Trovare

f(n)
Dati due numeri naturali m ed n chiamiamo
PROBLEMA DI DECISIONE
 Stabilire
se vale f(n) = m
25
Concetto di calcolabilità
Una funzione f si dice calcolabile se e solo
se esiste una macchina a stati che è in grado
di leggere n in input e scrivere f(n) in output
in un tempo finito
 Una funzione f totale e calcolabile si dice
totalmente calcolabile

26
Equivalenza (1)

Ogni problema di decisione può essere
risolto se so risolvere il corrispondente
problema di calcolo
 Per
decidere se m=f(n) calcolo f(n) e stabilisco
se vale l’uguaglianza

Meno ovviamente vale anche il contrario
 Se
so stabilire quando m=f(n) per calcolare f(n)
enumero da 1 in avanti e risolvo 1=f(n),
2=f(n),… fino a quando il risultato è vero. Il
valore stabilito è f(n)
27
Equivalenza (2)



Ogni problema di decisione corrisponde ad un
problema di riconoscimento e viceversa
Per stabilire che questo è vero è sufficiente
ricordare che l’insieme * è ovviamente
numerabile (anche detto di cardinalità ℵ0) ovvero
corrispondente biunivocamente ad ℕ tramite una
funzione h
Una volta enumerato * il problema di
riconoscimento per una stringa corrisponde a
stabilire se vale per una funzione f(h())=1 (inteso
come codifica per il vero)
28
Equivalenza (2) - continua

Per un problema di decisione ogni istanza del
problema può definirsi come una istanza di un
problema di riconoscimento


Enumeriamo ℕ2. Enumeriamo * per un dato alfabeto
 e costruiamo la corrispondenza biunivoca composta
da * all’enumerazione di ℕ2.
Ogni coppia di ℕ corrisponde ora ad una stringa in *.
Sia L il linguaggio delle stringhe che corrispondono ad
una coppia (m,n) tale che f(n)=m. Riconoscere L
corrisponde a risolvere il problema di decisione per f
29
Problemi paradigmatici
Date le equivalenze sopradette, i problemi
paradigmatici sono quelli di riconoscimento
 La calcolabilità è definita mediante
macchine a stati
 Quindi: l’obiettivo dell’informatica teorica
è definire tecniche per risolvere problemi di
riconoscimento mediante macchine a stati

30
Linguaggi di programmazione


Un linguaggio di programmazione è un linguaggio
grammaticale il cui scopo è descrivere tecniche di
risoluzione di problemi in modo che attraverso un
meccanismo automatico si possa fare applicare tali
tecniche su di una macchina a stati
I token di un linguaggio di programmazione
(simboli dell’alfabeto su cui è costruito) si
chiamano istruzioni
31
Linguaggi di programmazione



Una stringa sintatticamente corretta di un
linguaggio di programmazione si dice un
programma
La semantica operazionale di un linguaggio di
programmazione corrisponde ad un insieme di
regole che trasformano programmi in macchine a
stati
La semantica denotazionale di un linguaggio di
programmazione corrisponde ad un insieme di
regole che trasformano un programma nella
funzione da esso calcolata
32
Tipi di linguaggio (1)
Se le istruzioni di un linguaggio di
programmazione vengono tradotte in
comandi eseguibili dalla macchina
(istruzioni macchina) una per volta il
linguaggio di programmazione si dice
interpretato
 Il programma che effettua la traduzione si
dice interprete

33
Tipi di linguaggio (2)
Se ogni programma di un linguaggio di
programmazione viene tradotto in una
sequenza di istruzioni macchina (codice
eseguibile) il linguaggio di programmazione
si dice compilato
 Il programma che effettua la traduzione si
dice compilatore

34
Tipi di linguaggio (3)



Ogni programma eseguibile può essere in realtà
strutturato in comandi eseguibili direttamente dalla
macchina ma anche in comandi eseguibili da
macchine virtuali
Una macchina virtuale è un programma che
conosce un codice intermedio tra quello ad alto
livello del linguaggio di programmazione e quello
della macchina fisica
Tale codice prende il nome di p-code
35
Architettura dei linguaggi

Sintassi del linguaggio e sua analisi
 PARSER

Semantica del linguaggio
 INTERPRETE
 COMPILATORE

Esecuzione di programmi
 Run-Time
Support
36
Paradigmi di programmazione (1)
Un paradigma di programmazione è un
modo di vedere la macchina che esegue i
programmi
 Esecuzione di p-code come semantica
operazionale

37
Paradigmi di programmazione (2)

Linguaggi imperativi
 La
computazione è modellata come
l’esecuzione di ordini da parte di un “servo”

Linguaggi dichiarativi

La computazione è modellata come un calcolo
strutturato di


Funzioni
Condizioni logiche
(paradigma funzionale)
(paradigma logico)
38
Equivalenza di programmi
Due programmi che computano la stessa
funzione possono farlo in modo
profondamente diverso
 Se due programmi computano la stessa
funzione si dice che sono funzionalmente
equivalenti
 Se due programmi che computano la stessa
funzione lo fanno nello stesso modo si dice
che sono algoritmicamente equivalenti

39
Algoritmo

Perciò:


Necessità:


Algoritmo è la forma astratta di un programma, essendo
due programmi implementazioni dello stesso algoritmo
se computano la stessa funzione nello stesso modo
Un modo semplice e generale di descrivere gli algoritmi
Pseudolinguaggio

Una forma non implementata di linguaggio di
programmazione che contenga le strutture base dei
linguaggi di programmazione (imperativi)
40
Strutture fondamentali

Funzioni base
 Controllo
di flusso
 Lettura di dati
 Scrittura di dati
 Assegnamento di valori a variabili
41
Controllo di flusso: sequenza


Struttura di controllo
per fare eseguire due
istruzioni una dopo
l’altra
La rappresentazione
normalmente adottata
è di utilizzare un
separatore di linea
esplicito /il punto e
virgola) o implicito (a
capo)
Istruzione 1
Istruzione 2
42
Controllo di flusso: selezione


Struttura di controllo
per fare eseguire una
istruzione se vale una
condizione ed un’altra
altrimenti
La struttura
generalmente si
rappresenta mediante la
codifica
se condizione
allora
istr. 1
altrimenti istr. 2
condizione
vero
Istr. 1
falso
Istr. 2
43
Controllo di flusso: ciclo


Struttura di controllo
per fare eseguire
ripetutamente una
istruzione se vale una
condizione
La struttura
generalmente si
rappresenta mediante la
codifica
fintantoché condizione
istruzione
condizione
vero
falso
Istr. 1
Istr. 2
44
Nozione di variabile

Variabile





Nome
Tipo
Valore
Un nome di variabile è valido, generalmente se è
alfanumerico con limiti all’impiego di operatori
aritmetici e se inizia con una lettera
Occorrono costrutti per


Definire tipi
Attribuire tipi alle variabili
45
Altre istruzioni

Assegnamento
←v
 Sottocaso: incremento
x


x←x+1
Lettura
 read(x)

Scrittura
 write(x)
46
Tipi di dati
Tipi elementari/strutturati
 Tipi predefiniti/utente
 Costrutti di definizione di tipo
 Costrutti di binding (assegnamento di tipo
alle variabili)
 Regole di compatibilità tra tipi

47
Tipi elementari

Tipi elementari predefiniti

Interi







Short/long
Range
Reali

(numeri relativi)
(numeri con la virgola)
Float/Double
Range e precisione
Carattere
Stringhe
Logico
(caratteri alfanumerici)
(sequenze di caratteri alfanumerici)
(vero o falso)
48
Tipi enumerativi

I tipi enumerativi sono tipi utente
elementari costituiti da un elenco di tutti e
soli i possibili valori del tipo

Esempio: colori dell’arcobaleno

{rosso, arancione, giallo, verde, blu, indaco, violetto}
49
Tipi strutturati

Strutture statiche
 Array
 Record

Strutture dinamiche
 Liste
 Alberi
 File
50
Accesso agli elementi
Strutture ad accesso diretto o casuale sono
quelle che permettono di leggere e scrivere
elementi della struttura senza aver prima
scandito altri elementi
 Strutture ad accesso sequenziale sono quelle
che invece richiedono che la lettura di un
elemento segua la lettura di altri elementi
che precedono l’elemento detto nell’ordine
di scansione della struttura

51
Array



Un array è un oggetto formato da un insieme
accessibile direttamente di oggetti tutti dello stesso
tipo
Gli indici di accesso sono un tipo enumerativo
ovvero numeri interi
Un array è definito dalla sua dimensione
strutturale (un array di dimensioni strutturale 1è
un vettore, uno di dimensione strutturale 2 è una
matrice) e dalle dimensioni relative (un vettore di
dieci elementi è di dimensione relative 10)
52
Array

Esempio:

Array di dimensione strutturale 1 e dimensione relativa
7 di numeri interi
[4,5,2,3,5,11,2]
Array
di dimensione strutturale 2 e dimensioni
relative 2 e 4











2
3
44
4
11 

21 

3 

121
53
Record

Un record è un oggetto formato da un
insieme accessibile direttamente di oggetti
di tipi diversi

Gli indici di accesso sono nomi validi di
variabili
54
Liste
Una lista si costruisce aggiungendo un
elemento in coda ad una lista esistente, che
può essere vuota
 Per leggere una lista abbiamo due operatori:

 Uno
per ritornare il valore della posizione
corrente
 Uno per spostare la posizione corrente in avanti
55
Grafi



Un grafo (diretto) è una coppia <V,E> in cui E è
un insieme di coppie di V, gli elementi di V si
chiamano vertici, gli elementi di E archi
Una sequenza di vertici di un grafo è un percorso
se e solo se ogni coppia di vertici in sequenza è un
arco
Un grafo si dice aciclico se e solo se non contiene
percorsi circolari (cioè che iniziano e terminano
con lo stesso vertice)
56
Alberi

Un albero è
 Un
grafo diretto aciclico dove
 Ogni vertice è puntato da al più un altro vertice
 L’insieme dei vertici non puntati è un singoletto

Una lista è un albero i cui elementi puntano
al più un altro elemento
57
File

I file sono sequenze accessibili anche
mediante indici

Si differenziano dalle liste per avere
potenzialmente molti punti d’accesso
58
Scarica

Corso di Informatica per Giurisprudenza Lezione 2