PERBANDINGAN KONSTRUKSI FUNGSI DALAM BAHASA IMPERATIF DAN BAHASA FUNGSIONAL KASUS: KONVERSI BILANGAN KE TEKS Aditya Rama Mitra, S.Si., MT 1
Abstract In this paper a comparison is made between two programming paradigms concerning its technical aspects in defining functions. To implement the function under functional paradigm Haskell is used which is to contrast with one chosen imperative paradigm, C. ECLiPSe is introduced, but of little emphasis, as a representative for logic language. As particular case for investigation, number to text conversion is exposed to those paradigms. Further, special attention is brought into the discussion of the similarities of the function definition, as well as differences and difficulties in its realisation in each language. To summarize the discussion a brief conclusion is given indicating which paradigm that would look most natural for function building.
1.PENDAHULUAN Fungsi dapat dilihat sebagai sebuah mesin abstrak, yaitu mekanisme yang menerima masukan (satu argumen atau lebih) dan menghasilkan keluaran melalui proses pengolahan masukan tersebut menurut tugas (task) yang didefinisikan kepadanya. fungsi
—> masukan
••
•
keiuarun
• Gambar 1. Fungsi sebagai sebuah mesin abstrak
Dari sudut pandang yang lebih formal, matematika mengenal fungsi sebagai sebuah objek kajian yang berkaitan erat dengan pengertian-pengertian seperti pemetaan, argumen, ranah (domain), kodomain dan jangkauan (range). Secara simbolis, sebuah fungsi./ yang memetakan sebarang x elemen domain fungsi (Ds) ke v secara unik yang merupakan elemen kodomain fungsi tersebut (Cr) dituiiskan sebagai berikut:
1
Dosen Tetap Jurusan Teknik Komputer, FIK UPH
Perbandingan Konstruksi Fungsi dalam Bahasa ... (Aditya R. Mitra)
61
Atau secara diagramatis, pemetaan khusus ftersebut digambarkan sebagai berikut:
Gambar 2. Fungsi y=f(x)
Jika fungsi di atas hanya bekerja atas satu argumen, maka fungsi berpeubah banyak melibatkan lebih dari satu peubah sebagai argumen fungsi. Daftar argumen dari fungsi demikian dapat dilihat sebagai sebuah pasangan nilai {tuple) yang masing-masing komponennya adalah anggota dari himpunan terdefinisi. Secara formal fungsi berpeubah banyak ini dinyatakan sebagai y =fixi, x2, x3,..., x„), V(A-/,x 2 , XJ,...,
x„)eD(
Domain dan kodomain dalam pengertian fungsi di atas merupakan dua subhimpunan yang dapat berbeda. Lebih lanjut, elemen-elemen dari sebuah pasangan nilai juga bisa berasal dari himpunan yang saling berbeda. Himpunanhimpunan inilah yang dalam pemrograman menentukan tipe atau kombinasi tipe (tipe bentukan) dari fungsi yang melibatkan argumen tersebut. Berdasarkan definisi formal di atas maka sebuah fungsi lazimnya menerima setidaknya sebuah argumen untuk digunakan dalam proses komputasi di dalamnya sehingga sebuah keluaran yang merupakan variabel tak-bebas (bergantung pada nilai masukan) dapat dihasilkan. Namun tidak demikian halnya dengan bahasa pemrograman C yang mengklaim bahwa segala sesuatu dalam C adalah mengenai fungsi. Bahasa C memperkenalkan konsep yang diperluas mengenai fungsi yang dikenal dalam khazanah matematika. Fungsi dapat menerima argumen bertipe void (hampa) yang setara dengan fungsi tanpa argumen. Di samping itu, fungsi juga dapat mengembalikan nilai bertipe void. Walaupun demikian, diketahui bahwa fungsi dalam C tidak dapat mengembalikan struktur larik (array). Untuk mengatasi persoalan ini, maka peubah larik yang digunakan untuk menyimpan hasil komputasi didaftarkan sebagai salah satu argumen.Hal ini berarti pengubahan spesifikasi fungsi semula [2], 2. KARAKTERISTIK BAHASA FUNGSIONAL DAN FITUR HASKELL Haskell adalah bahasa pemrograman fungsional dengan berbagai fitur yang menarik yang menggabungkan berbagai gagasan dari bahasa pemrograman modern. Sebagai sebuah bahasa fungsional modus dasar komputasinya adalah pendefinisian {definition) fungsi dan penerapannya (application). Karakteristik kedua dari bahasa pemrograman fungsional, bahasa ini mempunyai sebuah bentuk kebebasan yang disebut kebebasan efek samping (side-effect freedom). Efek samping adalah operasi yang mengubah secara permanen nilai sebuah peubah. 62
Jurnal llmiah llmu Komputer, Vol. 4 No. 1 Januari 2006: 61-73
Jika C dan Pascal diketahui menggunakan pernyataan (statement) dengan efek samping, maka sebagai konsekuensi dari gaya bahasa fungsional Haskell mengevaluasi ekspresi yang diberikan dan bukannya mendefinisikan nilai suatu peubah. Dengan kata lain, evaluasi ekspresi yang ada diikuti oleh penciptaan elemen baru yang akan menampung hasil evaluasi tersebut. Berkaitan dengan evaluasi tipe, Haskell merupakan bahasa yang ketat dengan tipe (strongly typed language). Bahasa demikian menerapkan pemeriksaan keabsahan tipe pada saat kompilasi (compile time) tanpa perlu mengeksekusinya (run time). Dalam kabat (context) ini, sebuah nilai dengan tipe tertentu tidak dapat diasosiasikan ke peubah dengan tipe lain. Jika Haskell ketat dengan tipe, C menyediakan keluwesan (fleksibilitas) bekerja dengan tipe melalui mekanisme type casting. Di sisi lain, Lisp dan Prolog tidak mempersoalkan pemberlakuan kendala (constraint) terhadap tipe secara ketat. Haskell mendukung fungsi ordo tinggi (higher-order functions). Sebagaimana fungsi komposisi didefinisikan dalam matematika, Haskell memungkinkan pendefinisian sebuah fungsi yang menerima argumen berupa fungsi juga. Dalam C (dan juga Pascal) fungsi dapat diperlakukan sebagai argumen sebuah fungsi namun dalam skala terapan yang terbatas. Fitur berikutnya, Haskell mengenal polimorfisme (polymorphism), yaitu kemampuan dari sebuah fungsi untuk menerima argumen dengan berbagai tipe. Sebagai contoh, Haskell memungkinkan seseorang untuk cukup mendefinisikan satu tumpukan (stack) untuk kemudian diterapkan pada berbagai tipe elemen, seperti tumpukan dengan elemen bertipe bilangan bulat, tumpukan dengan elemen bertipe bilangan nyata, dan sebagainya. Dalam C dan juga Pascal, tiap jenis tumpukan akan membutuhkan satu definisi struktur dan cara memanipulasinya secara terpisah. Contoh lain, fungsi reversei yang menuliskan kembali sebuah senarai bertipe sebarang dalam urutan terbalik (Gambar 3) M l hit)* (Hugs mode) Main> r e w e r s e L " t h i s "tsil siht"
list"
Hain> reuerseL "tsil siht" "this list" Hain> r e v e r s e L
"this l i s t " Hain> rewei-seL [ 1 , 2 , 3 , 4 3 14,3,2,11 I1ain> r e v e r s e L ["apple", "banana", " c h e r r y " ! ["cherry","banana","apple " 1 Main> r e u e r s e L [ [ " a p p l e " , "banana"], ["cherry", [["cherry"."durian"],["apple","banana"]] Hain> „,
"durian"]]
Gambar 3. Hasil eksekusi fungsi r e v e r s e L untuk senarai bertipe sebarang (versi Haskell)
Dimana kode Haskell untuk fungsi reverseL: reverseL :: [t] -> [t] reverseL [] = [] reverseL (a:x) = reverseL x ++ [a] Gambar 4. Kode fungsi r e v e r s e L dalam Haskell
Perbandingan Konstruksi Fungsi dalam Bahasa ... (Aditya R. Mitra)
63
Kontras dengan Haskell, kode C untuk fungsi yang sama (Gambar 6) tidaklah seelegan kode dalam Haskell yang memanfaatkan keuntungan bekerja dengan struktur data senarai (list). Tipe s t r i n g dalam segmen kode adalah tipe yang didefinisikan sendiri, yaitu sebagai char *. Fungsi reverseL yang menerima string bertipe character karenanya tidak bekerja pada string tipe lain, seperti integer.
Gambar 5. Hasil eksekusi fungsi reverseL untuk string dengan tipe tertentu (versi C)
s;ring reverse L(s tring
s)
( int len=strl en is) ; int i,j=0; string sResu lt = II II . for (i=len-l ; i ==0;i--)
{ sResult" [ j ]
s[i] ; =
1 sResult[len] = '\0' ; return sResu it,
} Gambar 6. Kode fungsi reverseL dalam C
Fitur berikutnya, Haskell mendukung tipe data abstrak (abstract data type). Pendefinisian tipe ini dapat dilakukan disamping melalui sistem tipe yang elegan, juga melalui pendefinisian rekaan (construct) yang membatasi akses ke objek-objek bertipe tertentu. Sebagai contoh, pada struktur tumpukan (stack) operasi push, pop dan sejumlah operasi elementer lainnya didefinisikan sebagai satu-satunya cara untuk mengakses elemen tumpukan untuk keperluan pembacaan atau modifikasi struktur. Fitur lain dari Haskell adalah bahwa Haskell mendorong (promote) penggunaan rekursi (recursion) lebih dari iterator-iterator seperti f o r - l o o p atau w h i l e - l o o p yang banyak digunakan di C dan Pascal. Sebagaimana diketahui, pendefinisian fungsi dalam bentuk rekursi menjadikan gagasan fungsi dapat dibaca secara lebih jelas. Sekalipun rekursi lebih dianjurkan, Haskell menyediakan rekaan iteratif. Rekaan iteratif sebaiknya digunakan pada momen yang tepat. Fitur selanjutnya adalah bahwa Haskell menyediakan suatu cara untuk menerapkan pemrograman berbasis aturan (rule-based programming) dimana dasar aksi adalah aturan i f - t h e n . Dalam Haskell sebuah nilai (value) akan dibandingkan dengan berbagai pola (pattern) secara beraturan. Kesesuaian pertama yang terjadi memicu eksekusi dari aksi yang didefinisikan untuk pola tersebut. Dengan demikian, Haskell mempunyai kapabilitas merealisasi kemampuan yang dimiliki bahasa pemrograman deklaratif (seperti Prolog) yang diklasifikasikan sebagai "bahasa kecerdasan artifisial". 64 Jurnal llmiah llmu Komputer, Vol. 4 No. 1 Januari 2006: 61-73
3. KONVERSI BILANGAN KE TEKS DALAM NOTASI ALGORITMIK Persoalan konversi bilangan (dalam tulisan ini dipilihkan basis 10) ke teks dapat dilihat sebagai pengembangan dari persoalan tipikal konversi digit ke teks. Sebut d i g i t 2 T x t sebuah fungsi yang hanya menerima masukan berupa bilangan (basis 10) yang bernilai 0, 1, 2,... 9 dan mengubah simbol bilangan tersebut ke penyebutannya. function digi t2Txt(input n:integer) —>strinq kamus: algoritma: depend on n n=0
n=l n=2 n=3 n=4 n=5 n=6 n=7 n=8 n=9
1 - * •
zero'
—> 'one' —» v two'
-* -»
1
three'
v
four'
—» v five' —» ' six' —> v seven'
-* -*
1
eight'
'nine' Gambar 7. Teks algoritmik dan fungsi konversi digit ke teks. digit2txt
Kompleksitas persoalan konversi bergerak linier jika konversi yang dilakukan berupa pengejaan simbol-simbol bilangan yang diberikan satu per satu. Sebagai contoh 1198 dieja sebagai "satu satu sembilan delapan" atau "one one nine eight" dalam bahasa Inggris. Kompleksitas menjadi tidak linier untuk konversi berdasarkan nilai bilangan. Dengan demikian 1198 disebut "seribu seratus sembilan puluh delapan" atau "thousand hundred and ninety eight" (bahasa Inggris), atau "duizend honderd acht en negentig" (bahasa Belanda) atau "tausend ein hundert acht und neunzig" (bahasa Jerman). Diketahui juga bahwa bilangan bernilai sebelas yang disimbolkan dengan dua buah angka 1 berturutan mempunyai nama sendiri, yaitu "eleven", atau "elf" dalam bahasa Belanda dan Jerman. Penyebutan untuk bilangan-bilangan yang bernilai lebih besar dari 9 dengan demikian perlu ditangani secara khusus. Di samping itu, konversi juga disyaratkan untuk memperhatikan tatabahasa dari bahasa yang digunakan. Memperhatikan aturan penyebutan bilangan dalam beberapa bahasa, penyebutan bilangan dalam bahasa Belanda dan Jerman tidaklah sesederhana penyebutan dalam bahasa Inggris maupun Indonesia. Diketahui bahwa dalam bahasa Belanda dan Jerman penyebutan bilangan satuan dilakukan mendahului bilangan puluhan, baik untuk pengali satuan, seribu, jutaan, dan seterusnya. Sebagai contoh, 13100 disebut "dertien duizend honderd", 1310 disebut "duizend drie honderd tien"; tetapi 131000 disebut "honderd een en dertiq duizend", dan 131 menjadi "honderd een en dertiq". Perbandingan Konstruksi Fungsi dalam Bahasa ... (Aditya R. Mitra)
65
Notasi algoritmik dari fungsi konversi puluhan, ratusan, ribuan dan puluhan ribu dari bilangan yang diberikan disajikan berturut-turut dalam Gambar 8 hingga Gambar 11.
function doubleDigit2Txt(input n:integer)—^string kamus: p,q:integer numTxt str ing='' algoritma: p <— n div 10 q <— n mod 10 if p=0 then numTxt <— digit2Txt(n) else if p=l then depend on q q=0 : numTxt <- ten* q=l : numTxt <- eleven' q=2 : numTxt <- twelve' q=3 : numTxt <- thirteen' q=4 : numTxt <- fourteen' q=5 : numTxt <- fifteen' q=6 : numTxt <- sixteen' q=7 : numTxt <- seventeen' q=8 : numTxt <— eighteen' else: numTxt <— nineteen' {q=9} else depend on p p=2 numTxt <— 'twenty' p=3 numTxt <- * thirty' p=4 numTxt <— 1fourty' p=5 numTxt <— 'fifty' p=6 numTxt <— 1 sixty' p=7 numTxt <— 1 seventy' p=8 numTxt ( ) then numlrxt <- numTxt + l ' + digit2Txt(q) —> numTxt Gambar 8. Teks algoritmik dari fungsi konversi puluhan ke teks, doubleDigit2Txt
66
Jurnal llmiah llmu Komputer, Vol. 4 No. 1 Januari 2006: 61-73
function tripleDigit2Txt(input n:integer)-»string kamus: p, q -. integer numTxt : string='' algoritma: p <- n div 100 q <- n mod 100 if p=0 then numTxt <- doubleDigit2Txt(n) else if p=l then numText <— 'hundred' else numTxt <- digit2Txt(p) + ' hundred' if q>0 then numTxt <- numTxt + ' and ' + doubleDigit2Txt(q) —> numTxt Gambar 9. Teks algoritmik dari fungsi konversi ratusan ke teks, tripleDigit2Txt
function quadrupleDigit2Txt(input n:integer)—>string kamus: p,q:integer numTxt : string='' algoritma: p <— n div 1000 q <- n mod 1000 if p=0 then numTxt 0 then if q<100 then numTxt <— numTxt + ' and ' + doubleDigit2Txt(q) else numTxt <- numTxt + ( ' + tripleDigit2Txt(q) —> numTxt Gambar 10. Teks algoritmik dari fungsi konversi ribuan ke teks. quadrupleDigit2Txt
Perbandingan Konstruksi Fungsi dalam Bahasa ... (Aditya R. Mitra)
67
function quintupleDigit2Txt(input n:integer)->string kamus: p,q:integer numTxt :string='' algoritma: p <- n div 1000 q <- n mod 1000 ijf p=0 then numTxt «- tripleDigit2Txt(n) else if p=l then numTxt <— l thousand' else numTxt «- doubleDigit2Txt(p) + ' thousand' if q>0 then if q<100 then numTxt <— numTxt + ' and ' + doubleDigit2Txt(q) else numTxt <— numTxt + ' ' + tripleDigit2Txt(q) -> numTxt Gambar 11. Teks algoritmik dari fungsi konversi puluhan ribu ke teks, quintupleDigit2Txt
4. IMPLEMENTASI KONVERSI BILANGAN KE TEKS DALAM HASKELL Potongan kode Haskell untuk persoalan konversi bilangan ke teks dalam versi bahasa Inggris dan bahasa Belanda diberikan dalam Gambar 12. Dalam contoh eksekusi program yang diberikan, program mampu menangani konversi dari bilangan yang direpresentasi paling banyak menggunakan lima digit. Fungsi yang didefinisikan untuk keperluan ini adalah quintupieDig±t2Txt. Bagian yang ditandai dengan kotak adalah bagian yang membedakan aturan penyebutan dalam kedua bahasa. Hasil eksekusi program untuk konversi sejumlah bilangan ditunjukkan berturut-turut dalam Gambar 13 hingga Gambar 15. Hal lain yang menarik untuk dicermati adalah bahwa bahasa pemrograman fungsional secara elegan dapat mengimplementasi persoalan konversi bilangan melalui sejumlah deklarasi yang efektif yang juga mencerminkan juga nuansa pencocokan pola (pattern matching) yang kental. Pencocokan pola merupakan karakteristik dari pemrograman deklaratif sebagaimana hal ini dapat ditunjukkan melalui potongan kode dalam Prolog (menggunakan salah satu implementasinya, yaitu ECLiPSe versi 5.7) untuk persoalan yang sama (menangani bilangan yang direpresentasi maksimum dalam tiga digit) (Gb. 16). Hasil konversi ke teks untuk bilangan 145 dan 245 ditunjukkan berturut-turut dalam Gambar 17 dan Gambar 18. Dalam potongan kode tampak aspek komputasi yang jelas menandai adanya bagian tak murni dari bahasa deklaratif (lojik) yang tidak dapat dihindari untuk persoalan ini. Hasil konversi untuk 145 disimpan dalam variabel solusi x yang bernilai x=[hundred, and, f o r t y , f i v e ] . Sedangkan solusi untuk konversi bilangan 245 adalah X=[two, hundred, and, forty, five].
68
Jurnal llmiah llmu Komputer, Vol. 4 No. 1 Januari 2006: 61-73
digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt
:: Int -> String 0 = "zero" 1 = "one" 2 = "two" 3 = "three" 4 • "four" 5 = "five" 6 = "six" 7 = "seven" 8 = "eight" 9 = "nine"
doubleDigit2Txt :: Int -> String doubleDigit2Txt n | p==o = digit2Txt n | p= = l = case q of 0 -> "ten" l -> "eleven" 2 -> "twelve" 3 -> "thirteen" 4 -> "fourteen" 5 -> "fifteen" 6 -> "sixteen" 7 -> "seventeen" 8 -> "eighteen" 9 -> "nineteen" | p==2 s "twenty" ++ r ] p==3 = "thirty" ++ r | p==4 = "fourty" ++ r | p==5 = "fifty" ++ r j p==G = "sixty" ++ r | p==7 = "seventy" ++ r | p==8 = "eighty" ++ r | otherwise = "ninety" ++ r where p = div n 10 q = mod n 10 r = if q>0 then " " ++ digit2Txt q else
digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt digit2Txt
:: Int -> String 0 = "nul" 1 = "een" 2 = "twee" 3 = "drie" 4 = "vier" 5 • "vijf" 6 = "zes" 7 = "zeven" 8 = "acht" 9 = "negen"
doubleDigit2Txt :: Int -> String doubleDigit2Txt n | p==0 = digit2Txt n | p==l = case q of 0 -» "tien" 1 -> "elf" 2 -> "twaalf" 3 -> "dertien" 4 -> "veertien" 5 -> "vijftien" 6 -> "zestien" 7 -> "zeventien" 8 -> "achtien" 9 -> "negentien" | p==2 = r ++ "twentig" | p==3 = r + + "dertig" | p==4 = r ++ "veertig" | p==S = r ++ "vijftig" | p==6 = r ++ "zestig" | p==7 = r ++ "zeventig" | p==8 = r ++ "tachtig" | otherwise = r ++ "negentig" where p = div n 10 q = mod n 10 r = if q>0 then digit2Txt q ++ " en " else ii ii
tripleDigit2Txt :: Int -> String tripleDigit2Txt n 1 p==0 = doubleDigit2Txt n | p==l = "hundred" ++ r i otherwise = digit2Txt p + + " hundred" ++ r where p = div n 100 q = mod n 10 0 r = if q>0 then " and " ++ doubleDigit2Txt q else
tripleDigit2Txt :: Int -> String tripleDigit2Txt n | p==o = doubleDigit2Txt n | p==l = "honderd" ++ r | otherwise = digit2Txt p ++ " honderd" ++ r where p = div n 100 q = mod n 100 r = if q>0 then " " ++ doubleDigit2Txt q else
Gambar 12. Kode Haskell untuk konversi bilangan ke dalam bahasa Inggris (kiri) dan Belanda (kanan)
Perbandingan Konstruksi Fungsi dalam Bahasa ... (Aditya R. Mitra)
69
| 1 Hugs(Hugs mode)
Prelude> :1 c o n v n 2 t 3 . h s Reading f i l e " c o n u n 2 t 3 . h s " : Hugs s e s s i o n f o r : C:SProgram F i l e s \ H u g s 9 8 M i b \ P r e l u d e . h s convn2t3.hs Main> q u i n t u p l e D i g i t 2 T x t 12 "twelve" Main> quintupleDigit2Txt 1201 "thousand two hundred and one" Hain> quintupleDigit2Txt 123S7 "twelve thousand three hundred and fifty seven' (a) Konversi ke dalam bahasa Inggris
WM Hugs(Hugs mode) Hugs s e s s i o n f o r : C:\Program F i l e s \ H u g s 9 8 \ l i b \ P r e l u d e . h s convn2t4.hs Main> q u i n t u p l e D i g i t 2 T x t 12 "twaalf" Main> quintupleDigit2Txt 1201 "duizend twee honderd een" Main> quintupleDigit2Txt 12357 "twaalf duizend drie honderd seven en vijftig" (b) Konversi ke dalam bahasa Belanda Gambar 13. Hasil konversi bilangan dalam Haskell >. > Command Prompt -
Number t o c o n v e r t : Result: twelve (a) Konversi bilangan 1? c v Command Prompt - gobc
Number t o c o n v e r t : 1 2 0 1 R e s u l t : t h o u s a n d two hundred and o n e (b) Konversi bilangan 1201 cT Command Prompt - gobc
Number t o c o n v e r t : 1 2 3 5 7 R e s u l t : t w e l v e t h o u s a n d t h r e e hundred a n d f i f t y
seven
(c) Konversi bilangan 12357 Gambar 14. Hasil konversi bilangan 12, 1201 dan 12357 ke dalam bahasa Inggris dalam C .•• Command Prompt - gobc
Nunber t o c o n v e r t : 12 Result: twaalf (a) Konversi bilangan 12 cT Command Prompt - gobc
Nunber to convert: 1201 Result: duizend twee honderd een (b) Konversi bilangan 1201 cA Command Prompt - gobc
Number t o c o n v e r t : 1 2 3 5 7 R e s u l t : t w a a l f d u i z e n d d r i e honderd z e v e n en
vijftig
(c) Konversi bilangan 12357 Gambar 15. Hasil konversi bilangan 12, 1201 dan 12357 ke dalam bahasa Belanda dalam C
70
Jurnal llmiah llmu Komputer, Vol. 4 No. 1 Januari 2006: 61-73
5. IMPLEMENTASI KONVERSI BILANGAN KE TEKS DALAM ECLIPSE Sebagai perbandingan, realisasi fungsi persoalan yang sama di dalam bahasa ECLiPSe diberikan dalam Gambar 16. Kode dimaksud merupakan modifikasi kode yang muncul dalam [1]. Hasil eksekusi kode dalam ECLiPSe 5.7 diperlihatkan Gambar 17 dan 18.
number(0) --> [zero]. number(N) --> tripleDigit2Txt(N). tripleDig:Lt2Txt(N) --> doubleDigit2Txt(N). tripleDig:Lt2Txt(N) --> digit(D), hundred],rest_tripleDigit2Txt(Nl), {D>1, N is (D * 100) + Nl} . tripleDigit2Txt(N) -> [hundred],rest_tripleDigit2Txt(Nl), {D=l, N is (D * 100) + Nl}. rest_tripleDigit2Txt(0) •-> [] . rest_tripleDigit2Txt(N) --> [and], doubleDigit2Txt(N). doubleDigit2Txt(N) --> digit(N). doubleDigit2Txt(N) --> teen(N). doubleDigit2Txt(N) --> tens(T), rest doubleDigit2Txt(Nl), {N is T + Nl} . rest doubleDigit2Txt (0) -> [] . rest_doubleDigit2Txt(N) --> digit(N). digit(l) --> [one]. digit(2) --> [two].
digit(9) --> [nine]. teen(10) --> [ten] . teen(ll) --> [eleven].
teen(19) --> [nineteen]. tens(20) --> [twenty]. tens(30) --> [thirty].
tens(90) --> [ninety]. Gambar 16. Potongan kode konversi dalam Prolog versi Eclipse
Perbandingan Konstruksi Fungsi dalam Bahasa ... (Aditya R. Mitra)
71
I
?- number U 4 S , X, U ) . X « [hundred, and, forty, five] Yes (0.00s cpu, solution 1, maybe more) 4
Gambar 17. Eksekusi kode konversi bilangan 145 dalam Prolog versi ECLiPSe 5.7
is!
ECLiPSe 5.7 Toptevel File
Run Tools
Help Query Entry
eclipse run
•
: number(245.X.t 1 ) . more
More
make
.
Results
X = (two, hundred, and, forty, five] Yes (0.00s cpu, solution 1, maybe more)
Output and Error Messages
Gambar 18. Eksekusi kode konversi bilangan 245 dalam Prolog versi ECLiPSe 5.7
72
Jurnal llmiah llmu Komputer, Vol. 4 No. 1 Januari 2006: 61-73
6. ANALISIS Telah ditunjukkan bahwa pendefinisian fungsi konversi bilangan ke teks dalam konteks pemrograman imperatif memperlihatkan keserupaan yang signifikan dengan pengkonstruksian dalam pemrograman fungsional. Dalam penyajian kasus yang diberikan, gagasan higher-order function memang tidak muncul secara langsung; tetapi dalam implementasi algoritma menggunakan bahasa pemrograman imperatif yang dipilih, hasil kembalian {return value) dari suatu fungsi digunakan oleh fungsi lain yang memanggilnya. Hanya saja dibutuhkan kecermatan untuk bekerja dengan tipe pointer pada C yang digunakan secara intensif untuk persoalan konversi ini (yaitu tipe s t r i n g yang didefinisikan sebagai char*). Hal mana kesulitan demikian tidak dijumpai dalam Haskell yang memperlakukan string sebagai list of character Sebaliknya upaya ekstra yang harus dilakukan ketika bekerja dengan bahasa fungsional adalah memodifikasi fungsi sehingga pendefinisian variabel beserta assignment nilainya dapat diakomodasi saat mana hal itu tidak dapat dihindari. Perhatikan penggunaan where pada potongan kode Haskell dalam Gambar 12 di atas. Dapat dikatakan juga bahwa untuk persoalan yang diberikan bahasa fungsional Haskell dapat digunakan untuk merealisasi gagasan yang diadopsi dari paradigma pemrograman yang lain. Kemampuan inipun ditunjukkan oleh bahasa pemrograman imperatif C yang dipilih disini.
7. KESIMPULAN Dari diskusi di atas dapat dikatakan bahwa dalam realisasi fungsi adalah aktifitas yang mengikuti pendefinisian fungsi yang benar. Dalam realisasinya, ujud tubuh (body) fungsi dapat muncul dalam berbagai bentuk berdasarkan paradigma pemrograman yang digunakan. Namun sekalipun demikian, seseorang dapat menilai bentuk atau cara mana yang paling natural untuk mendefinisikan dan merealisasikan fungsi yang diberikan. Dalam kasus contoh yang disajikan di sini realisasi fungsi yang paling natural adalah fungsi yang ditulis dalam bahasa pemrograman fungsional Haskell.
REFERENSI [1] Bailey, P., "More about Definite Clause Grammars", Division of Informatics, University of Edinburgh, 2001. [2] Mitra, A.R., Lazarusli, I.A., "Some Glitches on Interpretation of Algorithmic Notation", Jurnal llmiah llmu Komputer, Vol. 3, No. 2, Mei, 2005, him 147—152 [3] Thompson, S., "Haskell: The Craft of Functional Programming", England: Addison-Wesley, 1996.
Perbandingan Konstruksi Fungsi dalam Bahasa ... (Aditya R. Mitra)
73