• Tidak ada hasil yang ditemukan

Strategi Pengurangan (Reduction Strategy) dan Format Normal

Dalam dokumen Buku bhs pemrograman Q Equational 2018 (Halaman 70-73)

7 Evaluasi Ekspresi dan Persamaan

7.6 Strategi Pengurangan (Reduction Strategy) dan Format Normal

Proses di mana penyamaan/equation diterapkan di dalam interpreter Q untuk mengevaluasi suatu ungkapan/expression yang ditentukan adalah secara langsung yang wajar. Sesungguhnya, itu sesuai dengan cara yang ditempuh oleh kita dalam memanipulasi formula aljabar, dan kita mempelajari bagaimana cara melakukannya di sekolah menengah.

Kita katakan bahwa suatu penyamaan/equation L=R dapat digunakan untuk ungkapan/expression yang ditentukan X, jika kita dapat mengganti nilai-nilai nyata untuk variabel yang terjadi di dalam L sedemikian sehingga kita memperoleh X. Ini juga dinyatakan

sebagai “L mempertemukan X” atau “X adalah suatu kejadian/instance dari L”. Dalam hal ini, kita dapat menggantikan X dengan Y, di mana Y adalah ungkapan/expression yang diperoleh dari R dengan menggantikan variabel yang terjadi di dalam L dengan nilai-nilai bersesuaian mereka. Kita akan sebut langkah penggantian (replacement step) suatu pengurangan (reduction) seperti itu, dan menuliskannya seperti X ) Y.

Sebagai contoh, diberikan aturan

sqr X = X*X;

kita mempunyai bahwa sqr 2 => 2*2

karena ungkapan/expression sqr 2 mempertemukan sisi left-hand sqr X, dengan 2 yang sedang digantikan untuk variabel X. hal ini bekerja dengan ungkapan/expressions campuran juga, sekalipun mereka melibatkan variabel mereka sendiri. Sebagai contoh:

Di sini, ungkapan/expression campuran (X+1) telah digantikan untuk variabel X.

Penyamaan/equations pada umumnya diterapkan dalam konteks suatu ungkapan/expression yang lebih besar untuk dievaluasi. Sebagai contoh, kita mempunyai bahwa

sqr 2+ 2 => 2*2+2

oleh aplikasi dari definisi di atas dari sqr kepada subexpression sqr 2 dari sqr 2 + 2.

Sebelum kita memproses, suatu komentar berperan dalam operasi built-in dari bahasa Q dalam urutan. Operasi primitif, seperti operator built-in + dan * diuraikan di Bagian 6.4 [Operator Built-In], halaman 40, tidak memerlukan penyamaan/equation manapun yang ditetapkan oleh programmer. Sebagai gantinya, mereka mungkin adalah pemikiran sebagai hal yang sudah dikenal oleh suatu set yang besar dari penyamaan/equation built-in. Masing-Masing aplikasi dari suatu aturan built-in juga menghitung seperti pengurangan tunggal. Sebagai contoh, kita mempunyai bahwa

2*2 => 4

dengan aturan built-in yang menangani perkalian integer/bilangan bulat.

Aturan Built-In mengambil prioritas atas penyamaan/equation manapun yang ditetapkan oleh programmer. Bagaimanapun, adalah mungkin untuk meluaskan definisi dari suatu operasi primitif dengan penyamaan/equations yang disediakan oleh programmer. Suatu contoh yang bersesuaian disampaikan dalam Bagian 7.1 [Penyamaan (Equations)], halaman 51. Yang mendefinisikan ulang definisi built-in definisi maka, kamu dapat juga perlakukan

“perkecualian/exceptions” di dalam operasi built-in; lihat Bagian 2.5 [Runtime Errors], halaman 18, untuk suatu contoh.

Dalam rangka melengkapi evaluasi dari suatu ungkapan/expression diberikan, kita harus berulang-kali melaksanakan pengurangan tunggal sampai tidak ada penyamaan/equation (built- in atau user-defined)lebih lanjut berlaku. Kita kemudian katakan bahwa ungkapan/expression yang menghasilkan adalah di dalam format normal, dan menginterpretasikannya sebagai nilai dari ungkapan asli (original expression). Sebagai contoh, urutan pengurangan berikut memimpin ke arah format normal (yaitu, nilai) 6 untuk ungkapan target sqr 2 + 2 (kita masih mengasumsikan definisi sqr diperkenalkan di atas):

sqr 2 + 2 => 2*2+2 => 4+2 => 6.

Format normal tidak perlu ada. Seperti halnya dalam bahasa perograman konvensional, evaluasi boleh memasuki suatu pengulangan yang tak ada akhirnya (endless loop) dan tidak pernah mengembalikan suatu jawaban. Sekalipun suatu format normal ada, [itu] tidak perlu unik –

mungkin tergantung pada penyamaan/equation yang digunakan di dalam proses pengurangan (reduction process) dan di dalam apa yang dipesan. Masalahnya adalah bahwa pada point manapun di dalam proses pengurangan mungkin ada lebih dari satu subexpression “yang dapat dikurangi (diturunkan)”, dan bahkan jika terdapat hanya satu ungkapan seperti itu (yang

dimasukkan suatu redex), mungkin ada lebih dari satu penyamaan/equation bisa diterapkan. Untuk menggambarkan masalah macam ini, pertimbangkan definisi dari fungsi sqr di atas, dan ungkapan target sqr (1+1). Ungkapan ini mengijinkan tiga urutan pengurangan beda (distinct reduction):

