Pemrograman Fungsional
Pendahuluan
• Paradigma pemrograman fungsional didasari oleh konsep pemetaan dan fungsi pada matematika
• Fungsi : asosiasi (pemetaan) antara 2 type yaitu domain dan range yang dapat berupa :
a. Tipe dasar
b. Tipe terkomposisi (bentukan)
• Pemrogram mengasumsikan bahwa fungsi dasar sudah terdefinisi
Pendahuluan (Lanjtn...)
• Komposisi fungsi dasar tersebut dapat dibentuk fungsi baru
• Penyelesaian masalah didasari atas aplikasi dari fungsi-fungsi tersebut
• Jadi dasar pemecahan persoalan adalah transformasional
• Semua kelakuan program adalah suatu rantai
transformasi dari sebuah keadaan awal menuju ke suatu rantai keadaan akhir, yang mungkin melalui keadaan antara, melalui aplikasi fungsi.
Pendahuluan (Lanjtn...)
• Paradigma fungsional tidak lagimempermasalahkan memorisasi dan struktur data, tidak ada pemilahan antara data dan program, tidak ada lagi pengertian tentang "variabel"
• Pemrogram tidak perlu lagi mengetahui bagaimana mesin mengeksekusi atau bagaimana informasi
disimpan dalam memori, setiap fungsi adalah
"kotak hitam", yang menjadi perhatiannya hanya keadaan awal dan akhir
• Dengan merakit kotak hitam ini, pemrogram akan menghasilkan program besar.
Pendahuluan (Lanjtn...)
• Program adalah fungsi hasil komposisi dari fungsi-fungsi lain
• Bahasa pemrograman fungsional memperoleh hasil dengan cara mengaplikasikan fungsi
terhadap argumen atau parameternya, yang juga dapat berupa fungsi.
• Bahasa pemrograman fungsional menonjol dalam kemampuan struktur datanya
Pendahuluan (Lanjtn...)
• Karena bahasa ini tidak dibatasi oleh variabel yang berasosiasi dengan lokasi memori, maka sebuah struktur data cukup ditangani sebagai sebuah nilai.
• Bahasa pemrograman fungsional tertua adalah LISP
LISP
• Lisp adalah bahasa pemrograman yang sudah berumur lebih dari 40 tahun.
• Keunggulan Lisp terletak pada kemampuannya memanipulasi simbol dan hubungan antar simbol dengan mudah, sehingga bahasa ini cocok
digunakan di bidang Artificial Intelligence
(kecerdasan buatan) dan pengambilan keputusan. • Walaupun begitu, bahasa ini juga dapat digunakan
untuk memecahkan masalah-masalah lainnya.
LISP
• Selama perkembangannya, Lisp menghasilkan banyak varian dan merupakan cikal bakal
berbagai bahasa lainnya (misalnya Logo dan Smalltalk).
• Pada 8 Desember 1994 ANSI (American National Standard Institute) berhasil menstandarisasi Lisp, yang diberi nama Common Lisp ANSI.
LISP
• Lisp menarik untuk dipelajari sebab Lisp jauh berbeda dibandingkan dengan bahasa
pemrograman seperti Pascal dan C.
• Setelah banyak menggunakan Lisp, kita akan bisa melihat/menganalisa suatu masalah dari sudut
pandang yang sebelumnya tidak pernah kita bayangkan. Paling tidak, Lisp dapat digunakan
sebagai kalkulator yang handal (akan ditunjukkan pada tutorial ini).
NOTASI FUNGSIONAL
• Definisi fungsi :
Nama fungsi, domain (parameter input),
range (definisi hasil)
• Spesifikasi
Apa yang akan dikerjakan oleh program
• Realisasi
Ekspresi fungsional “bagaimana” program
direalisasi menjadi instruksi komputer
• Aplikasi
Contoh Template Teks Program
dalam Notasi fungsional
Kerangka Program Fungsional
Nama-Fungsi (parameter) : Ekspresi-Fungsional
Operator
• Komputer mempunyai ALU (Arithmetic dan
Logic Unit), Oleh sebab itu mampu melakukan
penghitungan numerik dan operasi logic
• Operator adalah “sesuatu” paling dasar untuk mengoperasikan suatu nilai bertype tertentu • Type yang dapat dioperasikan oleh operator
adalah type dasar (numerik <integer, real>, karakter)
Ekspresi
• Ekspresi : gabungan antara operan dan
operatornya
• Operand dapat berupa suatu nilai yang
bertype sesuai operator, atau hasil aplikasi
fungsi
• Ekspresi fungsional :
a) Ekspresi aritmatika, logika
b) Ekspresi kondisional
Ekspresi fungsional
• Program fungsional direalisasikan dengan ekspresi fungsional
• Ekspresi : Sebuah teks yang terdiri dari nama, simbol, operator /fungsi yang dapat
menghasilkan suatu nilai berkat evaluasi hasil dari ekspresi
• Hasil evaluasi atau perhitungan dapat berupa numerik maupun boolean
Operator dan Ekspresi
•• Operator Aritmatika, yang terdiri dari operator :
– pangkat, yang dinyatakan sebagai fungsi expt – kali, yang dinyatakan sebagai fungsi *
– bagi, yang dinyatakan sebagai fungsi /
– tambah, yang dinyatakan sebagai fungsi + – kurang, yang dinyatakan sebagai fungsi –
– modula, yang dinyatakan sebagai mod.
Operan-nya harus bernilai numerik, dan hasilOperan-nya bernilai numerik.
Operator Relasional
Terdiri dari operator:
c. Sama-dengan, yang dinyatakan sebagai fungsi =
d. Tidak-sama-dengan, yang dinyatakan sebagai fungsi /=
e. Lebih-kecil, yang dinyatakan sebagai fungsi <
f. Lebih-besar, yang dinyatakan sebagai fungsi >
g. Lebih-kecil-atau-sama-dengan, yang dinyatakan sebagai fungsi <=
h. Lebih-besar-atau-sama-dengan, yang dinyatakan sebagai fungsi >=
i. Operan-nya harus bernilai numerik atau karakter, dan hasilnya bernilai boolean (true atau false).
Operator Lojik/Boolean
Terdiri dari operator :c. Negasi, yang dinyatakan sebagai fungsi NOT
d. Dan, yang dinyatakan sebagai fungsi AND
e. Atau, yang dinyatakan sebagai fungsi OR
Operan-nya harus bernilai boolean, dan hasilnya bernilai boolean
19
Notasi Fungsional dan LISP
Notasi Fungsional Notasi LISP
Ekspresi <operator> (<operan> , <operan>)
( <operator> <operan> <operan> )
Contoh cara penulisan ekspresi aritmatika : b. notasi infix: 2 * 5
c. notasi prefix: * 2 5
d. notasi (prefix) fungsional: *(2,5) e. notasi (prefix) LISP: (* 2 5)
Resource LISP
Website resmi LISP khususnya
CLISP yaitu http://www.clisp.org
Jenis LISP :
a- Kyoko Common Lisp (KCL) dg
platform UNIX
b- CLISP & XLISP pada platform PC c- dll
21
Struktur Program
• Karena LISP mempunyai pemroses bahasa berupa interpreter, maka interaksi antara LISP dengan
pemrogram dapat dilakukan secara interaktif
• Karena berupa interpreter, maka secara sintaks tidak diperlukan pendefinisian jenis ekspresi (termasuk operator dan operan) di awal program
• Pemrogram yang memberikan arti (dalam hal ini mencakup jenis) semantik dari ekspresi.
22
Struktur Program (Lnjtn..)
Interaksi cara Interaktif Arti => => ⇒2525 25 25LISP menunggu masukan dari pemrogram.
LISP menunggu masukan dari pemrogram. LISP siap mengevaluasi masukan dari
pemrogram, dengan prinsip read-evalprint. LISP mengembalikan (menuliskan) hasil evaluasinya.
23
Contoh ekspresi aritmatika dalam Interpreter LISP :
• =>25 25 • =>(expt 2 3) 8 • =>(* 5 4) 20 • =>(/ 10 5) 2 • =>(/ 10 6) 1.666667 • =>(+ 27 3) 30
24
Contoh ekspresi aritmatika dalam Interpreter
LISP(Lanjtn..) :
• =>(- 27 3) 24 • =>(+ 2 3 4 5) 14 • =>(* 2 3 4 5) 120 • =>(+ (* 3 (+ 2 7)) (- 5 (* 2 1))) 30Walaupun pemroses bahasanya berupa interpreter, LISP tetap dapat menerima masukan secara batch dari file eksternal.
25
• File eksternal itu berisi sederetan fungsi yang akan dievaluasi secara sekuensial.
• Sebagai akibatnya, hasil evaluasi dari kumpulan file yang terdapat dalam file eksternal itu hanya berupa nilai dari hasil evaluasi terhadap fungsi terakhir yang dituliskan dalam file eksternal tersebut.
26
• Sebuah program LISP dapat disimpan dalam sejumlah (lebih dari satu) file eksternal.
• Jika fungsi utama dari program tersebut mempunyai banyak sekali fungsi antara, maka fungsi-fungsi
antara itu dapat dikelompokkan berdasarkan fungsinya atau perannya.
• jika program LISP tersebut akan dieksekusi, maka seluruh file eksternal tersebut harus di-load dulu ke dalam memori.
27
Interaksi Cara Batch Arti
(load “CONTOH1.LSP” ) LISP akan mengevaluasi isi dari file eksternal bernama “CONTOH1.LSP”, yang berisi sekumpulan fungsi, dengan prinsip read-eval-print.
28
Isi dari file CONTOH1.LSP dapat dilihat sbb.
; Nama file : CONTOH1.LSP ;
; ini cara menuliskan komentar ;
(exp 2 3) ; artinya: 2 pangkat 3. (* 5 4) ; artinya: 5 * 4
(+ (* 3 (+ 2 7)) (- 5 (* 2 1))) ; artinya: (3 * (2 + 7)) + (5 - (2 * 1))
29
Penamaan Ekspresi
• Sebuah ekspresi dapat diberi nama.
• Penamaan ekspresi, dengan lingkup global, dapat dilakukan dengan menggunakan fungsi yang
didefinisikan sistem yang bernama setq.
• Sintaks dari ekspresi LISP-nya adalah sbb: (setq <nama-ekspresi> <nilai-ekspresi>)
30
Penamaan Ekspresi (Lnjtn..)
• Karena nilai-ekspresi ditentukan jenisnya oleh
pemrogram sendiri, maka tipe dari nama-ekspresi itu langsung terdefinisi (secara implisit) sesuai dengan tipe dari nilai-ekspresinya.
• Contohnya, jika JNILAI diberi nilai 5, maka otomatis JNILAI bertipe integer.
31
• Selain itu, karena LISP bukan bahasa fungsional murni
(seperti yang sudah dijelaskan di awal), jika suatu nama sudah di-binding dengan suatu nilai tertentu maka nama tersebut
akan tetap nilainya sesuai dengan lingkup dari nama tersebut. Tetapi, jika ada pemberian nilai lain yang berbeda untuk nama tersebut, maka itu dapat dilakukan
• Sehingga, kesimpulannya :
a. Sebuah nama-ekspresi dapat berubah-ubah nilainya.
b. Sebuah nama-ekspresi juga dapat berubah-ubah tipenya, tergantung nilainya.
32
Contoh penamaan ekspresi (lingkup global) :
=>(setq dua 2) 2 =>dua 2 =>(setq lis '(1 2 3 4)) (1 2 3 4) =>lis (1 2 3 4) =>(setq nilai (+ 3 5)) 8 =>(* dua nilai) 16 =>nilai 8=>(setq nilai 'atom1) atom1
=>nilai atom1
33
• Selain penamaan ekspresi untuk lingkup global, kita juga dapat melakukannya untuk lingkup lokal
• Lingkup lokal dalam arti bahwa ekspresi tersebut hanya akan digunakan secara lokal dalam sebuah fungsi tertentu
• Untuk memberi nama ekspresi dengan lingkup lokal tersebut, yang sifatnya sementara sehingga disebut ekspresi antara, kita menggunakan fungsi yang sudah didefinisikan oleh sistem yang bernama let.
34
Notasi Let
Notasi Fungsional Notasi LISP
Penamaan Ekspresi Antara (lokal) let <nama-ekspresi-1> = <nilai-ekspresi-1>, <nama-ekspresi-2> = <nilai-ekspresi-2> in <ekspresi>
( let ( (<nama-ekspresi-1> <nilai-ekspresi-1>)
(<nama-ekspresi-2> = <nilai-ekspresi-2>))
Bentuk Umum
Dimana :
• Nama-Fungsi merupakan nama fungsi yang direalisasikan.
• Nama merupakan nama sementara bersifat 'lokal' yang dipakai untuk menyimpan hasil evaluasi ekspresi dan nilai hanya terdefinisi pada lingkup dimana fungsi
tersebut akan direalisasikan.
• Ekspresi adalah suatu ekspresi fungsional.
• Realisasi-Fungsi adalah ekspresi fungsional, realisasi dari Nama-Fungsi
36
Fungsi Let
Let = Assigning Value
Let((<param1><val1>) (<param2><val2>))(exp) Untuk kasus keliling segitiga
kelsegi3(a t)let(z:=sqrt(sqr(1/2xa)+sqr(t))) a+2z
Implementasi
(defun kelsegi3 (a t)(let((z(sqrt(+(*(* 0.5 a) (* 0.5 a))(* t t)))))(+ a (* 2 z))))
37
Definisi : memetakan permasalahan dalam
suatu persamaan matematis
• Karakteristik fungsional : Memiliki parameter
Menghasilkan suatu nilai keluaran
• Langkah-langkah penyusunan fungsi :
a. Definisikan permasalahan
b. Analisa input/output
c. Tentukan solusi berdasarkan input yang ada dan petakan dalam persamaan matematis
38
Contoh
Kasus :
Mencari nilai mean olympic dari 4 deret data
Definisi : Bagamana mencari jumlah total 4 deret data yang bukan bernilai maksimum dan minimum
Input : 4 buah nilai deret data integer
Output : Jumlah deret not maks dan not min
Solusi : mo (a b c d) (a+b+c+d) - min(a b c d) - maks(a b c d)
Implementasi (defun mo (a b c d)(-(+ a b c d) (max a b c d)(min a b c d)))
Realisasi fungsi Realisasi program
mo(1 2 3 4) (mo 1 2 3 4)
5 5
mo(10 6 3 4) (mo 10 6 3 4)
39
Contoh (Lanjtn..)
Kasus :Mencari nilai luas suatu segitiga sama kaki
Definisi luas segitiga adalah perkalian alas dengan tinggi segitiga dibagi dua
Input dua buah nilai numerik (representasi alas dan tinggi)
Output nilai numerik luasan bidang segitiga Solusi luassesitiga3 (a t)1/2 x a x t
Implementasi (defun luassegi3 (a t)(* 0.5 a t)) Realisasi fungsi Realisasi program luassegi3(5 10) (luassegi3 5 10)
40
Contoh (Lanjtn..)
Kasus
Mencari keliling segitiga sama kaki
Definisi keliling segitiga adalah penjumlahan 2 sisi miring dengan alas
Input dua nilai numerik (representasi alas dan tinggi)
Output nilai keliling segitiga
Solusi 1 kelsegi3(a t)a + (2 x (sqrt(sqr(1/2xa)+sqr(t))) Solusi 2 cari sisimiring dulu
miring(a t)sqrt(sqr(1/2xa)+sqr(t)) kelsegi3(a t)a+(2xmiring(a t))))
Realisasi fungsi Realisasi program