Zelfgemaakt datatype voor bomen nMet functies data Tree a = Bin (Tree a) (Tree a) | Leaf a foldTree :: Tree a  b foldTree (b,lf) (Bin le ri) = b (foldTree.

Slides:



Advertisements
Verwante presentaties
Algoritmen en Datastructuren
Advertisements

HM-ES-th1 Les 9 Hardware/Software Codesign with SystemC.
JQuery en ASP.NET Bart De Meyer.
Taaltheorie en Taalverwerking Week 4: Parseer-algoritmes.
JAVA1 H 16. MULTITHREADING. 1. INLEIDING. Threads: delen van het programma die in concurrentie met elkaar gelijktijdig in executie gaan. Thread is een.
Basiscursus Informatica, College 7, H 7 1 Basiscursus Informatica 98/991 Basiscursus Informatica College 7, Data Structures Brookshear H7 Richard.
MagentaPurpleTeal PinkOrangeBlue LimeBrown RedGreen Introductie C# /.NET
SQL VOOR BIOLOGEN © 2011 M.L. Hekkelman CMBI Radboud UMC.
Biml en Data Vault.
OOS Object geOrienteerd Software-ontwerp - 4 Codeerperikelen Singleton Specificeren Scheiding GUI en Domein Facade.
AAHA (voor intern gebruik)
Omgevingen zijn dan geïmplementeerd als Symbol Tables. Symbol Table mapt een symbool met een Binding Meerdere noties van binding –Meerdere manieren te.
Modula vs Java MODULE Show; CONST PI = ; TYPE PointRc = RECORD x,y : INTEGER; speed : REAL; angle : REAL; END; VAR a,b : PointRc; BEGIN.
Informatica Universiteit AntwerpenScripting 5.1 Informatica 1rste BAC Biologie Hoofdstuk 5 Scripting.
Programming for Linguists An Introduction to Python 29/11/2012.
Polymorf zoeken zoek :: (a  a  Bool)  [ (a, b) ]  a  b zoek eq [ ] x = ??? zoek eq ((a,b):ts) x | eq a x = b | otherwise = zoek eq ts x MayBe b No.
Functies op Proposities evalueer:: Bedeling  Prop  Bool tautologie:: Prop  Bool contradictie:: Prop  Bool equivalentie:: Prop  Prop  Bool vervulbaar::
Server side scripting 1 Webtechnologie Lennart Herlaar.
1/1/ / faculty of Computer Science eindhoven university of technology 5JJ20:Computerarchitectuur 2M200:Inleiding Computersystemen Sessie 7(2): Vertalen.
Algoritmiek Arrays: wat zijn dat en wat kun je ermee? Loops: hoe hou je ze in bedwang? Hoorcollege 6 - Ma. 9 okt L.M. Bosveld-de Smet.
1 Ben Bruidegom AMSTEL-instituut Universiteit van Amsterdam Reehorstconferentie 2007 NLT-module Digitale Techniek Ontwerpen van digitale schakelingen met.
1Ben Bruidegom A Harvard Machine Calculator Calculator  Computer.
1 Woudschotenconferentie 2006 Ben Bruidegom AMSTEL-instituut Universiteit van Amsterdam NLT-module Digitale Techniek Ontwerpen van digitale schakelingen.
1Ben Bruidegom A Harvard Machine Recapitulatie Calculator Calculator  Calculator met “loopjes” Calculator met “loopjes”  Processor.
Inleidend probleem Data structuur (hiërarchie van classes)
Databases I (H.3) Het Entity-Relationship Model Wiebren de Jonge Vrije Universiteit, Amsterdam versie 2003.
Functies als Getallen Jan Martin Jansen.
3.6 Architecture of HIS. 3.7 Integrity & Integration within HIS Suraja Padarath /10/2007.
Algoritmen en Datastructuren (ALDAT) EVMINX4 Week 6.
Algoritmen en Datastructuren (ALDAT) EVMINX4 Dagdeel 2.
GESPRG Les 8 Gestructureerd programmeren in C. 101 Array Meerdere variabelen van hetzelfde type kun je samennemen in één array variabele. Stel in een.
GESPRG Les 12 Gestructureerd programmeren in C. 152 Huiswerk Uitwerking void reverse(int a[], int n) { int first = 0, last = n - 1; while (first < last)
Char en String nCharéén letter uord ::Char  Int uchr ::Int  Char nString[Char] uwords :: String  [String] uunwords :: [String]  String ”hoi” ”CKI”
Reguliere talen nReguliere grammatica: versimpelde Contextvrije grammatica nFinite-state Automaton: andere manier om een taal te beschrijven nReguliere.
Opg.1a: substring } String substring(int a) { int t; for (t=a; t
Opgave 1a: afronden int n=5; double a, b, c, d; a = n * 1.5; b = n * 3 / 2; c = n / 2 * 3; d = 3 / 2 * n; a b c d
Een echte re stack-machine nMemory nRegisters R0 R1 R2 R3 R4 PC SP MP nMemory uProgram uStack uMemory nRegisters uProgr.counter uStack pointer uMark pointer.
Hoorcollege 7 Collections, arrays. Programma ‘Snowflakes’ Sneeuwvlok object.
1 Van Harvard naar MIPS. 2 3 Van Harvard naar MIPS Microprocessor without Interlocked Pipeline Stages Verschillen met de Harvard machine: - 32 Registers.
Opleiding INFORMATICA Programmeertaal Implementatie Taal ontwerp Vertalen.
Algoritmiek Strings & Stringmanipulaties; Controle Structuren; Floating-point notation. Hoorcollege 4 - Ma. 25 sept L.M. Bosveld-de Smet.
DB&SQL8- 1 VBA Visual Basics for Applications: eigen Office versie vanaf Office2000 gelijk voor alle applicaties Programmeren onder meer nodig voor Het.
JAVA1 H 22. COLLECTIONS FRAMEWORK. 1. INLEIDING. Collections framework Is een verzameling van data structuren, interfaces en algoritmen Meest voorkomende.
Visual Basic.Net - Overzicht
Computerarchitectuur
KPRES1 : C vervolg Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology Les 2 sheet 1 Wat gaan we doen:  Een (vaste) melodie.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag Het ARM bord met wat library functies.
1Security Technology PICT les 1 ICT Techniek - les 6 - onderwerpen Verbetering systeemprestaties  Cache  Risc/Cisc  Pipelining  Superscalair.
Security Technology PICT les 1
DU2PRES1 : C vervolg Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Beginselen van C opgaves… volgende week: ARM.
Hoofdstuk 2 Java. Soorten Java-programma’s nJava Applet programma “leeft” op een WWW-pagina nJava Application programma heeft een eigen window nJavascript.
Hoofdstuk 9 Objecten en klassen.
Web Applicaties Bouwen met Visual Studio .NET
TOPIC O: Pointers | pag. 1 Pointer = adres in het geheugen, is zelf geen geheugen! Expliciet geheugen aanvragen vóór gebruik.
Computertechniek 2 – ARM assembler Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1  herhaling ARM assembler instructies.
1/1/ / faculty of Computer Science eindhoven university of technology 5B040:Computerarchitectuur 2M200:Inleiding Computersystemen Sessie 9(2): Virtual.
Hoofdstuk 5 Interactie. Controls Form Label Button Label TextBox.
C++ C++ als een verbetering van C Abstracte datatypen met classes Constructoren en destructoren Subklassen binding van functies 1.
Computertechniek Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 C programmeren voor niet-C programmeurs les 2 definitie.
1 OMI Modelleren van content. 2 Vocabulary Content “gevangen” in begrippenapparaat: Vocabulary: lijst met termen nauwelijks semantiek Ontology:
Inleiding computersystemen en netwerken deel 3 Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 3.1 Peter Kramer Mail:
Samenvatting hst. 3 sec. 1-3 ( ) :: Parser a b  Parser a b  Parser a b ( ) :: Parser a (b  c)  Parser a b  Parser a c ( ) :: (b  c)  Parser a b.
Hoofdstuk 11.3 Algoritmen: Zoeken in een netwerk.
Tentamen vraag 1 Als L en M talen zijn, dan nL  M is gelijk aan { s  t | s  L, t  M } nL M is gelijk aan { s t | s  L, t  M } nL n is gelijk aan.
Energie op school. Energiebesparing op school tot 20%
Definitie LL(1) Een grammatica is LL(1) nAls je op grond van het eerstvolgende input-symbool kunt kiezen uit alternatieven Formeel: nAls de lookahead-sets.
Definitie Taal van een grammatica nZij grammatica G = ( T, N, R, S ) nde taal van G is { z  T* | S  * z } L(G)
Tentamen vraag 1 nElke reguliere zin is ook contextvrij nElke reguliere taal is ook contextvrij nElke contextvrije grammatica is ook regulier nonsens “regulier”
eval (Add x y) = add (eval x) (eval y)
Chapter 1: Introduction
Transcript van de presentatie:

Zelfgemaakt datatype voor bomen nMet functies data Tree a = Bin (Tree a) (Tree a) | Leaf a foldTree :: Tree a  b foldTree (b,lf) (Bin le ri) = b (foldTree (b,lf) le) (foldTree (b,lf) ri) foldTree (b,lf) (Leaf x) = lf x bbbbbb (, )  abab foldTree :: (b  b  b, a  b)  Tree a  b foldTree (b,lf) = f where f (Bin le ri) = b (f le) (f ri) f (Leaf x) = lf x

Voorbeelden van algebras data Tree a = Bin (Tree a) (Tree a) | Leaf a type TreeAlgebra a b = ( b  b  b, a  b ) data Expr = Add Expr Expr | Mul Expr Expr | Con Int type ExprAlgebra b = ( b  b  b, b  b  b, Int  b ) data Expr = Add Expr Expr | Mul Expr Expr | Con Int | Var String type ExprAlgebra b = ( b  b  b, b  b  b, Int  b, String  b )

Definitie “een algebra” nEen algebra bestaat uit ueen type ufuncties in een tupel countLeafsFuns :: TreeAlgebra a Int countLeafsFuns = ( (+), \x  1 ) nEen algebra bestaat uit ueen type dat het resultaat is van een fold, die ufuncties in een tupel neerzet in plaats van constructorfuncties nEen algebra voor een datatype bestaat uit ueen type dat het resultaat is van een fold, die ufuncties in een tupel neerzet in plaats van constructorfuncties van dat datatype “carrier set” “semantiek”

Algebras voor wederzijds recursieve datatypes data Stat a = Assign String (Expr a) | Print (Expr a) | Block [Stat a] data Expr a = Con a | Var String | Add (Expr a) (Expr a) type StatExprAlgebra a s e = ( ( String  e  s, e  s, [ s ]  s ), ( a  e, String  e, e  e  e ) ) foldStatExpr :: StatExprAlgebra a s e  Stat a  s foldStatExpr ((f1,f2,f3),(g1,g2,g3)) = f where f (Assign x e)= f1 x (g e) f (Print e)= f2 (g e) f (Block ss)= f3 (map f ss) g (Con c)= g1 c g (Var x)= g2 x g (Add e1 e2)= g3 (g e1) (g e2)

Definitie van foldExpr data Expr = Add Expr Expr | Mul Expr Expr | Con Int type ExprAlgebra b = ( b  b  b, b  b  b, Int  b ) foldExpr :: ExprAlgebra b  Expr  b foldExpr (a,m,c)= f where f (Add e1 e2)= a(f e1) (f e2) f (Mul e1 e2)= m(f e1) (f e2) f (Con n)= c n

Gebruik van ExprAlgebra data Expr = Add Expr Expr | Mul Expr Expr | Con Int type ExprAlgebra b = ( b  b  b, b  b  b, Int  b ) evalExpr :: Expr  Int evalExpr = foldExpr evalExprAlgebra evalExprAlgebra :: ExprAlgebra Int evalExprAlgebra = ( (+), (*), id )

Taal: syntax en semantiek “ * 5 ” Add (Con 3) (Mul (Con 4) (Con 5)) parseExpr evalExpr 23 = start p where p = … … … = fold a where a = (…,…,…,…)

Compositionaliteit nEen semantiek is compositioneel als de betekenis van een geheel een functie is van de betekenissen van de delen eval (Add x y) = add (eval x) (eval y) nEen compositionele semantiek kun je schrijven als fold over de expressie waarbij een algebra vervangingen geeft voor de constructoren

Verschillende semantieken “ * 5 ” Add (Con 3) (Mul (Con 4) (Con 5)) 23 evalExpr compileExpr Push 3 Push 4 Push 5 Apply (*) Apply (+) runExpr parseExpr :: String :: Expr :: Int:: Code = fold a where a = (…,…,…,…) a::ExprAlgebra Int = fold a where a = (…,…,…,…) a::ExprAlgebra Code

De compileer-semantiek nWat is “machinecode” ? nWat is een “machine-instructie” ? type Code = [ Instr ] data Instr = Push Int | Apply (Int  Int  Int)

Compiler: genereren van Code data Expr = Add Expr Expr | Mul Expr Expr | Con Int type ExprAlgebra b = ( b  b  b, b  b  b, Int  b ) evalExpr :: Expr  Int evalExpr = foldExpr evalExprAlgebra where evalExprAlgebra :: ExprAlgebra Int evalExprAlgebra = ( (+), (*), id ) compExpr :: Expr  Code compExpr = foldExpr compExprAlgebra where compExprAlgebra :: ExprAlgebra Code compExprAlgebra = ( add, mul, con ) mul :: Code  Code  Code mul c1 c2 = c1 ++ c2 ++ [Apply (*)] con n = [ Push n ]

Verschillende semantieken “ * 5 ” Add (Con 3) (Mul (Con 4) (Con 5)) 23 evalExpr compileExpr Push 3 Push 4 Push 5 Apply (*) Apply (+) runExpr parseExpr :: String :: Expr :: Int:: Code = fold a where a = (…,…,…,…) a::ExprAlgebra Int = fold a where a = (…,…,…,…) a::ExprAlgebra Code

Runner: simulatie van processor run :: Code  Stack  Stack run [ ] stack = stack run (instr:rest) stack = exec instr stack run rest ( ) exec :: Instr  Stack  Stack exec (Push x) stack= x : stack exec (Apply f) (y:x:stack)= f x y : stack runExpr :: Code  Int runExpr prog = run prog [ ] head ( )

Compiler correctheid evalExpr “ * 5 ” Add (Con 3) (Mul (Con 4) (Con 5)) 23 compileExpr Push 3 Push 4 Push 5 Apply (*) Apply (+) runExpr parseExpr runExpr (compileExpr e) = evalExpr e

Uitrekenen van expressies met variabelen data Expr = Add Expr Expr | Mul Expr Expr | Con Int type ExprAlgebra b = ( b  b  b, b  b  b, Int  b ) evalExpr :: Expr  Int evalExpr = foldExpr eAlgebra where eAlgebra :: ExprAlgebra Int eAlgebra = ( (+), (*), id ) data Expr = Add Expr Expr | Mul Expr Expr | Con Int | Var String type ExprAlgebra b = ( b  b  b, b  b  b, Int  b, String  b ), ???? ) evalExpr :: Env  Expr  Int evalExpr env = foldExpr eAlgebra where eAlgebra :: ExprAlgebra Int eAlgebra = ( (+), (*), id, ???? ), (env ?) ) BAD !!!

Uitrekenen van expressies met variabelen data Expr = Add Expr Expr | Mul Expr Expr | Con Int | Var String type ExprAlgebra b = ( b  b  b, b  b  b, Int  b, String  b ) evalExpr :: Expr  Env  Int evalExpr env = foldExpr eAlgebra where eAlgebra :: ExprAlgebra Int eAlgebra = ( (+), (*), id, (env?) ) evalExpr :: Expr  (Env  Int) evalExpr = foldExpr eAlgebra where eAlgebra :: ExprAlgebra Int eAlgebra = ( add, mul, con, var ) (Env  Int) evalExpr’ :: Expr  Int evalExpr’ expr = evalExpr expr [ ]

Uitrekenen van expressies met definities evalExpr :: Expr  Env  Int evalExpr env = foldExpr eAlgebra where eAlgebra :: ExprAlgebra (Env  Int) eAlgebra = ( add, mul, con, var ) data Expr = Add Expr Expr | Mul Expr Expr | Con Int | Var String type ExprAlgebra b = ( b  b  b, b  b  b, Int  b, String  b ), def ) data Expr = Add Expr Expr | Mul Expr Expr | Con Int | Var String | Def String Expr Expr type ExprAlgebra b = ( b  b  b, b  b  b, Int  b, String  b, String  b  b  b )

