7/14/20151 Haskell: ADT n ADT: pricipi, proprietà n ADT in Haskell: il meccanismo n ADT in Haskell: Hiding e Qualified n Esempi: Store e i problemi di.

Slides:



Advertisements
Presentazioni simili
Programmazione ad oggetti
Advertisements

Definitezza Vogliamo poter richiedere la “definitezza” delle funzioni
Conseguenza semantica
Argomenti della lezione
Specifiche Algebriche
Algebra parziale con predicati
Dipartimento di Matematica
Differenze nei vari linguaggi di Elisa Trifirò e Barbara Tacchino
1 Astrazioni sui dati : Specifica ed Implementazione di Tipi di Dato Astratti in Java.
Liste di Interi Esercitazione. Liste Concatenate Tipo di dato utile per memorizzare sequenze di elementi di dimensioni variabile Definizione tipicamente.
MultiSet, Liste Ordinate
Le gerarchie di tipi.
Esercitazione Frame. Argomento Realizzazione di un tipo di dato astratto Usare le eccezioni per segnalare situazioni particolari Invariante e funzione.
LIP: 19 Aprile Contenuto Soluzione Compitino Tipo di dato MultiSet, estensione con sottoclasse.
Metodologie di Programmazione = decomposizione basata su astrazioni
LIP: 1 Marzo 2005 Classe Object e Vettori. Partiamo da Lesercizio dellultima esercitazione realizzato tramite array Vedremo come si puo fare in modo piu.
Query OQL e XQUERY a confronto
Università degli Studi di Modena e Reggio Emilia
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Anno accademico Le classi di memorizzazione.
Process synchronization
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
1 Programmazione ad oggetti in Java E.Mumolo, DEEI
Allocazione dinamica della memoria
Laboratorio di Linguaggi lezione III Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
Corso di Informatica (Programmazione)
Esercizio 4 Data una stringa P di lunghezza m e definita sullalfabeto, scrivere un programma PERL per calcolare la seguente funzione: PREFIX_FUNCTION:
Astrazioni sul controllo Iteratori. 2 Nuove iterazioni Definendo un nuovo tipo come collezione di oggetti (p. es., set) si vorrebbe disporre anche di.
Specifiche senza JML: uso delle asserzioni. 2 Asserzioni in Java Dal jdk 1.4 (da Febbraio 2002) cè meccanismo per gestire asserzioni Asserzione: espressione.
Argomenti della lezione
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Type int_stack = struct { int top; int P[100]; } int_stack creapila() { int_stack s = new int_stack; s.top = 0; return s; } int_stack push(int_stack s,
Lab. Calc. 2005/06 Ereditarietà. Lab. Calc. 2005/06 Scopo di questa lezione: Imparare a creare nuove classi ereditando da classi già esistenti. Capire.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
TIPI DI DATO Un tipo di dato T è definito come: un dominio di valori, D un insieme di funzioni F 1,..,F n sul dominio D un insieme di predicati P 1,..,P.
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Ereditarietà e Polimorfismo
Algoritmi e strutture dati
1 Astrazioni sui dati : Ragionare sui Tipi di Dato Astratti dispense prof. G. Levi.
Enumerazioni e Classi 1. Enumerazioni Permettono di definire nuovi tipi che consistono in un insieme di valori costanti (ognuno con un nome) – Migliorano.
Sintassi base e struttura di un programma
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
ISTITUTO STATALE DI ISTRUZIONE SUPERIORE F. ENRIQUES CORSO JAVA – PROVA INTERMEDIA DEL 12 MARZO 2007 NOME: COGNOME: ________________________________________________________________________________.
I nomi in Java F. Bombi 18 novembre novembre 2003.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Astrazione procedurale ed eccezioni
CORSO DI PROGRAMMAZIONE II Lezione 22
Javascript Istruzioni di ciclo: for(inizio; condizione; incremento ) {blocco istruzioni} istruzione seguente; – inizio e incremento possono contenere più.
Esercitazione su Vector. Permette di definire collezioni di dati generiche, che sono in grado di memorizzare elementi di ogni sottotipo di Object Definito.
Università di Torino – Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a prof. Viviana Bono Blocco 7 – Array.
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.
Astrazione di dati Dati Astratti: cosa e perchè Dati Astratti: due meccanismi differenti Dati Astratti: due meccanismi differenti Astrazione e incapsulamento.
1 Tipi di Dato §descrittori, tipi, controllo e inferenza dei tipi §specifica (semantica) e implementazione di tipi di dato l implementazioni “sequenziali”
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
1 Eccezioni in Java. 2 Ricordiamo che 4 una procedura può terminare –normalmente, ritornando un risultato –in modo eccezionale ci possono essere diverse.
Liste di Interi Esercitazione. Una variante Liste concatenate di Integers Non modificabile Costruttori per creare la lista vuota o un nodo Metodi d’istanza.
Primo Compitino Primo esercizio Identificare gli errori segnalati dal compilatore Verifica statica del codice Regole di binding per i nomi (quelle.
1 Progettazione dettagliata di un Tipo di Dato Astratto: l’ambiente di metodi.
Liste Concatenate 11 Aprile E’ una delle strutture dati fondamentali in tutti i linguaggi di programmazione di alto livello Una Lista Concatenata.
1 Laboratorio di Introduzione alla Programmazione §II MODULO §3 crediti §Esame e voto unico (su 6 crediti totali)
LIP: 22 Marzo 2005 Eccezioni. Eccezioni-Richiami Come si definiscono eccezioni Come si lanciano Come si gestiscono (gestione esplicita o di default)
LIP: 2 Maggio 2008 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Sommario Oggetti immutabili e non Tipi Primitivi: String, Arrays.
1 Programmazione Funzionale: ML 1 implementazione del -calcolo tipato l definizione di nuovi tipi ricorsivi l i valori dei nuovi tipi sono termini, che.
LIP: 11 Maggio 2007 Classi Astratte. Cos’e’ una Classe Astratta una classe astratta e’ un particolare tipo di classe permette di fornire una implementazione.
Esercitazione del 9 marzo 2007 Ereditarieta’. Richiami Definire sottoclassi (ereditarieta’) Overriding Specificatori di accesso (private, protected) Principio.
Progetto Parte II OCAML.
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à.
Lezione n. Parole chiave: Corso di Laurea: Insegnamento: Docente: A.A Salvatore Cuomo Strutture dati di tipo astratto 19 Strutture dati,
Transcript della presentazione:

7/14/20151 Haskell: ADT n ADT: pricipi, proprietà n ADT in Haskell: il meccanismo n ADT in Haskell: Hiding e Qualified n Esempi: Store e i problemi di accesso n Accesso: Store con Location importate n Accesso: esportare Location(..) o Location n Esempi: Store e Eq n Esempi: Store come funzione e Show n Esercizi

7/14/20152 ADT: Principi, Proprietà n Principi: –Separazione tra: portata: codice che è nello scope di una definizione o binding accessibilità: codice che può fare riferimento a tale definizione o binding n Proprietà: –Generalizzazione di strutture dati: implementazione: codice con cui è implementato ogni valore strutturato specifica: valori rappresentati, operazioni applicabili e loro comportamento – Indipendenza tra: sviluppo: codice con cui è implementato e chi lo realizza, e successive modifiche delle implementazioni uso: codice che utilizza tali valori e chi ne applica le operazione e successive modifiche delle applicazioni

7/14/20153 ADT in Haskell: il Meccanismo APPLICAZIONI - uso newIntStore:: IntStore value:: IntStore -> Location -> Int update:: IntStore -> Loation -> Int -> IntStore Sviluppo - implementazione n Meccanismo: –Segnatura operazioni accessibile, quindi utilizzabili, sui valori dell’ADToperazioni accessibile, quindi utilizzabili, sui valori dell’ADT attraverso impiego (facoltativo) dei tipi esplicitiattraverso impiego (facoltativo) dei tipi espliciti –Moduli e Hiding dei costruttori di tipi algebrici Struttura di modulo: per controllare accessibilitàStruttura di modulo: per controllare accessibilità module IntStore (--export identifiers con segnatura come commento a destra IntStore, -- IntStore newIntStore, -- IntStore value, -- IntStore -> Location -> Int update -- IntStore -> Location -> Int -> IntStore update -- IntStore -> Location -> Int -> IntStore ) where -- import: moduli importati -- import: moduli importati -- definizioni: dati e operazioni -- definizioni: dati e operazioni Import può restringere accessibilità sugli importatiImport può restringere accessibilità sugli importati Hiding e Qualified: per restringere accessibilità sugli importatiHiding e Qualified: per restringere accessibilità sugli importati

7/14/20154 ADT in Haskell: Hiding e Qualified n Meccanismo: –Import import Location import Location –hiding import Location Hiding (op1,..,opk,Data1,…,Datak) import Location Hiding (op1,..,opk,Data1,…,Datak) op1 -- locale –qualified import Qualified Location import Qualified Location…. Location.op1 -- importata op1 -- locale

7/14/20155 Esempi: Store e i problemi di accesso Cosa cambia se: 1. Locations è un tipo importato? 2. IntStore deve essere confrontabile con equivalenza strutturale 3. IntStore deve essere di classe Show module IntStore (--export identifiers con segnatura come commento a destra IntStore, -- IntStore IntStore, -- IntStore newIntStore, -- IntStore newIntStore, -- IntStore value, -- IntStore -> Location -> Int value, -- IntStore -> Location -> Int update -- IntStore -> Location -> Int -> IntStore update -- IntStore -> Location -> Int -> IntStore )where )where -- import: moduli importati -- definizioni: dati e operazioni data IntStore = Sto[ (Location,Int) ] type Location = String newIntStore:: IntStore newIntStore = Sto [] value:: IntStore -> Location -> Int value(Sto []) v = 0 value(Sto ((u,n):rs)) v | (u==v) = n | (u==v) = n | otherwise = value(Sto rs) v | otherwise = value(Sto rs) v update:: IntStore -> Location -> Int -> IntStore update(Sto s) u n = Sto ((u,n):s) module WorkingModule where import IntStore -- test s0 = newIntStore s1 = update newIntStore "loc0" 26 s2 = update (update s1 "Loc1” 2) "Loc7" 0 s3 = update s2 "Loc0” (-12) ERROR - Cannot find "show" function for: *** Expression : s3 I moduli sono caricati regolarmente Ma cosa succede se valutiamo s3

7/14/20156 Accesso: Store e il problema (1) Module Location ( Location -- il tipo è esportato Location -- il tipo è esportato )where )where data Location = L String module IntStore (--export identifiers con segnatura come IntStore, -- IntStore IntStore, -- IntStore … update -- IntStore -> Location -> Int -> IntStore update -- IntStore -> Location -> Int -> IntStore )where )where -- import: moduli importati import Location -- definizioni: dati e operazioni data IntStore = Sto[ (Location,Int) ] newIntStore:: IntStore newIntStore = Sto [] value:: IntStore -> Location -> Int value(Sto []) v = 0 --value(Sto ((u,n):rs)) v -- | (u==v) = n -- | otherwise = value(Sto rs) v update:: IntStore -> Location -> Int -> IntStore update(Sto s) u n = Sto ((u,n):s) module WorkingModule where import IntStore -- test s0 = newIntStore s1 = update newIntStore (L "loc0") 26 s2 = update (update s1 (L "Loc1") 2) (L "Loc7") 0 s3 = update s2 (L "Loc0") (-12) Il caricamento di IntStore è regolare ERROR - Undefined constructor function "L" Occorre rendere accessibile L anche a chi importa InstStore Location Il caricamento di WorkingModule produce Non basta Mettiamo da parte Eq

