Programmering og Problemløsning, 2017

Relaterede dokumenter
Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

Programmering for begyndere Lektion 2. Opsamling mm

Programmering og Problemløsning, 2017

Løsningsforslag Skriftlig eksamen 9. januar 2012

Dynamisk programmering

Lektion 3 Sammensætning af regnearterne

Forelæsning Uge 2 Torsdag

Lær Python dag 1 - modul 1

dynamisk geometriprogram regneark Fælles mål På MULTIs hjemmeside er der en oversigt over, hvilke Fælles Mål der er sat op for arbejdet med kapitlet.

Danmarks Tekniske Universitet

Dynamisk programmering

Forelæsning Uge 2 Mandag

Programmering og Problemløsning, 2017

Symbolbehandlingskompetencen er central gennem arbejdet med hele kapitlet i elevernes arbejde med tal og regneregler.

Dokumentation af programmering i Python 2.75

Oprids over grundforløbet i matematik

Algoritmer og invarianter

Dynamisk programmering

Induktive og rekursive definitioner

2) Det er let at være produktiv med Python, da Python som regel kun har mellem 67 og 80% færre linier end tilsvarende C eller Java kode.

Et udtryk er (som bekendt?) lineært hvis den differentierede er en konstant funktion, dvs. at den ikke afhænger af x. Betragt f lgende værdiprocedurer

Danmarks Tekniske Universitet

Syntaks og syntaksgenkendelse, særligt regulære udtryk og tilstandsmaskiner og lidt om anvendelser i bioinformatik

Forelæsning Uge 2 Mandag

Opgaver til Maple kursus 2012

JavaScript. nedarvning.

Python 3 kursus lektion 1:

PUT og INPUT funktionerne

Programmering i C Videre med C (2 af 4) 19. marts 2007

Løsningsforslag Skriftlig eksamen 3. januar 2013

Danmarks Tekniske Universitet

Et udtrykstrç med de ære regnearter, heltalskonstanter og variabler beskrives. Type Expr = Sumèplus, minus, times, div: Args, const: Int, name: Textè

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

ØVEHÆFTE FOR MATEMATIK C FORMLER OG LIGNINGER

matx.dk Enkle modeller

Kapitel 3 Betinget logik i C#

Definition : Et træ er en sammenhængende ikke-orienteret graf uden simple kredse. Sætning : En ikke-orienteret graf er et træ hvis og kun hvis der er

Bits DM534. Rolf Fagerberg, 2012

HinkeHop DE HURTIGE 5-6 ÅR. Sådan gør du: Prøv at justere aktiviteten sådan her...!

Introduktion til funktioner, moduler og scopes i Python

Eksempel: Skat i år 2000

Skriftlig eksamen i Datalogi

Programmering, algoritmik og matematik en nødvendig sammenblanding?

Rekursion og dynamisk programmering

Polynomier. Frank Villa. 26. marts 2012

Forelæsning Uge 2 Mandag

Sikre Beregninger. Kryptologi ved Datalogisk Institut, Aarhus Universitet

MIPS modulet og registerallokatoren

ØVEHÆFTE FOR MATEMATIK C FORMLER OG LIGNINGER

#AlleKanKode. Lektion 2 - Konstanter og Variabler

Divide-and-Conquer algoritmer

Sammensætning af regnearterne

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Sproget Limba. Til brug i G1 og K1. Dat1E 2003

Enigma. Et programmeringssprog. Forfatter: Niels Serup X. Y Vejleder: A B C. Fag: Programmering Uddannelsessted: N M

Fundamentale sprogbegreber

Mini-formelsamling. Matematik 1

Læringsprogram. Numeriske metoder. Matematik A Programmering C Studieområdet. Roskilde Tekniske Gymnasium Klasse 3.4

Forelæsning Uge 4 Mandag

Sproget Rascal (v. 2)

Differentiation i praksis

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16,

Divide-and-Conquer algoritmer

