download

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