7/14/20157 Accesso: Location(..) o Location? Module Location ( Location(L) -- il tipo algebrico è esportato Location(L) -- il tipo algebrico è esportato )where )where data Location = L String module IntStore (--export identifiers con segnatura IntStore, -- IntStore IntStore, -- IntStore Location(..) -- esporta Location con i costruttori Location(..) -- esporta Location con i costruttori … update -- IntStore -> Location -> Int -> IntStore update -- IntStore -> Location -> Int -> IntStore )where )where -- import: moduli importati import Location -- definizioni: dati e operazioni data IntStore = Sto[ (Location,Int) ] newIntStore:: IntStore newIntStore = Sto [] value:: IntStore -> Location -> Int value(Sto []) v = 0 --value(Sto ((u,n):rs)) v -- | (u==v) = n -- | otherwise = value(Sto rs) v update:: IntStore -> Location -> Int -> IntStore update(Sto s) u n = Sto ((u,n):s) module WorkingModule where import IntStore -- test s0 = newIntStore s1 = update newIntStore (L "loc0") 26 Module Location ( Location, -- esportato senza costruttori (ADT) Location, -- esportato senza costruttori (ADT) loc-- String -> Location loc-- String -> Location )where )where data Location = L String loc:: String -> Location loc s = L s module WorkingModule where import IntStore -- test s0 = newIntStore s1 = update newIntStore (loc "loc0") 26 module IntStore (--export identifiers con segnatura IntStore, -- IntStore IntStore, -- IntStore Location, -- esporta ADT Location, -- esporta ADT loc, -- esporta ADT loc, -- esporta ADT … update -- IntStore -> Location -> Int -> IntStore update -- IntStore -> Location -> Int -> IntStore )where )where -- import: moduli importati import Location … update:: IntStore -> Location -> Int -> IntStore update(Sto s) u n = Sto ((u,n):s)