sqr (1+1) => sqr 2 => 2*2 => 4

sqr (1+1) => (1+1)*(1+1) => 2*(1+1) => 2*2 => 4 sqr (1+1) => (1+1)*(1+1) => (1+1)*2 => 2*2 => 4.

Urutan pengurangan yang kedua dan ketiga nampak seperti hampir sama, tetapi urutan pengurangan yang pertama menjelaskan bahwa itu berbagai hal apakah kita mengurangi subexpression (1+1) sebelum menerapkan definisi sqr atau tidak. Di dalam contoh saat ini, order/pesanan di mana pengurangan dilakukan hanya mempengaruhi banyaknya langkah- langkah pengurangan yang diperlukan, tetapi adalah mudah untuk membangun sistem penyamaan lain di mana kedua penghentian dari suatu evaluasi format normal dan format normal yang dihitung benar-benar tergantung pada order/pesanan evaluasi.

format normal tidak unik tidak perlu berarti bahwa harus ada dua atau lebih aturan menjadi ungkapan yang dapat digunakan untuk suatu expression/ungkapan yang ditentukan. Kerancuan

dapat juga muncul ketika suatu penyamaan “tumpang-tindih” dengan penyamaan lain atau

dengan dirinya sendiri, seperti dalam contoh berikut :

foo (foo X) = bar X;

Sistem ini terdiri dari penyamaan tunggal yang sedang mengakhiri, tetapi mempunyai dua format normal yang beda untuk ungkapan/expression foo (foo (foo X)), yakni foo (bar X) dan bar (foo X).

Tentu saja, penghentian/termination sistem menulis kembali (rewrite systems) dan keunikan dari format normal adalah isu penting di dalam teori istilah sistem menulis kembali [Dershowitz/Jouannaud 1990]. Bahasa Q sederhananya menghindari permasalahan ini dengan mengesankan suatu strategi pengurangan yang membuat proses pengurangan deterministic. Strategi pengurangan harus menetapkan secara terang untuk masing-masing langkah pengurangan redex yang akan dikurangi dan penyamaan/equation yang akan diterapkan. Untuk tujuan ini interpreter Q menerapkan aturan berikut:

• Ungkapan/Expressions dievaluasi di dalam order/pesanan applicative, yang adalah, dari kiri ke kanan, ungkapan/expressions paling dalam dulu.

• Penyamaan/Equations diterapkan di dalam order/pesanan di mana mereka nampak di dalam suatu script. Aturan Built-In selalu mengambil prioritas.

Strategi Leftmost-Innermost adalah umum di dalam banyak bahasa pemrograman, dan juga

sesuai dengan cara “alami” yang cenderung orang gunakan untuk menyelesaikan kalkulasi

secara manual dengan tangan. Ini berarti bahwa pada point manapun di dalam proses pengurangan adalah selalu leftmost-innermost redex yang mana untuk dikurangi. Khususnya, ini menyiratkan bahwa di dalam suatu aplikasi dari format F X pertama F dievaluasi, kemudian X, sebelum nilai F diberlakukan bagi nilai X. dengan begitu urutan pengurangan yang pertama dari atas,

sqr (1+1) => sqr 2 => 2*2 => 4

akan jadi satu-satunya yang benar-benar dilaksanakan di dalam interpreter selama evaluasi sqr (1+1).

memutuskan penyamaan yang mana untuk menerapkan jika lebih dari satu penyamaan yang dapat digunakan untuk redex yang ditentukan. Seperti ditandai, default akan menerapkan penyamaan di dalam order/pesanan di mana mereka nampak di dalam script sumber. Ini mengijinkan kamu untuk mempunyai penyamaan dengan overlap sisi left-hand yang secara

alami muncul, e.g., di dalam definisi yang menyertakan “aturan kasus khusus” seperti definisi

dari fungsi fib di Bagian 7.1 [Penyamaan (Equations)], halaman 51:

fib 0 = 0;

fib 1 = 1;

fib N = fib (N-1) + fib (N-2) otherwise;

Catat bahwa default textual order/pesanan penyamaan dapat juga diubah dengan menggunakan

suatu yang sesuai “aturan prioritas” direktif. Ini diuraikan di Bagian 7.8 [Aturan Prioritas],

halaman 64.

Aturan untuk penerapan penyamaan diperluas kepada penyamaan built-in dari operasi primitif dengan mengumpamakan – seperti yang telah disebutkan – bahwa aturan built-in datang

“sebelum” penyamaan manapun yang ditetapkan oleh programmer, dan karenanya selalu

mengambil prioritas. Juga catat bahwa fungsi eksternal, yang dideklarasikan dengan modifier yang luar dan yang diterapkan di dalam suatu modul C, diperlakukan di dalam suatu cara analisa. Secara umum, interpreter akan mencoba yang pertama kali suatu aturan built-in, kemudian suatu aturan luar, kemudian penyamaan disediakan di dalam script. (Perawatan dari fungsi luar diuraikan secara lebih detil di Catatan tambahan C [Penghubung Bahasa C (C Language Interface)], halaman 217.)

Dalam dokumen Buku bhs pemrograman Q Equational 2018 (Halaman 70-73)