Functional and Logic Programming Functional languages Ing. Marek Běhálek FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz This presentation is based on original course materials coming from doc. Ing Miroslav Beneš Ph.D.
Introduction - Language classification Imperativní - programy jsou posloupnosti základních příkazů (nejčastěji přiřazení) s odpovídajícími řídicími strukturami (např. cykly), jež určují, které příkazy se budou provádět a v jakém pořadí. C, Pascal, Fortran, JSI Deklarativní jazyky - popisujeme, co se má vypočítat, ne jak. Logické - programy jsou kolekcemi tvrzení v konkrétní logice (nejčastěji predikátové) Prolog, Goedel Funkcionální - programy se popisují jako soustavy rovností s aplikacemi funkcí na hodnoty. FP, LISP, Scheme, ML, Haskell Programming languages 2
History Teoretické začátky Alonzo Church 30. léta - lambda-kalkul jako základ teorie vyčíslitelnosti Alan Turing ukázal, že stroj může řešit problémy "programování ve strojovém kódu omezuje rychlost a snadnost programování počítačů John von Neumann pojem paměti základní model většiny současných počítačů návrh zkratek pro Mark I Programming languages 3
History Language and computer s architecture Omezení jazyku na to, co lze efektivně implementovat na současných procesorech. Von Neumannova architektura Model klasických procesorů Základ klasických jazyků Funkcionální jazyky Backus (1978, Turing Adward) kritika přístupu od architektury k jazyku Funkcionální jazyky jsou efektivnější než imperativní Lze dokazovat vlastnosti programů Jednoduše je lze paralelizovat Založeno na algebraických pravidlech Malá efektivita implementace možné optimalizace Programming languages 4
Funkcionální programování Rozdíly mezí imperativními a deklarativními jazyky Imperativní jazyky Program má implicitní stav, který se modifikuje konstrukcemi programovacího jazyka. Explicitní pojem pořadí příkazů Vyjadřuje, jak se má program vyhodnocovat Vychází z aktuální (Von Neummanovy) architektury počítačů Jednoduchá a efektivní realizace Deklarativní jazyky Program nemá implicitní stav. Program je tvořen výrazy, ne příkazy. Popisujeme co se má spočítat, ne jak. Není dáno pořadí příkazu. Efektivní implementace vyžaduje komplexní optimalizace. Funkcionální jazyky x Relační (logické) jazyky Programming languages 5
Funkcionální programování Funkcionální programovací jazyky (1) Vycházejí z λ-kalkulu základním modelem výpočtu je matematický pojem Funkce aplikované na argument a vypočítávající deterministicky její výsledek. Program je složen s funkcí bez vedlejších efektů. Funkce jsou brány jako běžné hodnoty ( first-class values ). Funkcionální jazyky mají lepší mechanismus abstrakce Možnost abstrahovat chování pomocí funkcí vyššího řádu. Program je budován z funkcí jejich kompozicí. Většinou mnohem stručnější programy Funkcionální programovací jazyky neobsahují přiřazení, příkazy, cykly atd. Opakování je řešeno pomocí rekurze. Přiřazení má matematický význam. Proměnná má v daném kontextu vždy tutéž hodnotu referenční transparence. Programming languages 6
Funkcionální programování Funkcionální programovací jazyky (2) Umožňují nové algebraické přístupy Lazy evaluation ( x eager evaluation) Možnost používat potencionálně nekonečné struktury. Možnost oddělení dat od řízení nemusíme se starat o to, jak proběhne vyhodnocení. Umožňuje nové přístupy k vývoji programů Možnost dokazovat programy Možnost transformovat program na základě algebraických vlastností Umožňuje lepší využití paralelního provádění programů Jednoduchá dekompozice programů na části, které lze vyhodnocovat paralelně. Potencionálně příliš mnoho paralelismů. Možnost kompozice dvou paralelních úloh jednoduchou kompozicí funkcí. Programming languages 7
Funkcionální programování - λ-kalkul 1930 Alonzo Church netypovaný λ-kalkul matematická teorie funkcí Základ všech funkcionálních jazyků Některé konstrukce i v imperativních jazycích (např. Python) Programming languages 8
Funkcionální programování - Syntaxe λ-kalkulu Proměnné x, y, z, f, g, λ-abstrakce (λx. e) Aplikace (e 1 e 2 ) Konvence pro závorky λx. λy. e 1 e 2 = (λx. (λy. e 1 e 2 )) e 1 e 2 e 3 = ((e 1 e 2 ) e 3 ) Programming languages 9
Funkcionální programování - Proměnná označuje libovolnou hodnotu v daném kontextu označuje vždy tutéž hodnotu (neexistuje možnost přiřazení) vázaná a volná proměnná λ x. f x vázaná volná Programming languages 10
Funkcionální programování - λ-abstrakce λ x. e Funkce s parametrem x a tělem e λ x y. e Funkce s parametry x, y a tělem e ekvivalentní zápisu λ x. (λ y. e) λ e. e (λ f x (f x x)) (λ f x (f x x)) Programming languages 11
Funkcionální programování - Aplikace (e 1 e 2 ) aplikace Function e 1 na argument e 2 (f x y) aplikace Function (f x) na argument y aplikace Function f na argumenty x a y Programming languages 12
Funkcionální programování - Normalizační teorémy redex --- reducible expression výraz, který lze dále redukovat; α-redex, β-redex normální forma výrazu výraz neobsahuje žádný β-redex Church-Rosserovy teorémy Pokud e1 e2, pak existuje výraz e takový, že e1 e a e2 e Pokud e1 e2 a e2 je v normální formě, pak existuje redukční posloupnost z e1 do e2 (normální redukční posloupnost) Pokud existuje normální forma, lze k ní dojít normální redukční posloupností (leftmost outermost redex) Programming languages 13
Haskell - Haskell září 1991 Gofer Experimental language Mark P. Jones únor 1995 Hugs Hugs98 Nearly full implementation of programming language Haskell 98 Some extension implemented Základní zdroje http://haskell.org Language specification and other resources http://haskell.org/hugs Installation packages (Win / Unix) User s manual (is a part of installation) Programming languages 14
Haskell Hugs Interpret Basic evaluation: calculator $ hugs Prelude> 2*(3+5) 16 Script: containing user s definitions $ hugs example.hs Editing of source code :edit [file.hs] :e Loading of source code :load [file.hs] :reload Exiting work :quit Help :? Programming languages 15
Haskell Scritp example.hs module Example where -- Function computing sum of two numbers sum x y = x + y Example.lhs > module Example where Function computing factorial > f n = if n == 0 then 1 else n * f (n-1) Programming languages 16
Haskell Data types(1) Basic data types 1::Int a ::Char True,False::Bool 3.14::Float Lists [a] Empty list [] Non-empty list (x:xs) 1:2:3:[] :: [Int] [1,2,3] :: [Int] Ordered tuples (a,b,c,...) (1,2) :: (Int,Int) (1,['a','b'])::(Int, [Char]) () :: () Programming languages 17
Haskell Data types(2) Function a->b factorial :: Int -> Int sum:: Int -> Int -> Int plus :: (Int, Int) -> Int User defined data types data Color = Black White data Tree a = Leaf a Node a (Tree a) (Tree a) type String = [Char] type Table a = [(String, a)] Programming languages 18
Haskell Type classes Type class set of types with specific operations Num: +, -, *, abs, negate, signum, Eq: ==, /= Ord: >, >=, <, <=, min, max Constrains, type class specification elem :: Eq a => a -> [a] -> Bool minimum :: Ord a => [a] -> a sum :: Num a => [a] -> a Programming languages 19
Haskell Function definition Equation and pattern unification (pattern matching): f pat11 pat12... = rhs1 f pat21 pat22... = rhs2... First corresponding equation is chosen. If there is none error Programming languages 20
Haskell Patterns variable inc x = x + 1 constant not True = False not False = True List length [] = 0 length (x:xs) = 1 + length xs tupels plus (x,y) = x+y User s type constructor nl (Leaf _) = 1 nl (Node _ l r) = (nl l) + (nl r) Named pattern s parts duphd p@(x:xs) = x:p Another patterns - n+k fact 0 = 1 fact (n+1) = (n+1)*fact n Programming languages 21
Haskell Example Factorial fakt1 n = if n == 0 then 1 else n * fakt1 (n-1) fakt2 0 = 1 fakt2 n = n * fakt2 (n-1) fakt3 0 = 1 fakt3 (n+1) = (n+1) * fakt3 n fakt4 n n == 0 = 1 otherwise = n * fakt4 (n-1) Fibonacci numbers fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib (n+2) = fib n + fib (n+1) Programming languages 22
Haskell Example List length length [] = 0 length (x:xs) = 1 + length xs Comment: be aware of name conflict with previously defined functions! module Example where import Prelude hiding(length) length [] = 0 length (_:xs) = 1 + length xs Programming languages 23
Haskell Local definition Construction let... in f x y = let p = x + y q = x y in p * q Construction where f x y = p * q where p = x + y q = x - y Programming languages 24
Haskell Partial function application inc x = 1 + x inc x = add 1 x inc = add 1 inc = (+1) = (1+) add = (+) Eta reduction Point free programming lcasestring s = map tolower s lcasestring = map tolower Programming languages 25
Haskell Lambda abstraction Using function like a parameter nonzero xs = filter p xs where p x = x /= 0 nonzero xs = filter (/= 0) xs nonzero xs = filter (\x -> x/=0) xs \ x -> e λx. e inc = \x -> x+1 plus = \(x,y) -> x + y dividers n = filter (\m -> n `mod` m == 0) [1..n] Programming languages 26
Haskell Example Example creating a list of squared numers dm [] = [] dm (x:xs) = sq x : dm xs where sq x = x * x List s ordering (quicksort) qs [] = [] qs (x:xs) = let ls = filter (< x) xs rs = filter (>=x) xs in qs ls ++ [x] ++ qs rs Programming languages 27