Skriftlig eksamen i Datalogi

Danmarks Tekniske Universitet

Ved indkøring påtrykkes en kendt amplitude (HUSK 50 ohms afslutning) og displayet aflæses.

Noter til C# Programmering Selektion

Algebra med Bea. Bea Kaae Smit. nøgleord andengradsligning, komplekse tal, ligningsløsning, ligningssystemer, nulreglen, reducering

Repræsentation af tal

Introduktion Til Konkurrenceprogrammering

Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner

Rettelser til Pilen ved træets rod

At klippe en streng over på det mest hensigtsmæssige sted

DM507 Algoritmer og datastrukturer

Exceptions i Delphi. Try except

Aritmetiske Forelæsning Pr ogrammering operatorer tir 1999 sda præcedens september 1999 Logiske Sammenligningsoperatorer operatorer præcedens

Oversættere Skriftlig eksamen onsdag d. 25. januar 2006

Tirsdag 12. december David Pisinger

Træer. Datastrukturer & Algoritmer, Datalogi C Forelæsning 9/

Åben uddannelse, Efterår 1996, Oversættere og køretidsomgivelser

Divide-and-Conquer algoritmer

Søgetræer: Generel repræsentation af (sorterede) mængder og funktioner Databasesystemer...

Et kommatal som for eksempel 1,25 kaldes også noget andet. Hvad kaldes det også?

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 10

DesignMat Den komplekse eksponentialfunktion og polynomier

TAL OG BOGSTAVREGNING

1 Opsumering fra tidligere. 2 Dagsorden 3 BIMS. 4 Programtilstande. Statements/kommandoer (Stm) i bims. 3.1 Abstrakt syntaks for bims

It og informationssøgning Forelæsning september 2006 Nils Andersen. Underprogrammer og betingelser. Standardfunktioner, typeomsætning

Side 1 af 10. Undervisningsbeskrivelse. Stamoplysninger til brug ved prøver til gymnasiale uddannelser. Termin Maj-juni 2009/10

MIPS, registerallokering og MARS

Mike Vandal Auerbach. Funktioner.

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Danmarks Tekniske Universitet

3 Algebra. Faglige mål. Variable og brøker. Den distributive lov. Potenser og rødder

Transkript:

Programmering og Problemløsning, 2017 Træstrukturer Part III Martin Elsman Datalogisk Institut Københavns Universitet DIKU 3. November, 2017 Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 1 / 19

Outline 1 Træstrukturer Part III Udtrykstræer Evaluering af Udtryk Simpel Pretty-Printing Symbolsk Differentiering Generering af LAT E X kode Simplificering af Symbolske Udtryk Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 2 / 19

Outline Udtrykstræer og Symbolsk Differentiering Emner for i dag: 1 Udtrykstræer. Sum-type definition (funktioner af en variabel) 2 Evaluering af udtryk. 3 Simpel pretty-printing. Pretty bad... 4 Symbolsk differentiering. Vi implementerer gymnasiereglerne for differentiering... 5 Generering af L A TEX kode. Vi prøver at undgå unødige parenteser... 6 Simplificering. Vi implementerer forskellige regneregler til simplificering... Times Plus Divide X X Const 3 X ( 3 + x) sin x x Sin Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 3 / 19

Udtrykstræer Regneudtryk i én variabel Et udtryk kan (rekursivt) være på en af følgende former: 1 Variablen x. 2 En konstant c IR. 3 To udtryk adskilt af +. 4 To udtryk adskilt af. 5 To udtryk adskilt af (gange). 6 To udtryk adskilt af en brøkstreg. 7 Et udtryk opløftet til en potens p. 8 Funktionen sin anvendt på et udtryk. 9 Funktionen cos anvendt på et udtryk. 10 Funktionen log anvendt på et udtryk. 11 Konstanten e opløftet til en potens angivet med et udtryk. 12 Et udtryk omgivet af parenteser. Eksempel: sin x + (x + 1)2 cos x Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 4 / 19

