mosaic manipola oggetti primitivi (ruota e unisci) regole:

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Strutture dati per insiemi disgiunti
IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.
Estendere i linguaggi: i tipi di dato astratti
Sommario Nelle lezioni precedenti abbiamo introdotto tutti gli elementi che formano un particolare tipo di linguaggio logico, denominato linguaggio predicativo.
Sintassi (prima parte)
Semantica di linguaggi di programmazione Ne esistono differenti stili a seconda di paradigma di programmazione uso (validazione, prototyping, verifica.
Type Checking (1° parte)
Generazione di Codice Intermedio
Algoritmi e Programmazione
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Fondamenti di Informatica I a.a Il linguaggio C Il preprocessore La sostituzione di macro Le compilazioni condizionali Linclusione di file C.
Strutture dati elementari
Alberi binari di ricerca
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Semantica Denotazionale
Semantiche dei linguaggi di programmazione
FUNZIONI DI BIBLIOTECA
Iterazione enumerativa (for)
Fondamenti di Informatica II Ingegneria Informatica / Automatica (A-I) Meccanica Prof. M.T. PAZIENZA a.a – 3° ciclo.
Fondamenti di Informatica 2 Ingegneria Informatica Docente: Giovanni Macchia a.a
Il problema del dizionario
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Capitolo 4 Ordinamento: Heapsort Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Interrogazioni su un albero binario di ricerca Search(S,k) – dato un insieme S ed un valore chiave k restituisce un puntatore x ad un elemento in S tale.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Allocazione dinamica della memoria
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Assegnamento di valore a una variabile Anno Accademico 2009/2010.
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
Algoritmi e Strutture Dati Alberi Binari di Ricerca.
LISP.
Introduzione alla programmazione lll
Fondamentidi Programmazione Corso: Fondamenti di Programmazione Classe: PARI-DISPARI Docente: Prof. Luisa Gargano Testo: Aho, Ulman, Foundations of Computer.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
Modello dati ALBERO Albero: Albero: insieme di punti chiamati NODI e linee chiamate EDGES EDGE: linea che unisce due nodi distinti Radice (root): in una.
-calcolo Vogliamo studiare le problematiche relative al meccanismo di chiamata di funzione (eg differenze fra binding statico e dinamico) in isolamento.
1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.
Esercizi su alberi binari
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
Il Linguaggio C.
AN FI Un denominatoe comune Comandi u notazioni che esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno.
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
DEFINIZIONE DI NUOVE FUNZIONI & STRATEGIE DI COMPOSIZIONE La capacità di definire nuove funzioni permette: di definire nuove operazioni di introdurre variabili.
INSIEMI NUMERABILI L’analisi matematica introduce il concetto di insieme numerabile come insieme i cui elementi possono essere “contati” ossia che possiede.
LINGUAGGI DI PROGRAMMAZIONE
AN FI Un denominatoe comune Lo stile funzionale Concetti fondamentali.
Il linguaggio C Le funzioni C Language Il passaggio dei parametri
Esecuzione dei programmi Prolog Liste ed operatori aritmetici
Alberi binari Definizione della struttura dati: struct tree { };
Complessità di un algoritmo
Sistemi e Tecnologie Informatiche Ricorsione Umberto Ferraro Petrillo.
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
Introduzione a Javascript
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
Allievi Elettrici - AA Le funzioni ricorsive in C
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”
Algoritmi e Strutture Dati Strutture Dati Elementari.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Nucleo di Java: Struttura e Semantica Espressioni Assegnamento Controllo di sequenza Dichiarazioni.
Grammatiche Grammatiche libere da contesto Grammatiche regolari
public class volume { public static void main (String[] args) { final double bott_vol =2.0; final double latt_vol = 0.355; int bott_num = 4; int latt_num.
Elementi di semantica denotazionale ed operazionale
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.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

mosaic manipola oggetti primitivi (ruota e unisci) regole: un mosaico è uno dei pezzi primitivi si ottiene ruotano di 90° in senso orario un mosaico si ottiene unendo un mosaico a destra di un mosaico della stessa altezza niente altro è un mosaico

sintassi di espressioni che denotano mosaici E è una espressione se E è a E è b E è ruota(E1) e E1 è un’espressione E è unisci(E1,E2), e E1 e E2 sono espressioni niente altro è espressione <espressione>::= a | b | ruota(<espressione>) | unisci(<espressione>,<espressione>)

semantica delle espressioni specifica il mosaico denotato da un’espressione unisci(ruota(ruota(b)),a) che mosaico definisce?

funzioni definite dall’utente fun controruota(x) = ruota(ruota(ruota(x))) fun impila(x,y) = controruota(unisci(ruota(y),ruota(x)))

let <dichiarazione> in <espressione> end let dichiarazioni locali let <dichiarazione> in <espressione> end let fun controruota(x) = ruota(ruota(ruota(x))) fun impila(x,y) = controruota(unisci(ruota(y),ruota(x))) in impila(controruota(b),ruota(b)) denota il mosaico precedente espressione let o let-binding

dichiarazione di valore nomi per valori definiti dall’utente val <nome> = <espressione> let val x = E1 in E2 end dice che l’occorrenza del nome x nell’espressione E2 rappresenta il valore di E1 let val no = controruota(b) val se = ruota(b) in impila(no,se) end dichiarazione di valore espressione precedente con nomi più significativi

discussione: abbiamo lasciato in sospeso molti punti notazione: nell’espressione unisci(a,b) la funzione unisci è scritta prima dei suoi argomenti; esistono altre notazioni? valutazione: nel valutare l’espressione E1 e E2 si valuta prima E1 e poi E2 ? e se la prima espressione influenza la seconda? funzioni: cosa succede se una funzione è definita in termini di se stessa? ambito dei nomi: cambiare i nomi può cambiare il significato di una espressione? checking: cosa succede se una funzione riceve meno argomenti di quelli previsti, o argomenti di tipo diverso?

Notazioni per le espressioni infissa (a+b) prefissa (+ab) costante o variabile op applicato a a e b si scrive op a b postfissa (ab+)

associatività e precedenza come si valuta a + b * c ?? - parentesi precedenza fra operatori raggruppati da sinistra verso destra operatori associativi a sinistra (es. sottrazione) operatori associativi a destra (es. potenza)

rappresentazione ad albero di un’espressione radice -> operatore per ogni operando figlio della radice -> sottoalbero per l’operando b*b-4*a*c _ * * b b c * 4 a

alberi astratti: denotano la struttura dell’espressione senza tener conto della notazione l’albero dell’esempio precedente è lo stesso per le tre notazioni prefissa: -*bb**4ac infissa: b*b-4*a*c postfissa: bb*4a*c*-

Valutazione di espressioni in generale, per valutare (E op F) si valutano E ed F in qualche ordine e si applica ai valori risultanti l’operatore op - valutazione come riscrittura di alberi - valutazione tramite stack

valutazione come riscrittura di alberi infissa 7 * 7 – 4 * 2 * 3 = 49 – 4 * 2 * 3 = 49 – 8 * 3 = 49 – 24 = 25 postfissa 7 7 * 4 2 * 3 * – = 49 4 2 * 3 * – = 49 8 3 * – = 49 24 – = 25

_ _ * * 49 * 7 7 3 * 3 * 4 2 4 2 _ _ 49 * 49 24 25 3 8

valutazione tramite stack espressione in notaz. postfissa leggere da sinistra a destra se c’è una costante c, push(c) se c’è un operatore binario op, push(pop op pop) risultato = top

valutazione tramite stack espressione stack azione 7 7 * 4 2 * 3 * – 7 push 7 7 7 * 4 2 * 3 * – 7 7 push 7 7 7 * 4 2 * 3 * – 49 mult 7 7 * 4 2 * 3 * – 49 4 push 4 7 7 * 4 2 * 3 * – 49 4 2 push 2 7 7 * 4 2 * 3 * – 49 8 mult 7 7 * 4 2 * 3 * – 49 8 3 push 3 7 7 * 4 2 * 3 * – 49 24 mult 7 7 * 4 2 * 3 * – 25 subtr

Dichiarazioni e applicazioni di funzione funzioni come corrispondenze f : A -> B mappa gli elementi del dominio in quelli del codominio f è totale se associa ad ogni elemento di A uno di B f è parziale se è indefinita per qualche elemento di A

funzioni come algoritmi una dichiarazione di funzione è formata da nome parametri regola per calcolare il risultato partendo dai parametri dichiarazione: fun <nome> (<parametri formali>) = <corpo> applicazione: <nome>(<parametri attuali>) es. fun successore (n) = n+1; successore(2+3)

valutazione (attivazione) innermost <nome>(<parametri attuali>) è calcolata: - valuta le espressioni in <parametri attuali> - sostituisci i risultati ai parametri formali nel corpo della funzione valuta il corpo restituisci il valore come risposta la tecnica è detta anche chiamata per valore

valutazione selettiva if <condizione> then <espr1> else <espr2> fun abs(n)= if n >= 0 then n else 0-n fun or(n)= if x = true then true else if y = true then true else false

funzioni ricorsive una funzione f è ricorsiva se il suo corpo contiene un’applicazione di f (o se può attivare se stessa, anche indirettamente); ad esempio fun fib(n)= if (n=0 or n=1) then 1 else fib(n-1)+fib(n-2) la funzione è valutata come sempre: i parametri attuali sono calcolati e sostituiti nel corpo della funzione esempio: fib(4).

if n=0 then 1 else n*fattoriale(n-1) ricorsione lineare una funzione f è ricorsiva lineare se una attivazione di f(a) può attivare al più una singola attivazione di f; ad esempio fun fattoriale(n)= if n=0 then 1 else n*fattoriale(n-1) la funzione è valutata in due fasi: winding, in cui sono iniziate nuove attivazioni unwinding, in cui le attivazioni rilasciano il controllo (LIFO)

ricorsione tail una funzione f è tail ricorsiva se restituisce un valore (senza richiedere risorsione) oppure il risultato di una attivazione ricorsiva; ad esempio fun g(n,a)= if n=0 then a else g(n-1, n*a) in questo caso tutto il lavoro è fatto nella fase di winding

y non è locale; dipende dal contesto. ambito lessicale: significato dei nomi in un programma rinominare in modo consistente le variabili non cambia il valore di un’espressione; per rinominare occorre esprimere il concetto di variabile locale (bound) fun successore(x)= x+1 fun successore(n)= n+1 cosa succede se la dichiarazione di funzione fa riferimento a nomi non locali?? fun sommay= x+y successore(5) è sempre 6 y non è locale; dipende dal contesto.

regole di ambito lessicale (lexical scope rules): usano il testo del programma in cui si trova una dichiarazione di funzione per determinare il contesto di valutazione dei nomi non locali let val x=2 in x+x end il valore di una espressione non cambia se sostituiamo tutte le occorrenze di una variabile nell’ambito di un binding di x con una nuova variabile tutte le occorrenze di x in questa espressione sono nello scope (ambito) del binding (legame) binding di x

let val x=3 in let val y=4 in x*x+y*y end end let val x=2 in let val x=x+1 in x*x end end se rimpiazzo x con y nel binding più interno ottengo let val x=2 in let val y=x+1 in y*y end end l’ambito del binding di x include le due occorrenze di x in x*x+y*y l’ambito del binding di y include le due occorrenze di y in x*x+y*y

tipo di un’espressione: indica i valori che essa può rappresentare e le operazioni che possono essere applicate una espressione (un oggetto) può avere più di un tipo?? livello macchina: i valori supportati direttamente dall’architettura sono i tipi elementari (con operazioni diverse) livello del linguaggio: tipi strutturati o aggregati (con costruttori di tipo) livello utente: raggruppamenti di dati e funzioni con nomi (classi)

costruttori di insiemi (ognuno con la sua sintassi, gli elementi dell’insieme costruito, le operazioni ammesse): prodotto: AB = {(a,b) | aA, b B} primo(a,b) secondo(a,b) funzione: f:AB es: intintint (insieme di tutte le funzioni che associano un intero a una coppia di interi) sequenza: dato l’insieme A, la chiusura di Kleene (A*) sono tutte le ennuple formate a partire da A

espressione = variabile, costante, E+F, E-F, E*F, E/F regole di tipo = sistemi di tipi un insieme di regole per associare un tipo alle espressioni di un linguaggio; il sistema rigetta un’espressione se non può associare un tipo esempio espressione = variabile, costante, E+F, E-F, E*F, E/F regole di tipo = i nomi di variabili che cominciano con una lettera fra I e N sono di tipo int tutti gli altri nomi sono di tipo real un numero è real se contiene il punto decimale; tutti gli altri sono int se E ed F sono dello stesso tipo, allora E+F, E-F, E*F, E/Fsono espressioni dello stesso tipo

di che tipo è I+J ?? di che tipo è X+Y ?? di che tipo è X+J ?? operatori aritmetici a ogni operatore op è associata una regola che specifica il tipo di un’espressione E op F, partendo dai tipi di E ed F overloading simboli di operatori comuni (come + o *) sono sovraccarichi, cioè hanno significati diversi a seconda del contesto in cui sono usati. +: intintint oppure *: intintint

coercion (conversione forzata) cosa succede se sommo un int e un real??

tipi e controllo degli errori (type checking) garantisce che le operazioni in un programma siano applicate in modo proprio si verifica un errore di tipo se una funzione di tipo ST è applicata a un elemento a che non è di tipo S un programma eseguito (o compilato) senza errori di tipo si dice type safe rispetto ai tipi controllo statico (sistema forte) controllo dinamico (sistema debole)

valori associati al tipo direzione introduzione a ML le espressioni, le funzioni e i let binding usati finora sono quelli di ML datatype direzione= nord | sud | est | ovest fun sensoorario(x)= if x=nord then est else if x=est then sud else if x=sud then ovest else nord; valori associati al tipo direzione

definizione ricorsiva datatype binalbero= foglia | nonfoglia of binalbero * binalbero foglia nonfoglia(foglia, foglia) nonfoglia(foglia, nonfoglia(foglia, foglia)) definizione ricorsiva

funzione ricorsiva che conta le foglie dell’albero contafoglie(foglia)= 1 | contafoglie(nonfoglia(s,t))= contafoglie(s)+contafoglie(t) scrivere la funzione che dice se un albero è una foglia scrivere la funzione che estrae il sottoalbero destro e sinistro di un albero funzione ricorsiva che conta le foglie dell’albero

datatype intalbero= vuoto | nodo of int * intalbero * intalbero albero binario di ricerca 15 15 15 2 16 15 15 16 10 15 2 16 2 16 2 16 10 10 19 15 10 9 9 2 16 9

fun inserisci(k, vuoto) = nodo(k, vuoto, vuoto) | inserisci(k, nodo(n, s, t)) = if (k<n) then nodo(n, inserisci(k, s), t) else if (k>n) then nodo(n, s, inserisci(k, t)) else nodo(n, s, t); appartiene(k, vuoto) = false | appartiene(k, nodo(n, s, t)) = if (k<n) then appartiene(k, s) else if (k>n) then appartiene(k, t) else true;