Linguaggi di Programmazione avanzati Linguaggi funzionali

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Linguaggi di Programmazione avanzati Linguaggi funzionali"

Transcript

1 Linguaggi di Programmazione avanzati Linguaggi funzionali Simone Martini Dipartimento di Scienze dell Informazione Università di Bologna Italy A.a / 95

2 Il paradigma funzionale puro Un lambda-calcolo esteso Strategie di riduzione Programmare in un linguaggio funzionale Zucchero sintattico Tipi e polimorfismo Aspetti imperativi La macchina SECD Monadi Outline Le continuazioni e la continuation passing transformation Continuazioni La CPS Le continuazioni come oggetti manipolabili: call/cc 2 / 95

3 Monadi: effetti collaterali in ambiente puro I In linguaggi call-by-value gli effetti collaterali sono aggiunti, ottenendo linguaggi impuri I Nei linguaggi puri, il flusso dei dati è totalmente esplicito I Talvolta questo è molto pesante, quando non impossibile I Discuteremo un esempio (P. Wadler, 1995) 46 / 95

4 Valutatore di espressioni I Sintassi Haskell-like I Il tipo dei termini data Term = Con Int Div Term Term ; I La funzione di valutazione eval :: Term -> Int eval ( Con n) = n eval ( Div t u) = ( eval t) / ( eval u) I Due termini ok = Div ( Div ( Con 2000) ( Con 2)) ( Con 5) ko = Div ( Con 2000) ( Con 0) I eval ok = 200 eval ko indefinito 47 / 95

5 Eccezioni I Per sollevare eccezioni dobbiamo estendere il tipo dei valori: eval può restituire un Int oppure un eccezione I type M a = Excp Value a I Excp e Value sono costruttori I M a è un tipo polimorfo. Per ogni tipo T abbiamo il tipo M T I A noi interessa M Int, i cui valori sono: I Excp I Value n I Il nuovo tipo di eval eval :: Term -> M Int 48 / 95

6 Valutatore con eccezioni I eval :: Term -> M Int eval ( Con a) = Value a eval ( Div t u) = case eval t of Excp -> Excp Value a -> case eval u of Excp -> Excp Value b -> if b = 0 then Excp else Value ( a/ b) I eval ok = Value 200 eval ko = Excp I Il risultato deve essere controllato ad ogni chiamata 49 / 95

7 Valutatore con I/O I Si vogliono stampare tutti i valori intermedi calcolati dal valutatore I Occorre estendere il tipo dei valori: eval restituisce sia un Int, sia l output (una stringa, per esempio) I data M a = ( Output, a) type Output = String I eval :: Term -> M Int eval ( Con a) = ( Con ++ ( showint a), a) eval ( Div t u ) = let (x, a) = eval t in let (y, b) = eval u in (x ++ y ++ Div ++ ( showint a/b), a/b) I showint :: Int -> String converte un intero in stringa 50 / 95

8 Valutatore con I/O, 2 I eval :: Term -> M Int eval ( Con a) = ( Con ++ ( showint a), a ) eval ( Div t u ) = let (x, a) = eval t in let (y, b) = eval u in (x ++ y ++ Div ++ ( showint a/b), a/b) I ok = Div (Div (Con 2000) (Con 2)) (Con 5) I eval ok = (x, 100) dove x è la stringa: Con 2000 Con 2 Div 1000 Con 5 Div 200 I Se volessimo ottenere la stampa a rovescio Div 200 Con 5 Div 1000 Con 2 Con 2000 basterebbe usare il termine Div ++ (showint a/b) ++ y ++ x 51 / 95

9 Valutatore con stato I Si vuole contare il numero di moltiplicazioni I Il tipo dei valori: data M a = State -> (a, State ) type State = Int Un valore è una funzione che prende lo stato iniziale e restituisce il valore calcolato e accoppiato allo stato finale. I eval :: Term -> M Int eval ( Con a) x = ( a, x) eval ( Div t u) x = let ( a, y) = eval t x in let ( b, z) = eval u y in (a/b, z + 1) 52 / 95

10 Impariamo dagli esempi I Un tratto comune degli esempi Invece di: eval :: Term -> Int Abbiamo: eval :: Term -> M Int I Intuitivamente: eval restituisce un Int, più gli effetti aggiuntivi descritti dall opportuno M. I Quali sono le operazioni che sono possibili sui valori di tipo M a? I Cerchiamo di capirlo guardando i nostri valutatori / 95

11 I Il valutatore con eccezioni: Operazioni sui tipi monadici, 1 eval :: Term -> M Int eval (Con a) = Value a eval ( Div t u) = case eval t of Excp -> Excp Value a -> case eval u of Excp -> Excp Value b -> if b == 0 then Excp else Value ( a/ b) I Usiamo un modo canonico per trasformare un valore di tipo Int nel corrispondente valore di tipo M Int. I Chiamiamo return :: a -> M a questa immersione return n = Value n 54 / 95

12 Operazioni sui tipi monadici, 2 I eval :: Term -> M Int eval ( Con a) = Value a eval ( Div t u) = case eval t of Excp -> Excp Value a ->... Value (a/ b) I eval t dà il risultato Value a dal quale estraiamo il valore a per usarlo successivamente (nella divisione a/b) I Una funzione g :: Int -> Int g = λ a.... Value (a/b) I eval t :: M Int I Dobbiamo applicare g al risultato di eval t (ma i tipi non tornano esattamente) 55 / 95