Udtrykstræer Sum-Type til Udtrykstræer type expr = X // The variable x Const of float // Constants Plus of expr * expr // Addition Minus of expr * expr Times of expr * expr Divide of expr * expr Power of expr * float // a d, e.g., (x + 2) 2.3 Sin of expr Cos of expr Log of expr Exp of expr // e a, e.g., e (2+x) Bemærk Vi understøtter kun funktioner af én variabel. Parenteser er implicitte; træet indkoder parenteser direkte. Dvs: Parsning (at konvertere en streng til et udtrykstræ) er en separat problemstilling vi vil se på en anden gang... Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 5 / 19

Evaluering af Udtryk Evaluering af Udtryk (fortolkning) Et udtrykstræ repræsenterer kroppen på en funktion f (x). let rec eval e x = // assume a value for the variable X match e with X -> x Const c -> c Plus (e1, e2) -> eval e1 x + eval e2 x Minus (e1, e2) -> eval e1 x - eval e2 x Times (e1, e2) -> eval e1 x * eval e2 x Plus Divide (e1, e2) -> eval e1 x / eval e2 x Power (e, p) -> (eval e x) ** p Sin e -> sin (eval e x) Cos e -> cos (eval e x) Divide Power Log e -> log (eval e x) Exp e -> exp (eval e x) Sin Cos Plus 2 x x x 1 let ee = Plus (Divide (Sin X, Cos X), Power (Plus (X, Const 1.0), 2.0)) let v = eval ee 3.0 // evaluates to 15.85745346 Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 6 / 19

Simpel Pretty-Printing Simpel Pretty-Printing (pretty bad) let par s = "(" + s + ")" let rec pp e : string = match e with X -> "x" Const c -> sprintf "%g" c Plus (e1, e2) -> par(pp e1 + "+" + pp e2) Minus (e1, e2) -> par(pp e1 + "-" + pp e2) Times (e1, e2) -> par(pp e1 + "*" + pp e2) Divide (e1, e2) -> par(pp e1 + "/" + pp e2) Power (e, p) -> par(pp e + "ˆ" + sprintf "%g" p) Sin e -> "sin " + pp e Cos e -> "cos " + pp e Log e -> "log " + pp e Exp e -> "exp " + pp e Hvad er der galt ved denne pretty-printer? 1 2 Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 7 / 19

Symbolsk Differentiering Differentieringsregler h(x) h (x) x 1 c 0 f (x) + g(x) f (x) + g (x) f (x) g(x) f (x) g (x) f (x) g(x) f (x) g(x) + f (x) g (x) f (x) g(x) x n f (x) g(x) f (x) g (x) (g(x)) 2 n x n 1 sin x cos x cos x sin x logx 1 e x f (g(x)) x e x f (g(x)) g (x) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 8 / 19

Symbolsk Differentiering Symbolsk Differentiering i F# let rec ddx e = match e with X -> Const 1.0 Const c -> Const 0.0 Plus (e1, e2) -> Plus(ddx e1, ddx e2) Minus (e1, e2) -> Minus (ddx e1, ddx e2) Times (e1, e2) -> Plus (Times (ddx e1, e2), Times (e1, ddx e2)) Divide (e1, e2) -> Divide(Minus (Times (ddx e1, e2), Times (e1, ddx e2)), Power (e2, 2.0)) Power (e, p) -> Times (Times (Const p, Power (e, p-1.0)), ddx e) Sin e -> Times (Cos e, ddx e) Cos e -> Times (Minus (Const 0.0, Sin e), ddx e) Log e -> Times (Divide (Const 1.0, e), ddx e) Exp e -> Times (Exp e, ddx e) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 9 / 19

