1 Programmazione Funzionale: ML 1 implementazione del -calcolo tipato l definizione di nuovi tipi ricorsivi l i valori dei nuovi tipi sono termini, che.

Slides:



Advertisements
Presentazioni simili
PHP.
Advertisements

Linguaggi di programmazione
2/11/2004Laboratorio di Programmazione - Luca Tesei1 Punto della situazione Da dove veniamo, dove andiamo.
Semantica di linguaggi di programmazione Ne esistono differenti stili a seconda di paradigma di programmazione uso (validazione, prototyping, verifica.
Type Checking (1° parte)
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di un’espressione La maggior.
Paradigma Funzionale Paradigma Imperativo: Programma = transizione di stato Paradigma Funzionale: Programma = valutazione di unespressione La maggior parte.
Algoritmi e Programmazione
Programmazione II Docente: Francesca Levi
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
1 Semantica Operazionale di un frammento di Java: lo stato.
Classi ed Oggetti in Java (Cenni). Richiami Ruolo delle Classi in Java Oggetti.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Semantica Operazionale di un frammento di Java: lo stato
1 Strutture dati nel supporto a run time. 2 Entità presenti quando un programma va in esecuzione §programmi dutente (compilati) §routines del supporto.
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche.
Semantiche dei linguaggi di programmazione
Esercizi su alberi binari
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
Esercizi su alberi binari
mosaic manipola oggetti primitivi (ruota e unisci) regole:
1 Strutture Dinamiche Corso di Informatica A Vito Perrone.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
Alberi binari Definizione della struttura dati: struct tree { };
Attività progettuale in Linguaggi e Modelli Computazionali M
I nomi in Java F. Bombi 18 novembre novembre 2003.
Complessità di un algoritmo
Sintassi: Programma e classi Program::=prog {ClassDeclList {StatList}} ClassDeclList::=ClassDecl ClassDeclList |  ClassDecl::=class Ide c [StaticMetDefList]
1 Tecniche per il passaggio dei parametri. 2 Contenuti ¥la tecnica base (nei vari paradigmi) ¥ passaggio per costante, per riferimento, di funzioni, procedure.
1 Implementazione di (ambiente e) memoria nel linguaggio imperativo.
Un interprete astratto per l’inferenza dei tipi
Introduzione a Javascript
1 Blocchi e ambiente locale in linguaggi funzionali e imperativi.
Esercizi 1)Si scriva in Caml un’espressione che introduce una variabile x con valore 3, quindi introduce una variabile y con valore x+2, quindi una variabile.
GLI ALGORITMI VISIBILE SUL BLOG INFORMATICA ANNO SCOLASTICO 2013 / 2014 GABRIELE SCARICA 2°T.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 7 Tipi di dato e strutture dati Specifica e realizzazione di strutture informative come classi.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
1 Controllo di sequenza: espressioni e comandi. 2 Contenuti ¥espressioni pure (senza blocchi e funzioni) ¥ regola di valutazione, operazioni strette e.
Nucleo di Java: Struttura e Semantica Espressioni Assegnamento Controllo di sequenza Dichiarazioni.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
Ripasso su Java. Introduzione Per risolvere problemi complessi, i linguaggi di programmazione forniscono costrutti per realizzare nuove funzioni che trasformino.
Linguaggi di Programmazione
1 Progettare un Tipo di Dato Astratto. 2 Scelte di Progetto (astrazione) 4 Caratteristiche degli oggetti –Modificabilità 4 Scelta delle operazioni –Realizzare.
1 Semantica Operazionale di un frammento di Java: le regole di transizione estensione (con piccole varianti) di quella in Barbuti, Mancarella, Turini,
Elementi di semantica denotazionale ed operazionale
LIP: 8 Marzo 2005 Vettori. Abbiamo visto L’uso di Vector come alternativa all’uso di arrays Rivediamo l’esercizio dell’altra volta.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
1 Macchine astratte, linguaggi, interpretazione, compilazione.
1 Sottoprogrammi e astrazioni funzionali in linguaggi funzionali.
1 Linguaggi: guardando la semantica §esistono un insieme di concetti semantici e di strutture di implementazione in termini dei quali si descrivono in.
Linguaggio C: Le basi Stefano Cagnoni e Monica Mordonini
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Progetto Parte II OCAML.
1 Gestione dinamica della memoria a heap (nel linguaggio orientato ad oggetti)
Esercitazione sull’ ordinamento 20 maggio 2003
Esercizi.
LIP: 4 Maggio 2007 Interfacce. Cos’e’ una Interfaccia una interfaccia e’ un particolare tipo di classe contiene solo la specifica non ha implementazione.
LIP: 15 Marzo 2005 Vettori di interi. Esercizio proposto Definire una classe VectorInt i cui oggetti sono vettori omogenei di interi ordinati in modo.
1 Tipi di dato modificabili §a livello semantico, riconduciamo la modificabilità alla nozione di variabile l lo stato “modificabile” corrispondente sarà.
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
1 Sottoprogrammi e astrazioni funzionali in linguaggi funzionali.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Introduzione alle Classi e agli Oggetti in Java 1.
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
1 MODULO STRUTTURE DATI FONDAMENTALI: Strutture dinamiche classe 4° INDUSTRIALE INFORMATICA Focus on.
Transcript della presentazione:

1 Programmazione Funzionale: ML 1 implementazione del -calcolo tipato l definizione di nuovi tipi ricorsivi l i valori dei nuovi tipi sono termini, che possono essere visitati con un meccanismo di pattern matching (versione semplificata dell’unificazione) l scoping statico (a differenza di LISP) l semantica statica molto potente (inferenza e controllo dei tipi) un programma “corretto” per la semantica statica quasi sempre va bene l gestione della memoria a heap con garbage collector

2 Lo strumento utilizzato seconda parte del corso §Ocaml (Objective CaML), una estensione, orientata ad oggetti (e con un frammento imperativo), di uno dei più importanti linguaggi funzionali (ML) l progettato ed implementato all’INRIA (Francia) §l’implementazione (per tutte le piattaforme importanti) si può scaricare dal sito §il manuale on line al sito

3 OCAML §nucleo funzionale puro l funzioni (ricorsive) l tipi e pattern matching l primitive utili: liste §componente imperativo l variabili e assegnamento l primitive utili: arrays §moduli e oggetti §meccanismi per la definizione di tipi e di tipi di dato astratto

Applicazione: macchina astratta §semantica operazionale: implementazione e strutture a tempo di esecuzuioone §riprenderemo l’interprete di un semplice linguaggio imperativo (frammento C) visto a Programmazione I §vedremo come utilizzare le caratteristiche del linguaggio ad oggetti (meccanismi di astrazione sui dati)

Seguendo il tutorial §sessione interattiva §l’utente scrive frasi CAML che iniziano con prompt # §a seguito del prompt, il sistema compila le frasi, le esegue e stampa il risultato della valutazione §per ogni frase il risultato e’ un valore ed il tipo (type inference)

6 Espressioni pure Objective Caml version /Mac1.0a1 # 25;; - : int = 25 # true;; - : bool = true # 23 * 17;; - : int = 391 # true & false;; - : bool = false # 23 * true;; This expression has type bool but is here used with type int # if 2 = 3 then 23 * 17 else 15;; - : int = 15 # if 2 = 3 then 23 else true;; This expression has type bool but is here used with type int

7 Funzioni # function x -> x + 1;; - : int -> int = # (function x -> x + 1) 3;; - : int = 4 # (function x -> x + 1) true;; This expression has type bool but is here used with type int §anche i parametri delle funzioni non richiedono annotazioni di tipo (il tipo e’ inferito dal loro uso nel corpo) §il valore di una funzione e’

8 Funzioni # function x -> x;; - : 'a -> 'a = # function x -> function y -> x y;; - : ('a -> 'b) -> 'a -> 'b = # (function x -> x) 2;; - : int = 2 # (function x -> x) (function x -> x + 1);; - : int -> int = # function (x, y) -> x + y;; - : int * int -> int = # (function (x, y) -> x + y) (2, 33);; - : int = 35 §‘a e’ una variabile di tipo, puo’ assumere qualsiasi tipo (polimorfismo) §le funzioni sono valori, possono essere passate come parametri (funzioni di ordine superiore)

Il costrutto let \ let in §permette di definire un nuovo identificatore a con associato un valore §valori: simple expressions o funzioni

10 Let binding # let x = 3;; val x : int = 3 # x;; - : int = 3 # let y = 5 in x + y;; - : int = 8 # y;; Unbound value y (definizione globale/locale)

11 Let binding # let f = function x -> x + 1;; val f : int -> int = # f 3;; - : int = 4 # let f x = x + 1;; val f : int -> int = # f 3;; - : int = 4 # let fact x = if x = 0 then 1 else x * fact(x - 1) ;; Unbound value fact