Uitrekenen van expressies met definities add :: b  b  b (Env  Int) Env  Int mul :: b  b  b (Env  Int) Env  Int con :: Int  b Env  Int var :: String  b Env  Int def :: String  b  b  b (Env  Int) Env  Int mul f g e = f e * g e con n e =n var x e =e ? x def x fd fb e =fb e(x, )( : )fd e con = const var = flip (?) def = ( ) add f g e =f e + g e

Verschillende semantieken “ * 5 ” Add (Con 3) (Mul (Con 4) (Con 5)) 23 evalExpr compileExpr Push 3 Push 4 Push 5 Apply (*) Apply (+) runExpr parseExpr :: String :: Expr :: Int:: Code = fold a where a = (…,…,…,…) a::ExprAlgebra Int = fold a where a = (…,…,…,…) a::ExprAlgebra Code

add :: b  b  b mul :: b  b  b con :: Int  b var :: String  b def :: String  b  b  b Compileren van expressies met definities mul f g e = con n e =[ Push n ] var x e =e ? x def x fd fb e =fb ( (x, fd e) : e ) add f g e = f e ++ g e ++ [Apply (+)] (Env  Code) Env  Code (Env  Code) Env  Code (Env  Code) Env  Code f e ++ g e ++ [Apply (*)]

