Matakuliah : Konsep Bahasa Pemrograman Tahun : 2010 PEMROGRAMAN FUNGSIONAL Pertemuan 12 Pendahuluan • • • • • • • • • Pendahuluan Fungsi Matematika Basis Bahasa Pemrograman Fungsional LISP : Bahasa Pemrograman Fungsional Pertama Scheme COMMON LISP ML Haskell Perbandingan Bahasa Fungsional dan Imperatif Bina Nusantara University 3 Pendahuluan • Desain bahasa imperatif didasarkan pada arsitektur the von Neumann – Tujuan utama adalah efisiensi bukannya pengembangan bahasa • Desain bahasa fungsional adalah fungsi matematika – Basis teori yang juga dekata dengan pengguna tetapi relatif tidak konsern dengan aritektur mesin di mana program akan di eksekusi • Aplikasi Bahasa Fungsional – LISP digunakan untuk AI – Scheme digunakan untuk pengajaran pengantar pemrograman disejumlah universitas Bina Nusantara University 4 Fungsi Matematika • Fungsi matematika adalah pemetaan dari anggota suatu himpunan, disebut domain, ke himpunan lain, disebut range • Ekspresi lambda menspesifikasi parameter dan fungsi pemetaan dalam bentuk (x) x * x * x untuk fungsi cube (x) = x * x * x Bina Nusantara University 5 Ekspresi Lambda • Ekspresi lambda adalah fungsi tanpa nama • Ekspresi lambda diaplikasikan ke parameter dengan meletakkan parameter sesudah ekspresi • Sebagai contoh ((x) x * x * x)(2) yang menghasilkan nilai 8 Bina Nusantara University 6 Bentuk Fungsional • Fungsi derajat tinggi atau functional form adalah fungsi yang parameternya fungsi atau menghasilkan fungsi atau kedua-duanya. • Komposisi fungsi : bentuk fungsional yang mempunyai dua fungsi sebagai parameter dan menghasilkan fungsi yang nilainya adalah parameter aktual fungsi pertama diaplikasikan ke fungsi kedua Bentuk: h f ° g yang berarti h (x) f ( g ( x)) Untuk f (x) x + 2 dan g (x) 3 * x, h f ° g menghasilkan (3 * x)+ 2 Bina Nusantara University 7 Apply to All • Bentuk fungsional yang mempunyai satu fungsi sebagai parameter dan menghasilkan daftar nilai yang didapat dengan mengaplikasikan kesetiap elemen dalam daftar parameter Bentuk : untuk h (x) x * x ( h, (2, 3, 4)) yields (4, 9, 16) Bina Nusantara University 8 Konsep Dasar Bahasa Pemrograman Fungsional • Obyektif desain FPL adalah menggunakan fungsi matematika semaksimal mungkin • Proses komputasi di FPL berbeda secara signifikan dengan bahasa imperatif – Di bahasa imperatif, operasi dilakukan dan hasilnya disimpan dalam variabel untuk penggunaan berikutnya – Pengelolaan variabel adalah hal paling utama dan sumber kompleksitas di bahasa imperatif • Di FPL variabel tidak perlu seperti di matematika • Di FPL, evaluasi fungsi selalu menghasilkan hasil yang sama untuk parameter yang sama Bina Nusantara University 9 Tipe Data dan Struktur LISP • Tipe obyek data : aslinya hanya atom dan list • Bentuk list: koleksi parenthesized sublist dan/atau atom e.g., (A B (C D) E) • Aslinya LISP adalah bahasa typeless • List disimpan internal sebagai single-linked lists Bina Nusantara University 10 Interpretasi LISP • Notasi lambda digunakan untuk menspesifikasi fungsi dan definisi fungsi. Aplikasi fungsi dan data mempunyai bentuk yang sama . Sebagai contoh, jika list (A B C) jika diartikan sebagai data ia adalah list dari tiga atom A, B, dan C; tetapi jika diartikan sebagai aplikasi fungsi ia berarti fungsi dengan nama A diaplikasikan ke dua parameter B dan C • Interpretasi ini hanya menunjukkan kemampuan komputasi universal dari notasi lambda Bina Nusantara University 11 Origin Scheme • Pertengahan 1970-an dialek LISP, didesain lebih jelas, lebih modern dan versi sederhana daripada LISP kontemporer • Hanya menggunakan lingkup statik • Fungsi adalah entitas pertama – Mereka mungkin nilai ekspresi atau elemen list – Mereka dapat di-assign ke variabel dan dikirim sebagai parameter Bina Nusantara University 12 Evaluasi Fungsi • • • • Parameter dievaluasi Nilai parameter disubstitusikan ke fungsi Fungsi dievaluasi Nilai ekspresi terakhir fungsi adalah nilai fungsi Bina Nusantara University 13 Fungsi Primitif • • Aritmatika: +, -, *, /, ABS, SQRT, REMAINDER, MIN, MAX e.g., (+ 5 2) menghasilkan 7 QUOTE – mengambil satu parameter; mengembalikan parameter tanpa evaluasi – – QUOTE dibutuhkan kerena interpreter Scheme, bernama EVAL, selalu mengevaluasi parameter ke fungsi aplikasi sebelum memakai fungsi. QUOTE digunakan untuk menghindari evaluasi parameter jika tidak tepat QUOTE dapat disingkat dengan prefix operator apostrophe '(A B) setara dengan QUOTE (A B)) Bina Nusantara University 14 Definisi Fungsi Lambda • Ekspresi Lambda – Formatnya didasarkan pada notasi e.g., (LAMBDA (x) (* x x) x disebut bound variable • Ekspresi lambda contoh ((LAMBDA (x) (* x x)) 7) Bina Nusantara University 15 Fungsi DEFINE • • Fungsi untuk konstruksi fungsi Fungsi DEFINE – dua format : 1. Mengikat simbol ke ekspresi e.g., (DEFINE pi 3.141593) Contoh: (DEFINE two_pi (* 2 pi)) 2. Mengikat nama ke ekspresi lambda e.g., (DEFINE (square x) (* x x)) Contoh : (square 5) Bina Nusantara University 16 Fungsi Keluaran, Predikat Numerik dan Kendali if • Fungsi Keluaran – (DISPLAY expression) – (NEWLINE) • Fungsi Predikat Numerik – #T is true and ()is false – =, <>, >, <, >=, <= – EVEN?, ODD?, ZERO?, NEGATIVE? • Seleksi – format IF – (IF predicate then_exp else_exp) e.g., (IF (<> count 0) (/ sum count) 0) Bina Nusantara University 17 Alir Kendali COND • Seleksi Multipel: mengembalikan nilai ekspresi terakhir dalam pasangan pertama yang predikatnya bernilai TRUE (COND (predicate_1 expr {expr}) (predicate_1 expr {expr}) ... (predicate_1 expr {expr}) (ELSE expr {expr})) • (DEFINE (compare x y) (COND ((> x y) (DISPLAY “x is greater than y”)) ((< x y) (DISPLAY “y is greater than x”)) (ELSE (DISPLAY “x and y are equal”)) ) ) Bina Nusantara University 18 Fungsi CONS dan LIST • CONS mempunyai dua parameter, yang pertama mungkin atom atau list dan yang kedua adalah list; mengembalikan list baru yang memuat parameter pertama sebagai elemen pertama dan parameter kedua sebagai sisa hasilnya e.g., (CONS 'A '(B C)) returns (A B C) • LIST mempunyai sembarang parameter; mengembalikan list dengan parameter sebagai elemen Bina Nusantara University 19 Fungsi CAR dan CDR • CAR memuat daftar parameter; mengembalikan elemen pertama daftar (CAR '(A B C)) menghasilkan A (CAR '((A B) C D)) yields (A B) • CDR memuat daftar parameter; mengembalikan daftar dengan membuang elemen pertama (CDR '(A B C)) menghasilkan (B C) (CDR '((A B) C D)) yields (C D) Bina Nusantara University 20 Fungsi Predikat EQ? • EQ? mempunyai dua parameter simbolik; mengembalikan #T jika kedua parameter adalah atom dan keduanya sama (EQ? 'A 'A) menghasilkan #T (EQ? 'A 'B) menghasilkan () – Jika EQ? dipanggil dengan daftar parameter, hasilnya tidak reliable – EQ? juga tidak bekerja untuk atom numerik Bina Nusantara University 21 Fungsi Predikat LIST? dan NULL? • LIST? mempunyai satu parameter; mengembalikan #T jika parameter adalah list; jika tidak ) • NULL? mempunyai satu parameter; mengembalikan #T jika parameternya list kosong ; jika tidak () – NULL? Mengembalikan #T jika parameternya () Bina Nusantara University 22 Contoh Fungsi member • member memuat atom dan simple list; mengembalikan #T jika atom dalam list; () jika tidak DEFINE (member atm lis) (COND ((NULL? lis) '()) ((EQ? atm (CAR lis)) #T) ((ELSE (member atm (CDR lis))) )) Bina Nusantara University 23 Contoh Fungsi equalsimp • equalsimp memuat dua simple lists sebagai parameter; mengembalikan #T jika kedua paramater sama ; () jika tidak (DEFINE (equalsimp lis1 lis2) (COND ((NULL? lis1) (NULL? lis2)) ((NULL? lis2) '()) ((EQ? (CAR lis1) (CAR lis2)) (equalsimp(CDR lis1)(CDR lis2))) (ELSE '()) )) Bina Nusantara University 24 Fungsi equal • equal memuat dua general lists sebagai parameter; mengembalikan #T jika sama dan ()jika tidak (DEFINE (equal lis1 lis2) (COND ((NOT (LIST? lis1))(EQ? lis1 lis2)) ((NOT (LIST? lis2)) '()) ((NULL? lis1) (NULL? lis2)) ((NULL? lis2) '()) ((equal (CAR lis1) (CAR lis2)) (equal (CDR lis1) (CDR lis2))) (ELSE '()) )) Bina Nusantara University 25 Fungsi append • append memuat dua lists sebagai parameter; mengembalikan parameter pertama list dengan elemen dari paremeter kedua list di-append ke akhir (DEFINE (append lis1 lis2) (COND ((NULL? lis1) lis2) (ELSE (CONS (CAR lis1) (append (CDR lis1) lis2))) )) Bina Nusantara University 26 Fungsi LET • Bentuk umum (LET ( (name_1 expression_1) (name_2 expression_2) ... (name_n expression_n)) body ) • Evaluasi semua ekspresi, kemudian ikat nilainya ke nama; evaluasi body Bina Nusantara University 27 Contoh LET (DEFINE (quadratic_roots a b c) (LET ( (root_part_over_2a (/ (SQRT (- (* b b) (* 4 a c)))(* 2 a))) (minus_b_over_2a (/ (- 0 b) (* 2 a))) (DISPLAY (+ minus_b_over_2a root_part_over_2a)) (NEWLINE) (DISPLAY (- minus_b_over_2a root_part_over_2a)) )) Bina Nusantara University 28 Format Fungsi Scheme • Komposisi – Contoh sevbelumnya – (CDR (CDR ‘(A B C))) mengembalikan (C) • Aplikasi ke All – salah satu bentuk di Scheme adalah mapcar – Aplikasi fungsi ke suam elemen dalam list (DEFINE (mapcar fun lis) (COND ((NULL? lis) '()) (ELSE (CONS (fun (CAR lis)) (mapcar fun (CDR lis)))) )) Bina Nusantara University 29 Fungsi EVAL • Sangat mungkin di Scheme untuk mendefinisikan fungsi yang membentuk kode Scheme dan meminta interpretasinya • Hal ini dimungkinkan oleh adanya user-available function, EVAL Bina Nusantara University 30 Menambahkan dua daftar bilangan ((DEFINE (adder lis) (COND ((NULL? lis) 0) (ELSE (EVAL (CONS '+ lis))) )) • Parameter adalah daftar bilangan ditambahkan ; adder menyisipkan operator + dan mengevaluasi hasilnya – Gunakan CONS untuk meng-insert atom + kedalam daftar bilangan – Yakinkan bahwa + adalah quoted untuk mencegah evaluasi – Submit list baru ke EVAL untuk evaluasi Bina Nusantara University 31 COMMON LISP • Kombinasi dari banyak fitur dialek popular LISP sekitar awal 80-an • Bahasa yang besar dan kompleks, sehingga berlawanan dengan Scheme • Fitur a.l. – – – – – – – records arrays Bilangan kompleks String karakter powerful I/O packages dengan kendali akses Pernyataan iterative Bina Nusantara University 32 ML • Bahasa fungsional lingkup statik dengan sintaks dekat ke Pascal daripada LISP • Menggunakan deklarasi tipe, tetapi juga tipe inferensi untuk menentukan tipe variabel yang tidak dideklarasikan • Strongly typed ,Scheme esensinya typeless, dan tidak punya type coercions • Mencakup EH dan fasilitas modul untuk implementasi TDA • Memuat lists dan operasi list • Pernyataan val mengikat nama ke nilai, mirip dengan DEFINE di Scheme) • Format deklarasi fungsi fun name (parameters) = body; e.g., fun cube (x : int) = x * x * x; Bina Nusantara University 33 Haskell • Mirip ML (sintaks, lingkup statik, tipe strong, tipe inferencing) • Berbeda dari ML (dan sebagian besar bahasa fungsional) ia adalah fungsional murni (e.g., tak ada variabel, tak ada pernyataan penugasan, tak ada efek samping dalam bentuk apapun) • Fitur paling penting – Menggunakan lazy evaluation – Mempunyhai list comprehensions, sehingga memungkinkan untuk menangani infinite lists Bina Nusantara University 34 Bilangan Fibonacci • Bilangan Fibonacci fib 0 = 1 fib 1 = 1 fib (n + 2) = fib (n + 1) + fib n Bina Nusantara University 35 Guard • Faktorial fact n | n == 0 = 1 | n > 0 = n * fact (n - 1) • Kata khusus otherwise dapat berlaku sebagai guard Bina Nusantara University 36 List • Notasi list : letakkan elemen dalam bracket e.g., directions = [“north”, “south”, “east”, “west”] • Panjang : # e.g., #directions is 4 • Deret arithmetik dengan operator .. e.g., [2, 4..10] is [2, 4, 6, 8, 10] • Katenasi dengan ++ e.g., [1, 3] ++ [5, 7] hasilnya [1, 3, 5, 7] • CONS, CAR, CDR melalui operator colon seperti di Prolog e.g., 1:[3, 5, 7] hasilnya [1, 3, 5, 7] Bina Nusantara University 37 Revisi Faktorial product [] = 1 product (a:x) = a * product x fact n = product [1..n] Bina Nusantara University 38 List Komprihensif • Notasi himpunan • Daftar kuadrat dari 20 integer positif pertama : [n * n | n ← [1..20]] • Semua faktor dari parameter yang diberikan factors n = [i | i ← [1..n div 2], n mod i == 0] Bina Nusantara University 39 Quick Sort sort [] = [] sort (a:x) = sort [b | b ← x; b <= a] ++ [a] ++ sort [b | b ← x; b > a] Bina Nusantara University 40 Evaluasi Lazy • Hanya menghitung yang diperlukan • Bilangan positif positives = [0..] • Menentukan apakah 16 adalah bilangan kuadrat member [] b = False member(a:x) b=(a == b)||member x b squares = [n * n | n ← [0..]] member squares 16 Bina Nusantara University 41 Revisi member • Anggota fungsi dapat ditulis sebagai member [] b = False member(a:x) b=(a == b)||member x b • Tetapi ini hanya jalan jika parameter yang dikuadratkan adalah perfect square; jika tidak akan men-generatenya selamanya . Versi berikut akan selalu jalan member2 (m:x) n | m < n = member2 x n | m == n = True | otherwise = False Bina Nusantara University 42 Perbandingan Bahasa Fungsional dan Imperatif • Bahasa Imperatif – – – – Eksekusi efisien Semantik kompleks Sintaks kompleks Konkurensi adalah tugas pemrogram Bina Nusantara University • Bahasa Fungsional – – – – Semantik sederhana Sintaks sederhana Eksekusi tidak efisien Program dapat otomatis dibuat konkuren 43 LATIHAN A. SOAL PILIHAN 01. Pionir dari bahasa functional adalah a. FORTRAN b. Perl c. LISP d. Prolog 02. Paradigma pemrograman fungsional didasarkan pada a. logical calculus b. mathematical function c. proving theorem d. predicate calculus 03. Aslinya bahasa LISP adalah a. type less language b. strong type language c. type language d. check type language 04. Secara internal, list sebagai elemen dasar LISP disimpan dalam bentuk a. array b. single link list c. record d. hash tables Bina Nusantara University 44 LATIHAN 5. Bahasa yang dibentuk dengan menggabungkan fitur-fitur utama beberapa dialek LISP sebelum tahun 80-an adalah a. ML b. Scheme c. Haskell d. COMMON LISP B. SOAL URAIAN 1. Apakah yang dimaksud dengan lazy evaluation? 2. Uraikan mengapa banyak fitur bahasa imperative yang ditambahkan ke sebagian besar dialek bahasa LISP? Bina Nusantara University 45 Ringkasan • FPL menggunakan aplikasi fungsi, ekspresi kondisional, rekursi, dan bentuk fungsi untuk mengendalikan eksekusi program bukannya sebagai variabel dan assignment di bahasa imperatif • LISP adalah bahasa fungsional murni dan kemudian menambahkan fitur imperatif • Scheme adalah dialek LISP yang sederhana yang menggunakan static scoping secara eksklusif • COMMON LISP adalah bahasa basis LISP yang sangat besar • ML adalah bahasa fungsional static-scoped dan strongly typed yang mencakup type inference, exception handling, dan beragam struktur data dan TDA • Haskell adalah lazy functional language yang mendukung infinite lists dan set comprehension. • Bahasa fungsional murni mempunyai keunggulan dibandingkan bahasa imperatif tetapi karena kurang efisiennya eksekusi di arsitektur mesin yang tersedia maka ia kurang populer penggunaannya Bina Nusantara University 46