7/14/20158 Esempi: Store e Eq module IntStore (--export identifiers con segnatura IntStore, -- IntStore IntStore, -- IntStore Location, -- esporta Location con i costruttori Location, -- esporta Location con i costruttori loc, -- String -> Location loc, -- String -> Location … update -- IntStore -> Location -> Int -> IntStore update -- IntStore -> Location -> Int -> IntStore )where )where -- import: moduli importati import Location -- definizioni: dati e operazioni data IntStore = Sto[ (Location,Int) ] type Location = String newIntStore:: IntStore newIntStore = Sto [] value:: IntStore -> Location -> Int value(Sto []) v = 0 value(Sto ((u,n):rs)) v | (u==v) = n | (u==v) = n | otherwise = value(Sto rs) v | otherwise = value(Sto rs) v update:: IntStore -> Location -> Int -> IntStore update(Sto s) u n = Sto ((u,n):s) Module Location ( Location -- esportato senza costruttori (ADT) Location -- esportato senza costruttori (ADT) loc -- String -> Location loc -- String -> Location )where )where data Location = L String deriving(Eq) loc:: String -> Location loc s = L s module WorkingModule where import IntStore -- test s0 = newIntStore s1 = update newIntStore (loc "loc0") 26

7/14/20159 Esempi: Store come funzione e Show module IntStore( IntStore, Location(..), Location(..), newIntStore, -- IntStore newIntStore, -- IntStore value, -- IntStore -> Location -> Maybe Int value, -- IntStore -> Location -> Maybe Int update -- IntStore -> Location -> Int -> IntStore update -- IntStore -> Location -> Int -> IntStore ) where import Location data IntStore = Sto (Maybe(Location -> Int)) [Location] dom:: IntStore -> [Location] dom (Sto _ l) = l size:: IntStore -> Int size (Sto _ l) = length l … (continued) module Location( Location(..) Location(..) ) where ) where data Location = L Int deriving(Eq) instance Show Location where show (L n) = "%" ++ (show n) show (L n) = "%" ++ (show n) module WorkingModule where import IntStore -- test s0 = newIntStore s1 = update newIntStore (L 0) 26