13 Operazioni sui tipi monadici, 3 I Ricapitolando: g :: Int -> Int, eval t :: M Int I In generale: applicare una funzione di tipo a -> M b ad una computazione di tipo M a I Abbiamo bisogno dunque di un operazione >>= :: M a -> (a -> M b) -> M b che scriviamo infissa t >>= g Osserva che t :: M a mentre g :: a -> M b I Nel caso delle eccezioni: t >>= g = case t of Excp -> Excp Value a -> g a 56 / 95

14 Monadi I Una monade è una tripla (M, return, >>=) dove: I M è un costruttore di tipo I return :: a -> M a I >>= :: M a -> (a -> M b) -> M b I Le due operazioni devono soddisfare tre leggi che vedremo tra poco 57 / 95

15 Valutatore monadico I Data una monade M, possiamo scrivere il generico valutatore su di essa I eval :: Term -> M Int eval ( Con a) = return a eval ( Div t u) = eval t >>= (λ a. eval u >>= λ b. return (a/b)) 58 / 95

16 Valutatore monadico per le eccezioni I Monade I type M a = Excp Value a I return :: a -> M a return a = Value a I >>= :: M a -> (a -> M b) -> M b I Valutatore t >>= g = case t of Excp -> Excp Value a -> g a eval :: Term -> M Int eval ( Con a) = return a eval ( Div t u) = eval t >>= (λ a. eval u >>= λ b. if b=0 then Excp else return ( a/ b)) 59 / 95

17 Monade dello I/O I Monade I type M a = (Output, a) I type Output = String I return :: a -> M a return a = (,a) I >>= :: M a -> (a -> M b) -> M b t >>= g = let (x, a) = t in let (y, b) = g a in (x ++ y, b) I out :: Output -> M () out e = (x, ()) 60 / 95

