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 = xy; = xy 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