Wat zit er in het Env ? nevalExpr ncompExpr type Env = [ (String, Int) ] type Env = [ (String, Code) ]

Compiler correctheid expressies met definities evalExpr “ * 5 ” Add (Con 3) (Mul (Con 4) (Con 5)) 23 compileExpr Push 3 Push 4 Push 5 Apply (*) Apply (+) runExpr parseExpr hd (run (compileExpr e) s) = evalExpr e runExpr (compileExpr e env) = evalExpr e env

Voorbeeld compileren van expressie “ 3+4*5 ” Push 3 Push 4 Push 5 Apply (*) Apply (+) Push 3 Push 2 Apply (+) Push 5 Apply (*) Apply (+) parseExpr compileExpr “ let x=2+2 in 3+x*5 ” parseExpr compileExpr Push 2 Apply (+) x

Voorbeeld compileren van expressie Push 3 Push 2 Apply (+) Push 5 Apply (*) Apply (+) “ let x=2+2 in 3+x*5 ” parseExpr compileExpr Push 2 Apply (+) x “ let x=2+2 in 3+x*x ” parseExpr compileExpr Push 3 Push 2 Apply (+) Push 2 Apply (+) Apply (*) Apply (+)

De compileer-semantiek nWat is “machinecode” ? nWat is een “machine-instructie” ? type Code = [ Instr ] data Instr = Push Int | Apply (Int  Int  Int) data Instr = Push Int | Apply (Int  Int  Int) | Load Adres | Store Adres Aanpassing van

