Functies als Getallen Jan Martin Jansen.

Slides:



Advertisements
Verwante presentaties
Optellen en aftrekken tot 20
Advertisements

BRIDGE Vervolgcursus Vervolg op starterscursus Bridgeclub Schiedam ‘59 info: Maandagavond: 19: – of
Voorrangsregels bij rekenen (2)
28 juni 2009 Paëllanamiddag 1 Paëllanamiddag 28 juni 2009 Voorbereiding vrijdagavond (Loopt automatisch - 7 seconden)
Hoe werkt een rekenmachine?
Downloaden: Ad-aware. Downloaden bestaat uit 3 delen: •1. Zoeken naar de plek waar je het bestand kan vinden op het internet •2. Het nemen van een kopie.
vergelijkingen oplossen
ADOBE PRESENTER Willem vanden Berg Dienst Onderwijsondersteuning en –ontwikkeling KaHo Sint-Lieven 1.
Hoofdstuk 8: Recursie.
Ronde (Sport & Spel) Quiz Night !
Lijsten in de -calculus Een lijst [E 1, E 2,..., E n ] kan in de -calculus voorgesteld worden als z.((z E 1 ) z.((z E 2 )... z.((z E n ) nil)...) met nil.
Uitwerking tentamen Functioneel Programmeren 29 januari 2009.
prNBN D addendum 1 Deel 2: PLT
Hogere Wiskunde Complexe getallen college week 6
Kb.1 Ik leer op een goede manier optellen en aftrekken
Datastructuren Analyse van Algoritmen en O
Leiden University. The university to discover. ICLON, Interfacultair Centrum voor Lerarenopleiding, Onderwijsontwikkeling en Nascholing Denkgereedschap.
© GfK 2012 | Title of presentation | DD. Month

Computervaardigheden Hoofdstuk 4 — Scripting (Let op: dit is enkel voor studenten Biologie.)
 - congruentie -regel:
Passie - Verrijzenis Arcabas
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen College 5.
Functies op Proposities evalueer:: Bedeling  Prop  Bool tautologie:: Prop  Bool contradictie:: Prop  Bool equivalentie:: Prop  Prop  Bool vervulbaar::
1 het type x² = getal 2 ontbinden in factoren 3 de abc-formule
1 introductie 3'46” …………… normaal hart hond 1'41” ……..
1Ben Bruidegom Hoe werkt een rekenmachine? Ben Bruidegom AMSTEL Instituut Universiteit van Amsterdam.
Hoofdstuk 1, 2 en 3 Toegepaste Mechanica deel 1
Bewegen Hoofdstuk 3 Beweging Ing. J. van de Worp.
-calculus.
Functies definiëren nDoor combinatie van standaardfuncties fac :: Int  Int fac n = product [1..n] oneven :: Int  Bool oneven n = not (even n) negatief.
Char en String nCharéén letter uord ::Char  Int uchr ::Int  Char nString[Char] uwords :: String  [String] uunwords :: [String]  String ”hoi” ”CKI”
Hogere-ordefuncties nVoeg de elementen van een lijst samen nCombineer twee functies foldr :: (a  b  b)  b  [a]  b [a] (.) :: (b  c)  (a  b)  a.
Reguliere talen nReguliere grammatica: versimpelde Contextvrije grammatica nFinite-state Automaton: andere manier om een taal te beschrijven nReguliere.
1 Datastructuren Skiplists. 2 Skiplists  Vrij eenvoudige datastructuur  “Makkelijker” dan gebalanceerde bomen  Kunnen hetzelfde als gebalanceerde bomen.
Van de eerste graad in één onbekende
Werken aan Intergenerationele Samenwerking en Expertise.
De vierkantjes ! Dit is een puzzel om uw hersens eens goed te laten werken. De vraag is bij elk figuur hoeveel vierkanten u ziet.
2009 Tevredenheidsenquête Resultaten Opleidingsinstellingen.
PLAYBOY Kalender 2006 Dit is wat mannen boeit!.
ribwis1 Toegepaste wiskunde Lesweek 2
ribwis1 Toegepaste wiskunde Lesweek 01 – Deel B
ribwis1 Toegepaste wiskunde, ribPWI Lesweek 01
ribWBK11t Toegepaste wiskunde Lesweek 02
, 17h30Recursie 1 Inleiding tot recursie Karel Popelier.
ZijActief Koningslust 10 jaar Truusje Trap
Vergelijkingen oplossen.
Van Vensoc tot Biztax Vennootschapsbelasting Aj 2011.
Voorrangsregels bij rekenen (1)
ECHT ONGELOOFLIJK. Lees alle getallen. langzaam en rij voor rij
2 januari 2009Nieuwjaarsreceptie "Meule wal straete" 1 Nieuwjaarsreceptie 2 januari 2009 Eerste bijeenkomst van de bewoners van de “Meule wal straete”
17/08/2014 | pag. 1 Fractale en Wavelet Beeldcompressie Les 5.
17/08/2014 | pag. 1 Fractale en Wavelet Beeldcompressie Les 3.
Fractale en Wavelet Beeldcompressie
Fractale en Wavelet Beeldcompressie
De financiële functie: Integrale bedrijfsanalyse©
Oefeningen Workshop RIE Gemeenten
Centrummaten en Boxplot
De vierkantjes ! Dit is een puzzel om uw hersens eens goed te laten werken. De vraag is bij elk figuur hoeveel vierkanten u ziet.
1 Zie ook identiteit.pdf willen denkenvoelen 5 Zie ook identiteit.pdf.
ZijActief Koningslust
Functioneel programmeren Een snelle herhaling…. Functie-definitie static int kwad (int x) { return x*x ; } kwad x = x * x Haskell kwad :: Int  Int.
Cegeka & TenForce Ronde tafel 17/06/2014 Doelstellingenmanagement VO.
Vervolg C Hogeschool van Utrecht / Institute for Computer, Communication and Media Technology 1 Onderwerpen voor vandaag top-down decompositie Opdrachten:
Recursie in de wiskunde
-calculus versus Scheme
Transcript van de presentatie:

Functies als Getallen Jan Martin Jansen

Functies als Getallen Vraag Hoeveel formalisme is er nodig om een serieuze programmeertaal te maken? Serieuze Programmeertaal Het moet mogelijk zijn om een algoritme te schrijven om het n-de priemgetal te berekenen voor willekeurige n. Het moet mogelijk zijn in deze taal een interpreter voor de taal zelf te schrijven.

Functies als Getallen Antwoord Het blijkt dat je met erg weinig formalisme toe kan! Definitie De taal bestaat uit uitsluitend functies. De enige operatie is functietoepassing. Er zijn geen voorgedefiniëerde datatypes.

Syntax Informeel m.b.v. voorbeelden Functiedefinities: f a b = b a app f x = f x id x = x k x y = x s f g x = f x (g x) fix f x = f (fix f) x

Semantiek Berekenen van een expressie Argumenten invullen in rechterkant: k f s  f f k id  id k  k app k f  k f

Anonieme functies Het blijkt handig te zijn ook anonieme functies toe te staan: app (x -> x) f  (x -> x) f  f (x -> y -> k y x) f s  k s f  s Anonieme functies zijn niet echt nodig, maar zijn zeer nuttig voor de leesbaarheid van programma’s.

Grammatica Syntax Formeel d.m.v. grammatica function ::= iden {iden} ‘=’ expr expr ::= iden ‘->’ expr | application application ::= factor {factor} factor ::= iden | ‘(’ expr ‘)’

Semantiek Formeel m.b.v. interpreter Informeel evalueren van een expressie (= functie applicatie): herhaal (zolang de expresie functieapplicaties bevat met voldoende argumenten) vervang de functieaanroep door de rechterkant van de functie met de argumenten ingevuld

Serieuze programma’s Getallen en bewerkingen Wat is een natuurlijk getal? Ieder getal een eigen functie: zero x = x one x = x two x = x .... Probleem Er zijn oneindig veel getallen!

Getallen Oplossing Recursieve definitie Een getal is of nul of opvolger van een ander getal: zero f g = f suc n f g = g n de functie zero stelt dus het getal 0 voor en selecteert van twee argumenten het eerste de functie suc n heeft ook twee argumenten en past het tweede argument toe op n de functie suc (suc (suc zero)) stelt het getal 3 voor.

Operaties op Getallen Daar de definitie van een getal recursief is moeten ook de operaties op getallen recursief gedefinieerd worden. Let ook op het gebruik van anonieme functies.

Optellen add n m = m n (mm1 -> suc (add n mm1)) Recursie over m m zero geeft n m = suc mm1 ==> Resultaat = suc (add n mm1) n + m optellen is dus niets anders dan m keer 1 bij n optellen!

Voorbeelden add (suc zero) zero  zero (suc zero) ... suc zero add (suc zero) (suc zero)  suc zero (suc zero) (mm1 -> suc (add (suc zero) mm1))  (mm1-> suc (add (suc zero) mm1)) zero  suc (add (suc zero) zero)  suc (suc zero) 1 + 1 is dus inderdaad 2!

Vermenigvuldiging mult n m = m zero (mm1 -> add n (mult n mm1))) Vermenigvuldiging is dus niets anders dan herhaald optellen.