18 Valutatore monadico con I/O I Ricorda: t >>= g = let (x, a) = t in let (y, b) = g a in (x ++ y, b) out :: Output -> M () out e = (x, ()) I Valutatore eval :: Term -> M Int eval ( Con a) = out ( Con ++ ( showint a)) >>= λ(). return a eval ( Div t u) = eval t >>= (λ a. eval u >>= λ b. out ( Div ++( showint a/b)) >>= λ(). return (a/b) 61 / 95

19 Monade dello stato I Monade I type M a = State -> (a, State) I type State = Int I return :: a -> M a return a = λx.(a,x) I >>= :: M a -> (a -> M b) -> M b t >>= g = λx. let (a, y) = t x in let (b,z) = g a y in (b,z) I tick :: M () tick = λx.((), x +1) 62 / 95

20 Valutatore monadico con stato I Ricorda: t >>= g = λx. let (a, y) = t x in let (b,z) = g a y in (b,z) tick :: M () tick = λx.((), x +1) I Valutatore eval :: Term -> M Int eval ( Con a) = return a eval ( Div t u) = eval t >>= (λ a. eval u >>= λ b. tick >>= λ(). return ( a/ b) 63 / 95

21 Leggi I Neutro a sinistra return a >>= λb. n = n[ a/ b] I Neutro a destra m >>= λ a. return a = m I Associatività m >>= λ a. ( n >>= λ b. o) = ( m >>= λ a. n) >>= λ b. o Osserva che deve essere a 62 FV (o) I Esercizio: Verifica le leggi per le monadi introdotte I Le leggi servono per dimostrare proprietà dei programmi 64 / 95

22 Monadi: una variante I Una monade può essere definita anche come (M, return, join, map) con map :: (a -> b) -> (M a -> M b) join :: M (M a) -> M a e le leggi I map id = id map ( f g) = map f map g map f return = return f map f join = join map ( map f ) join return = id join map return = id join map join = join join 65 / 95

23 Le due definizioni sono equivalenti I Definiamo map e join in termini di >>= map f m = m >>= λa. return ( f a) join z = z >>= λm. m I Definiamo >>= in termini di map e join m >>= k = join ( map k m) I Esercizio: verificare le leggi in entrambi i casi. 66 / 95

24 La monade più semplice: Identità I Monade I type M a = a I return :: a -> M a return a = a I >>= :: M a -> (a -> M b) -> M b t >>= g = g t I Il generico valutatore monadico su questa monade concide col valutatore puro 67 / 95

25 Liste come monadi I Vedere le liste come monadi può essere utile I Monade I type L a = [a] Notazione Haskell: [Int] liste di interi I return :: a -> L a return a = [a] I >>= :: L a -> (a -> L b) -> L b I Esempio: l >>= g = concat (map g l) ha come risultato [10,20,30] >>= λx.[x, x +1] [10,11,20,21,30,31] 68 / 95

26 I Riprendiamo il valutatore con I/O Notazioni Haskell eval :: Term -> M Int eval ( Con a) = out ( Con ++ ( showint a)) >>= λ(). return a eval ( Div t u) = eval t >>= (λ a. eval u >>= λ b. out ( Div ++( showint a/b)) >>= λ(). return (a/b) I Alcune volte in m >>= g il valore di m non è usato I Notazione apposita: >> :: M a -> M b -> M b, definito come m >> n = m >>= λ().n I Così risparmiamo qualche λ / 95

27 I Il valutatore con I/O, ottimizzando i λ Notazione do eval ( Con a) = out ( Con ++ ( showint a)) >> return a eval ( Div t u) = eval t >>= (λ a. eval u >>= λ b. out ( Div ++( showint a/b)) >> return ( a/ b) I Osserva: >> è come ; in C >>= è simile ad un assegnamento. I La notazione do: eval ( Con a) = do out ( Con ++ ( showint a)) return a eval ( Div t u) = do a <- eval t b <- eval u out ( Div ++( showint a/b)) return ( a/ b) 70 / 95

28 Notazione do, 2 I Il valutatore con stato eval ( Con a) = return a eval ( Div t u) = eval t >>= (λ a. eval u >>= λ b. tick >> return (a/b) I Diviene: eval ( Con a) = do return a eval ( Div t u) = do a <- eval t b <- eval u tick return ( a/ b) 71 / 95

Linguaggi di Programmazione avanzati Linguaggi funzionali

Linguaggi di Programmazione avanzati Linguaggi funzionali Linguaggi di Programmazione avanzati Linguaggi funzionali Simone Martini Dipartimento di Scienze dell Informazione Università di Bologna Italy A.a. 2005-2006 1 / 95 Il paradigma funzionale puro Un lambda-calcolo

Dettagli

Linguaggi di Programmazione avanzati Linguaggi funzionali

Linguaggi di Programmazione avanzati Linguaggi funzionali Linguaggi di Programmazione avanzati Linguaggi funzionali Simone Martini Dipartimento di Scienze dell Informazione Università di Bologna Italy A.a. 2005-2006 1 / 45 Outline Il paradigma funzionale puro

Dettagli

Valutazione Lazy. Prefazione alla lezione

Valutazione Lazy. Prefazione alla lezione Valutazione Lazy Aniello Murano Università degli Studi di Napoli Federico II 1 Prefazione alla lezione Nella lezione precedente abbiamo introdotto i linguaggi (funzionali) con tipi di ordine superiore.

Dettagli

CENNI MINIMI DI PROGRAMMAZIONE FUNZIONALE IN PYTHON - V. 0.3

CENNI MINIMI DI PROGRAMMAZIONE FUNZIONALE IN PYTHON - V. 0.3 CENNI MINIMI DI PROGRAMMAZIONE FUNZIONALE IN PYTHON - V. 0.3 MATTEO PRADELLA 1. Introduzione e concetti base La programmazione funzionale è uno stile di programmzione che enfatizza la valutazione di espressioni,

Dettagli

Programmazione Definizione di nuovi tipi

Programmazione Definizione di nuovi tipi Programmazione Definizione di nuovi tipi Samuel Rota Bulò DAIS Università Ca Foscari di Venezia. Outline Abbiamo incontrato i tipi primitivi. unit, bool, int, float, char, string Abbiamo visto come costruire

Dettagli

ESEMPI DI TRIPLE DI HOARE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

ESEMPI DI TRIPLE DI HOARE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella ESEMPI DI TRIPLE DI HOARE Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella ESEMPIO DI SEQUENZA DI COMANDI Verificare la tripla: Per la Regola per la Sequenza, dobbiamo

Dettagli

Espressioni e Comandi

Espressioni e Comandi Espressioni e Comandi March 24, 2017 Elementi di Base dei Programmi Ricordate? Macchina Astratta: Insieme di algoritmi e strutture dati che permettono di memorizzare ed eseguire programmi Abbiamo parlato

Dettagli

Sintassi. Logica. Sintassi di Matita. Claudio Sacerdoti Coen. Universitá di Bologna 16,18/10/2017. Claudio Sacerdoti Coen

Sintassi. Logica. Sintassi di Matita. Claudio Sacerdoti Coen. Universitá di Bologna 16,18/10/2017. Claudio Sacerdoti Coen Logica di Matita Universitá di Bologna 16,18/10/2017 Outline 1 dei termini di Matita Termini: t ::= x c t t λx : T.t... x sono variabili (potete usare qualunque identificatore) c

Dettagli

Laboratorio di Informatica I

Laboratorio di Informatica I Struttura della lezione Lezione : Elementi lessicali del C Vittorio Scarano Corso di Laurea in Informatica Elementi lessicali e token Costanti Identificatori Operatori operatori di incremento/decremento

Dettagli

Introduzione alla Programmazione Funzionale

Introduzione alla Programmazione Funzionale Introduzione alla Programmazione Funzionale April 27, 2017 Paradigmi di Programmazione Programmi sviluppabili usando diversi paradigmi Imperativo: computazione come modifica di stato Funzionale: computazione

Dettagli

Esercizio 1.A Rispondere, in maniera concisa, alle seguenti domande (12 punti)

Esercizio 1.A Rispondere, in maniera concisa, alle seguenti domande (12 punti) Cognome e Nome: Matr.: Linguaggi di programmazione A 27 giugno 2018 Esercizio 1.A Rispondere, in maniera concisa, alle seguenti domande (12 punti) 1. In cosa l aritmetica dei puntatori differisce dall

Dettagli

Corso di Linguaggi di Programmazione

Corso di Linguaggi di Programmazione Corso di Linguaggi di Programmazione Lezione 5 Alberto Ceselli alberto.ceselli@unimi.it Università degli Studi di Milano 12 Marzo 2013 Le funzioni sono oggetti di prima classe in Scheme In Scheme le funzioni

Dettagli

In questo esempio, il tipo a -> a indica che la funzione fn x => x è polimorfa, ed è dunque corretto applicarla ad argomenti di tipo diverso:

In questo esempio, il tipo a -> a indica che la funzione fn x => x è polimorfa, ed è dunque corretto applicarla ad argomenti di tipo diverso: 1 Polimorfismo in ML In ML i termini di cui si compone un programma possono non contenere alcuna informazione sui tipi. Ad esempio, sono legali in ML tanto il termine fn x : int => x quanto fn x => x.

Dettagli

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER Domenico Daniele Bloisi Docenti Metodi Numerici prof. Vittoria Bruni vittoria.bruni@sbai.uniroma1.it Programmazione prof. Domenico

Dettagli

Haskell is pure! - si può vivere senza side effects?

Haskell is pure! - si può vivere senza side effects? 11 Monadi Haskell is pure! - si può vivere senza side effects? I/O (da file, da stream, a video, timers, ) pseudo-random number generator non determinismo non local control (eccezioni, call-cc, eccezioni

Dettagli

Esercizio: punti e segmenti

Esercizio: punti e segmenti Esercizio: punti e segmenti! Punti e segmenti nel piano, con data abstraction Esercizio: punti e segmenti! Punti e segmenti nel piano, con data abstraction! Lunghezza di un segmento l = (x 2 " x 1 ) 2

Dettagli

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Corso di Fondamenti di Informatica Ingegneria delle Comunicazioni BCOR Ingegneria Elettronica BELR Domenico Daniele Bloisi Docenti Parte I prof. Silvio Salza salza@dis.uniroma1.it http://www.dis.uniroma1.it/~salza/fondamenti.htm

Dettagli

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I Lezione 4 Elementi lessicali e espressioni logiche Matricole 2-3 Elementi lessicali il linguaggio C ha un suo vocabolario di base i cui elementi sono detti token esistono 6 tipi di token: parole chiave

Dettagli

Linguaggi e grammatiche. Esercizi. Linguaggi e grammatiche. Linguaggi e grammatiche

Linguaggi e grammatiche. Esercizi. Linguaggi e grammatiche. Linguaggi e grammatiche Esercizi Grammatiche, scoping Univ. di Udine Grammatiche, scoping (Univ. di Udine) Esercizi 1 / 29 Linguaggi e grammatiche Definire i numeri divisibili per 2 in base 3, come grammatica libera da contesto

Dettagli

Tela (Teaching Language)

Tela (Teaching Language) Tela (Teaching Language) Paradigma imperativo Dichiarazioni di variabili, costanti, moduli Programma strutturato in moduli innestati Scope statico Passaggio dei parametri per valore Corpo del modulo =

Dettagli

Traduzione guidata dalla sintassi. Attributi e Definizioni guidate dalla sintassi

Traduzione guidata dalla sintassi. Attributi e Definizioni guidate dalla sintassi Traduzione guidata dalla sintassi Attributi e Definizioni guidate dalla sintassi Intro In questa ultima parte del corso vediamo, in breve, una tecnica che permette di effettuare analisi semantiche e traduzione

Dettagli

Intro. Traduzione guidata dalla sintassi. Attributi. Due notazioni a diversi livelli. Due notazioni a diversi livelli. Il flusso concettuale

Intro. Traduzione guidata dalla sintassi. Attributi. Due notazioni a diversi livelli. Due notazioni a diversi livelli. Il flusso concettuale Intro Traduzione guidata dalla sintassi Attributi e Definizioni guidate dalla sintassi In questa ultima parte del corso vediamo, in breve, una tecnica che permette di effettuare analisi semantiche e traduzione

Dettagli

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl

Linguaggi di programmazione - Principi e paradigmi 2/ed Maurizio Gabbrielli, Simone Martini Copyright The McGraw-Hill Companies srl Approfondimento 2.1 Non è questo il testo dove trattare esaurientemente queste tecniche semantiche. Ci accontenteremo di dare un semplice esempio delle tecniche basate sui sistemi di transizione per dare

Dettagli

Semantica operazionale e denotazionale

Semantica operazionale e denotazionale Semantica operazionale e denotazionale Abbiamo definito la semantica di tre linguaggi di programmazione in termini operazionali, cioé in termini di sequenze di computazione Abbiamo assegnato un algoritmo

Dettagli

Scheme: struttura del programma e campo di azione

Scheme: struttura del programma e campo di azione «a2» 2013.11.11 --- Copyright Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net Scheme: struttura del programma e campo di azione Definizione e campo di azione...........................

Dettagli

Esercizi. Grammatiche, scoping. Univ. di Udine. Grammatiche, scoping (Univ. di Udine) Esercizi 1 / 29

Esercizi. Grammatiche, scoping. Univ. di Udine. Grammatiche, scoping (Univ. di Udine) Esercizi 1 / 29 Esercizi Grammatiche, scoping Univ. di Udine Grammatiche, scoping (Univ. di Udine) Esercizi 1 / 29 Linguaggi e grammatiche Definire i numeri divisibili per 2 in base 3, come grammatica libera da contesto

Dettagli

Variabili. Unità 2. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Variabili. Unità 2. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi Corso di Ingegneria Clinica BCLR Domenico Daniele Bloisi Docente Ing. Domenico Daniele Bloisi, PhD Ricercatore Dipartimento di Ingegneria Informatica, Automatica e Gestionale Antonio Ruberti Via Ariosto

Dettagli

Variabili. Unità 2. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi

Variabili. Unità 2. Corso di Laboratorio di Informatica Ingegneria Clinica BCLR. Domenico Daniele Bloisi Corso di Laboratorio di Informatica Ingegneria Clinica BCLR Domenico Daniele Bloisi Docente Ing. Domenico Daniele Bloisi, PhD Ricercatore Dipartimento di Ingegneria Informatica, Automatica e Gestionale

Dettagli

Logica per la Programmazione

Logica per la Programmazione Logica per la Programmazione Lezione 12 Linguaggio di Programmazione Imperativo: Sintassi e Semantica Concetto di Tripla di Hoare Soddisfatta pag. 1 Introduzione Dall inizio del corso ad ora abbiamo introdotto,

Dettagli

L assegnamento. Andrea Marin. a.a. 2011/2012. Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time

L assegnamento. Andrea Marin. a.a. 2011/2012. Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Abbiamo visto È conveniente definire una macchina astratta C Lo stato della macchina ci

Dettagli

PROGRAMMAZIONE 2 15bis. OCaML: un veloce ripasso

PROGRAMMAZIONE 2 15bis. OCaML: un veloce ripasso PROGRAMMAZIONE 2 15bis. OCaML: un veloce ripasso PR2 2017-2018 1 Lo stile funzionale In Java (ma anche in C) l effetto osservabile di un programma è la modifica dello stato temp = pair.x; pair.x = pair.y;

Dettagli

ESEMPI DI TRIPLE DI HOARE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella

ESEMPI DI TRIPLE DI HOARE. Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella ESEMPI DI TRIPLE DI HOARE Corso di Logica per la Programmazione A.A. 2010/11 Andrea Corradini, Paolo Mancarella ESEMPIO DI SEQUENZA DI COMANDI Verificare la tripla: Per la Regola per la Sequenza, dobbiamo

Dettagli

Due osservazioni sulle variabili

Due osservazioni sulle variabili Due osservazioni sulle variabili Dichiarazione: cosa succede se non dichiaro una variabile e la uso? provare... Le costanti: sono utilizzate nei linguaggi di programmazione rendere simbolici dei valori

Dettagli

Logica per la Programmazione

Logica per la Programmazione Logica per la Programmazione Lezione 11 Linguaggio di Programmazione Imperativo: Sintassi e Semantica Concetto di Tripla di Hoare Soddisfatta pag. 1 Introduzione Dall inizio del corso ad ora abbiamo introdotto,

Dettagli

Programmazione in Java (I modulo)

Programmazione in Java (I modulo) Programmazione in Java (I modulo) Lezione 4 Variabili di tipo primitivo. Dichiarazione di costanti Conversioni di tipo: operatore cast Altri operatori di assegnamento Operazioni aritmetiche e di confronto

Dettagli

Programmazione. Selezione e ripetizione. Francesco Tiezzi. Scuola di Scienze e Tecnologie Sezione di Informatica Università di Camerino

Programmazione. Selezione e ripetizione. Francesco Tiezzi. Scuola di Scienze e Tecnologie Sezione di Informatica Università di Camerino Programmazione Francesco Tiezzi Scuola di Scienze e Tecnologie Sezione di Informatica Università di Camerino Lucidi originali di Pierluigi Crescenzi Variabili ed espressioni Booleane Variabili ed espressioni

Dettagli

Espressioni aritmetiche

Espressioni aritmetiche Espressioni aritmetiche Consideriamo espressioni costruite a partire da variabili e costanti intere mediante applicazione delle operazioni di somma, sottrazione, prodotto e divisione (intera). Ad esempio:

Dettagli

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt); Un esempio per iniziare Il controllo del programma in C DD Cap.3 pp.91-130 /* calcolo di 8!*/ #include #define C 8 int main() int i=1; int fatt=1; while (i

Dettagli

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output

Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output Un algoritmo realizza una relazione funzionale tra i valori di input e quelli di output F = { (s, s ) } per ogni s esiste una e una sola coppia (s, s ). Esempio: un algoritmo che calcola il quadrato di

Dettagli

TIPI DI DATO. e quasi sempre anche collezioni di oggetti, mediante la definizione di tipi strutturati

TIPI DI DATO. e quasi sempre anche collezioni di oggetti, mediante la definizione di tipi strutturati Tipicamente un elaboratore è capace di trattare domini di dati di tipi primitivi numeri naturali, interi, reali caratteri e stringhe di caratteri e quasi sempre anche collezioni di oggetti, mediante la

Dettagli

Fondamenti di informatica T-1 (A K) Esercitazione 3: assegnamento e variabili

Fondamenti di informatica T-1 (A K) Esercitazione 3: assegnamento e variabili Fondamenti di informatica T-1 (A K) Esercitazione 3: assegnamento e variabili A.A. 2018/2019 Tutor Lorenzo Rosa lorenzo.rosa@unibo.it 2 Esercitazione 3 Introduzione al calcolatore e Java Linguaggio Java,

Dettagli

Espressioni. Espressione = meccanismo fondamentale per esprimere computazioni in un LP importante comprenderne la semantica!

Espressioni. Espressione = meccanismo fondamentale per esprimere computazioni in un LP importante comprenderne la semantica! Espressioni Espressione = meccanismo fondamentale per esprimere computazioni in un LP importante comprenderne la semantica! Valutazione automatica di expr aritmetiche = obiettivo primario dei primi LP

Dettagli

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari 7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa

Dettagli

Contenuti. Elementi di semantica denotazionale ed operazionale. Sintassi astratta. Sintassi e semantica. ! sintassi astratta e domini sintattici

Contenuti. Elementi di semantica denotazionale ed operazionale. Sintassi astratta. Sintassi e semantica. ! sintassi astratta e domini sintattici Elementi di semantica denotazionale ed operazionale Contenuti! sintassi astratta e domini sintattici " un frammento di linguaggio imperativo! semantica denotazionale " domini semantici: valori e stato

Dettagli

Javascript: il browser

Javascript: il browser Javascript: il browser Un browser è un programma Un browser interpreta il linguaggio HTML e visualizza le pagine sullo schermo Per la visualizzazione delle pagine un browser si appoggia al software di

Dettagli

Pattern matching e tipi di dato strutturati

Pattern matching e tipi di dato strutturati Capitolo 3 Pattern matching e tipi di dato strutturati Per il momento abbiamo considerato un linguaggio funzionale (denominato SimpleCaml ) i cui unici tipi di dato sono interi, float, booleani e funzioni.

Dettagli

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

6 - Blocchi e cicli. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 6 - Blocchi e cicli Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://pages.di.unipi.it/milazzo milazzo di.unipi.it

Dettagli

Javascript: il browser

Javascript: il browser Javascript: il browser Un browser è un programma Un browser interpreta il linguaggio HTML e visualizza le pagine sullo schermo Per la visualizzazione delle pagine un browser si appoggia al software di

Dettagli

Programmazione Funzionale

Programmazione Funzionale Programmazione Funzionale Linguaggi funzionali http://cialdea.dia.uniroma3.it/teaching/pf/ di alto livello: un programma è una funzione. di tipo dichiarativo: il programmatore specifica che cosa calcola

Dettagli

Logica per la Programmazione

Logica per la Programmazione Logica per la Programmazione Lezione 13 Comando Iterativo Sequenze (array) ed Aggiornamento Selettivo pag. 1 Regole di Inferenza per Triple di Hoare: Comando Iterativo Semantica informale del Comando Iterativo

Dettagli

Logica per la Programmazione

Logica per la Programmazione Logica per la Programmazione Lezione 13 Sistema di Dimostrazioni per le Triple di Hoare Comando Vuoto, Assegnamento, Sequenza, Condizionale pag. 1 Tripla di Hoare Soddisfatta: richiamo Data una Tripla

Dettagli

La principale modalità di calcolo è l applicazione di funzioni

La principale modalità di calcolo è l applicazione di funzioni 1 La principale modalità di calcolo è l applicazione di funzioni Nei linguaggi funzionali puri non esistono strutture di controllo predefinite per la realizzazione di cicli quali for, while, repeat Un

Dettagli

Paolo Bison. Fondamenti di Informatica Ingegneria Meccanica Università di Padova A.A. 2008/09

Paolo Bison. Fondamenti di Informatica Ingegneria Meccanica Università di Padova A.A. 2008/09 Linguaggi procedurali Paolo Bison Fondamenti di Informatica Ingegneria Meccanica Università di Padova A.A. 2008/09 Linguaggi procedurali, Paolo Bison, FI08, 2008-09-29 p.1 Linguaggi procedurali classe

Dettagli

Programmazione Funzionale

Programmazione Funzionale 1 Introduzione alla programmazione in un Programmazione Funzionale linguaggio funzionale Objective Caml di alto livello: un programma è una funzione; di tipo dichiarativo: il programmatore specifica che

Dettagli

Costanti e Variabili

Costanti e Variabili Parte 3 Costanti e Variabili Identificatori Un identificatore è un nome che viene associato a diverse entità (costanti, tipi, variabili, funzioni, ecc.) e serve ad identificare la particolare entità Gli

Dettagli

Sistemi di tipo e analisi statica

Sistemi di tipo e analisi statica Sistemi di tipo 1 Sistemi di tipo e analisi statica le tecniche di analisi statica approssimano (a tempo di compilazione) il comportamento di un programma (a tempo di esecuzione) con l obiettivo di scoprire

Dettagli

Laboratorio di Algoritmi e Strutture Dati. Pile

Laboratorio di Algoritmi e Strutture Dati. Pile Laboratorio di Algoritmi e Strutture Dati Pile Teresa M.A. Basile basile@di.uniba.it Dipartimento di Informatica Università degli Studi di Bari Aldo Moro Materiale di base gentilmente concesso dal dott.

Dettagli

Sviluppo di programmi

Sviluppo di programmi Sviluppo di programmi FASE 1: Dare un nome al problema partendo dall analisi del problema FASE 2: Scrivere la specifica funzionale FASE 3: Scrittura dell algoritmo FASE 3.1: Introduzione delle variabili

Dettagli

1 Il Paradigma Imperativo

1 Il Paradigma Imperativo 1 Il Paradigma Imperativo 1.1 Imp : un semplice linguaggio imperativo Abbiamo visto in Fun un meccanismo eager per la valutazione dei parametri di una funzione ed un meccanismo lazy. Una situazione analoga

Dettagli

Laboratorio di Python

Laboratorio di Python Problem solving, Ricorsione, Università di Bologna 13 e 15 marzo 2013 Sommario 1 2 3 4 Errore di semantica Esercizio def vocali(s): voc='' for c in s: if c in 'aeiou': voc=voc+c return voc Cerchiamo di

Dettagli

Fondamenti di Informatica T-1

Fondamenti di Informatica T-1 Fondamenti di Informatica T-1 Introduzione al linguaggio Java - Input/Output, Variabili, Tipi Tutor: Allegra De Filippo allegra.defilippo@unibo.it a.a. 2015/2016 Fondamenti di Informatica T-1 Allegra De

Dettagli

Fondamenti di informatica T-1 (A K) Esercitazione 4: controllo del flusso

Fondamenti di informatica T-1 (A K) Esercitazione 4: controllo del flusso Fondamenti di informatica T-1 (A K) Esercitazione 4: controllo del flusso AA 2018/2019 Tutor: Lorenzo Rosa lorenzo.rosa@unibo.it 2 Esercitazione 4 Introduzione al calcolatore e Java Linguaggio Java, basi

Dettagli

Pag. 1. La formalizzazione dell informazione: Dati e Diagrammi di Flusso. Codifica degli algoritmi

Pag. 1. La formalizzazione dell informazione: Dati e Diagrammi di Flusso. Codifica degli algoritmi 1 Università degli studi di Parma Dipartimento di Ingegneria dell Informazione Informatica a.a. 2012/13 Informatica Facoltà di Medicina Veterinaria a.a. 2012/13 prof. Stefano Cagnoni La formalizzazione

Dettagli

Semantiche dei linguaggi di programmazione

Semantiche dei linguaggi di programmazione Semantiche dei linguaggi di programmazione By Giulia Costantini (819048) e Giuseppe Maggiore (819050) Contents La semantica del linguaggio... 1 Tipi di semantica... 1 Esempio di semantica operazionale...

Dettagli

Logica per la Programmazione

Logica per la Programmazione Logica per la Programmazione Lezione 12 Sistema di Dimostrazioni per le Triple di Hoare Comando Vuoto, Assegnamento, Sequenza, Condizionale pag. 1 Tripla di Hoare Soddisfatta: richiamo Data la tripla di

Dettagli

Problema: stampa degli interi compresi tra n e m

Problema: stampa degli interi compresi tra n e m Costrutti imperativi Problema: stampa degli interi compresi tra n e m http://caml.inria.fr/pub/docs/manual-ocaml/libref/pervasives.html Output functions on standard output val print_string: string -> unit

Dettagli

Fondamenti di Informatica T-1. Selezione

Fondamenti di Informatica T-1. Selezione Selezione 2 Selezione Permette di differenziare il flusso di controllo a seconda che sia verificata o meno una condizione. Il flusso di controllo si ramifica in due (o più) sequenze di istruzioni alternative.

Dettagli

Java Gli array. Array

Java Gli array. Array Java Gli array 1 Gli array In generale un array è una sequenza di locazioni di memoria, che contengono entità dello stesso tipo, e a cui si può fare riferimento con un nome comune Le entità che compongono

Dettagli

Java Gli array. Array

Java Gli array. Array Java Gli array 1 Gli array In generale un array è una sequenza di locazioni di memoria, che contengono entità dello stesso tipo, e a cui si può fare riferimento con un nome comune Le entità che compongono

Dettagli

Programmazione Funzionale

Programmazione Funzionale Introduzione alla programmazione in un Programmazione Funzionale linguaggio funzionale Objective Caml di alto livello: un programma è una funzione; di tipo dichiarativo: il programmatore specifica che

Dettagli

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3) Funzioni Il concetto di funzione Parametri formali e attuali Il valore di ritorno Definizione e chiamata di funzioni Passaggio dei parametri Corpo della funzione 2 Strategie di programmazione Riuso di

Dettagli

Programmazione II. Lezione 11. Daniele Sgandurra 23/11/2010.

Programmazione II. Lezione 11. Daniele Sgandurra 23/11/2010. Programmazione II Lezione 11 Daniele Sgandurra daniele.sgandurra@iit.cnr.it 23/11/2010 1/30 Programmazione II Lezione 11 23/11/2010 Sommario 1 2/30 Programmazione II Lezione 11 23/11/2010 Parte I 3/30

Dettagli

Sviluppo di programmi

Sviluppo di programmi Sviluppo di programmi Per la costruzione di un programma conviene: 1. condurre un analisi del problema da risolvere 2. elaborare un algoritmo della soluzione rappresentato in un linguaggio adatto alla

Dettagli

Logica per la Programmazione

Logica per la Programmazione Logica per la Programmazione Lezione 12 Linguaggio di Programmazione Imperativo: Sintassi e Semantica Tripla di Hoare soddisfatta A. Corradini e F.Levi Dip.to Informatica Logica per la Programmazione a.a.

Dettagli

Linguaggio C: Espressioni

Linguaggio C: Espressioni Linguaggio C: Espressioni Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ 2 / 34 Ringraziamenti prof. Mirko Viroli, Università

Dettagli

Analisi Sintattica. Maria Rita Di Berardini. Universitá di Camerino Ruolo del parser

Analisi Sintattica. Maria Rita Di Berardini. Universitá di Camerino Ruolo del parser Ruolo del parser Analisi 1 1 Dipartimento di Matematica e Informatica Universitá di Camerino mariarita.diberardini@unicam.it Ruolo del parser Ruolo dell analisi sintattica Ruolo del parser Metodologie

Dettagli

Linguaggio C: Espressioni

Linguaggio C: Espressioni Linguaggio C: Espressioni Moreno Marzolla Dipartimento di Informatica Scienza e Ingegneria (DISI) Università di Bologna http://www.moreno.marzolla.name/ 2 Ringraziamenti prof. Mirko Viroli, Università

Dettagli

Sommario. I Uso degli oggetti 39

Sommario. I Uso degli oggetti 39 Questo è l'indice del libro, in cui sono evidenziati i paragrafi corrispondenti agli argomenti trattati nel corso e che costituiranno il programma d'esame. Alcuni argomenti sono stati trattati nelle lezioni

Dettagli

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1

Il linguaggio C. Prof. E. Occhiuto INFORMATICA 242AA a.a. 2010/11 pag. 1 Il linguaggio C I linguaggi di programmazione ad alto livello sono linguaggi formali ( sintassi e semantica formalmente definite) però sono compatti e comprensibili. Le tipologie di linguaggi sono: procedurali

Dettagli

INTRODUZIONE ALLA LOGICA DI HOARE. Corso di Logica per la Programmazione

INTRODUZIONE ALLA LOGICA DI HOARE. Corso di Logica per la Programmazione INTRODUZIONE ALLA LOGICA DI HOARE Corso di Logica per la Programmazione INTRODUZIONE Dall inizio del corso ad ora abbiamo introdotto, un po alla volta, un linguaggio logico sempre più ricco: connettivi

Dettagli

5 - Istruzioni condizionali

5 - Istruzioni condizionali 5 - Istruzioni condizionali Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it

Dettagli

Linguaggi Regolari e Linguaggi Liberi

Linguaggi Regolari e Linguaggi Liberi Linguaggi Regolari e Linguaggi Liberi Potenza espressiva degli automi Potenza espressiva delle grammatiche 9/11/2004 Programmazione - Luca Tesei 1 Linguaggi Regolari Tutti i linguaggi che possono essere

Dettagli

Funzioni e Spezie. Luca Abeni. March 14, 2016

Funzioni e Spezie. Luca Abeni. March 14, 2016 Funzioni e Spezie March 14, 2016 Spezie??? Qual è la relazione fra funzioni e spezie??? Non esiste... Ma procediamo un po alla volta Di cosa ci occupiamo oggi, allora? Funzioni in più variabili Abbiamo

Dettagli

C# delegates. Vittorio Maniezzo Università di Bologna. Vittorio Maniezzo Università di Bologna 1. Delegate

C# delegates. Vittorio Maniezzo Università di Bologna. Vittorio Maniezzo Università di Bologna 1. Delegate C# delegates Vittorio Maniezzo Università di Bologna Vittorio Maniezzo Università di Bologna 1 Delegate I delegati possono essere visti come definizioni di tipi per puntatori a funzione. Permettono di

Dettagli

Espressività e limitazioni delle grammatiche regolari

Espressività e limitazioni delle grammatiche regolari Espressività e limitazioni delle grammatiche regolari Vantaggi: Le grammatiche regolari consentono di esprimere una significativa classe di linguaggi: linguaggi con un numero di sequenze infinito grazie

Dettagli

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

19 - Eccezioni. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 19 - Eccezioni Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso

Dettagli

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi

Informatica Generale Andrea Corradini Gli algoritmi e la risoluzione di problemi Informatica Generale Andrea Corradini 13 - Gli algoritmi e la risoluzione di problemi Sommario Passi per la risoluzione di problemi Problemi di ricerca e ordinamento Algoritmi iterativi: la ricerca lineare

Dettagli

Assegnazione di una variabile

Assegnazione di una variabile Assegnazione di una variabile Per scrivere un valore dentro una variabile si usa l operatore di assegnazione, che è rappresentato dal simbolo =. Quindi, se scrivo int a; a = 12; assegno alla variabile

Dettagli

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 9 - Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di Laurea

Dettagli

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java

INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA. Struttura di un programma Java Fondamenti di Informatica INTRODUZIONE ALLA PROGRAMMAZIONE AD ALTO LIVELLO IL LINGUAGGIO JAVA 1 Struttura di un programma Java Un programma Java consiste in un insieme di definizioni di classi. In genere

Dettagli

Ingredienti sintattici di Java

Ingredienti sintattici di Java Ingredienti sintattici di Java Eugenio G. Omodeo Dip. Matematica e Geoscienze DMI Trieste, 23/09/2015 Eugenio G. Omodeo Ingredienti sintattici di Java 1/7 Specificare ( Dizionario online tratto da: Grande

Dettagli