12 Let rec binding # let rec fact x = if x = 0 then 1 else x * fact(x - 1) ;; val fact : int -> int = # fact (x + 1);; - : int = 24

Type §per definire nuove strutture dati vengono forniti records e variants (unione) §entrambi si definiscono con una dichiarazione di tipo type

14 Record # type ratio={num:int; denum:int};; type ratio={num:int; denum:int} # let x={num=1;denum=3);; val x: ratio={num=1;denum=3;} # x.num;; - int =1 un record per memorizzare numeri razionali creare e selezionare i campi

15 Unione disgiunta, variant enumera tutti i casi che possono assumere i valori di quel tipo ogni caso e ’ identificato da un nome (costruttore) che serve per costruire valori di quel tipo e per riconscerlo per pattern- matching utile per definire tipi di dato ricorsivi

# type number = | Int of int | Float of float | Error;; type number= | Int of int | Float of float | Error # let add_num n1 n2= match (n1,n2) with (Int i1,Int i2)---> (Int i1,Float i2)---> (Float i1,Float i2)---> (Float i1,Int i2)---> (Error,-) >Error (-,Error) >Error val add_num: number->number->number= # Int 3;; - : number= Int 3;

17 Espressioni: sintassi astratta # type ide = string;; type ide = string # type expr = | Den of ide | Val of ide | Fun of ide * expr | Plus of expr * expr | Apply of expr * expr;; type expr = | Den of ide | Val of ide | Fun of ide * expr | Plus of expr * expr | Apply of expr * expr E ::= I | val(I) | lambda(I, E 1 ) | plus(E 1, E 2 ) | apply(E 1, E 2 ) # Apply(Fun("x",Plus(Den "x", Den "x")), Val "y");; - : expr = Apply (Fun ("x", Plus (Den "x", Den "x")), Val "y")

18 L’ambiente # type eval = Int of int | Bool of bool | Efun of expr | Unbound;; type eval = | Int of int | Bool of bool | Efun of expr | Unbound # type env = ide -> eval;; type env = ide -> eval # let bind (rho, i, d) = function x -> if x = i then d else rho x;; val bind : (ide -> eval) * ide * eval -> (ide -> eval) = -env = IDE  eval -eval = [ int + bool + fun ]

19 Comandi: sintassi astratta # type com = Assign of ide * expr | Ifthenelse of expr * com list * com list | While of expr * com list;; type com = | Assign of ide * expr | Ifthenelse of expr * com list * com list | While of expr * com list C ::= ifthenelse(E, C 1, C 2 ) | while(E, C 1 ) | assign(I, E) | cseq(C 1, C 2 ) # While(Den "x", [Assign("y", Plus(Val "y", Val "x"))]);; -: com = While (Den "x", [Assign ("y", Plus (Val "y", Val "x"))])

20 Tipi e pattern matching type expr = | Den of ide | Fun of ide * expr | Plus of expr * expr | Apply of expr * expr type eval = | Int of int | Bool of bool | Efun of expr | Unbound type env = ide -> eval E (I,  ) =  (I) E (plus(E 1, E 2 ),  )= E (E 1,  ) + E (E 2,  ) E (lambda(I, E 1 ),  )= lambda(I, E 1 ) E (apply(E 1, E 2 ),  ) = applyfun( E (E 1,  ),  E (E 2,  ),  ) applyfun(lambda(I, E 1 ), d,  ) = E (E 1 ) [  / I  d ] # let rec sem (e, rho) = match e with | Den i -> rho i | Plus(e1, e2) -> plus(sem (e1, rho), sem (e2, rho)) | Fun(i, e) -> Efun(Fun(i, e)) | Apply(e1, e2) -> match sem(e1, rho) with | Efun(Fun(i, e)) -> sem(e, bind(rho, i, sem(e2, rho)) | _ -> failwith("wrong application");; val sem : expr * env -> eval =

Un tipo primitivo utile: le liste §Si costruiscono enumerando esplicitamente gli elementi, racchiusi tra [] §Oppure a partire dalla lista vuota [] tramite l’operatore di cons §Operazioni primitive standard

22 Liste # let l1 = [1; 2; 1];; val l1 : int list = [1; 2; 1] # let l2 = 3 :: l1;; val l2 : int list = [3; 1; 2; 1] # let l3 = l2;; val l3 : int list = [1; 2; 1; 3; 1; 2; 1] # List.hd l3;; - : int = 1 # List.tl l3;; - : int list = [2; 1; 3; 1; 2; 1] # List.length l3;; - : int = 7

