Ján Kollár Funkcionálne programovanie 1
|
|
- Μαγδαληνή Βενιζέλος
- 5 χρόνια πριν
- Προβολές:
Transcript
1 Ján Kollár Funkcionálne programovanie 1 Jazyky procedurálne, objektové, deklaratívne (aplikatívne, popisné) logické, funkcionálne. Čisté funkcionálne jazyky (bez procedurálnych prvkov) Orwell, Gofer, Hugs98, Haskell, Miranda. Teoretický základ Moses Schönfinkel, Haskell Curry kombinatorická logika, Alonzo Church jazyk lambda (lambda kalkul) základný, rozšírený Implementácia pomocou rozšíreného jazyka lambda (výrazy if, case, let, letrec) (Simon Peyton Jones, Philip Wadler, David Turner) Procedurálna metodológia programovania popis problému, organizácia pamäti, organizácia postupnosti krokov. Metodológia funkcionálneho programovania iba popis (formálny opis) problému. žiadne procedurálne prvky (premenné ako bunky, priradenie, postupnosť krokov), matematický pojem premennej, funkcie vyššieho rádu. Funkcionálny program je výraz konštantná aplikatívna forma (CAF), množina rekurzívnych funkcií a hlavná funkcia vždy konštanta. Rozšírená štruktúra funkcionálneho programu modularita, import, export, riešenie kolízie mien, typové triedy a ich inštancie, obsahujúce definície prekrývaných operácií (funkcií) Typový polymorfizmus parametrický aj prekrývanie (overloading), statická kontrola typov. Vykonávanie funkcionálneho programu postupná aplikácia funkcií na argumenty(currying), transformácia CAF zjednodušenie redukcia (beta) výrazu lambda výpočet, implicitná konštrukcia údajových štruktúr, automatické uvoľňovanie z pamäti (garbage collection) Vedľajší účinok (side effect) dosiahnuteľný monadickými operáciami. Praktický prístup k funkcionálnemu programovaniu návrh zhora-nadol, implementácia (definícia funkcií) zdola-nahor, overovanie typov funkcií, aplikácia na vzorky argumentov, hľadanie čo nastručnejšej formy, využívajúc zameniteľnosť (konvertibilitu) výrazov, funkcie vyššieho rádu, nerekurzívne definície a množinové abstrakcie. Podrobné komentovanie neformálneho významu argumentov a hodnoty funkcie a uvádzanie testovacích aplikácií a ich hodnôt v dokumentácii. Koncepcia funkcionálneho programovania
2 Ján Kollár Funkcionálne programovanie 2 data T α 1 α 2... α u = C 0 T 0,1 T 0,2... T 0,n0 C 1 T 1,1 T 1,2... T 1,n1 C 2 T 2,1 T 2,2... T 2,n C m T m,1 T m,2... T m,nm f :: T 1 T 2... T n T f p 1,1 p 1,2... p 1,n = e 1 f x 1 x 2... x n = e f p 2,1 p 2,2... p 2,n = e 2 f p q,1 p q,2... p q,n = e q f m 1 m 2... m n T 1 T 2... T n T T 1 (T 2 (... (T n T ))...)) f m 1 m 2... m n (... ((f m 1 ) m 2 )... ) m n Základné prvky funkcionálneho jazyka
3 Ján Kollár Funkcionálne programovanie 3 add :: Int -> Int -> Int add x y = x + y add2 :: (Int,Int) -> Int add2 (x,y) = x + y add3 x y = x - y globálna úroveň definícií funkcií, význam funkcie, premenné (parametre) funkcie, vzory, arita funkcie - konštanta, unárna a binárna funkcia, funkcia n argumentov, mená funkcií, definícia (odvodenie) typu funkcie, operácie a typové operácie, definícia nového (algebraickeho) typu, typ sumárny, násobný, nerekurzívny a rekurzívny, typ konštruktora, význam konštruktora, princíp postupnej aplikácie funkcie, asociatívnosť operácie aplikácie, asociatívnosť typovej operácie zobrazenia, aplikácia konštruktora ako kanonickej funkcie, asociatívnosť typovej operácie zobrazenia, princíp výpočtu ako postupného zjednodušenia CAF (redukcie výrazu lambda) do kanonickej formy, zameniteľnosť výrazov, referenčná transparentnosť, hodnota (aplikácie) funkcie, funkcia ako hodnota, funkcie vyššieho rádu. Základné pojmy
4 Ján Kollár Funkcionálne programovanie 4 add x y = x + y square x = x * x main = add 2 (square 3) add 2 (square 3) add 2 (3 3) add add 2 (square 3) 2 + (square 3) 2 + (3 3) Výpočet na základe hodnoty a požiadavky (eager and lazy)
5 Ján Kollár Funkcionálne programovanie 5 module Main where import Data.Char add x y = x + y square x = x * x main = add 2 (square 3) -- main :: IO () -- pre GHC main = let add = \x->(\y->x+y) square = \x->x*x in (add 2 (square 3)) main = let add = \x->(\y->x+y); square = \x->x*x in (add 2 (square 3)) let x=2 in x*x = (\x->x*x) 2 let x=2; y=3 in x*y = LETREC x=2; y=3 in x*y Ekvivalentné formy: program a LETREC, definícia funkcie pomocou abstrakcie lambda, významy let (Haskell)
6 Ján Kollár Funkcionálne programovanie 6 f (x,y,z) = (f x, g y, h z) where f = (2*) g = (3*) h = (4*) f = \(x,y,z) -> let f = \x -> (2*) x g = \x -> (3*) x h = \x -> (4*) x in (f x, g y, h z) Ekvivalentné formy: where a LETREC
7 Ján Kollár Funkcionálne programovanie 7 fac 0 = 1 fac (n+1) = (n+1) * fac n fac n n == 0 = 1 n > 0 = n * fac (n-1) fac n = if (n == 0) then 1 else (if (n > 0) then (n * fac (n-1)) else undefined) Ekviv. formy: Porovnávanie vzorov pre celé nezáporné čísla (Hugs98), podmienené výrazy, if, otherwise, rekurzívna definícia fac n n == 0 = 1 fac 0 = 1 otherwise = n * fac (n-1) fac n = n * fac (n-1) fac n = n * fac (n-1) fac 0 = 1 Nesprávne definície: úplná namiesto neúplnej a nejednoznačná
8 Ján Kollár Funkcionálne programovanie 8 map f [] = [] map f (x:xs) = f x : map f xs map = \f ->(\p->case p of [] -> [] (x:xs) -> f x : map f xs) map = \f ->(\p->case p of [] -> [] (x:xs) -> ((\u->(\us->f u : map f us))) x xs) Ekvivalentné formy: porovnávanie vzorov pre zoznamy, case, kolízia mien (map)
9 Ján Kollár Funkcionálne programovanie 9 module Sorting (isort) where {- Triedenie vkladanim (insertsort) isort :: [a] -> [a] isort xs... usporiadava zoznam prvkov xs, hodnotou je usporiadany zoznam prvkov foldr :: (a -> b -> b) -> b -> [a] -> b foldr op a [x1,x2,...,xn] = x1 op (x2 op (... op (xn op a)...)) kde op=insert, a=[] insert :: a -> [a] -> [a] insert x xs... vklada prvok x do prazdneho alebo usporiadaneho zoznamu xs tak, aby hodnotou bol usporiadany zoznam } -- isort :: [a] -> [a] isort xs = foldr insert [] xs where insert x [] = [x] insert x (y:ys) x<=y = x:y:ys otherwise = y:insert x ys -- Test: stringsort = isort "bsgat" numssort = isort [4,3,8,1,9,6,7] -- Aplikacia: > stringsort "abgst" > numssort [1,3,4,6,7,8,9] Príklad: Modul Sorting (sorting.hs), export isort
10 Ján Kollár Funkcionálne programovanie 10 isort :: Ord a => [a]->[a] isort = \xs -> let insert = \x->(\u-> (case u of [] -> [x] (y:ys)-> (\y->(\ys->(if (x<=y) then (x:y:ys) else (y:insert x ys)))) y ys)) in (foldr ins [] xs) Reprezentácia isort v rozšírenom jazyku lambda module Main where import qualified Sorting as S {- main vypis usporiadanych zoznamov } main = (putstr.show) (S.iSort [9,6,5,3,5,1,3]) >> (putstr.show) (S.iSort "abeceda") Príklad: Modul Main (main.hs), kvalifikácia importovanej funkcie isort, kompozícia a monadické operácie
11 Ján Kollár Funkcionálne programovanie return :: a -> IO a -- (>>=):: IO a -> (a -> IO b) -> IO b -- (>>) :: IO a -> IO b -> IO b -- 1.verzia -- readnames :: [String] -> IO [String] readnames xs = getline >>= \s -> if s=="" then (return xs) else readnames (xs++[s]) -- 2.verzia readnames xs = getline >>= addname where addname s s=="" = return xs otherwise = readnames (xs++[s]) -- 3.verzia readnames xs = getline >>= addname xs addname xs s s=="" = return xs otherwise = readnames (xs++[s]) main = readnames [] {- test *Main> main alfa beta gamma ["alfa","beta","gamma"] -- test zapisu do súboru: readnames [] >>= \xs -> writefile "testfile.txt" (concat xs) Aplikácia monadických operácií
12 Ján Kollár Funkcionálne programovanie 12 Asociatívnosť Operácia Význam doprava ^, ^^, ** mocnina doľava *, /, div, mod aritmetické operácie doľava +, - aritmetické operácie doprava ++ zreťazenie žiadna ==, /=, <, <=, >=, > porovnanie doprava && logický súčet doprava logický súčin Tabuľka 1: Vybrané binárne operácie Binárne operácie
13 Ján Kollár Funkcionálne programovanie 13 C i :: T 1,i T 1,i... T 1,ni T α 1 α 2... α u, i = 0... m m = 0 násobný typ T m > 0 sumárny typ T u = 0 monomorfný typ T u > 0 polymorfný typ T T i,j ; T T i,j T je nerekurzívny typ. T i,j ; T T i,j T je rekurzívny typ. Jednoduché typy Char, Int, Float Typ logických hodnôt. nerekurzívny typ. data Bool = F alse T rue Entice. nerekurzívny typ. data T uple2 a b = T uple2 a b data T uple3 a b c = T uple3 a b c data T uple4 a b c d = T uple4 a b c d Zoznamy. Zoznam (a String) je rekurzívny typ. data List a = Nil Cons a (List a) Celé nezáporné čísla. Rekurzívny typ. data N at = Zero Succ N at Klasifikácia typov a základné typy
14 Ján Kollár Funkcionálne programovanie 14 Pre entice Typ T uple2 a b (a, b), T uple3 a b c (a, b, c),... Konštruktor T uple2 e 1 e 2 (e 1, e 2 ), T uple3 e 1 e 2 e 3 (e 1, e 2, e 3 ),... Pre zoznamy Typ List a [a] Konštruktory Nil [], Cons e 1 e 2 (e 1 : e 2 ),... Syntaktická podpora zápisu entíc a zoznamov
15 Ján Kollár Funkcionálne programovanie 15 Enumeračný typ Variantný typ Binárny strom data F arba = F ialova Modra Zelena Zlta Cervena data ZnakAleboCislo = Z Char C Int data Btree a = T ip a Bin (Btree a) (Btree a) Binárny značkovaný strom data Lbtree a b = T ip a Bin b (Lbtree a b) (Lbtree a b) Binárny vyhľadávací strom data Bstree a = T ip Bin a (Bstree a) (Bstree a) Všeobecný strom data Gtree a = Node a [Gtree a] type String = [Char] type Matrix a = [[a]] type Graph a = [(a, [a])] Niektoré užitočné typy a synonymá typov
16 Ján Kollár Funkcionálne programovanie 16 class Show a where... typové signatúry... data Farba = Biela Modra instance Show Farba where show Biela = "Biela" show Modra = "Modra" data Farba = Biela Modra deriving (Eq,Show) Definícia resp. odvodenie operácií abstraktného typu pre nový algebraický typ
17 Ján Kollár Funkcionálne programovanie 17 fst (x,y) = x snd (x,y) = y reverse [] = [] reverse (x:xs) = reverse xs ++ [x] reversebtree (Tip x) = Tip x reversebtree (Bin tl tr) = Bin (reversebtree tr) (reversebtree tl) last [x] = x last (x:x :xs) = last (x :xs) length :: [a] -> Int length [] = 0 length (x:xs) = 1 + length xs (++) :: [a] -> [a] -> [a] [] ++ ys = ys (x:xs) ++ ys = x : xs ++ ys concat :: [[a]] -> [a] concat [] = [] concat (xs:xss) = xs ++ concat xss Najdôležitejšie funkcie
18 Ján Kollár Funkcionálne programovanie 18 (!!) :: [a] -> Int -> a (x:xs)!! 0 = x (x:xs)!! (n+1) = xs!! n head :: [a] -> a head (x:xs) = x tail :: [a] -> [a] tail (x:xs) = xs init :: [a] -> [a] init [x] = [] init (x:y:xs) = x : init (y:xs) last :: [a] -> a last [x] = x last (x:y:xs) = last (y:xs) take :: Int -> [a] -> [a] take 0 xs = [] take (n+1) [] = [] take (n+1) (x:xs) = x : take n xs drop :: Int -> [a] -> [a] drop 0 xs = xs drop (n+1) [] = [] drop (n+1) (x:xs) = drop n xs Najdôležitejšie funkcie
19 Ján Kollár Funkcionálne programovanie 19 copy :: Int -> a -> [a] copy n x = take n xs where xs = x:xs space :: Int -> String space n = copy n map :: (a -> b) -> [a] ->[b] map f [] = [] map f (x:xs) = f x : map f xs filter :: (a -> Bool) -> [a] -> [a] filter p [] = [] filter p (x:xs) p x = x : filter p xs otherwise = filter p xs even :: Int -> Bool even x = (x mod 2) == 0 takewhile :: (a -> Bool) -> [a] -> [a] takewhile p [] = [] takewhile p (x:xs) p x = x : takewhile p xs otherwise = [] dropwhile :: (a -> bool) -> [a] -> [a] dropwhile p [] = [] dropwhile p (x:xs) p x = dropwhile p xs otherwise = x:xs Najdôležitejšie funkcie
20 Ján Kollár Funkcionálne programovanie 20 foldl :: (a -> b -> a) -> a -> [b] -> a foldl f a [] = a foldl f a (x:xs) = foldl f (f a x) xs foldr :: (a -> b -> b) -> b -> [a] -> b foldr f a [] = a foldr f a (x:xs) = f x (foldr f a xs) sum :: Num a => [a] -> a sum = foldl (+) 0 product :: Num a => [a] -> a product = foldl (*) 1 concat :: [[a]] -> [a] concat = foldr (++) [] and :: [Bool] -> Bool and = foldr (&&) True or :: [Bool] -> Bool or = foldr ( ) False foldl1 :: (a -> a -> a) -> [a] -> a foldl1 f (x:xs) = foldl f x xs foldr1 :: (a -> a -> a) -> [a] -> a foldr1 f [x] = x foldr1 f (x:y:xs) = f x (foldr1 f (y:xs)) Najdôležitejšie funkcie
21 Ján Kollár Funkcionálne programovanie 21 minimum :: [a] -> a minimum = foldl1 min maximum :: [a] -> a maximum = foldl1 max scan :: (a -> b -> a) -> a -> [b] -> [a] scan f a xs = a : sc f a xs where sc f a [] = [] sc f a (x:xs) = scan f (f a x) xs zip :: [a] -> [b] -> [(a, b)] zip [] ys = [] zip (x:xs) [] = [] zip (x:xs) (y:ys) = (x,y) : zip xs ys zipwith :: (a -> b -> c) -> [a] -> [b] -> [c] zipwith f [] [] = [] zipwith f [] (y:ys) = [] zipwith f (x:xs) [] = [] zipwith f (x:xs) (y:ys) = (f x y) : zipwith f xs ys Najdôležitejšie funkcie
22 Ján Kollár Funkcionálne programovanie 22 (A) Pravidlo aplikácie: (R) Pravidlo rovnosti: f x : T x : T f : T T x : T x : T T = T kde T je nový typ. (F) Pravidlo funkcie: T U = T U T T 1... T n = T T 1... T n T = T U = U T 1 = T 1... T n = T n (.) :: (b -> c) -> (a -> b) -> a -> c (f. g) x = f (g x) ( ) f g x = f (g x) ( ) : T 1 T 2 T 3 T 4 f : T 1 g : T 2 x : T 3 f (g x) : T 4 1. Poďľa (A): f (g x) : T 4 (g x) : T 5 f : T 5 T Poďľa (R): f : T 1 f : T 5 T 4 T 1 = T 5 T Poďľa (A): (g x) : T 5 x : T 6 g : T 6 T Poďľa (R): g : T 2 g : T 6 T 5 T 2 = T 6 T Poďľa (R): x : T 3 x : T 6 T 3 = T 6 = T 7. ( ) : (T 5 T 4 ) (T 7 T 5 ) T 7 T 4 (.) :: (b -> a) -> (c -> b) -> c -> a Pravidlá typovej kontroly a odvodenie typu kompozície
23 Ján Kollár Funkcionálne programovanie 23 f x = x x T 1 = T 1 T 2. f x y = fst x + fst y fst :: (a,b) -> a fst (x,y) = x f x y = fst 1 x + fst 2 y (+) : Int Int Int f : T 1 T 2 T 3 fst 1 : (T 4, T 5 ) T 4 fst 2 : (T 6, T 7 ) T 6 x : T 1 y : T 2 ((+) (fst 1 x))(fst 2 y) : T f :: (Int, a) (Int, b) Int (+)::Num a => a -> a -> a f :: Num a => (a,b) -> (a,c) -> a Odvodenie polymorfného typu zlyhanie a viacnásobná aplikácia funkcie (konštruktora)
24 Ján Kollár Funkcionálne programovanie 24 any :: (a -> Bool) -> [a] -> Bool any p = or. map p all :: (a -> Bool) -> [a] -> Bool all p = and. map p elem :: a -> [a] -> Bool x elem xs = any (x ==) xs reverse :: [a] -> [a] reverse = foldl (flip (:)) [] sp = sum. zipwith (*) flip :: (a -> b -> c) -> b -> a -> c flip f x y = f y x Nerekurzívne definície a funkcie vyššieho rádu
25 Ján Kollár Funkcionálne programovanie [e 1..] generuje nekonečný zoznam počnúc od hodnoty výrazu e 1 s krokom [e 1, e 2..] generuje nekonečný zoznam počnúc od hodnoty výrazu e 1 s krokom e 2 e [e 1..e 3 ] generuje konečný zoznam počnúc od hodnoty výrazu e 1 v intervale e 1, e 3 s krokom [e 1, e 2..e 3 ] generuje konečný zoznam počnúc od hodnoty výrazu e 1 v intervale e 1, e 3 s krokom s krokom e 2 e 1. [ E Q 1,..., Q n ] :: [T ], ak E :: T MA ::= [ E QS ] QS ::= Q 1,..., Q n, pre n 0 Q ::= G F G ::= p <- L p ::= vzor Obr. 1: Syntax množinových abstrakcií Aritmetické postupnosti a množinové abstrakcie
26 Ján Kollár Funkcionálne programovanie 26 E [[ [ E qs ] ]] = C [[ [ E qs ] ]] C [[ [ E ] ]] = [ E [[ E ]] ] (1) C [[ [ E F, qs ] ]] = if (E [[ F ]] ) (C [[ [ E qs ] ]] ) ([ ]) (2) C [[ [ E F ] ]] = if (E [[ F ]] ) (C [[ [ E ] ]] ) ([ ]) (3) C [[ [ E p L, qs ] ]] = h (λp. C [[ [ E qs ] ]] ) (E [[ L ]] ) (4) C [[ [ E p L ] ]] = h (λp. C [[ [ E ] ]] ) (E [[ L ]] ) (5) Obr. 2: Schéma prekladu množinových abstrakcií kde qs je zoznam kvalifikátorov a h je h :: (a -> [b]) -> [a] -> [b] h f [] = [] h f (x:xs) = f x ++ h f xs Platí h f = concat. (map f) Preklad množinových abstrakcií
27 Ján Kollár Funkcionálne programovanie 27 concat :: [[a]] -> [a] concat xss = [x xs <- xss; x <- xs] map :: (a -> b) -> [a] ->[b] map f xs = [f x x <- xs] filter p xs = [x x <- xs; p x] zipwith :: (a -> b -> c) -> [a] -> [b] -> [c] zipwith f xs ys = [f x y (x,y) <- zip xs ys] sp xs ys = sum [x*y (x,y) <- zip xs ys] Použitie množinových abstrakcií
28 Ján Kollár Funkcionálne programovanie 28 data Btree a = Tip a Bin (Btree a) (Btree a) size (Tip x) = 1 size (Bin t1 t2) = size t1 + size t2 nsize (Tip x) = 0 nsize (Bin t1 t2) = 1 + size t1 + size t2 height (Tip x) = 0 height (Bin t1 t2) = 1 + (height t1) max (height t2) mapbtree :: (a->b) -> Btree a -> Btree b mapbtree f (Tip x) = Tip (f x) mapbtree f (Bin t1 t2) = Bin (mapbtree f t1) (mapbtree f t2) foldbtree :: (a->a->a) -> Btree a -> a foldbtree op (Tip x) = x foldbtree op (Bin t1 t2) = (foldbtree op t1) op (foldbtree op t2) sumtips = foldbtree (+) size = foldbtree (+). mapbtree (const 1) const :: a -> b -> a const k x = k height = foldbtree op. mapbtree (const 0) where d1 op d2 = 1 + (d1 max d2) tips = foldbtree (++). mapbtree unit where unit x = [x] data LBtree a b = Tip a Bin b (LBtree a b) (LBtree a b) -- binarny znackovany strom Binárne stromy
29 Ján Kollár Funkcionálne programovanie 29 data BStree a = Nil Bin a (BStree a) (BStree a) empty :: BStree a insert :: a -> BStree a -> BStree a delete :: a -> BStree a -> BStree a member :: a -> BStree a -> Bool Binárne vyhľadávacie stromy a množinové operácie
30 Ján Kollár Funkcionálne programovanie 30 empty = Nil insert x Nil = Bin x Nil Nil insert x (Bin y t1 t2) x < y = Bin y (insert x t1) t2 x == y = Bin y t1 t2 x > y = Bin y t1 (insert x t2) delete x Nil = Nil delete x (Bin y t1 t2) x < y = Bin y (delete x t1) t2 x == y = join t1 t2 x < y = Bin y t1 (delete x t2) join t1 t2 t1 == Nil = t2 otherwise = split t1 t2 split (Bin x t1 t2) t3 t2 == Nil = Bin x t1 t3 otherwise = Bin x t1 (split t2 t3) member x Nil = False member x (Bin y t1 t2) x < y = member x t1 x == y = True x > y = member x t2 labels Nil = [] labels (Bin x t1 t2) = labels t1 ++ [x] ++ labels t2 Implementácia množinových operácií
31 Ján Kollár Funkcionálne programovanie 31 sl Nil = 0 sl (Bin x t1 t2) = height t1 - height t2 Teraz možno def inovať funkciu rebal pre vyváženie stromu, pričom predpokladáme, že jeho podstromy sú vyvážené: rebal t sl t == 2 = shiftr t sl t == -2 = shiftl t otherwise = t Funkcie shiftr a shiftl def inujú posun stromu doprava, resp. ďoľava pomocou rotácií nasledovne: shiftr (Bin x t1 t2) sl t1 == -1 = rotr (Bin x (rotl t1) t2) otherwise = rotr (Bin x t1 t2) shiftl (Bin x t1 t2) sl t2 == 1 = rotl (Bin x t1 (rotr t2)) otherwise = rotl (Bin x t1 t2) rotr (Bin x (Bin y t1 t2) t3) = Bin y t1 (Bin x t2 t3) rotl (Bin x t1 (Bin y t2 t3)) = Bin y (Bin x t1 t2) t3 insert x Nil = Bin x Nil Nil insert x (Bin y t1 t2) x<y = rebal (Bin y (insert x t1) t2) x==y = Bin y t1 t2 x>y = rebal (Bin y t1 (insert x t2)) Vyvážené stromy
32 Ján Kollár Funkcionálne programovanie 32 data Gtree a = Node a [Gtree a] size (Node x gs) = 1 + sum (map size gs) height (Node x []) = 0 height (Node x (g:gs)) = 1 + maximum (map height (g:gs)) mapgtree :: (a -> b) -> Gtree a -> Gtree b mapgtree f (Node x gs) = Node (f x) (map (mapgtree f) gs) foldgtree :: (a -> a -> a) -> Gtree a -> a foldgtree f (Node x gs) = foldl f x (map (foldgtree f) gs) Všeobecné stromy
33 Ján Kollár Funkcionálne programovanie 33 abstr :: R A abstr :: List a [a] abstr Nil = [ ] abstr (Cons x xs) = x : abstr xs abstr :: Nat Int abstr Zero = 0 abstr (Succ x) = abstr x + 1 valid :: R Bool abstr :: [a] Set a abstr [ ] = {} abstr (x : xs) = {x} abstr xs valid1 xs = T rue valid2 xs = nodups xs valid3 xs = nodecs xs Abstraktné typy abstrakčná funkcia a predikát platnosti
34 Ján Kollár Funkcionálne programovanie 34 addset :: a Set a Set a addset x s = {x} s abstr (insert x xs) = addset x (abstr xs) abstr (insert x) = (addset x) abstr (abstr, valid1) (abstr, valid2) (abstr, valid3) insert1 x xs = [x] insert2 x xs = [x] ++ [y y<- xs, x /= y] insert3 x xs = takewhile (< x) xs ++ [x] ++ dropwhile (<= x) xs Príklad implementácie funkcie insert
35 Ján Kollár Funkcionálne programovanie 35 start :: Queue a join :: Queue a a Queue a front :: Queue a a reduce :: Queue a Queue a (1) f ront (join start x) = x (2) front (join (join q x) y) = front (join q x) (3) reduce (join start x) = start (4) reduce (join (join q x) y) = join (reduce (join q x)) y (5) Algebraická špecifikácia abstraktného typu front (Queue)
36 Ján Kollár Funkcionálne programovanie 36 data QUEUE a = Start Join (QUEUE a) a abstr :: QUEUE a Queue a abstr Start = start abstr (Join q x) = join (abstr q) x type QUEUE a = [a] abstr :: QUEUE a Queue a abstr [ ] = start abstr (x : xs) = join (abstr xs) x Príklad voľby rôznej reprezentácie údajov
37 Ján Kollár Funkcionálne programovanie 37 type QUEUE a = [a] class Queue a where start :: QUEUE a join :: QUEUE a -> a -> QUEUE a front :: QUEUE a -> a reduce :: QUEUE a -> QUEUE a isempty :: QUEUE a -> Bool mkqueue :: [a] -> QUEUE a instance Queue Int where start = [] join q x = q ++ [x] front q = head q reduce q = tail q instance Queue Char where start = [] join q x = q ++ [x] front q = head q reduce q = tail q isempty [] = True isempty (x:xs) = False mkqueue [] = start mkqueue (x:xs) = join (mkqueue (init (x:xs))) (last (x:xs)) instance Queue (a,b) where start = [] join q x = q ++ [x] front q = head q reduce q = tail q isempty [] = True isempty (x:xs) = False isempty [] isempty (x:xs) = True = False mkqueue [] = start mkqueue (x:xs) = join (mkqueue (init (x:xs))) (last (x:xs)) mkqueue [] = start mkqueue (x:xs) = join (mkqueue (init (x:xs))) (last (x:xs)) Implementácia abstraktného typu typová trieda a množina inštancií
38 Ján Kollár Funkcionálne programovanie 38 type QUEUE a = [a] class Queue a where start :: QUEUE a join :: QUEUE a -> a -> QUEUE a front :: QUEUE a -> a reduce :: QUEUE a -> QUEUE a isempty :: QUEUE a -> Bool mkqueue :: [a] -> QUEUE a -- definicia operacii pre vsetky instancie start = [] join q x = q ++ [x] front q = head q reduce q = tail q isempty [] = True isempty (x:xs) = False mkqueue [] = start mkqueue (x:xs) = join (mkqueue (init (x:xs))) (last (x:xs)) instance Queue Int instance Queue Char instance Queue (a,b) instance Queue Bool > start::queue Int [] > start::queue (Int,Char) [] > start::queue Char "" > reduce (join (join ( join (start::queue Char) a ) b ) c ) "bc" > front (join (join ( join (start::queue Char) a ) b ) c ) a > reduce (join (join ( join (start::queue Int) 10) 20) 30) [20,30] > front (join (join ( join (start::queue Int) 10) 20) 30) 10 > Špeciálny prípad implementácie abstraktného typu v jazyku Haskell a verifikácia
39 Ján Kollár Funkcionálne programovanie 39 class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b instance Monad IO where (>>=) = primbindio return = primretio return :: a -> IO a (>>=) :: IO a -> (a -> IO b) -> IO b 1. p 0 >>= \x 1 ->p 1 >>= \x 2 ->p 2 >>=... >>= \x (n 1) ->p (n 1) >>= \x n ->p n 2. do { x 1 <- p 0 ; x 2 <- p 1 ;... ; x n <- p (n 1) ; p n } (>>) :: Monad m => m a -> m b -> m b p >> q = p >>= \_ -> q (>>) :: IO a -> IO b -> IO b 1. p 0 >> p 1 >> p 2 >>... >> p (n 1) >> p n 2. p 0 >>= \ ->p 1 >>= \ ->p 2 >>=... >>= \ ->p (n 1) >>= \ ->p n 3. do { p 0 ; p 1 ;... ; p (n 1) ; p n } Používať formu zápisov 1., v žiadnom prípade nie do!!! Monadické operácie return, (>>=) a (>>) a ekvivalentné monadické väzby
40 Ján Kollár Funkcionálne programovanie 40 getchar :: IO Char getch :: IO Char getline :: IO String putchar :: Char -> IO () putstr :: String -> IO () putstrln :: String -> IO () readfile :: FilePath -> IO String writefile :: FilePath -> String -> IO () appendfile :: FilePath -> String -> IO () readbinaryfile :: FilePath -> IO String writebinaryfile :: FilePath -> String -> IO () appendbinaryfile :: FilePath -> String -> IO () import IOExtensions - len pre Hugs98 main = putstrln "Ahoj, ako sa volas?" >>= \x -> getline >>= \meno -> putstrln ("Ahoj " ++ meno ++ "!") > main Ahoj, ako sa volas? Jano Ahoj Jano! > Monadické funkcie pre vstup a výstup, príklad použitia
41 Ján Kollár Funkcionálne programovanie 41 Dokázať platnosť tvrdenia indukciou na zoznamoch znamená riešiť dva prípady: Prípad [ ]. Dokázať, že platí tvrdenie T([ ]). Prípad (x : xs). Dokázať nasledovné: Ak platí tvrdenie T(xs), potom platí aj tvrdenie T(x : xs). Príklad dôkaz platnosti vzťahu: take n xs ++ drop n xs = xs Prípad 0, xs. Pre tento prípad vzťah platí. Prípad n + 1, [ ]. Aj pre tento prípad vzťah platí. Prípad n + 1, (x : xs). take 0 xs ++ drop 0 xs = [ ] ++ xs (take.1, drop.1) = xs (++.1) take (n + 1) [ ] ++ drop (n + 1) [ ] = [ ] ++ [ ] (take.2, drop.2 ) = [ ] (++.1) take (n + 1) (x : xs) ++ drop (n + 1) (x : xs) = (x : take n xs) ++ drop n xs (take.3, drop.3 ) = x : (take n xs ++ drop n xs) (++.2) = x : xs (predpoklad) Vzhľadom na to, že vzťah platí aj pre tretí prípad, platí pre všetky prípustné hodnoty a teda je platný. Dokazovanie správnosti: dôkaz indukciou na zoznamoch
42 Ján Kollár Funkcionálne programovanie 42 data A a = N a S (A a) (A a)... (A a) Dokázať platnosť tvrdenia štrukturálnou indukciou znamená riešiť dva prípady: Prípad (N x). Dokázať, že platí tvrdenie T(N x). Prípad (N x 1 x 2... x n ). Dokázať nasledovné: Ak platia tvrdenia T(x 1 ), T(x 2 ),... T(x n ), potom platí aj tvrdenie T(N x 1 x 2... x n ). Príklad dôkaz platnosti size t 2ˆheight t Platí: size (T ip x) = 1 size (Bin t1 t2) = size t1 + size t2 Dôkaz: Prípad (T ip x). Platí: v súlade s predpokladom. height (T ip x) = 0 height (Bin t1 t2) = 1 + (height t1) max (height t2) size (T ip x) = 1 (size.1) = 2ˆ0 (ˆ.1) = 2ˆheight (T ip x) (height.1) Dokazovanie správnosti: dôkaz štrukturálnou indukciou
43 Ján Kollár Funkcionálne programovanie 43 Prípad (Bin t1 t2). Predpokladajme, vzhľadom na indukciu, že platí: size t1 2ˆheight t1 size t2 2ˆheight t2 a označme Potom platí: d = (height t1) max (height t2) size (Bin t1 t2) = size t1 + size t2 (size.2) (2ˆheight t1) + (2ˆheight t2) (predpoklad) (2ˆd) + (2ˆd) (dosadenie) = 2ˆ(1 + d) (výpočet) = 2ˆ(height (Bin t1 t2)) (height.2) Dokazovanie správnosti: dôkaz štrukturálnou indukciou pokračovanie
44 Ján Kollár Funkcionálne programovanie 44 init xs = take (length xs 1) xs, pre xs [ ] (6) Vzťah (6) je špecifikáciou a zároveň neefektívnou implementáciou. Efektívnejšiu implementáciu odvodíme tým, že odstránime funkcie take a length. (length) :: [a] Int length [ ] = 0 length (x : xs) = 1 + length xs Prípad [x]. init [x] = take (length [x] 1) [x] (dosadenie) = take (1 + length [] 1) [x] (length.2) = take ( ) [x] (length.1) = take 0 [x] (výpočet) = [ ] (take.1) Výsledkom je rovnica Indukčný predpoklad je init [x] = [ ] init (x : xs) = take (length (x : xs) 1) (x : xs) Vzťah syntézy a dokazovania správnosti: syntéza
45 Ján Kollár Funkcionálne programovanie 45 Prípad (x : y : xs). init (x : y : xs) = take (length (x : y : xs) 1) (x : y : xs) (dosadenie) = take (1 + length (y : xs) 1) (x : y : xs) (length.2) = take (length (y : xs)) (x : y : xs) (výpočet) = x : take (length (y : xs) 1) (y : xs) (take.2) = x : init (y : xs) (predpoklad) Druhá rovnica implementácie (pre viac ako jednoprvkový zoznam) je v tvare: init (x : y : xs) = x : init (y : xs) takže odvodená implementácia v tvare výslednej rekurzívnej definície funkcie init je nasledovná: init [x] = [ ] init (x : y : xs) = x : init (y : xs) Vzťah syntézy a dokazovania správnosti: syntéza pokračovanie
46 Ján Kollár Funkcionálne programovanie 46 Prepokladajme teraz, že sme uvedenú funkciu neodvodili, ale priamo ju navrhli. V tom prípade prichádza do úvahy dôkaz platnosti tejto implementácie vo vzťahu na špecifikáciu (6), ktorý spočíva v dôkaze vzťahov init [x] = [ ], pre length [x] = 1 init (x : y : xs) = x : init (y : xs) pre length (x : y : xs) > 1 Dôkaz: Prípad [x]. pre jednoprvkové zoznamy init [x] = [ ] (dosadenie) = take 0 [x] (take.1) = take (length []) [x] (length.1 ) = take ((1 + length []) 1) [x] (úprava) = take (length [x] 1) [x] (length.2) Implementácia teda zodpovedá špecifikácii pre jednoprvkové zoznamy. Prípad (x : y : xs). pre všetky viac ako jednoprvkové zoznamy Indukčný predpoklad: init (x : xs) = take (length (x : xs) 1) (x : xs) init (x : y : xs) = x : init (y : xs) (dosadenie) = x : take (length (y : xs) 1) (y : xs) (predpoklad) = take (length (y : xs)) (x : y : xs) (take.2) = take ((1 + length (y : xs)) 1) (x : y : xs) (úprava) = take (length (x : y : xs) 1) (x : y : xs) (length.2) Implementácia teda zodpovedá špecifikácii aj pre viac ako jednoprvkové zoznamy, a teda je správna. Záver: Dôkaz platnosti pre program syntetizovaný matematickými metódami nemá význam robiť. Vzťah syntézy a dokazovania správnosti: dôkaz platnosti
47 Ján Kollár Funkcionálne programovanie 47 Def inícia 1: Abstraktná syntax jazyka lambda E ::= k konštanta v meno premennej E E aplikácia λv.e abstrakcia lambda incr x = x + 1 (λ(x).(((+) (x)) (1))) add x y = x + y (λ(x).(λ(y).(((+) (x)) (y)))) incr = λx. + x 1 add = λx.λy. + x y Syntax jazyka lambda a príklady vyjadrenia funkcií v jazyku lambda
48 Ján Kollár Funkcionálne programovanie 48 Def inícia 2: Voľná premenná 1. Premenná x je voľná v premennej x (nie však v konštante alebo inej premennej). 2. Premenná x je voľná v aplikácii (E F ) práve vtedy, ak je voľná vo výraze E alebo je voľná vo výraze F. 3. Premenná x je voľná v abstrakcii (λy.e) práve vtedy, ak x a y sú rôzne premenné a x je voľná v E. Def inícia 3: Viazaná premenná 1. Premenná x je viazaná v aplikácii (E F ) práve vtedy, ak je viazaná v E a zároveň je viazaná v F. 2. Premenná x je viazaná v abstrakcii (λy.e) práve vtedy, ak x a y sú tie isté premenné a x je voľná v E alebo ak x je viazaná v E. Vo výraze (λx. + x y) 4 je premenná x viazaná, y je voľná. Operačná sémantika jazyka lambda: voľné a viazané premenné
49 Ján Kollár Funkcionálne programovanie 49 Def inícia 4: Substitúcia E[M/x] Ak x, y a z sú premenné, c je premenná alebo konštanta rôzna od x, a E, F a M sú výrazy lambda, potom substitúcia E[M/x] je def inovaná nasledovne: x [M/x] = M c [M/x] = c (E F ) [M/x] = E[M/x] F [M/x] (λx.e) [M/x] = λx.e (λy.e) [M/x] = λy.e[m/x], ak x nie je voľná v E alebo y nie je voľná v M = λz.(e[z/y]) [M/x], v opačnom prípade,, kde z je nová premenná, ktorá nie je voľná v E a M Operačná sémantika jazyka lambda: substitúcia E[M/x]
50 Ján Kollár Funkcionálne programovanie 50 Definícia 5: Zámena alfa Ak y nie je voľná v E, potom platí: (λx. E) λy. E[y/x] Def inícia 6: Zámena beta (λx.e) M E[M/x] Definícia 7: Zámena eta Ak x nie je voľná v E a E je funkcia, potom: (λx.e x) E Zámeny beta a eta použité zľava doprava ( ) sa nazývajú redukcie. Predpoklad zámeny eta dovoľuje napríklad redukciu eta, ktorou je odstránená nadbytočná abstrakcia lambda (λx. + 1 x) + 1 lebo (+ 1) je funkcia, ktorá neobsahuje x. Na druhej strane redukcia eta (λx. + x x) + x nie je platná, lebo (+ x) je síce funkcia, ale obsahuje x. Operačná sémantika jazyka lambda: pravidlá zameniteľnosti výrazov
51 Ján Kollár Funkcionálne programovanie Redukcia beta: (λx 1.λx 2... λx n.e) F λx 2... λx n. E[F/x 1 ] kde E[F/x 1 ] označuje výraz E, v ktorom všetky výskyty premennej x 1 sú nahradené výrazom F, je platná, ak voľné premenné argumentu F nie sú identické so žiadnym z formálnych parametrov x 1, x 2,..., x n tela E abstrakcie lambda: λx 1.λx 2... λx n. E 2. Zámena alf a: λx. E λy. E[x/y] je platná, ak nové meno y nie je identické s voľnou premennou výrazu E. (λx.λy. + x y) y 2 (λy. + y y) redukcia beta a kolízia y je chybný výsledok. Operačná sémantika jazyka lambda: problém kolízie mien
52 Ján Kollár Funkcionálne programovanie 52 Veta 1: Church-Rosserova veta I Ak E 1 E 2, potom existuje výraz E taký, že platí: E 1 E a súčasne E 2 E Žiadny výraz nemožno redukovať do dvoch rôznych normálnych foriem (t.j. alf a-nekonvertibilných). Dôkaz: Predpokladajme, že E E 1 a E E 2, kde E 1 a E 2 sú v normálnej forme. Potom E 1 E 2 a podľa Church-Rosserovej vety I musí existovať výraz F taký, že platí: E 1 F a súčasne E 2 F Vzhľadom na to, že E 1 a E 2 neobsahujú žiadny redukovateľný výraz, platí E 1 = F = E 2. Veta 2: Church-Rosserova veta II Ak E 1 E 2, a E 2 je v normálnej forme, potom existuje normálne poradie postupnosti redukcií z E 1 do E 2. Normálne poradie redukcie určuje, že prvý bude redukovaný vonkajší (najvrchnejší) výraz zľava, napr.: (λx.(λy.( x y))) (+ 3 4) ( 5 2) (λy.( (+ 3 4) y)) ( 5 2) ( (+ 3 4) ( 5 2)) ( 7 ( 5 2)) ( 7 3) 21 Church-Rosserove vety a normálne poradie redukcie
53 Ján Kollár Funkcionálne programovanie 53 Vonkajšia redukcia zľava. Je to normálne poradie redukcie. Vnútorná redukcia zľava. Výber redukovateľného výrazu sa uskutočňuje sekvenčne zľava, avšak vyžaduje sa, aby aj funkcia aj jej argument boli v normálnej forme. Vonkajšia paralelná redukcia. Všetky redukovateľné výrazy, ktoré nie sú vnorené v iných výrazoch, sú vybraté naraz a naraz sú redukované. Vnútorná paralelná redukcia. Všetky redukovateľné výrazy, ktoré neobsahujú redukovateľné výrazy sú vyberané a redukované súčasne. Úplná paralelná redukcia. Všetky redukovateľné výrazy sú redukované naraz. Táto stratégia je veľmi komplikovaná, keďže výrazy môžu byť vnorené. Ak aj existuje normálna forma, vnútornou stratégiou redukcie nie je vždy dosiahnuteľná, t.j. výpočet nemusí skončiť. Ako príklad možno uviesť vnútornú redukciu: (λy. c) ((λx. x x x) (λx. x x x)) (λy. c) ((λx. x x x) (λx. x x x) (λx. x x x)) (λy. c) ((λx. x x x) (λx. x x x) (λx. x x x) (λx. x x x)) ktorá vedie k expanzii výrazu ((λx. x x x) (λx. x x x)) pričom pri vonkajšej redukcii možno okamžite v prvom kroku získať normálnu formu c. (λy. c) ((λx. x x x) (λx. x x x)) c Stratégie redukcie výrazu
54 Ján Kollár Funkcionálne programovanie 54 Def inícia 8: Slabá pref ixná normálna forma Výraz lambda je v slabej prefixnej normálnej forme práve vtedy, keď je v tvare: F E 1 E 2... E n kde n 0 a F je buď premenná alebo údajový objekt, alebo F je abstrakcia lambda alebo operátor a zároveň F E 1 E 2 je redukovateľný výraz pre m n.... E m nie Výraz neobsahuje žiadny vrcholový redukovateľný výraz vtedy a len vtedy, ak je v slabej prefixnej normálnej forme. Def inícia 9: Pref ixná normálna forma Výraz lambda je v prefixnej normálnej forme práve vtedy, keď je v tvare: λx 1.λx λx n. v M 1 M 2... M m kde n, m 0 a v je premenná x i, údajový objekt alebo operátor a (v M 1 M 2... M p ) nie je redukovateľný výraz pre p m. Každý výraz v pref ixnej normálnej forme je zároveň výrazom v slabej pref ixnej normálnej forme, ale nie naopak. Normálne formy výrazu
55 Ján Kollár Funkcionálne programovanie 55 Funkcia f: f = λx. E je rekurzívna, ak obsahuje premennú f v svojom tele E. Pomocou abstrakcie beta ju možno vyjadriť nasledovne: f = (λx. E) (λn.λx. E[n/f]) f = H f kde H = λn.λx. E[n/f] je abstrakcia lambda, ktorá neobsahuje f vo výraze E[n/f], je to teda nerekurzívna funkcia. Potom rovnica: f = H f (7) znamená, že ak H sa aplikuje na f, výsledok ostáva f, a preto je f pevným bodom funkcie H. Funkcia môže mať aj viac pevných bodov, napr. 0 a 1 sú pevné body funkcie λx. x x Funkcia Y, nazývaná tiež kombinátorom pevného bodu je funkcia, ktorá vypočíta pevný bod, keď je aplikovaná na H (pretože pevný bod f závisí jedine od H). Teda platí: f = Y H (8) a po dosadení do rovnice (7) Y H = H (Y H) (9) Pritom kombinátor pevného bodu Y je def inovaný nasledovne: Dosadením do (9) možno preveriť správnosť def inície (10). Y = (λh.(λx. h (x x)) (λx. h (x x))) (10) Vyjadrenie rekurzívnych funkcií v netypovanom jazyku lambda
56 Ján Kollár Funkcionálne programovanie 56 Def inícia kombinátora Y je nerekurzívna a teda umožňuje vyjadriť rekurzívnu funkciu f pomocou aplikácie nerekurzívneho kombinátora pevného bodu Y na funkciu H, ktorá je tiež nerekurzívna. Napr. rekurzívnu funkciu fac k = 1, if k = 0 = k f ac (k 1), otherwise vyjadrenú vo formálne nesprávnom (a rekurzívnom) tvare fac = λk. IF (= k 0) 1 ( k (fac ( k 1))) je možné vyjadriť správne a nerekurzívne nasledovne: fac = (λh. (λx. h (x x)) (λx. h (x x))) (λn.λk. IF (= k 0) 1 ( k (n ( k 1)))) Implementácia rekurzívnych funkcií na báze rozšíreného jazyka lambda nevyžaduje uplatnenie kombinátora Y. Vyjadrenie rekurzívnych funkcií v netypovanom jazyku lambda pokračovanie
57 Ján Kollár Funkcionálne programovanie 57 Eval [[ k ]] hodnota konštanty Eval [[ x ]] ρ = ρ x Eval [[ E 1 E 2 ]] ρ = (Eval [[ E 1 ]] ρ) (Eval [[ E 2 ]] ρ) Eval [[ λx.e ]] ρ a = Eval [[ E ]] ρ[x = a] kde k je konštanta alebo operátor x je premenná a je hodnota E, E 1, E 2 sú výrazy ρ je prostredie, t.j. funkcia zobrazujúca mená premenných do ich hodnôt Platí ρ[x = a] x = a ρ[x = a] y = ρ y kde ρ[x = a] je funkcia ρ, ktorá má premennú x viazanú na hodnotu a. Definícia 10: Symbol Symbol označuje nedef inovanú hodnotu a je def inovaný nasledovne: Eval [[ E ]] = kde E je výraz, ktorý nemá normálnu formu. Denotačná sémantika jazyka lambda
58 Ján Kollár Funkcionálne programovanie 58 Def inícia 11: Striktná funkcia Funkcia f je striktná vzhľadom na svoj argument práve vtedy, ak platí: f = Def inícia 12: Nestriktná funkcia Funkcia f je nestriktná vzhľadom na svoj argument práve vtedy, ak platí: f = a Striktnosť a nestriktnosť funkcie definícia
59 Ján Kollár Funkcionálne programovanie 59 Eval [[ ]] T rue T rue = T rue Eval [[ ]] T rue F alse = T rue Eval [[ ]] F alse T rue = T rue Eval [[ ]] F alse F alse = F alse Eval [[ ]] T rue = T rue Eval [[ ]] T rue = T rue Eval [[ ]] F alse = Eval [[ ]] F alse = Eval [[ ]] = Eval [[ IF ]] T rue a b = a Eval [[ IF ]] F alse a b = b Eval [[ IF ]] a b = Eval [[ < ]] x y = x < y, ak x a y Eval [[ < ]] y = Eval [[ < ]] x = Eval [[ / ]] x y = x/y, ak x a y a y 0 Eval [[ / ]] x y =, ak x a y a y = 0 Eval [[ < ]] y = Eval [[ < ]] x = Striktnosť a nestriktnosť funkcie príklady
60 Ján Kollár Funkcionálne programovanie 60 Všeobecne platí: Eval [[ k ]] = k kde k na ľavej strane je konštanta ako syntaktický objekt a k na pravej strane je hodnota konštanty (čísla, operátora alebo konštruktora). Napríklad: Eval [[ 3 ]] = 3 ; numerická konštanta Eval [[ a ]] = a ; znaková konštanta Eval [[ IF ]] = IF ; operátor Eval [[ + ]] = + ; operátor Eval [[ T rue ]] = T rue ; konštruktor Eval [[ Nil ]] = Nil ; konštruktor Eval [[ Cons ]] = Cons ; konštruktor Sémantika konštanty a operátora
61 Ján Kollár Funkcionálne programovanie 61 Def inícia 13: Výpočet na základe hodnoty Základným princípom tohto výpočtu je mechanizmus, pri ktorom hodnoty argumentov funkcie musia byť vypočítané predtým, ako je funkcia aplikovaná. Ide o princíp vnútornej redukcie. Odovzdávanie skutočných parametrov je realizované hodnotou (callby-value). Def inícia 14: Výpočet na základe požiadavky Pre tento výpočet je charakteristické, že hodnoty argumentov funkcie sú vypočítané až na základe požiadavky. Ide teda o princíp vonkajšej redukcie. Odovzdávanie skutočných parametrov je realizované menom (call-by-name). Nestriktnosť je matematickou vlastnosťou funkcie (operácie) a výpočet na základe požiadavky je jej výhodným sekvenčným implementačným mechanizmom, pretože neužitočný výraz netreba vôbec počítať. Princíp výpočtu na základe požiadavky a hodnoty
62 Ján Kollár Funkcionálne programovanie 62 Def inícia 15: Superkombinátor Superkombinátor $S násobnosti n je výraz lambda v tvare: $S = λx 1.λx λx n. E kde E nie je abstrakcia lambda, taký, že platí 1. $S neobsahuje voľné premenné 2. Každá abstrakcia lambda vo výraze E je superkombinátorom 3. n 0 Kombinátor je špecif ickým výrazom lambda a superkombinátor je špecif ickým kombinátorom. Transformácia do superkombinátorovej formy znamená odstránenie voľných premenných. Algoritmus, pomocou ktorého je to možné dosiahnuť, sa nazýva λ lifting. Kombinátory superkombinátory
63 Ján Kollár Funkcionálne programovanie 63 Pravidlá pre transformáciu abstrakcií lambda do kombinátorov SK sa nazývajú transformácie S, K a I, a sú nasledovné: (λx.e 1 e 2 ) S (λx.e 1 ) (λx. e 2 ) (λx.c) K c (c x) (λx.x) I Napríklad nech funkcia h je vyjadrená nasledovnou abstrakciou lambda: h = λx. OR x T RUE kde OR a T RU E sú konštanty. Dvojnásobným použitím transformácie S dostaneme: (λx. OR x T RUE) S S (λx. OR x) (λx. T RUE) S S (S (λx. OR) (λx. x)) (λx. T RUE) Ďalej použitím transformácie I a K dostaneme výsledok nasledovne: ((S (λx. OR) (λx. x)) (λx. T RUE)) I S (S (λx. OR) I) (λx. T RUE) K S (S (K OR) I) (λx. T RUE) K S (S (K OR) I) (K T RUE) Funkciu h teda možno vyjadriť v tvare kombinátorov S, K a I nasledovne: h = S (S (K OR) I) (K T RUE) Kombinátory SK transformácia výrazu lambda
64 Ján Kollár Funkcionálne programovanie 64 Redukčné pravidlá pre kombinátory S, K, a I sú nasledovné: S f g x f x (g x) K c y c I x x Príklad redukcie výrazu (h y): čo skutočne zodpovedá výrazu (h y) = S (S (K OR) I) (K T RUE) y S S (K OR) I y (K T RUE y) S K OR y (I y) (K T RUE y) K OR (I y) (K T RUE y) I OR y (K T RUE y) K OR y T RUE (λx. OR x T RUE) y po redukcii beta. Nazáver možno ukázať, že kombinátor I možno nahradiť výrazom (S K K) a teda kombinátor I je nadbytočný. Ak aplikujeme výraz (S K K) na výraz x dostaneme výraz x: čo zodpovedá aplikácii I na x: Výraz (S K K) je teda ekvivalentný kombinátoru I. (S K K) x S K x (K x) K x I x I x Kombinátory SK redukcia výrazu v tvare kombinátorov SK
65 FUNKCIONÁLNE PROGRAMOVANIE c prof. Ing. Ján Kollár, CSc. Katedra počítačov a informatiky Fakulta elektrotechniky a informatiky Technická univerzita v Košiciach
Ekvačná a kvantifikačná logika
a kvantifikačná 3. prednáška (6. 10. 004) Prehľad 1 1 (dokončenie) ekvačných tabliel Formula A je ekvačne dokázateľná z množiny axióm T (T i A) práve vtedy, keď existuje uzavreté tablo pre cieľ A ekvačných
Διαβάστε περισσότεραMatematika Funkcia viac premenných, Parciálne derivácie
Matematika 2-01 Funkcia viac premenných, Parciálne derivácie Euklidovská metrika na množine R n všetkých usporiadaných n-íc reálnych čísel je reálna funkcia ρ: R n R n R definovaná nasledovne: Ak X = x
Διαβάστε περισσότερα1. Limita, spojitost a diferenciálny počet funkcie jednej premennej
. Limita, spojitost a diferenciálny počet funkcie jednej premennej Definícia.: Hromadný bod a R množiny A R: v každom jeho okolí leží aspoň jeden bod z množiny A, ktorý je rôzny od bodu a Zadanie množiny
Διαβάστε περισσότεραCvičenie č. 4,5 Limita funkcie
Cvičenie č. 4,5 Limita funkcie Definícia ity Limita funkcie (vlastná vo vlastnom bode) Nech funkcia f je definovaná na nejakom okolí U( ) bodu. Hovoríme, že funkcia f má v bode itu rovnú A, ak ( ε > )(
Διαβάστε περισσότεραMatematika prednáška 4 Postupnosti a rady 4.5 Funkcionálne rady - mocninové rady - Taylorov rad, MacLaurinov rad
Matematika 3-13. prednáška 4 Postupnosti a rady 4.5 Funkcionálne rady - mocninové rady - Taylorov rad, MacLaurinov rad Erika Škrabul áková F BERG, TU Košice 15. 12. 2015 Erika Škrabul áková (TUKE) Taylorov
Διαβάστε περισσότεραGoniometrické rovnice a nerovnice. Základné goniometrické rovnice
Goniometrické rovnice a nerovnice Definícia: Rovnice (nerovnice) obsahujúce neznámu x alebo výrazy s neznámou x ako argumenty jednej alebo niekoľkých goniometrických funkcií nazývame goniometrickými rovnicami
Διαβάστε περισσότεραStart. Vstup r. O = 2*π*r S = π*r*r. Vystup O, S. Stop. Start. Vstup P, C V = P*C*1,19. Vystup V. Stop
1) Vytvorte algoritmus (vývojový diagram) na výpočet obvodu kruhu. O=2xπxr ; S=πxrxr Vstup r O = 2*π*r S = π*r*r Vystup O, S 2) Vytvorte algoritmus (vývojový diagram) na výpočet celkovej ceny výrobku s
Διαβάστε περισσότεραTomáš Madaras Prvočísla
Prvočísla Tomáš Madaras 2011 Definícia Nech a Z. Čísla 1, 1, a, a sa nazývajú triviálne delitele čísla a. Cele číslo a / {0, 1, 1} sa nazýva prvočíslo, ak má iba triviálne delitele; ak má aj iné delitele,
Διαβάστε περισσότερα7. FUNKCIE POJEM FUNKCIE
7. FUNKCIE POJEM FUNKCIE Funkcia f reálnej premennej je : - každé zobrazenie f v množine všetkých reálnych čísel; - množina f všetkých usporiadaných dvojíc[,y] R R pre ktorú platí: ku každému R eistuje
Διαβάστε περισσότεραΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΣΧΟΛΗ ΘΕΤΙΚΩΝ ΕΠΙΣΤΗΜΩΝ ΤΜΗΜΑ ΜΑΘΗΜΑΤΙΚΩΝ ΙΠΛΩΜΑΤΙΚΗ ΕΡΓΑΣΙΑ ηµιουργία και χειρισµός LIFO λιστών µεταβλητού µήκους µε στοιχεία ακεραίους αριθµούς. Γενίκευση για χειρισµό λιστών πραγµατικών
Διαβάστε περισσότερα6 Limita funkcie. 6.1 Myšlienka limity, interval bez bodu
6 Limita funkcie 6 Myšlienka ity, interval bez bodu Intuitívna myšlienka ity je prirodzená, ale definovať presne pojem ity je značne obtiažne Nech f je funkcia a nech a je reálne číslo Čo znamená zápis
Διαβάστε περισσότεραΤι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations) f : A B σημαίνει:
Τι σημαίνουν οι τύποι συναρτήσεων στην ML f : A B σημαίνει: Για κάθε x A, f(x) = για κάποιο στοιχείο y = f(x) B ατέρμονη εκτέλεση η εκτέλεση τερματίζει εγείροντας κάποια εξαίρεση Με λόγια: εάν η αποτίμηση
Διαβάστε περισσότεραKompilátory. Cvičenie 6: LLVM. Peter Kostolányi. 21. novembra 2017
Kompilátory Cvičenie 6: LLVM Peter Kostolányi 21. novembra 2017 LLVM V podstate sada nástrojov pre tvorbu kompilátorov LLVM V podstate sada nástrojov pre tvorbu kompilátorov Pôvodne Low Level Virtual Machine
Διαβάστε περισσότεραΠολυμορφισμός και Υπερφόρτωση
Πολυμορφισμός και Υπερφόρτωση Γιάννης Κασσιός Σε αυτές τις σημειώσεις, θα ασχοληθούμε με πιο προχωρημένα θέματα του συστήματος τύπων της Haskell και πιο συγκεκριμένα με τις έννοιες του πολυμορφισμού (polymorphism)
Διαβάστε περισσότεραObvod a obsah štvoruholníka
Obvod a štvoruholníka D. Štyri body roviny z ktorých žiadne tri nie sú kolineárne (neležia na jednej priamke) tvoria jeden štvoruholník. Tie body (A, B, C, D) sú vrcholy štvoruholníka. strany štvoruholníka
Διαβάστε περισσότεραΗ γλώσσα ML σε βάθος. Τι σημαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγμα επισημειώσεων τύπων στην ML. Επισημειώσεις τύπων (type annotations)
Η γλώσσα ML σε βάθος Τι σημαίνουν οι τύποι συναρτήσεων στην ML f : A B σημαίνει: Για κάθε x A, f(x) = για κάποιο στοιχείο y=f(x) B ατέρμονη εκτέλεση η εκτέλεση τερματίζει εγείροντας κάποια εξαίρεση Με
Διαβάστε περισσότεραHaskell: Βασικές Δομές Δεδομένων και Απόκρυψη Ονομάτων
Haskell: Βασικές Δομές Δεδομένων και Απόκρυψη Ονομάτων Γιάννης Κασσιός Σε αυτές τις σημειώσεις, θα εισάγουμε τις δύο βασικές δομές δεδομένων που υποστηρίζει η Haskell, τις πλειάδες (tuples) και τις λίστες
Διαβάστε περισσότεραΗ γλώσσα ML σε βάθος. Joan Miró, El Carnaval del Arlequín, Κωστής Σαγώνας Νίκος Παπασπύρου
Η γλώσσα ML σε βάθος Joan Miró, El Carnaval del Arlequín, 1925 Κωστής Σαγώνας Νίκος Παπασπύρου Τι σημαίνουν οι τύποι συναρτήσεων στην ML f : A B σημαίνει: Για
Διαβάστε περισσότεραΤι σηµαίνουν οι τύποι συναρτήσεων στην ML. Παράδειγµα επισηµειώσεων τύπων στην ML. Επισηµειώσεις τύπων (type annotations) Σύνταξη ταιριάσµατος
Τι σηµαίνουν οι τύποι συναρτήσεων στην ML f : A B σηµαίνει: Για κάθε x A f(x) = για κάποιο στοιχείο y = f(x) B ατέρµονη εκτέλεση η εκτέλεση τερµατίζει εγείροντας κάποια εξαίρεση Με λόγια: εάν η αποτίμηση
Διαβάστε περισσότεραΣυναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων
Συναρτησιακός Προγραμματισμός 2008 Λύσεις στο Δεύτερο Φύλλο Ασκήσεων 1. Στις Σημ. 4, είδαμε τη δημιουργία της κλάσης Condition που μας επιτρέπει να χρησιμοποιούμε αριθμούς, λίστες και ζεύγη ως αληθοτιμές
Διαβάστε περισσότεραΗ γλώσσα ML σε βάθος. Γλώσσες Προγραμματισμού Ι. Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας
Σχολή Ηλεκτρολόγων Μηχανικών και Μηχανικών Υπολογιστών Τομέας Τεχνολογίας Πληροφορικής και Υπολογιστών Εθνικό Μετσόβιο Πολυτεχνείο Γλώσσες Προγραμματισμού Ι Διδάσκοντες: Νικόλαος Παπασπύρου, Κωστής Σαγώνας
Διαβάστε περισσότεραMotivácia Denícia determinantu Výpo et determinantov Determinant sú inu matíc Vyuºitie determinantov. Determinanty. 14. decembra 2010.
14. decembra 2010 Rie²enie sústav Plocha rovnobeºníka Objem rovnobeºnostena Rie²enie sústav Príklad a 11 x 1 + a 12 x 2 = c 1 a 21 x 1 + a 22 x 2 = c 2 Dostaneme: x 1 = c 1a 22 c 2 a 12 a 11 a 22 a 12
Διαβάστε περισσότεραΚΥΡΙΑ ΜΟΝΤΕΛΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ
ΚΥΡΙΑ ΜΟΝΤΕΛΑ ΓΛΩΣΣΩΝ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ 27 Κύρια προγραμματιστικά μοντέλα (1) Προστακτικός προγραμματισμός (imperative programming) FORTRAN, Algol, COBOL, BASIC, C, Pascal, Modula-2, Ada Συναρτησιακός προγραμματισμός
Διαβάστε περισσότεραPrechod z 2D do 3D. Martin Florek 3. marca 2009
Počítačová grafika 2 Prechod z 2D do 3D Martin Florek florek@sccg.sk FMFI UK 3. marca 2009 Prechod z 2D do 3D Čo to znamená? Ako zobraziť? Súradnicové systémy Čo to znamená? Ako zobraziť? tretia súradnica
Διαβάστε περισσότεραModerné vzdelávanie pre vedomostnú spoločnosť Projekt je spolufinancovaný zo zdrojov EÚ M A T E M A T I K A
M A T E M A T I K A PRACOVNÝ ZOŠIT II. ROČNÍK Mgr. Agnesa Balážová Obchodná akadémia, Akademika Hronca 8, Rožňava PRACOVNÝ LIST 1 Urč typ kvadratickej rovnice : 1. x 2 3x = 0... 2. 3x 2 = - 2... 3. -4x
Διαβάστε περισσότεραARMA modely čast 2: moving average modely (MA)
ARMA modely čast 2: moving average modely (MA) Beáta Stehlíková Časové rady, FMFI UK, 2014/2015 ARMA modely časť 2: moving average modely(ma) p.1/24 V. Moving average proces prvého rádu - MA(1) ARMA modely
Διαβάστε περισσότεραGramatická indukcia a jej využitie
a jej využitie KAI FMFI UK 29. Marec 2010 a jej využitie Prehľad Teória formálnych jazykov 1 Teória formálnych jazykov 2 3 a jej využitie Na počiatku bolo slovo. A slovo... a jej využitie Definícia (Slovo)
Διαβάστε περισσότεραΚεφάλαιο 8. Συναρτησιακός Προγραμματισμός: Η Γλώσσα Haskell. Προπτυχιακό μάθημα Αρχές Γλωσσών Προγραμματισμού Π. Ροντογιάννης
Κεφάλαιο 8 Συναρτησιακός Προγραμματισμός: Η Γλώσσα Haskell Προπτυχιακό μάθημα Αρχές Γλωσσών Προγραμματισμού Π. Ροντογιάννης 1 Συναρτησιακές Γλώσσες Προγραμματισμού Γλώσσες στις οποίες ο προγραμματιστής
Διαβάστε περισσότεραKomplexné čísla, Diskrétna Fourierova transformácia 1
Komplexné čísla, Diskrétna Fourierova transformácia Komplexné čísla C - množina všetkých komplexných čísel komplexné číslo: z = a + bi, kde a, b R, i - imaginárna jednotka i =, t.j. i =. komplexne združené
Διαβάστε περισσότεραΕισαγωγή στη γλώσσα Haskell
Haskell Εισαγωγή στη γλώσσα Haskell ØΕίναι µια καινοτόµα συναρτησιακή γλώσσα προγραµµατισµού γενικής χρήσεως µε µη αυστηρή σηµασιολογία και ισχυρούς τύπους. ØΕίναι περισσότερο ευέλικτη και δυναµική γλώσσα
Διαβάστε περισσότεραPlanárne a rovinné grafy
Planárne a rovinné grafy Definícia Graf G sa nazýva planárny, ak existuje jeho nakreslenie D, v ktorom sa žiadne dve hrany nepretínajú. D sa potom nazýva rovinný graf. Planárne a rovinné grafy Definícia
Διαβάστε περισσότεραIntegrovanie racionálnych funkcií
Integrovanie racionálnych funkcií Tomáš Madaras 2009-20 Z teórie funkcií už vieme, že každá racionálna funkcia (t.j. podiel dvoch polynomických funkcií) sa dá zapísať ako súčet polynomickej funkcie a funkcie
Διαβάστε περισσότεραM6: Model Hydraulický systém dvoch zásobníkov kvapaliny s interakciou
M6: Model Hydraulický ytém dvoch záobníkov kvapaliny interakciou Úlohy:. Zotavte matematický popi modelu Hydraulický ytém. Vytvorte imulačný model v jazyku: a. Matlab b. imulink 3. Linearizujte nelineárny
Διαβάστε περισσότεραÚvod do lineárnej algebry. Monika Molnárová Prednášky
Úvod do lineárnej algebry Monika Molnárová Prednášky 2006 Prednášky: 3 17 marca 2006 4 24 marca 2006 c RNDr Monika Molnárová, PhD Obsah 2 Sústavy lineárnych rovníc 25 21 Riešenie sústavy lineárnych rovníc
Διαβάστε περισσότερα4. Výrokové funkcie (formy), ich definičný obor a obor pravdivosti
4. Výrokové funkcie (formy), ich definičný obor a obor pravdivosti Výroková funkcia (forma) ϕ ( x) je formálny výraz (formula), ktorý obsahuje znak x, pričom x berieme z nejakej množiny M. Ak za x zvolíme
Διαβάστε περισσότεραPREHĽAD ZÁKLADNÝCH VZORCOV A VZŤAHOV ZO STREDOŠKOLSKEJ MATEMATIKY. Pomôcka pre prípravný kurz
KATEDRA APLIKOVANEJ MATEMATIKY A INFORMATIKY STROJNÍCKA FAKULTA TU KOŠICE PREHĽAD ZÁKLADNÝCH VZORCOV A VZŤAHOV ZO STREDOŠKOLSKEJ MATEMATIKY Pomôcka pre prípravný kurz 8 ZÁKLADNÉ ALGEBRAICKÉ VZORCE ) (a±b)
Διαβάστε περισσότεραNávrh vzduchotesnosti pre detaily napojení
Výpočet lineárneho stratového súčiniteľa tepelného mosta vzťahujúceho sa k vonkajším rozmerom: Ψ e podľa STN EN ISO 10211 Návrh vzduchotesnosti pre detaily napojení Objednávateľ: Ing. Natália Voltmannová
Διαβάστε περισσότεραMatematika 2. časť: Funkcia viac premenných Letný semester 2013/2014
Matematika 2 časť: Funkcia viac premenných Letný semester 2013/2014 RNDr. Jana Pócsová, PhD. Ústav riadenia a informatizácie výrobných procesov Fakulta BERG Technická univerzita v Košiciach e-mail: jana.pocsova@tuke.sk
Διαβάστε περισσότεραSpojité rozdelenia pravdepodobnosti. Pomôcka k predmetu PaŠ. RNDr. Aleš Kozubík, PhD. 26. marca Domovská stránka. Titulná strana.
Spojité rozdelenia pravdepodobnosti Pomôcka k predmetu PaŠ Strana z 7 RNDr. Aleš Kozubík, PhD. 6. marca 3 Zoznam obrázkov Rovnomerné rozdelenie Ro (a, b). Definícia.........................................
Διαβάστε περισσότεραReálna funkcia reálnej premennej
(ÚMV/MAN3a/10) RNDr. Ivan Mojsej, PhD ivan.mojsej@upjs.sk 18.10.2012 Úvod V každodennom živote, hlavne pri skúmaní prírodných javov, procesov sa stretávame so závislosťou veľkosti niektorých veličín od
Διαβάστε περισσότεραJednotkový koreň (unit root), diferencovanie časového radu, unit root testy
Jednotkový koreň (unit root), diferencovanie časového radu, unit root testy Beáta Stehlíková Časové rady, FMFI UK, 2012/2013 Jednotkový koreň(unit root),diferencovanie časového radu, unit root testy p.1/18
Διαβάστε περισσότεραMatematika 2. časť: Analytická geometria
Matematika 2 časť: Analytická geometria RNDr. Jana Pócsová, PhD. Ústav riadenia a informatizácie výrobných procesov Fakulta BERG Technická univerzita v Košiciach e-mail: jana.pocsova@tuke.sk Súradnicové
Διαβάστε περισσότεραOdporníky. 1. Príklad1. TESLA TR
Odporníky Úloha cvičenia: 1.Zistite technické údaje odporníkov pomocou katalógov 2.Zistite menovitú hodnotu odporníkov označených farebným kódom Schématická značka: 1. Príklad1. TESLA TR 163 200 ±1% L
Διαβάστε περισσότεραx x x2 n
Reálne symetrické matice Skalárny súčin v R n. Pripomeniem, že pre vektory u = u, u, u, v = v, v, v R platí. dĺžka vektora u je u = u + u + u,. ak sú oba vektory nenulové a zvierajú neorientovaný uhol
Διαβάστε περισσότεραRiešenie cvičení z 5. kapitoly
Riešenie cvičení z 5. kapitoly Cvičenie 5.1. Vety prepíšte pomocou jazyka predikátovej logiky, použite symboly uvedené v úlohách. (a Niekto má hudobný sluch (H a niekto ho nemá. ( H( ( H( (b Niektoré dieťa
Διαβάστε περισσότεραΕισαγωγή στη Γλώσσα ML. Juan Miró
Εισαγωγή στη Γλώσσα ML Juan Miró Κωστής Σαγώνας Συναρτησιακός και Προστακτικός Προγραμματισμός Ένας τρόπος διαχωρισμού Ο προστακτικός προγραμματισμός επικεντρώνει στο πώς θα υλοποιήσουμε
Διαβάστε περισσότεραGoniometrické substitúcie
Goniometrické substitúcie Marta Kossaczká S goniometrickými funkciami ste sa už určite stretli, pravdepodobne predovšetkým v geometrii. Ich použitie tam ale zďaleka nekončí. Nazačiatoksizhrňme,čoonichvieme.Funkciesínusakosínussadajúdefinovať
Διαβάστε περισσότεραΚεφάλαιο 10 H γλώσσα συναρτησιακού προγραμματισμού Haskell Τα βασικά
Κεφάλαιο 10 H γλώσσα συναρτησιακού προγραμματισμού Haskell Τα βασικά Σύνοψη Στο κεφάλαιο αυτό παρουσιάζεται ο τρόπος με τον οποίο μπορούμε να γράφουμε προγράμματα Haskell, διατυπώνοντας ορισμούς συναρτήσεων,
Διαβάστε περισσότεραΕισαγωγή στη Γλώσσα ML
Συναρτησιακός και Προστακτικός Προγραμματισμός Εισαγωγή στη Γλώσσα ML Ένας τρόπος διαχωρισμού Ο προστακτικός προγραμματισμός επικεντρώνει στο πως θα υλοποιήσουμε τα συστατικά του προγράμματός μας Ο συναρτησιακός
Διαβάστε περισσότεραΔομές Δεδομένων & Αλγόριθμοι
Ουρές Ουρές Περίληψη Η ΟυράΑΔΤ Υλοποίηση με κυκλικό πίνακα Αυξανόμενη Ουρά βασισμένη σε πίνακα Interface ουράς στην C++ Η Ουρά ADT Η ΑΔΤ Ουρά αποθηκεύει αυθαίρετα αντικείμενα Οι εισαγωγές και διαγραφές
Διαβάστε περισσότεραZákladné vzťahy medzi hodnotami goniometrických funkcií
Ma-Go-2-T List Základné vzťahy medzi hodnotami goniometrických funkcií RNDr. Marián Macko U: Predstav si, že ti zadám hodnotu jednej z goniometrických funkcií. Napríklad sin x = 0,6. Vedel by si určiť
Διαβάστε περισσότεραFunkcie - základné pojmy
Funkcie - základné pojmy DEFINÍCIA FUNKCIE Nech A, B sú dve neprázdne číselné množiny. Ak každému prvku x A je priradený najviac jeden prvok y B, tak hovoríme, že je daná funkcia z množiny A do množiny
Διαβάστε περισσότεραLineárna algebra I - pole skalárov, lineárny priestor, lineárna závislosť, dimenzia, podpriestor, suma podpriestorov, izomorfizmus
1. prednáška Lineárna algebra I - pole skalárov, lineárny priestor, lineárna závislosť, dimenzia, podpriestor, suma podpriestorov, izomorfizmus Matematickým základom kvantovej mechaniky je teória Hilbertových
Διαβάστε περισσότεραΣτοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής
Στοίβες - Ουρές Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής οµές εδοµένων 1 Στοίβα (stack) οµή τύπουlifo: Last In - First Out (τελευταία εισαγωγή πρώτη εξαγωγή) Περιορισµένος
Διαβάστε περισσότεραARMA modely čast 2: moving average modely (MA)
ARMA modely čast 2: moving average modely (MA) Beáta Stehlíková Časové rady, FMFI UK, 2011/2012 ARMA modely časť 2: moving average modely(ma) p.1/25 V. Moving average proces prvého rádu - MA(1) ARMA modely
Διαβάστε περισσότεραDefinícia parciálna derivácia funkcie podľa premennej x. Definícia parciálna derivácia funkcie podľa premennej y. Ak existuje limita.
Teória prednáška č. 9 Deinícia parciálna deriácia nkcie podľa premennej Nech nkcia Ak eistje limita je deinoaná okolí bod [ ] lim. tak túto limit nazýame parciálno deriácio nkcie podľa premennej bode [
Διαβάστε περισσότερα2. prednáška. Teória množín I. množina operácie nad množinami množinová algebra mohutnosť a enumerácia karteziánsky súčin
2. prednáška Teória množín I množina operácie nad množinami množinová algebra mohutnosť a enumerácia karteziánsky súčin Verzia: 27. 9. 2009 Priesvtika: 1 Definícia množiny Koncepcia množiny patrí medzi
Διαβάστε περισσότεραDynamic types, Lambda calculus machines Section and Practice Problems Apr 21 22, 2016
Harvard School of Engineering and Applied Sciences CS 152: Programming Languages Dynamic types, Lambda calculus machines Apr 21 22, 2016 1 Dynamic types and contracts (a) To make sure you understand the
Διαβάστε περισσότεραVLASTNÉ ČÍSLA A JORDANOV KANONICKÝ TVAR. Michal Zajac. 3 T b 1 = T b 2 = = = 2b
VLASTNÉ ČÍSLA A JORDANOV KANONICKÝ TVAR Michal Zajac Vlastné čísla a vlastné vektory Pripomeňme najprv, že lineárny operátor T : L L je vzhl adom na bázu B = {b 1, b 2,, b n } lineárneho priestoru L určený
Διαβάστε περισσότεραΟρισμός Συναρτήσεων στην ΜL
Ορισμός Συναρτήσεων στην ΜL Ονόματα και δεσμεύσεις: ησυνάρτησηval Τα ονόματα σταθερών δεσμεύονται με τιμές σταθερών μέσω ορισμών της συνάρτησης val. val codeof0 = ord 0 val codeof9 = codeof0 + 9 Τα ονόματα
Διαβάστε περισσότεραMotivácia pojmu derivácia
Derivácia funkcie Motivácia pojmu derivácia Zaujíma nás priemerná intenzita zmeny nejakej veličiny (dráhy, rastu populácie, veľkosti elektrického náboja, hmotnosti), vzhľadom na inú veličinu (čas, dĺžka)
Διαβάστε περισσότεραMIDTERM (A) riešenia a bodovanie
MIDTERM (A) riešenia a bodovanie 1. (7b) Nech vzhl adom na štandardnú karteziánsku sústavu súradníc S 1 := O, e 1, e 2 majú bod P a vektory u, v súradnice P = [0, 1], u = e 1, v = 2 e 2. Aký predpis bude
Διαβάστε περισσότεραFUNKTSIONAALNE PROGRAMMEERIMINE. Skeemid. Eesmärk: esitada riistvara skeeme ja teisi andmevoodiagrammidel baseeruvaid kirjeldusi Haskellis
Skeemid Eesmärk: esitada riistvara skeeme ja teisi andmevoodiagrammidel baseeruvaid kirjeldusi Haskellis VARMO VENE 1 Skeemid Skeemid koosnevad juhtmetest ja komponentidest Läbi juhtmete voolavad etteantud
Διαβάστε περισσότεραΚεφάλαιο 11 Εκφραστικές δυνατότητες της Haskell
Κεφάλαιο 11 Εκφραστικές δυνατότητες της Haskell Σύνοψη Στο κεφάλαιο αυτό παρουσιάζονται οι περιφραστικές λίστες, μια δυνατότητα που παρέχει η Haskell και με την οποία μπορούμε πολύ εύκολα να ορίσουμε διάφορες
Διαβάστε περισσότεραΜοντέλα Προγραµµατισµού
ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΕΠΙΣΤΗΜΗ ΤΩΝ ΥΠΟΛΟΓΙΣΤΩΝ http://www.corelab.ece.ntua.gr/~pagour/introcs/shmmy/ Επιµέλεια: (nickie@softlab.ntua.gr) Συναρτησιακός προγραµµατισµός Λογικός προγραµµατισµός Αντικειµενοστρεφής
Διαβάστε περισσότεραAerobTec Altis Micro
AerobTec Altis Micro Záznamový / súťažný výškomer s telemetriou Výrobca: AerobTec, s.r.o. Pionierska 15 831 02 Bratislava www.aerobtec.com info@aerobtec.com Obsah 1.Vlastnosti... 3 2.Úvod... 3 3.Princíp
Διαβάστε περισσότεραFUNKCIE N REÁLNYCH PREMENNÝCH
FAKULTA MATEMATIKY, FYZIKY A INFORMATIKY UNIVERZITY KOMENSKÉHO V BRATISLAVE FUNKCIE N REÁLNYCH PREMENNÝCH RNDr. Kristína Rostás, PhD. PREDMET: Matematická analýza ) 2010/2011 1. DEFINÍCIA REÁLNEJ FUNKCIE
Διαβάστε περισσότεραVybrané partie z logiky
FAKULTA MATEMATIKY, FYZIKY A INFORMATIKY UNIVERZITY KOMENSKÉHO Katedra informatiky Vybrané partie z logiky poznámky z prednášok martin florek 22. mája 2004 Predhovor Vďaka nude a oprášeniu vedomostí z
Διαβάστε περισσότεραAutomaty a formálne jazyky
Automaty a formálne jazyky Podľa prednášok prof. RNDr. Viliama Gefferta, DrSc., PrírF UPJŠ Dňa 8. februára 2005 zostavil Róbert Novotný, r.novotny@szm.sk. Typeset by LATEX. Illustrations by jpicedit. Úvodné
Διαβάστε περισσότεραLambda calculus. Štruktúra prednášok: úvod do syntaxe, netypovaný λ-kalkul (gramatika + konvencie) sémantika (redukčné pravidlá)
Lambda calculus Štruktúra prednášok: úvod do syntaxe, netypovaný λ-kalkul (gramatika + konvencie) sémantika (redukčné pravidlá) programovací jazyk nad λ-kalkulom domáca úloha: interpreter λ-kalkulu,...
Διαβάστε περισσότεραn true false if t then t else t u t t b t emptylist cons t t t t λx.t u ::= head tail isempty
Συναρτησιακός Προγραµµατισµός 2008 Τρίτο Φύλλο Ασκήσεων - Project Το project αυτό µπορεί να γίνει από οµάδες 1-3 ατόµων και αντιστοιχεί στο 15% του ϐαθµού στο µάθηµα. Συνολικό Αθροισµα Βαθµών: 150 Προθεσµία
Διαβάστε περισσότεραMetódy vol nej optimalizácie
Metódy vol nej optimalizácie Metódy vol nej optimalizácie p. 1/28 Motivácia k metódam vol nej optimalizácie APLIKÁCIE p. 2/28 II 1. PRÍKLAD: Lineárna regresia - metóda najmenších štvorcov Na základe dostupných
Διαβάστε περισσότερα3. prednáška. Komplexné čísla
3. predáška Komplexé čísla Úvodé pozámky Vieme, že existujú také kvadratické rovice, ktoré emajú riešeie v obore reálych čísel. Študujme kvadratickú rovicu x x + 5 = 0 Použitím štadardej formule pre výpočet
Διαβάστε περισσότεραMATEMATICKÁ ANALÝZA 1
UNIVERZITA PAVLA JOZEFA ŠAFÁRIKA V KOŠICIACH Prírodovedecká fakulta Ústav matematických vied Božena Mihalíková, Ján Ohriska MATEMATICKÁ ANALÝZA Vysokoškolský učebný text Košice, 202 202 doc. RNDr. Božena
Διαβάστε περισσότεραVektorový priestor V : Množina prvkov (vektory), na ktorej je definované ich sčítanie a ich
Tuesday 15 th January, 2013, 19:53 Základy tenzorového počtu M.Gintner Vektorový priestor V : Množina prvkov (vektory), na ktorej je definované ich sčítanie a ich násobenie reálnym číslom tak, že platí:
Διαβάστε περισσότεραΕυφυής Προγραμματισμός
Ευφυής Προγραμματισμός Ιωάννης Χατζηλυγερούδης Πολυτεχνική Σχολή Τμήμα Μηχανικών Η/Υ & Πληροφορικής Περιεχόμενα ενότητας Συναρτήσεις-Δομές Ελέγχου : 1. Συναρτήσεις Χρήστη 2. Έλεγχος Ροής Προγράμματος 3.
Διαβάστε περισσότερα3. Striedavé prúdy. Sínusoida
. Striedavé prúdy VZNIK: Striedavý elektrický prúd prechádza obvodom, ktorý je pripojený na zdroj striedavého napätia. Striedavé napätie vyrába synchrónny generátor, kde na koncoch rotorového vinutia sa
Διαβάστε περισσότερα,Zohrievanie vody indukčným varičom bez pokrievky,
Farba skupiny: zelená Označenie úlohy:,zohrievanie vody indukčným varičom bez pokrievky, Úloha: Zistiť, ako závisí účinnosť zohrievania vody na indukčnom variči od priemeru použitého hrnca. Hypotéza: Účinnosť
Διαβάστε περισσότεραObsah. 1.1 Reálne čísla a ich základné vlastnosti... 7 1.1.1 Komplexné čísla... 8
Obsah 1 Číselné obory 7 1.1 Reálne čísla a ich základné vlastnosti............................ 7 1.1.1 Komplexné čísla................................... 8 1.2 Číselné množiny.......................................
Διαβάστε περισσότεραSymbolická logika. Stanislav Krajči. Prírodovedecká fakulta
Symbolická logika Stanislav Krajči Prírodovedecká fakulta UPJŠ Košice 2008 Názov diela: Symbolická logika Autor: Doc. RNDr. Stanislav Krajči, PhD. Vydala: c UPJŠ Košice, 2008 Recenzovali: Doc. RNDr. Miroslav
Διαβάστε περισσότεραGoniometrické rovnice riešené substitúciou
Ma-Go-10-T List 1 Goniometrické rovnice riešené substitúciou RNDr. Marián Macko U: Okrem základných goniometrických rovníc, ktorým sme sa už venovali, existujú aj zložitejšie goniometrické rovnice. Metódy
Διαβάστε περισσότεραHASLIM112V, HASLIM123V, HASLIM136V HASLIM112Z, HASLIM123Z, HASLIM136Z HASLIM112S, HASLIM123S, HASLIM136S
PROUKTOVÝ LIST HKL SLIM č. sklad. karty / obj. číslo: HSLIM112V, HSLIM123V, HSLIM136V HSLIM112Z, HSLIM123Z, HSLIM136Z HSLIM112S, HSLIM123S, HSLIM136S fakturačný názov výrobku: HKL SLIMv 1,2kW HKL SLIMv
Διαβάστε περισσότερα9. kapitola Boolove funkcie a logické obvody
9. kapitola Boolove funkcie a logické obvody Priesvitka 1 Boolova algebra Elektronické obvody v počítačoch a v podobných zariadeniach sú charakterizované binárnymi vstupmi a výstupmi (rovnajúcimi sa 0
Διαβάστε περισσότεραΣύντομη Εισαγωγή στην SML/NJ
Σύντομη Εισαγωγή στην SML/NJ Φυλλάδιο σημειώσεων για το 1ο εργαστήριο του μαθήματος 1 Εγκατάσταση και πρώτη γνωριμία Η πιο πρόσφατη έκδοση της SML/NJ τη στιγμή συγγραφής αυτού του κειμένου υπάρχει στο:
Διαβάστε περισσότεραTeória funkcionálneho a logického programovania
Prírodovedecká fakulta UPJŠ Košice Teória fucionálneho a logického programovania (poznámky z prednášok z akademického roka 2002/2003) prednáša: Prof. RNDr. Peter Vojtáš, DrSc. 2 TEÓRIA FUNKCIONÁLNEHO A
Διαβάστε περισσότεραMATEMATICKÁ OLYMPIÁDA
S MATEMATICÁ OLYMPIÁDA skmo.sk 2008/2009 58. ročník Matematickej olympiády Riešenia úloh IMO. Nech n je kladné celé číslo a a,..., a k (k 2) sú navzájom rôzne celé čísla z množiny {,..., n} také, že n
Διαβάστε περισσότεραRIEŠENIE WHEATSONOVHO MOSTÍKA
SNÁ PMYSLNÁ ŠKOL LKONKÁ V PŠŤNO KOMPLXNÁ PÁ Č. / ŠN WSONOVO MOSÍK Piešťany, október 00 utor : Marek eteš. Komplexná práca č. / Strana č. / Obsah:. eoretický rozbor Wheatsonovho mostíka. eoretický rozbor
Διαβάστε περισσότεραREZISTORY. Rezistory (súčiastky) sú pasívne prvky. Používajú sa vo všetkých elektrických
REZISTORY Rezistory (súčiastky) sú pasívne prvky. Používajú sa vo všetkých elektrických obvodoch. Základnou vlastnosťou rezistora je jeho odpor. Odpor je fyzikálna vlastnosť, ktorá je daná štruktúrou materiálu
Διαβάστε περισσότεραΔομές Δεδομένων (Data Structures)
Δομές Δεδομένων (Data Structures) Στοίβες Ουρές Στοίβες: Βασικές Έννοιες. Ουρές: Βασικές Έννοιες. Βασικές Λειτουργίες. Παραδείγματα. Στοίβες Δομή τύπου LIFO: Last In - First Out (τελευταία εισαγωγή πρώτη
Διαβάστε περισσότεραTechnická univerzita v Košiciach Fakulta elektrotechniky a informatiky MATEMATIKA II. Zbierka riešených a neriešených úloh
Technická univerzita v Košiciach Fakulta elektrotechniky a informatiky MATEMATIKA II Zbierka riešených a neriešených úloh Anna Grinčová Jana Petrillová Košice 06 Technická univerzita v Košiciach Fakulta
Διαβάστε περισσότεραČíslo a číslica. Pojem čísla je jedným zo základných pojmov matematiky. Číslo je abstraktná entita (fil. niečo existujúce) používaná na opis množstva.
Číslo a číslica Pojem čísla je jedným zo základných pojmov matematiky. Číslo je abstraktná entita (fil. niečo existujúce) používaná na opis množstva. Číslica (cifra) je grafický znak, pomocou ktorého zapisujeme
Διαβάστε περισσότεραΕισαγωγή στη Γλώσσα ML
Εισαγωγή στη Γλώσσα ML Συναρτησιακός και Προστακτικός Προγραµµατισµός Ένας τρόπος διαχωρισµού Ο προστακτικός προγραµµατισµός επικεντρώνει στο πως θα υλοποιήσουµε τα συστατικά του πρόγραµµατός µας Ο συναρτησιακός
Διαβάστε περισσότεραNumerická lineárna algebra. Zobrazenie
Numerická lineárna algebra. Zobrazenie reálnych čísiel v počítači Ing. Gabriel Okša, CSc. Matematický ústav Slovenská akadémia vied Bratislava Stavebná fakulta STU G. Okša: Reálne čísla v počítači 1/16
Διαβάστε περισσότερα7 Derivácia funkcie. 7.1 Motivácia k derivácii
Híc, P Pokorný, M: Matematika pre informatikov a prírodné vedy 7 Derivácia funkcie 7 Motivácia k derivácii S využitím derivácií sa stretávame veľmi často v matematike, geometrii, fyzike, či v rôznych technických
Διαβάστε περισσότεραZáklady matematickej štatistiky
1. Náhodný výber, výberové momenty a odhad parametrov Katedra Matematických metód Fakulta Riadenia a Informatiky Žilinská Univerzita v Žiline 6. mája 2015 1 Náhodný výber 2 Výberové momenty 3 Odhady parametrov
Διαβάστε περισσότεραHarmonizované technické špecifikácie Trieda GP - CS lv EN Pevnosť v tlaku 6 N/mm² EN Prídržnosť
Baumit Prednástrek / Vorspritzer Vyhlásenie o parametroch č.: 01-BSK- Prednástrek / Vorspritzer 1. Jedinečný identifikačný kód typu a výrobku: Baumit Prednástrek / Vorspritzer 2. Typ, číslo výrobnej dávky
Διαβάστε περισσότεραThe Simply Typed Lambda Calculus
Type Inference Instead of writing type annotations, can we use an algorithm to infer what the type annotations should be? That depends on the type system. For simple type systems the answer is yes, and
Διαβάστε περισσότεραp(α 1 ) = u 1. p(α n ) = u n. Definícia (modulárna reprezentácia polynómu). Zobrazenie
1. Rychlá Fourierová transformácia Budeme značiť teleso T a ω jeho prvok. Veta 1.1 (o interpolácií). Nech α 0, α 1,..., α n sú po dvoch rôzne prvky telesa T[x]. Potom pre každé u 0, u 1,..., u n T existuje
Διαβάστε περισσότεραKATEDRA DOPRAVNEJ A MANIPULAČNEJ TECHNIKY Strojnícka fakulta, Žilinská Univerzita
132 1 Absolútna chyba: ) = - skut absolútna ochýlka: ) ' = - spr. relatívna chyba: alebo Chyby (ochýlky): M systematické, M náhoné, M hrubé. Korekcia: k = spr - = - Î' pomerná korekcia: Správna honota:
Διαβάστε περισσότεραAutomatizácia technologických procesov
Téma: Logické obvody. Základné pojmy. Logická algebra,logické funkcie. Znázornenie logických funkcií a základy ich minimalizácie. - sú častým druhom riadenia, ktoré sa vyskytujú ako samostatné ako aj v
Διαβάστε περισσότερα