perbandingan konstruksi fungsi dalam bahasa imperatif dan bahasa

advertisement
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 <reverseL " t h i s l i s t " >
"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 <r- 'eighty'
numTxt <— 'ninety' {p=9}
else
±f_ q>( ) 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 <r- tripleDigit2Txt (n)
e 1 se
if p=l then
numTxt <— 'thousand'
else
numTxt <— digit2Txt(p) + v thousand'
if q>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
Download