350 likes | 459 Views
Kolommen uniformeren. aap. noot. mies. wim. zus. jet. weide. hok. schapen. unikol =. Kolommen uniformeren. aap. noot. mies. wim. zus. jet. weide. hok. schapen. unikol = wissel . map uniform . wissel. [4, 6, 8]. [3, 5, 7]. [2, 4, 6, 8]. [1, 3, 5, 7]. Wissel.
E N D
Kolommen uniformeren aap noot mies wim zus jet weide hok schapen unikol =
Kolommen uniformeren aap noot mies wim zus jet weide hok schapen unikol = wissel . map uniform . wissel
[4, 6, 8] [3, 5, 7] [2, 4, 6, 8] [1, 3, 5, 7] Wissel wissel ( xs : xss ) [1, 2] [3, 4] [5, 6] [7, 8] = (wissel xss) zipWith (:) xs [1, 2]
[ ] [2] [2,3] [2,3,4] [ ] [1] [1,2] [1,2,3] [1,2,3,4] Aanloop :: [a] [[a]] aanloop ( x : xs ) 1 2 3 4 = (aanloop xs) [ ] : map ((:) ) x 1
[ ] [4] [3] [2] [2,3,4] [3,4] [2,3] segment :: [a] [[a]] segment ( x : xs ) 1 2 3 4 = (segment xs) ++ aanloop (x:xs) tail( ) 1 [ ] [4] [3] [2] [2,3,4] [3,4] [2,3] [1] [1,2,3] [1,2,3,4] [1,2]
[ ] [4] [2] [2,4] [2,3,4] [3] [3,4] [2,3] deelrij :: [a] [[a]] deelrij ( x : xs ) 1 2 3 4 = (deelrij xs) ++ map ((:) ) x (deelrij xs) 1 [ ] [4] [2] [2,4] [2,3,4] [3] [3,4] [2,3] [1] [1,3] [1,3,4] [1,2,3] [1,2,4] [1,2,3,4] [1,4] [1,2]
1 2 3 4 [1,2] [1,4] [2,4] [3,4] [1,3] [2,3] kies :: Int [a] [[a]] > kies 2 kies 0 xs = kies n [ ] = kies n (x:xs) = [ [ ] ] [ ] map ((:)x) (kies (n-1) xs) ++ kies n xs
Hogere-ordefuncties zien kwadraten [ ] = [ ] kwadraten (x:xs) = x*x : kwadraten xs kwadraten = map (\ x x*x) totaal [ ] = 0 totaal (x:xs) = x + totaal xs totaal = foldr (+) 0
Hogere-ordefuncties zien concat [ ] = [ ] concat (xs:xss) = xs ++ concat xss concat = foldr (++) [ ] length [ ] = 0 length (x:xs) = 1 + length xs length = foldr (\ e r 1+r) 0
Hogere-ordefuncties zien sorteer [ ] = [ ] sorteer (x:xs) = insert x (sorteer xs) sorteer = foldr insert [ ] wissel [ ] = repeat [ ] wissel (xs:xss) = zipWith (:) xs (wissel xss) wissel = foldr (zipWith (:)) (repeat [ ])
3 4 Toepassing: Breuken typeBreuk = (Int, Int) maal :: Breuk Breuk Breuk plus :: Breuk Breuk Breuk eq :: Breuk Breuk Bool eenvoud :: Breuk Breuk plus (x,y) (p,q) = (x*q+y*p, y*q)
Toepassing: Polynomen 3.5x4 + 6.1x2 + 2.5 typeTerm = (Float, Int) type Poly = [Term] maal :: Poly Poly Poly plus :: Poly Poly Poly eq :: Poly Poly Bool eenvoud :: Poly Poly plus p q = eenvoud (p ++ q)
Polynomen vermenigvuldigen 3x + 1 * 2x2 + 5 = 6x3+15x + 2x2+5 • Alle termen met elkaar vermenigvuldigen maal :: Poly Poly Poly maal p q = eenvoud (cross tMaal p q) tMaal :: Term Term Term tMaal (c1,e1) (c2,e2) = (c1*.c2, e1+e2)
Kruisproduct • Met lijstcomprehensie • Met expliciete recursie cross :: (aab) [a] [a] [b] cross f xs ys = [ f x y | x xs, yys ] cross f [ ] ys = cross f (x:xs) ys = [ ] map (f x) ys ++ cross f xs ys
Toepassing: expressies (3*a + 4*b) / c typeExpr = plus :: Expr Expr Expr maal :: Expr Expr Expr waarde :: [(String,Int)] Expr Int eenvoud :: Expr Expr
Expressies: poging 1 (3*a + 4*b) / c typeExpr = String 3+a 4+b * maal :: Expr Expr Expr waarde :: [(String,Int)] Expr Int maal a b = a ++ “*” ++ b waarde tab s = foldr ??? ??? s
Expressies: poging 2 dataExpr = | | | | | Con Var Plus Min Maal Deel Int String Expr Expr Expr Expr Expr Expr Expr Expr constructorfuncties waarmee je een Expr bouwt types van de parametersdie daarbij nodig zijn
Een datastructuur opschrijven • Lijst • Boom [ ] 1 : 2 : 3 : 4 : Tak 3 ( ) ( ) Tak 7 ( ) ( ) Tak 4 Blad Blad Tak 2 Blad Blad Tak 5 (Tak 1 Blad Blad ) (Blad )
Een datastructuur opschrijven (3*a + 4*b) / c • Expr (Maal (Con 3) (Var “a”)) (Maal (Con 4) (Var “b”)) Deel ( ) ( Var “c” ) Plus
Expressies: poging 3 dataExpr = | | | | | Constructorenbeginnen methoofdletter of dubbelepunt Int String Expr Expr Expr Expr Expr Expr Expr Expr Con Var :+: :-: :*: :/: constructorfuncties/operatoren waarmee je een Expr bouwt constructorfuncties waarmee je een Expr bouwt
Een datastructuur opschrijven (3*a + 4*b) / c • Expr Con 3 :*: Var “a” Con 4 :*: Var “b” ( ) :/: ( Var “c” ) :+: infixl 6 (:+:), (:-:) infixl 7 (:*:), (:/:)
Functies op Expressies plus :: Expr Expr Expr maal :: Expr Expr Expr waarde :: [(String,Int)] Expr Int eenvoud :: Expr Expr plus = (:+:) maal = (:*:)
Functies op Expressies wrd :: [(String,Int)] Expr Int wrd t (Con n) wrd t (Var v) wrd t (a:+:b) wrd t (a:-:b) wrd t (a:*:b) wrd t (a:/:b) = = = = = = n zoekop t v wrd t a + wrd t b wrd t a – wrd t b wrd t a * wrd t b wrd t a / wrd t b
Functies op Expressies afg :: Expr String Expr “de afgeleide naar eenvariabele” afg (Con c) dx afg (Var v) dx = Con 0 | eqString v dx = Con 1 | otherwise = Con 0 afg (a:+:b) dx afg (a :-:b) dx = afg a dx :+: afg b dx = afg a dx :-: afg b dx
Functies op Expressies afg :: Expr String Expr = a :*: afg b dx :+: b :*: afg a dx afg (a:*:b) dx afg (a :/:b) dx = ( b :*: afg a dx :-: a :*: afg b dx ) :/: (b :*: b)
Twee soorten berekening • Numeriek • Symbolisch diff :: (FloatFloat) (FloatFloat) diff f x = (f (x+h) – f x) / h where h = 0.00001 dat is nou AI! afg :: Expr String Expr afg (Con c) dx = Con 0 afg (Var v) dx | eqString v dx = Con 1 |otherwise = Con 0 afg (a:+:b) dx = afg a dx :+: afg b dx afg (a:*:b) dx = a :*: afg b dx :+: b :*: afg a dx
Rekenen met Booleans (&&) :: Bool Bool Bool (||) :: Bool Bool Bool not :: Bool Bool True && y = y False && y = False True || y = True False || y = y not True = False not False = True
Symbolisch Propositiesbewerken dataProp = | | | | | Bool String Prop Prop Prop Prop Prop Prop Prop Con Var Not :/\ :\/ :-> constructorfuncties/operatoren waarmee je een Prop bouwt constructorfuncties waarmee je een Expr bouwt
Functies op Proposities typeBedeling = [(String,Bool)] evalueer :: Bedeling Prop Bool > evalueer [ (“p”,True), (“q”, False) ] (Var “p” :/\ Var “q”) False
Functies op Proposities tautologie :: Prop Bool contradictie :: Prop Bool > tautologie (Var “p” :\/ Not (Var “p”)) True > contradictie (Var “p” :-> Var “q” ) False
Functies op Proposities equivalentie :: Prop Prop Bool vervulbaar :: Prop [Bedeling] > vervulbaar (Var “p” :-> Var “q” ) [ [ (“p”,True) , (“q”,True) ] , [ (“p”,False) , (“q”, False) ] , [ (“p”,False) , (“q”, True) ] ]
Functies op Proposities eenvoudig :: Prop Prop tautologieën en contradictiesvervangen door constanten > eenvoudig Not(Not (Var “p” :/\ (Var “q” :\/ Not Var “q”)) Not (Not (Var “p” :/\ Con True)) Not (Not (Var “p”)) Var “p” operatoren met constanteparameters wegwerken dubbele Not wegwerken
Functies op Proposities normaalvorm :: Prop Prop > normaalvorm (Not (Not Var “p” :\/ Var “q” ) Var “p” :/\ Not Var “q” Not alleen voor variabelen
Functies op Proposities toon :: Prop String ontleed :: String Prop > putStr (toon (Var “p” :-> Var “q”)) p -> q > ontleed “p && !p” Var “p” :/\ Not Var “p”
Functies op Proposities evalueer :: Bedeling Prop Bool tautologie :: Prop Bool contradictie :: Prop Bool equivalentie :: Prop Prop Bool vervulbaar :: Prop [Bedeling] eenvoudig :: Prop Prop normaalvorm :: Prop Prop toon :: Prop String ontleed :: String Prop