add :: b  b  b mul :: b  b  b con :: Int  b var :: String  b def :: String  b  b  b Efficient compileren van expressies met definities mul f g e = con n e =[ Push n ] var x e =e ? x def x fd fb e =fb ( (x, fd e) : e ) add f g e = f e ++ g e ++ [Apply (+)] (Env  Code) Env  Code (Env  Code) Env  Code (Env  Code) Env  Code f e ++ g e ++ [Apply (*)] [ Load (e?x) ] fd e ++ [Store a] ++ fb ((x,a):e) where a = length e

Wat zit er in het Env ? nevalExpr ncompExpr nefficientCompExpr type Env = [ (String, Int) ] type Env = [ (String, Code) ] type Env = [ (String, Adres) ]

Runner: simulatie van processor run :: Code  Stack  Stack run [ ] stack = stack run (instr:rest) stack = exec instr stack run rest ( ) exec :: Instr  Stack  Stack exec (Push x) stack= x : stack exec (Apply f) (y:x:stack)= f x y : stack runExpr :: Code  Int runExpr prog = run prog [ ] head ( )

Runner: aangepaste simulatie van processor run :: Code  (Mem,Stack)  (Mem,Stack) run [ ] ms = ms run (instr:rest) ms = exec instr ms run rest ( ) exec :: Instr  (Mem,Stack)  (Mem,Stack) exec (Push x) (m, st)= (m, x : st ) exec (Apply f) (m, y:x:st)= (m, f x y : st ) exec (Load a) (m, st)= (m, m!a : st ) exec (Store a) (m, x: st)= (update m a x, st )

Voorbeeld Blokgestructureerde talen “ use x ;dcl x ;{use z ;use y ;dcl x ;dcl z ;use x } ;dcl y ;use y ” Enter (0,2) Access(0,0) Enter (1,2) Access (1,1) Access (0,1) Access (1,0) Leave (1,2) Access(0,1) Leave (0,2) parsecompile

Definitie van Block-type, -algebra & -fold data Block = Cons Stat Block | Empty data Stat = Decl Naam | Use Naam | Blk Block type BlockAlgebra b s = ( ( s  b  b, b ), ( Naam  s, Naam  s, b  s ) foldBlock :: BlockAlgebra b s  Block  b foldBlock ((c,e),(d,u,b))= f where f (Cons (s:b))= c (g s) (f b) f Empty= e g (Decl x)= d x g (Use x)= u x g (Blk n)= b (f n)

Compileren van een Block compBlock :: Block  Code compBlock = foldBlock cAlg where cAlg :: BlockAlgebra Code cAlg = ( (c,e), (d,u,b)) where c = … e = … d = … u = … b = … (Env  Code) Env  Code (GEnv  LEnv  Code) (GEnv  LEnv  (LEnv,Code)) Inherited attribuut Synthesized attribuut