Aftrekken Eerst definiëren we de predecessor functie. Deze is alleen gedefinieerd voor getallen ongelijk 0. error x = x pred n = n error (nm1 -> nm1) error wordt gebruikt om een fout aan te geven. sub n m = m n (mm1 -> pred (sub n mm1)) m van n aftrekken is dus m keer 1 van n aftrekken.

Andere operaties If-then-else true x y = x false x y = y ifte b x y = b x y true selecteert van 2 argumenten het eerste en false het tweede. ifte past de functie b (true of false) toe op de twee argumenten x en y (eigenlijk niet nodig).

Andere operaties (On)gelijkheids testen. eq n m = n (m true (mm1 -> false)) (nm1 -> (m false (mm1 -> (eq nm1 mm1)))) gt n m = n (m false (mm1 -> false)) (nm1 -> (m true (mm1 -> (gt nm1 mm1))))

Andere operaties Div en Mod mod n m = ifte (gt m n) n (mod (sub n m) m) div n m = ifte (gt m n) zero (suc (div (sub n m) m)) Voorbeeld: Faculteit fac n = n (suc zero) (nm1 -> mult n (fac nm1))

Priemgetallen Om priemgetallen te vinden gebruiken we het beroemde zeef-algoritme van Erasthostenes. Om dit in ons geval te kunnen toepassen hebben we eerst een opslagstructuur voor getallen nodig.

