LOGISCH en FUNCTIONEEL PROGRAMMEREN Ik zeg wat ik denk! Opbouw Deel 1: Functioneel programmeren docent: Jeroen Fokker (informatica) tot de kerstvakantie (week 47-51) Deel 2: Logisch programmeren docent: Louis des Tombe (letteren) na de kerstvakantie (week 2-5) deel 1: Functioneel programmeren H1 H2 H3.1 H3.2 H4 H5.1 H5.2 H5.2 App. A Pr.1 tentamen Pr.2 Imperatief programmeren Programma bestaat uit opdrachten gegroepeerd in methoden Runnen is één voor één uitvoeren te beginnen met main Functioneel programmeren Programma bestaat uit functie-definities Runnen is uitrekenen van een expressie Logisch programmeren Programma bestaat uit predicaat-definities Runnen is vervullen van een predicaat proberen te Geschiedenis van programmeertalen Imperatief 1945 1950 1955 1960 1965 1970 1975 1980 1985 1990 1995 2000 Mach.taal Assembler Fortran Algol Basic Pascal Simula C C++ Java C# Functioneel Logisch Lisp Prolog Miranda Scheme Gofer Haskell Functie-definitie static int kwad (int x) { return x*x ; } kwad :: Int Int kwad x = x * x Haskell Gebruik van de functie public static void main(String [ ] ps) { System.out.println( this.kwad(5) ); } main :: Int main = kwad 5 Haskell Compilers voor Haskell GHC (Glasgow Haskell Compiler) Hugs (Haskell User’s Gofer System) Helium Helium Compiler èn interpreter Vereenvoudigd type-systeem Begrijpelijke foutmeldingen Utrechts Gloednieuw Experimenteel Helium-interpreter H:\> hi > sqrt 2.0 1.41421 functie uit de standaard prelude Int - operatoren >5+2*3 11 > sin 0.3 *. sin 0.3 +. cos 0.3 *. cos 0.3 1.0 Float - operatoren Lijsten Lijst: rijtje elementen van hetzelfde type [ 1, 3, 8, 2, 5 ] vierkante haken [ 2 .. 6 ] “tot en met” Functies op lijsten > sum [1 .. 10] 55 > reverse [3 .. 8] [8, 7, 6, 5, 4, 3] > length [1, 5, 9, 3] 4 > replicate 5 2 [2, 2, 2, 2, 2] Zelf functies definiëren module Statistiek where fac n = product [1..n] boven n k = fac n / (fac k * fac (n-k)) n! = 1*2*...*n n! n = k k! (n-k)! () Functie-definitie fac :: Int Int fac n = product [1..n] static int fac (int n) { int tel, res; res = 1; for (tel=1; tel<=n; tel++) res *= tel; return res; } Haskell Gebruik van functies Met de interpreter module Stat where fac n = product [1..n] H:\> hi > :l Stat > fac 6 720 Met de compiler module Stat where fac n = product [1..n] main = fac 6 H:\> helium Stat.hs H:\> lvmrun Stat 720 Soorten definities Functie fac :: Int Int fac n = product [1..n] Constante pi :: Float pi = 3.1415926535 Operator ( !^! ) :: Int Int Int n !^! k = fac n / (fac k * fac (n-k)) Prelude: functies op Int Rekenkundige operatoren + - * / ^ Vergelijkingsoperatoren == /= < <= > >= Functies abs signum gcd Prelude: functies op Float Rekenkundige operatoren +. -. *. /. ^. Vergelijkingsoperatoren ==. /=. <. <=. >. >=. Functies sqrt sin log exp truncate Prelude: functies op Bool Logische combinaties Functies && not || Prelude: operatoren op lijsten “op kop van” : > 1 : [2, 3, 4] [1, 2, 3, 4] “samenvoegen” > [1, 2] ++ [3, 4, 5] [1, 2, 3, 4, 5] ++ Prelude: functies op lijsten “leeg?” null > null [ ] True “allemaal waar?” and > and [ 1<2, 2<3, 1==0] False “neem deel” > take 3 [2..10] [2, 3, 4] take Functies als parameter Pas functie toe op alle elementen van een lijst map > map fac [1, 2, 3, 4, 5] [1, 2, 6, 24, 120] > map sqrt [1.0, 2.0, 3.0, 4.0] [1.0, 1.41421, 1.73205, 2.0] > map even [1 .. 6] [False, True, False, True, False, True] Functies definiëren Door combinatie van standaardfuncties fac :: Int Int fac n = product [1..n] oneven :: Int Bool oneven n = not (even n) negatief :: Int Bool negatief n = n < 0 Functies met meer parameters boven :: Int Int Int boven n = fac n / (fac k * (fac (n-k)) met een lijst als resultaat omtrekOppervl :: Int Int [Int] omtrekOppervl len br = [ 2*(len+br) , len*br ] Hergebruik deel-formules abc :: Float Float Float [Float] abc a b c = [ (-b + sqrt(b*b-4*a*c)) / (2*a) , (-b - sqrt(b*b-4*a*c)) / (2*a) ] geef de deelformules een naam abc a b c = [ ( -b + d ) / n , ( -b - d ) / n ] where d = sqrt (b*b – 4*a*c) n = 2*a Gevallen onderscheiden abs :: Int Int abs x | x>=0 | x<0 = x = -x “guards” Herhalen fac :: Int Int fac n | n==0 | n>0 graag zonder product te gebruiken = 1 = n * fac (n-1) “recursie” Definitie met patronen dag dag dag dag dag dag dag dag :: Int 1 = 2 = 3 = 4 = 5 = 6 = 7 = String “maandag” “dinsdag” “woensdag” “donderdag” “vrijdag” “zaterdag” “zondag” constante als formele parameter! Lijst-patronen null :: [Int] Bool null [ ] = True null (x:xs) = False head :: [Int] Int head (x:xs) = x tail :: [Int] [Int] head (x:xs) = xs Patronen èn recursie sum :: [Int] Int sum [ ] = 0 sum (x:xs) = x + sum xs length :: [Int] Int length [ ] = 0 length (x:xs) = 1 + length xs Het type van length [a] length :: [Int] Int Int “polymorf” length [ ] = 0 length (x:xs) = 1 + length xs null :: [a] Bool head:: [a] a tail :: [a] [a] Publieksvraag: Het type van map > map fac [1, 2, 3, 4, 5] [1, 2, 6, 24, 120] > map even [1 .. 6] [False, True, False, True, False, True] map :: (ab) [a] [b] Practicum BBL zaal 408 en 412 (2 personen per computer) Website www.cs.uu.nl/docs/vakken/lfp