Symbolsk Differentiering Symbolsk Differentiering i F# > ddx ee;; val it : expr = Plus (Divide (Minus (Times (Times (Cos X,Const 1.0),Cos X), Times (Sin X,Times (Minus (Const 0.0,Sin X), Const 1.0))), Power (Cos X,2.0)), Times (Times (Const 2.0,Power (Plus (X,Const 1.0),1.0)), Plus (Const 1.0,Const 0.0))) > pp (ddx ee);; val it : string = "(((((cos x*1)*cos x)-(sin x*((0-sin x)*1)))/... (cos xˆ2))+((2*((x+1)ˆ1))*(1+0)))" Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 10 / 19

Generering af LAT E X kode Generering af L A TEX kode I stedet for at generere tekst kan vi generere L A T E X kode. Strategien er at lade vores pretty-printer returnere et par af to værdier: 1 En streng der repræsenterer den genererede L A T E X kode. 2 Et tal (præcedens) der siger hvor stærkt det underliggende udtryk binder. Eksempler pp (Plus(X, Const 1.0)) ("x+1.0", 2) pp (Times(Const 2.0, Const 3.0)) ("2.0\\cdot 3.0", 3) Betrakt udtrykket Times(X,Plus(X,Const 1.0)): Når vi nu skal pretty-printe det højre argument til Times kan vi se at vi skal sætte paranteser rundt om udtrykket "x+1.0", da præcedens-tallet 2 er mindre end (eller lig med) præcedens for konstruktøren Times: pp (Times(X, Plus(X, Const 1.0))) ("x\\cdot (x+1.0)", 3) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 11 / 19

Generering af LAT E X kode Generering af L A TEX kode del 0 Nogle hjælpfunktioner samt præcedens-konstanter: let p_plus = 3 // precedence let p_times = 4 let p_divide = 0 // division with horizontal bar let p_unop = 5 let p_max = 1000 // [par p s] adds parentheses around s if the relative // precedence p (p_parent - p_child) is positive or 0 let par p s = if p < 0 then s else "(" + s + ")" Igen: Ingen parenteser er nødvendige omkring et barn hvis dets udtryk binder stærkere end forældre-udtrykket. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 12 / 19

Generering af LAT E X kode Generering af L A TEX kode del 1 let tolatex e = let rec pp e : string * int = match e with X -> ("x", p_max) Const c -> (sprintf "%g" c, p_max) Plus (e1, e2) -> pp_binop ("+",p_plus) e1 e2 Minus (e1, e2) -> pp_binop ("-",p_plus) e1 e2 Times (e1, e2) -> pp_binop ("\\cdot ",p_times) e1 e2 Divide (e1, e2) -> let (s1,s2,_) = pp_bin p_divide e1 e2 in ("\\frac{" + s1 + "}{" + s2 + "}", p_max) Power (e, k) -> let (s1,s2,p) = pp_bin p_unop e (Const k) in (s1 + "ˆ{" + s2 + "}", p) Sin e -> pp_unop "sin " e Cos e -> pp_unop "cos " e Log e -> pp_unop "log " e Exp e -> let (s,a) = pp e in ("eˆ{" + par (p_unop-a) s + "}", p_unop) and... Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 13 / 19

Generering af LAT E X kode Generering af L A TEX kode del 2... and pp_bin p e1 e2 = let (s1,p1) = pp e1 let (s2,p2) = pp e2 in (par (p-p1) s1, par (p-p2) s2, p) and pp_binop (op,p) e1 e2 = let (s1,s2,p) = pp_bin p e1 e2 in (s1 + op + s2, p) and pp_unop op e = let (s,p) = pp e in ("\\"+op + par (p_unop-p) s, p_unop) in fst(pp e) Eksempel: tolatex (ddx ee) "\frac{(\cos x\cdot 1)\cdot \cos x-\sin x\cdot ((0-\sin x)... \cdot 1)}{(\cos x)ˆ{2}}+(2\cdot (x+1)ˆ{1})\cdot (1+0)" (cos x 1) cos x sin x ((0 sin x) 1) (cos x) 2 + (2 (x + 1) 1 ) (1 + 0) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 14 / 19