Caratteristiche Imperative §variabili e assegnamento §arrays (mutabili) §comandi iterativi, while, for

24 Variabili e frammento imperativo # let x = ref(3);; val x : int ref = {contents=3} # !x;; - : int = 3 # x := 25;; - : unit = () # !x;; - : int = 25 # x := !x + 2; !x;; -: int = 27 §references sono mutable indirection cells, il cui valore puo’ essere modificato da un assegnamento

25 Un tipo primitivo mutabile: l’array # let a = [| 1; 2; 3 |];; val a : int array = [|1; 2; 3|] # let b = Array.make 12 1;; val b : int array = [|1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1; 1|] # Array.length b;; - : int = 12 # Array.get a 0;; - : int = 1 # Array.get b 12;; Uncaught exception: Invalid_argument("Array.get") # Array.set b 3 131;; - : unit = () # b;; - : int array = [|1; 1; 1; 131; 1; 1; 1; 1; 1; 1; 1; 1|]

26 Programmi Stand-alone §Il programma da eseguire deve essere memorizzato in un file.ml §Compilare ed eseguire

27 Esercizio 1 §Funziona per ordinare una lista polimorfa §Le liste sono un tipo di dato primitivo immutabile (in stile funzionale), a differenza degli array §La funzione sort ha tipo 'a list -> 'a list Gli operatori di confronto (=,<=,….) sono polimorfi, si applicano ad ogni tipo

Cosa vogliamo? # let l1 = [6; 2; 5; 3];; val l1 : int list = [6; 2; 5;3] # sort l1 ;; - : int list = [2; 3; 5;6] # let l2 = [3.14; 2.17];; val l1 : int list = [3.14; 2.17] # sort l2 ;; -: float list = [2.17; 3.14] La lista passata come input non e’ modificata, la funzione restituisce una nuova lista, che contiene gli elementi in ordine crescente

Insertion sort §Realizzare sort in modo ricorsivo caso base: [] caso ricorsivo cons: head:: tail Pattern matching Insertion sort (funzione ausiliaria che inserisce un elemento in una lista ordinata)

Funzioni di ordine superiore §in puro stile funzionale le funzioni sono valori, possono essere passate come parametri ad altre funzioni E’ utile per realizzare operazioni su strutture dati

List.map # let l1 = [6; 2; 5; 3];; val l1 : int list = [6; 2; 5;3] # List.map (function n -> n+1) l1 ;; - : int list = [7; 3; 6;4] E’ un funzionale standard, applica una funzione ad ogni elemento di una lista E’ fornito dalla libreria, ma non c’e’ niente di magico Definiamolo, come una funzione ricorsiva di ordine superiore

32 Alberi binari  Definire un tipo unione ‘ a btree che specifica alberi binari polimorfi §Definizione ricorsiva: caso base: vuoto caso ricorsivo: un nodo che contiene un valore di tipo ‘a, e due sottoalberi ‘a btree sx e dx

Btree # type ‘a btree= Empty| Node of ‘a * ‘a btree * ‘a btree;; type ‘a btree= Empty| Node of ‘a * ‘a btree * ‘a btree # Empty;; - : ‘a btree = Empty # Node(1,Empty,Empty);; -: int btree = Node(1,Empty,Empty) # Node;; the constructor node expects 3 arguments, but is here applied to zero arguments

Funzioni  Scrivere una funzione che, dato un ‘ a btree, calcola il numero di nodi  Ordered Binary Btree: ‘ a btree polimorfi ma ordinati, il sottoalbero sx ha un valore strettamente minore, e quello dx un valore strettamente maggiore di quello del nodo  Scrivere due funzioni che, dato un ordered ‘ a btree ed un valore x di tipo ‘ a, fanno la ricerca o l’inserimento di x

Osservazione  Le funzioni member e insert come parametro un btree §Assumiamo che sia di tipo Ordered §Non possiamo definire un tipo di dato Ordered per costruzione §Che cosa serve? Un meccanismo per definire un tipo di dato astratto

Tipi di dato astratto §Dati + operazioni : insieme §In questo modo possiamo definire proprieta’ dei dati (tipo l’ordine per costruzione) §Meccanismi di astrazione, incapsulamento dell’informazione, in modo da garantire che le proprieta’ non siano violate dal codice che usa il tipo di dato