Pemrograman Fungsional FAJAR SAPTONO, ST
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
2
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. 3
Pendahuluan (Lanjtn...) • Paradigma fungsional tidak lagi mempermasalahkan 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. 4
Pendahuluan (Lanjtn...) • Program adalah fungsi hasil komposisi dari fungsifungsi 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
5
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
6
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. 7
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.
8
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). 9
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 Pemakaian fungsi yang terdefinisi
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
, 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 c) Ekspresi rekursif
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. Operannya harus bernilai numerik, dan hasilnya 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
Notasi Fungsional dan LISP Notasi Fungsional Ekspresi ( , )
Notasi LISP ( )
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)
19
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
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.
21
Struktur Program (Lnjtn..) Interaksi cara Interaktif => ⇒25
25
Arti LISP menunggu masukan dari pemrogram. LISP siap mengevaluasi masukan dari pemrogram, dengan prinsip read-evalprint. LISP mengembalikan (menuliskan) hasil evaluasinya.
22
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 23
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))) 30 Walaupun pemroses bahasanya berupa interpreter, LISP tetap dapat menerima masukan secara batch dari file eksternal.
24
• 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.
25
• 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.
26
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.
27
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))
28
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 )
29
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.
30
• 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.
31
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
32
• 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.
33
Notasi Let Notasi Fungsional Penamaan Ekspresi Antara (lokal) let = , = in <ekspresi>
Notasi LISP ( let ( ( ) ( = )) <ekspresi>
34
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 35
Fungsi Let Let = Assigning Value Let((<param1>) (<param2>))(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))))
36
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
37
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) 10 10 38
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) 25 25 39
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 kelsegi3(5 5) (kelsegi3 5 5)
40