Simplificering af Symbolske Udtryk Simplificering af Symbolske Udtryk Der er tilsyneladende en række konstruktioner der kan simplificeres... ddx ee Plus (Divide (Minus (Times (Times (Cos X,Const 1.0),Cos X), Times (Sin X,Times (Minus (Const 0.0,Sin X), Const 1.0))), Power (Cos X,2.0)), Times (Times (Const 2.0,Power (Plus (X,Const 1.0),1.0)), Plus (Const 1.0,Const 0.0))) Eksempler: Times (Cos X,Const 1.0) = Cos X Plus (Const 1.0,Const 0.0) = Const 1.0 Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 15 / 19

Simplificering af Symbolske Udtryk En Simplificeringsfunktion i F# del 1 let rec simplify e = match e with Plus (e1, Const 0.0) -> simplify e1 Plus (Const 0.0, e2) -> simplify e2 Plus (Const a, Const b) -> Const (a + b) Plus (e1, e2) -> Plus (simplify e1, simplify e2) Minus (e1, Const 0.0) -> simplify e1 Minus (Const a, Const b) -> Const (a - b) Minus (e1, Minus(Const 0.0, e2)) -> Plus (simplify e1, simplify e2) Minus (e1, e2) -> Minus (simplify e1, simplify e2) Divide (Const 0.0, e2) -> Const 0.0 Divide (e1, Const 1.0) -> simplify e1 Divide (e1, e2) -> Divide (simplify e1, simplify e2) Power (e, 1.0) -> simplify e Power (e, c) -> Power (simplify e,c)... Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 16 / 19

Simplificering af Symbolske Udtryk En Simplificeringsfunktion i F# del 2 let rec simplify e = match e with... Times (e1, Const 0.0) -> Const 0.0 Times (Const 0.0, e2) -> Const 0.0 Times (e1, Const 1.0) -> simplify e1 Times (Const 1.0, e2) -> simplify e2 Times (Const a, Const b) -> Const (a * b) Times (e1,plus(e2,e3)) -> simplify (Plus(Times(e1,e2),Times(e1,e3))) Times (e1,minus(e2,e3)) -> simplify (Minus(Times(e1,e2),Times(e1,e3))) Times (e1, e2) -> if e1 = e2 then simplify (Power (e1,2.0)) else Times (simplify e1, simplify e2) Sin e -> Sin (simplify e) Cos e -> Cos (simplify e) Log e -> Log (simplify e) Exp e -> Exp (simplify e) _ -> e Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 17 / 19

Simplificering af Symbolske Udtryk Det tager flere steps før simplifyeren stabiliseres: tolatex(ddx ee) (cos x 1) cos x sin x ((0 sin x) 1) (cos x) 2 + (2 (x + 1) 1 ) (1 + 0) tolatex(simplify(ddx ee)) cos x cos x sin x (0 sin x) (cos x) 2 + (2 (x + 1) + 0) tolatex(simplify(simplify(ddx ee))) (cos x) 2 (0 (sin x) 2 ) (cos x) 2 + (2 x + 2) tolatex(simplify(simplify(simplify(ddx ee)))) (cos x) 2 + (sin x) 2 (cos x) 2 + (2 x + 2) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 18 / 19

Simplificering af Symbolske Udtryk Komplet Simplificering Med generisk lighed og rekursion kan vi let skrive en simplifyer der kalder simplify igen og igen indtil udtrykket ikke længere simplificeres: let rec simplifymax e = let se = simplify e in if se = e then e else simplifymax se Komplet Simplificering i Aktion: tolatex(simplifymax(ddx ee)) "\\frac{(\\cos x)ˆ{2}+(\\sin x)ˆ{2}}{(\\cos x)ˆ{2}}+(2\\cdot x+2)" L A T E X Fortolkning: (cos x) 2 + (sin x) 2 (cos x) 2 + (2 x + 2) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 3. November, 2017 19 / 19