Lijsten Ook een lijst is een recursieve structuur. Leeg of bestaat uit head en tail. empty z1 z2 = z1 cons x xs z1 z2 = z2 x xs Voorbeelden: cons zero empty cons (suc zero) (cons zero empty)

Operaties op lijsten from n = cons n (from (suc n)) take n ls = ls empty (x -> xs -> n empty (nm1 -> (cons x (take nm1 xs))))

Operaties op lijsten filter p ls = ls empty (x -> xs -> ifte (p x) (cons x (filter p xs)) (filter p xs))

Priemgetallen We zijn nu klaar voor de priemgetallen! notmodzero x y = ifte (eq (mod y x) zero) false true notmodzero : als y mod x = 0 dan false, anders true two = suc (suc zero) primes = sieve (from two)

Priemgetallen Sieve sieve ls = ls error (x -> xs -> cons x (sieve (filter (notmodzero x)xs)))

Interpreter De interpreter die we beschrijven is voor een iets eenvoudigere taal dan Yapl omdat we afzien van anonieme functies. De datastructuur voor expressies met variabelen wordt beschreven door de volgende 3 functies: app f g f1 f2 f3 = f1 f g var n f1 f2 f3 = f2 n func n f1 f2 f3 = f3 n

Interpreter app f g beschrijft de toepassing van f op g. var n beschrijft een variabele met naam n (in de praktijk is dit een getal). func n beschrijft de aanroep van functie met naam n (ook een getal).

Interpreter: Voorbeelden id x = x de body van deze functie wordt var 0 s f g x = f x (g x) (app (app (var 0) (var 2)) (app (var 1) (var 2)))

Interpreter De functie eval heeft 3 argumenten: De te evalueren expressie Een argumenten stack (lijst) Een lijst met functiebeschrijvingen met als items een tuple van het aantal argumenten en de body van de functie(als boven)

Tuples tup a b f = f a b fst t = t (a -> b -> a) snd t = t (a -> b -> b)

Interpreter In func n geeft n de plaats in de functielijst aan waar de functie kan worden gevonden. Bij het evalueren van een applicatie wordt rechterkant op de stack gezet waarna linkerkant wordt geëvalueerd. Bij het evalueren van een functie aanroep wordt er gecontroleerd of er voldoende argumenten op de stack staan; zo ja, dan wordt de functie body opgezocht en de argumenten worden gesubstitueerd.; zo nee, dan wordt de functie applicatie herbouwd m.b.v. rebuild.

Interpreter eval exp es fs = exp (f -> g -> eval f (cons (eval g empty fs) es) fs) (n -> error) (n -> (ge (count es) (fst (el n fs))) (eval (subst (snd (el n fs)) es) (drop (fst (el n fs)) es) fs) (rebuild (func n) es))

Interpreter subst e es = e (f -> g -> app (subst f es) (subst g es)) (n -> el n es) (n -> func n) rebuild e es = es e (x -> xs -> rebuild (app e x) xs)

Interpreter Voorbeeld Implementatie van getallen definitie van zero, suc, add en hadd tup 2 (var 0) moet gelezen worden als f a b = a 2 is het aantal argumenten en var 0 is de body van de functie Voor add is er gebruik gemaakt van een hulpfunctie

Interpreter Voorbeeld Implementatie van getallen numfuncs = (cons (tup 2 (var 0)) (cons (tup 3 (app (var 2) (var 0))) (cons (tup 2 (app (app (var 1) (var 0)) (app (func 3) (var 0)))) (cons (tup 2 (app (func 1) (app (app (func 2) (var 0)) (var 1)))) empty))))

Interpreter Voorbeeld Implementatie van getallen Een aantal handige afkortingen: nul = func 0 een = app opv nul twee = app opv een opv = func 1 telop = func 2

Interpreter Voorbeeld Implementatie van getallen Code van 2 + 2 numvb = eval (app (app telop twee) twee) empty numfuncs