7/14/ Esercizi:  Store. Modificare il modulo IntStore in modo tale che l’implementazione dell’ADT utilizzi funzioni da Location -> Val. Allo scopo si fornisca anche un ADT per Val di classe Eq e Show. Location -> Val. Allo scopo si fornisca anche un ADT per Val di classe Eq e Show.  Store. Modificare le definizioni precedenti in modo tale che Val sia un unione polimorfa di tre differenti tipi, Location sia anche di classe Show, e Store abbia una operazione polimorfa per allocazione e tipi, Location sia anche di classe Show, e Store abbia una operazione polimorfa per allocazione e inizializzazione (al valore di default) delle locazioni. inizializzazione (al valore di default) delle locazioni.  Set. Definire un ADT polimorfo per insiemi di valori di tipo a, equipaggiato con valore empty, operazioni union, set, choice, e predicato isIn: tutte con l’usuale significato. In particolare, set, applicato ad un valore union, set, choice, e predicato isIn: tutte con l’usuale significato. In particolare, set, applicato ad un valore di v calcola il singoletto v, mentre choice, applicata ad un Set, s0, non empty, calcola una coppia (u,s1) tali di v calcola il singoletto v, mentre choice, applicata ad un Set, s0, non empty, calcola una coppia (u,s1) tali che: 1) isIn u s0 == False, 2) union (set u) s1 == s0. che: 1) isIn u s0 == False, 2) union (set u) s1 == s0.  Set. Si definisca un modulo WSet che importi il modulo Set di esercizio precedente, e fornisca - le operazioni interset, che calcola intersezione, e size, che calcola la cardinalità - le operazioni interset, che calcola intersezione, e size, che calcola la cardinalità - un ADT polimorfo per insiemi di valori di quattro possibili tipi polimorfi. Il nuovo ADT fornisce - un ADT polimorfo per insiemi di valori di quattro possibili tipi polimorfi. Il nuovo ADT fornisce le sole operazioni union, interset, empty e isIn. le sole operazioni union, interset, empty e isIn.  unify. Scrivere tre moduli: Terms, Substitution, Unify. Terms contiene un ADT per termini tipi con variabili, funzione, coppia, lista. Substitution contiene un ADT per sostituzioni. Unify contiene una variabili, funzione, coppia, lista. Substitution contiene un ADT per sostituzioni. Unify contiene una funzione che implementa l’algoritmo di unificazione visto nel corso. funzione che implementa l’algoritmo di unificazione visto nel corso.