LAPORAN PRAKTIKUM VIII KECERDASAN BUATAN TEKNIK INFORMATIKA/S1 MUHAMMAD ABDULLAH AL MUWAHHID 135410025 LABORATORIUM TERPADU SEKOLAH TINGGI MANAJEMEN INFORMATIKA DAN KOMPUTER AKAKOM YOGYAKARTA STRUKTUR DATA REKURSI I. TUJUAN. Tujuan dari bab ini adalah agar mahasiswa dapat mengetahui bagaimana bentuk dari struktur data rekursi, bagaimana mekanismenya dan mengetahui salah satu bidang dari rekursi yaitu rekursi ekor, agar dapat diimplementasikan ke dalam pengolaha data – data yang kompleks. II. DASAR TEORI Prolog merupakan satu-satunya bahasa pemrograman yang digunakan secara luas yang memperbolehkan mendefinisikan tipe struktur data rekursif. Salah satu tipe struktu data rekursif yaitu struktur data pohon (tree). Pohon dalam Prolog dapat didefinsikan sebagai berikut: DOMAINS tipepohon = pohon(string, tipepohon, tipepohon) Deklarasi tersebut menyatakan bahwa sebuah pohon ditulis sebagai sebuah functor pohon yang argumennya adalah sebuah string dan dua tambahan pohon lainnya. Berikut ini merupakan contoh program untuk membuat struktur data pohon. Untuk menjelajahi sebuah pohon, algoritma yang sering digunakan adalah: - Jika pohon tersebut empty maka tidak melakukan apa-apa. - Jika tidak, lakukan proses pada titik tersebut, kemudian jelajahi subpohon sebelah kiri, kemudian jelajahi subpohon sebelah kanan. Metode diatas biasa disebut dengan metode dfs(Depth First Search). III. PEMBAHASAN. 1. PRAKTEK 1. Pada praktek 1 ini dibahas mengenai rekursi untuk struktur pohon karakter pada nama – nama orang. Berikut penjelasannya : DOMAINS tipepohon = pohon(string,tipepohon,tipepohon) ; empty() Pada sisi domain, diinstan tipepohon dengan nilai berupa pohon(string, tipepohon, tipepohon). PREDICATES buat_pohon(string, tipepohon) sisip_kiri(tipepohon, tipepohon, tipepohon) sisip_kanan(tipepohon, tipepohon, tipepohon) bentuk_pohon(tipepohon) Pada sisi predikat, diinstan beberapa predikat, yaitu buat_pohon dengan parameter string dan tipepohon, selanjutnya terdapat sisip_kiri dengan parameter tipepohon, tipepohon, tipepohon. Predikat terakhir yang diinstan adalah bentuk_pohon dengan predikat tipepohon. CLAUSES buat_pohon(A, pohon(A, empty, empty)). Pada klausa diatas, diinstan bahwa buat_pohon berisi A dan fungsi pohon dengan parameter A, empty, empty. sisip_kiri(X, pohon(A,_,B), pohon(A,X,B)). Klausa diatas adalah penginstanan sisip_kiri, dimana klausa tersebut berparameter X, fungsi pohon(A,_, B) dan fungsi pohon(A, X, B). Dengan begitu penyisipan pada sisip_kiri akan berada di antara parameter A & B pada fungsi pohon. sisip_kanan(X, pohon(A,B,_), pohon(A,B,X)). Klausa diatas adalah penginstanan sisip_kanan, dimana klausa tersebut berparameter X, fungsi pohon(A,B, _) dan fungsi pohon(A, B, X). Dengan begitu penyisipan pada sisip_kanan akan berada di sebelah kanan parameter B pada fungsi pohon. bentuk_pohon(Ca3):buat_pohon("Charles",Ch), buat_pohon("Hazel",H), buat_pohon("Michael",Mi), buat_pohon("Jim",J), buat_pohon("Eleanor",E), buat_pohon("Melody",Me), buat_pohon("Cathy",Ca), Klausa diatas merupakan penginisialisasian fungsi bentuk_pohon(), dimana diinisialisasi 7 nilai dari fungsi buat_pohon di dalam fungsi bentuk_pohon(), Ca3 pada parameter bentuk_pohon merupakan indeks terakhir pemakaian struktur pohon. Pada klausa – klausa berikutnya akan diinstan penginisialisasian tiap nilai dari fungsi sisip_kiri dan sisip_kanan, dimana penginisialisasian ini dimulai dari level paling bawah. sisip_kiri(Ch, Mi, Mi2), Klausa diatas merupakan penginisialisasian sisip_kiri pertama dengan penyisipan charles, dengan level diatasnya adalah 2 kode yaitu michael dan Mi2 yang digunakan untuk pemanggilan rekursi berekor untuk fungsi berikutnya yang ingin menggunakan berikutnya. sisip_kanan(H, Mi2, Mi3), Klausa diatas merupakan penginisialisasian sisip_kanan pertama dengan penyisipan hazel, dengan level diatasnya adalah 2 kode yaitu michael dan Mi2 yang digunakan untuk pemanggilan rekursi berekor untuk fungsi berikutnya yang ingin menggunakan berikutnya. sisip_kiri(J, Me, Me2), Klausa diatas merupakan penginisialisasian sisip_kiri pertama dengan penyisipan Jim, dengan level diatasnya adalah 2 kode yaitu Melody dan Me2 yang digunakan untuk pemanggilan rekursi berekor untuk fungsi berikutnya yang ingin menggunakan berikutnya. sisip_kanan(E, Me2, Me3), Klausa diatas merupakan penginisialisasian sisip_kanan pertama dengan penyisipan Eleanor, dengan level diatasnya adalah 2 kode yaitu Melody dan Me3 yang digunakan untuk pemanggilan rekursi berekor untuk fungsi berikutnya yang ingin menggunakan berikutnya. sisip_kiri(Mi3, Ca, Ca2), Klausa diatas merupakan penginisialisasian sisip_kiri dengan penyisipan Michael, dengan level diatasnya adalah Cathy, Ca2 ini digunakan untuk memberikan rekursi berekor terhadap fungsi yang akan menggunakan fungsi ini berikutnya. sisip_kanan(Me3, Ca2, Ca3). Klausa diatas merupakan penginisialisasian sisip_kanan dengan penyisipan Melody, dengan level diatasnya adalah Cathy, Ca3 ini digunakan untuk memberikan rekursi berekor terhadap fungsi yang akan menggunakan fungsi ini berikutnya. GOAL bentuk_pohon(Pohon). 2. Latihan . Latihan dibahas program mengenai pembentukan pohon karakter berurut dari inputan sembarang. Adapun inputan berupa nama lengkap masing – masing mahasiswa. Berikut penjelasan program : DOMAINS pohonchar = pohon(char, pohonchar, pohonchar); akhir Pada sisi domain diinstan domain bernama pohonchar yang bernilai objek yaitu pohon(char, pohonchar, pohonchar) PREDICATES nondeterm lakukan(pohonchar) kerjakan(char, pohonchar, pohonchar) buat_pohon(pohonchar, pohonchar) sisip(char, pohonchar, pohonchar) cetak_pohon(pohonchar) nondeterm ulang Pada sisi predikat diinstan 6 predikat, yaitu lakukan(), kerjakan(), buat_pohon(), sisip(), cetak_pohon() dan ulang. CLAUSES lakukan(Pohon):ulang,nl, write("*******************************************************"),nl, write("Ketik 1 meng-update pohon\n"), write("Ketik 2 mencetak pohon\n"), write("Ketik 7 keluar\n"), write("*******************************************************"),nl, write("Masukkan angka - "), readchar(X),nl, kerjakan(X, Pohon, PohonBaru), lakukan(PohonBaru). Klausa diatas merupakan output untuk menampilkan informasi fungsi input user. Selanjutnya user dapat memberikan sembarang input dengan perintah readchar(X). Perintah berikutnya adalah kerjakan(X, Pohon, PohonBaru), fungsi ini digunakan untuk memproses langkah berikutnya setelah user menginputkan sembarang angka. Syarat terakhir dari lakukan(Pohon) adalah melakukan perintah lakukan(X) lagi, perintah ini merupakan proses rekursi yang nantinya akan diulang hingga user menginputkan angka yang memanggil perintah keluar dari fungsi tersebut. kerjakan('1',Pohon,PohonBaru):write("Ketik karakter # untuk mengakhiri: "), buat_pohon(Pohon, PohonBaru). Kerjakan() dengan parameter 1 akan memanggil fungsi buat_pohon(). Fungsi ini nantinya akan digunakan untuk membuat pohon baru. kerjakan('2',Pohon,Pohon):cetak_pohon(Pohon), write("\nTekan sembarang tombol"), readchar(_),nl. kerjakan('7', _, akhir):exit. Kerjakan() dengan nilai 2 akan melakukan beberapa proses : Pemanggilan fungsi cetak_pohon() Pemanggilan perintah untuk input. Pemanggilan fungsi kerjakan(X, _, akhir) dengan nilai X adalah 7. buat_pohon(Pohon, PohonBaru):readchar(C), C<>'#',!, write(C, " "), sisip(C, Pohon, PohonTemp), buat_pohon(PohonTemp, PohonBaru). buat_pohon(Pohon, Pohon). Buat_pohon() memiliki beberapa perintah yang dilakukan: Input data untuk variabel C Pemrosesan variabel C pada buat_pohon() Pemanggilan sisip() untuk variabel C. Pemanggilan fungsi buat_pohon() dengan parameter PohonTemp dan PohonBaru. Ini merupakan perintah dilakukannya rekursi ekor untuk mengurutkan karakter sembarang. Pemanggilan fungsi buat_pohon() dengan parameter Pohon dan Pohon, fungsi ini merpuakan perintah dari rekursi untuk menetapkan karakter – karakter yang suddah diurutkan sebelumnya, sisip(Baru,akhir,pohon(Baru,akhir,akhir)):-!. Perintah pemanggilan diatas merupakan indikasi bahwa fungsi sisip() dengan parameternya tidak boleh kosong. sisip(Baru,pohon(Elemen,Kiri,Kanan),pohon(Elemen,KiriBaru,Kanan)):Baru<Elemen,!, sisip(Baru,Kiri,KiriBaru). Pemanggilan fungsi sisip() diatas digunakan untuk melakukan penyisipan karakter untuk sisi kiri dengan syarat karakter baru kurang dari elemen. Perintah selanjutnya adalah memanggil fungsi sisip() lagi dengan parameter Baru, Kiri, dan KiriBaru. sisip(Baru,pohon(Elemen,Kiri,Kanan),pohon(Elemen,Kiri,KananBaru)):sisip(Baru,Kanan,KananBaru). Pemanggilan fungsi sisip() diatas dengan parameternya digunakan untuk menyisipkan karakter ke sisi kanan dengam memanggil fungsi sisip() yang berparameter Baru, Kanan dan KananBaru. cetak_pohon(akhir). Pemanggilan fungsi diatas digunakan untuk menampilkan akhir, dimana akhir merupakan variabel yang didapat dari hasil pengurutan sebelumn - sebelumnya. Sedangkan akhir sendiri penjelasan prosesnya akan diinstan di klausa berikutnya. cetak_pohon(pohon(Item,Kiri,Kanan)):cetak_pohon(Kiri), write(Item, " "), cetak_pohon(Kanan). Pemanggilan fungsi buat_pohon() diatas dengan parameter objek pohon() merupakan yang nantinya akan digenerate ke variabel akhir memiliki beberapa perintah, yaitu pemanggilan cetak_pohon() dengan parameter Kiri selanjutnya pemanggilan cetak_pohon() dengan parameter Kanan yang akan diulang hingga karakter habis. ulang. ulang:-ulang. Perintah ulang digunakan untuk melakukan pengulangan pada cetak_pohon. Dari hasil yang tertera, berikut tampilan struktur pohonnya : 3. TUGAS. Pada TUGAS, dibuat program menggunakan prolog untuk membuat struktur instansi yang berada di kampus STMIK akakom, berikut adalah struktur pohonnya : Adapun skrip dari visual prolognya adalah sebagai berikut : DOMAINS tipepohon = pohon(string,tipepohon,tipepohon) ; empty() PREDICATES buat_pohon(string, tipepohon) sisip_kiri(tipepohon, tipepohon, tipepohon) sisip_kanan(tipepohon, tipepohon, tipepohon) bentuk_pohon(tipepohon) CLAUSES buat_pohon(A, pohon(A, empty, empty)). sisip_kiri(X, pohon(A,_,B), pohon(A,X,B)). sisip_kanan(X, pohon(A,B,_), pohon(A,B,X)). bentuk_pohon(Kt2):buat_pohon("Ketua",Kt), buat_pohon("Puket1",P1k), buat_pohon("Puket2",P2k), buat_pohon("TI",Ti), buat_pohon("SI",Si), buat_pohon("Pegawai",Pg), buat_pohon("Keuangan",Ku), buat_pohon("ACC",Ac), buat_pohon("Mahasiswa",Mh), buat_pohon("Edukasi",Ed), buat_pohon("NonEdukasi",No), sisip_kiri(Ti, P1k, P1k2), sisip_kanan(Si, P1k2, P1k3), sisip_kiri(P1k3, Kt, Kt1), sisip_kiri(Ed, Pg, Pg1), sisip_kanan(No, Pg1, Pg2), sisip_kiri(Pg2, P2k, P2k1), sisip_kanan(Ku, P2k1, P2k2), sisip_kanan(P2k2, Kt1, Kt2). GOAL bentuk_pohon(Pohon). HASIL : IV. KESIMPULAN. Dari bab ini dapat disimpulkan, pada turbo prolog dapat menginisialisasi pembentukan fungsi yang digunakan untuk membuat struktur data rekursi, dengan pemanggilan fungsi berulang di dalam fungsi tersebut. Fungsi tersebut biasa disebut dengan rekursi ekor. V. LISTING. Terlampir.