pembangkitan dan penyelesaian slither link dengan answer ... · slither link is a popular...

37
PEMBANGKITAN DAN PENYELESAIAN SLITHER LINK DENGAN ANSWER SET PROGRAMMING DAN PROCEDURAL PROGRAMMING SALMAN FARIZI DEPARTEMEN ILMU KOMPUTER FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM INSTITUT PERTANIAN BOGOR BOGOR 2011

Upload: hoangkhue

Post on 23-Mar-2019

221 views

Category:

Documents


0 download

TRANSCRIPT

PEMBANGKITAN DAN PENYELESAIAN SLITHER LINK DENGAN

ANSWER SET PROGRAMMING DAN PROCEDURAL PROGRAMMING

SALMAN FARIZI

DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

INSTITUT PERTANIAN BOGOR

BOGOR

2011

ABSTRAK

SALMAN FARIZI. Application of Generator and Solver Slither Link with Answer Set Programming

and Procedural Programming. Supervised by MUSHTHOFA.

Slither Link is a popular pencil-based puzzle game similar to Sudoku. This problem has been shown

to be NP-Complete. The goal of the game is to link grid segments forming a loop such that the number

of lines adjacent to a cell is equal to the number written on the cell. In this research, we investigate the

use of Answer Set Programming as a formal representation of the game, and to prove an alternative

solving method, as opposed to the procedural method. We then perform experiment to test the

efficiency of Answer Set Programming compared to the procedural method in solving Slither Link.

For the Anser Set Programming method, we use DLV as the solver, whereas for the procedural

method we write a program in C++ to solve Slither Link in a procedural manner. The result shows that

ASP performed consistently better than the procedural method we use.

Keywords : Slither Link, Answer Set Programming, Logic Programming.

PEMBANGKITAN DAN PENYELESAIAN SLITHER LINK DENGAN

ANSWER SET PROGRAMMING DAN PROCEDURAL PROGRAMMING

SALMAN FARIZI

Skripsi

Sebagai salah suatu syarat untuk memperoleh gelar

Sarjana Komputer pada

Program Studi Ilmu Komputer

DEPARTEMEN ILMU KOMPUTER

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM

INSTITUT PERTANIAN BOGOR

BOGOR

2011

Judul Skripsi : Pembangkitan dan Penyelesaian Sliher Link dengan Answer Set Programming dan

Procedural Programming

Nama : Salman Farizi

NIM : G64086006

Menyetujui:

Pembimbing

Mushthofa, S.Kom., M.Sc.

NIP. 19820325 200912 1 003

Mengetahui:

Ketua Departemen Ilmu Komputer

Institut Pertanian Bogor

Dr. Ir. Sri Nurdiati, M.Sc

NIP. 19601126 198601 2 001

Tanggal Lulus:

RIWAYAT HIDUP Penulis dilahirkan pada tanggal 10 Desember 1986 di Jakarta sebagai anak pertama dari dua

bersaudara dari pasangan Hifni Machmud dan Esty Dianingsih. Penulis menyelesaikan pendidikan

menengah atas pada tahun 2004 dari SMU Negeri 3 Bogor dan lulus program Diploma

Manajemen Informatika Politeknik Manufaktur Astra di Jakarta pada tahun 2007. Selama tiga

bulan penulis melaksanakan praktek kerja lapang di PT Gajah Tunggal tbk.

Pada tahun 2007 sampai 2008 penulis bekerja pada salah satu perusahaan otomotif di Jakarta,

kemudian penulis melanjutkan studi Sarjana di Departemen Ilmu Komputer jurusan Ilmu

Komputer, Institut Pertanian Bogor pada tahun 2008.

PRAKATA

Segala puji bagi Allah dan salawat serta salam atas Rasul Allah, Nabi Muhammad shalallahu

alaihi wa salam serta kepada keluarga dan sahabat-sahabatnya.

Melalui lembar ini penulis ingin menyampaikan terima kasih kepada Bapak Mushthofa

S.Kom., M.Sc. selaku pembimbing yang telah meluangkan waktu dan tenaganya untuk

membimbing penulis, memberikan ilmu-ilmu yang sangat berharga, serta dukungan selama

penelitian ini berjalan. Bapak Dr. Ir. Agus Buono M.Si, M.Kom. dan Bapak Ahmad Ridha

S.Kom., MS. yang telah bersedia menjadi penguji dalam pelaksanaan seminar dan sidang.

Penulis juga mengucapkan terima kasih kepada seluruh keluarga, terutama Mama dan Bapak

yang telah memberikan dukungannya, kasih sayang, pengorbanan, dan kesabarannya selama ini.

Abang Sandi, Teteh Etsa, Syalfa, Uwa, Paman, serta Bibi yang selalu mengingatkan penulis untuk

berdoa, berusaha, dan memberikan semangat untuk terus menyelesaikan tugas akhir.

Teguh yang selalu membantu, memberi dukungan, pendapat, dan teman satu bimbingan selama

ini. Teman-teman Badminton ilkom dan teman-teman acara nonton bareng yang selalu memberi

keceriaan dan wawasan baru pada penulis. Abdul Rahmat Ramdhan yang tanpa lelah selalu

memberi dukungan pada seminar dan sidang, serta teman-teman Ilkom Ekstensi angkatan 3 terima

kasih untuk kebersamaan selama kuliah di Ilmu Komputer IPB.

Seluruh staf pengajar yang telah memberikan ilmu yang berharga selama penulis menuntut

ilmu di Departemen Ilmu Komputer. Seluruh staf administrasi dan perpustakaan Departemen Ilmu

Komputer yang selalu memberikan kemudahan dalam mengurus segala macam hal berkaitan

dengan perkuliahan, serta pihak lain yang tidak bisa disebutkan satu-persatu.

Sebagaimana manusia yang tidak luput dari kesalahan, penulis menyadari bahwa karya ilmiah

ini jauh dari sempurna. Namun penulis berharap semoga karya ini bisa berguna untuk siapapun

yang membacanya.

Bogor, Mei 2011

Salman Farizi

iv

DAFTAR ISI

Halaman

DAFTAR GAMBAR ................................................................................................................... v

DAFTAR LAMPIRAN .............................................................................................................. vi

PENDAHULUAN ....................................................................................................................... 1

Latar Belakang ........................................................................................................................ 1

Tujuan Penelitian .................................................................................................................... 1

Ruang Lingkup Penelitian ...................................................................................................... 1

Manfaat Penelitian .................................................................................................................. 1

TINJAUAN PUSTAKA .............................................................................................................. 1

NP-Complete........................................................................................................................... 1

Logic Programming ................................................................................................................ 2

Answer set programming ........................................................................................................ 2

DLV (datalog with disjunction) .............................................................................................. 4

Slither link ............................................................................................................................... 5

METODOLOGI .......................................................................................................................... 5

Formulasi aturan pembangkitan slither link ............................................................................ 5

Formulasi aturan penyelesaian ................................................................................................ 6

Pembangunan front end .......................................................................................................... 7

Arsitektur sistem ..................................................................................................................... 8

HASIL DAN PEMBAHASAN ................................................................................................... 8

Domain masalah dalam DLV .................................................................................................. 8

Encoding dengan DLV ........................................................................................................... 9

Menjalankan model penyelesaian slither link ....................................................................... 12

Implementasi dengan Procedural Programming .................................................................. 13

Struktur data.......................................................................................................................... 13

Hasil Pengujian ..................................................................................................................... 14

KESIMPULAN DAN SARAN ................................................................................................. 15

Kesimpulan ........................................................................................................................... 15

Saran ..................................................................................................................................... 15

DAFTAR PUSTAKA ................................................................................................................ 15

LAMPIRAN .............................................................................................................................. 16

v

DAFTAR GAMBAR

Halaman

1 Hubungan antara P, NP, dan NPC (Cormen et al 2001). ............................................................... 2 2 Graf tujuh kota. .............................................................................................................................. 5 3 Masalah slither link dan solusinya (Yato 2003). ............................................................................ 5 4 Formulasi pembangkitan. ............................................................................................................... 5 5 Grafik tingkat kesulitan puzzle berbanding dengan constraint puzzle. ........................................... 6 6 Formulasi Penyelesaian. ................................................................................................................. 6 7 Cell dengan nilai 0 (Conceptis puzzle 1997). ................................................................................. 6 8 Cell bernilai 0 dan 3 yang bertetangga (Conceptis puzzle 1997). .................................................. 7 9 Cell bernilai 0 dan 3 diagonal (Conceptis puzzle 1997). ................................................................ 7 10 Dua cell bernilai 3 yang bertetangga (Conceptis puzzle 1997). ................................................... 7 11 Dua cell bernilai 3 dan diagonal (Conceptis puzzle 1997). .......................................................... 7 12 Angka apapun pada pojok cell (Conceptis puzzle 1997). ............................................................ 7 13 Arsitektur sistem. ......................................................................................................................... 8 14 Diagram alur proses solver slither link. ........................................................................................ 8 15 Representasi dari fakta slither link. .............................................................................................. 8 16 Representasi status garis di sekeliling cell arc(X,Y,0,0,0,1). ........................................... 9 17 Cell dengan predikat arc(X,Y,1,0,0,0). ........................................................................... 9 18 Cell dengan predikat arc(X,Y,1,0,0,0). ........................................................................... 9 19 Cell dengan predikat arc(X,Y,0,0,1,0). ........................................................................... 9 20 Cell dengan predikat arc(X,Y,0,0,0,1). ........................................................................... 9 21 Cell dengan nilai 0. ...................................................................................................................... 9 22 Cell dengan nilai 1. .................................................................................................................... 10 23 Cell dengan nilai 2. .................................................................................................................... 10 24 Cell dengan nilai 3. .................................................................................................................... 10 25 Local loop pada cell bernilai 3. .................................................................................................. 10 26 Constraint pada posisi pojok kiri atas. ....................................................................................... 11 27 Constraint pada posisi pojok kanan atas .................................................................................... 11 28 Constraint pada posisi pojok kiri bawah. ................................................................................... 11 29 Constraint pada posisi pojok kanan bawah. ............................................................................... 11 30 Antisipasi cabang. ...................................................................................................................... 12 31 Ketersambungan dari garis. ........................................................................................................ 12 32 Local loop dengan 2 cell bernilai 3. ........................................................................................... 12 33 Cell bernilai 2 yang bersebelah dengan 0. .................................................................................. 12 34 Slither link hasil pembangkitan. ................................................................................................. 13 35 Solusi slither link. ....................................................................................................................... 13 36 Ilustrasi penomoran sisi pada grid. ............................................................................................. 13 37 Grafik perbandingan waktu eksekusi dan ukuran slither link. ................................................... 15

vi

DAFTAR LAMPIRAN

Halaman

1 Program DLV, modul pembangkitan. ................................................................................................ 17 2 Program DLV, constraint cell dengan nilai 0, 1, 2, dan 3. ................................................................ 18 3 Program DLV, constraint mencegah local loop. ............................................................................... 19 4 Program DLV, constraint pada cell dengan posisi di pojok grid. ...................................................... 20 5 Program DLV, constraint untuk mengantisipasi cabang dan ketersambungan garis. ........................ 21 6 Program DLV, constraint dari cell bernilai 2 yang bersebelahan dengan cell bernilai 0. .................. 22 7 Pseudo code program C++ untuk membaca fakta slither link. .......................................................... 23 8 Pseudo code program C++, modul basic_rule . ................................................................................. 24 9 Pseudo code program C++, modul advance_rule . ............................................................................ 25 10 Pseudo code program C++, modul cek_garis_cell . ........................................................................ 26 11 Pseudo code program C++, modul sambung_garis dan modul cek_cabang. ................................... 27 12 Pseudo code program C++, modul cek_logic dan fungsi sambung. ................................................ 28

1

PENDAHULUAN

Latar Belakang

Slither link adalah salah satu permainan

kertas terkenal yang sulit untuk dipecahkan

secara konvensional. Tujuan dari slither link

adalah membentuk loop, yaitu sebuah putaran

garis yang tidak bercabang dan kembali ke

titik awal tetapi harus memenuhi aturan slither

link yaitu jumlah garis yang mengelilingi cell

harus sama dengan angka di dalam cell.

Penyelesaian untuk persoalan ini harus

melibatkan algoritme yang mencari

kemungkinan semua solusi. Hal ini

menyebabkan kompleksitas dari eksekusi

algoritme ini akan menjadi eksponensial

terhadap ukuran masukan yang diberikan.

Permasalahan ini lebih dikenal sebagai

Nondeterministic Polynomial-time Complete

(NP-Complete).

Teknik pemrograman komputer mempunyai

banyak paradigma atau teknik untuk

menyelesaikan sebuah masalah, pemilihan

teknik pemrograman yang tepat akan

memberikan cara paling efektif untuk

mendapatkan solusi dari masalah ini. Salah

satunya adalah teknik procedural programming.

Teknik ini akan memberi sekumpulan instruksi

untuk komputer berupa langkah-langkah, dan

perintahnya bersifat linear untuk menyelesaikan

sebuah masalah dengan menggunakan loop dan

percabangan.

Teknik lain yang digunakan dalam

pemrograman komputer adalah logic

programming yang bersifat deklaratif, teknik ini

akan mengubah masalah menjadi sekumpulan

fakta dan aturan. Dengan melakukan

pendekatan secara logika, sebuah model

penyelesaian akan menyelesaikan slither link

mirip dengan logika manusia. Metode ini akan

memberikan cara yang lebih efisien dalam

menemukan solusi dari slither link, salah

satunya adalah dengan menggunakan answer set

programming.

Tujuan Penelitian

Tujuan dari penelitian ini adalah untuk

membuat model penyelesaian game slither link

menggunakan answer set programming dengan

tool DLV (datalog with disjunction) dan

procedural programming menggunakan C++

kemudian membandingkan kinerja dari kedua

metode tersebut.

Ruang Lingkup Penelitian

Ruang lingkup permasalahan pada tugas ini

adalah :

1 Membuat model penyelesaian game slither

link. dengan menggunakan answer set

programming dan procedural

programming.

2 Ukuran pembanding adalah rata-rata waktu

eksekusi dari setiap model solver.

3 Software yang digunakan adalah PHP

sebagai front end dan DLV serta C++

sebagai back end.

Manfaat Penelitian

Penelitian ini diharapkan dapat

menunjukkan bahwa answer set programming

bisa menyelesaikan masalah game slither link

NP-Complete sebagaimana procedural

programming melakukannya.

TINJAUAN PUSTAKA

NP-Complete

Setiap masalah bisa diselesaikan dengan

berbagai jenis algoritme, tapi algoritme yang

disebut efisien adalah algoritme yang bisa

menyelesaikan masalah dalam waktu

polinomial untuk semua input. Algoritme yang

disebut tidak efisien adalah algoritme yang

menyelesaikan masalah dalam waktu

eksponensial untuk beberapa input. Ada tiga

kelas masalah yaitu P, NP, dan NPC.

Kelas P (polinomial) berisi masalah-

masalah yang bisa dalam waktu polinomial,

sebuah fungsi f(n) dikatakan P jika f(n) = O(nk)

dengan k bernilai konstan dan n adalah ukuran

dari input. Contoh masalah yang bisa

diselesaikan dengan waktu polinomial adalah

masalah sorting, dari semua algoritme sorting

kompleksitas terbaiknya untuk kasus worst case

adalah O(n2) dan O(n log n) untuk kasus best

case (Cormen et al. 2001).

Kelas NP (non deterministic polynomial)

berisi masalah-masalah yang bisa diverifikasi

dalam waktu polinomial. Maksud dari kalimat

tersebut adalah jika kita mempunyai kandidat

solusi dari masalah NP, maka kita bisa

melakukan verifikasi apakah solusi tersebut

benar dalam waktu polinomial. Setiap masalah

dalam P adalah NP, karena untuk setiap

masalah dalam P bisa kita selesaikan dalam

waktu polinomial tanpa memerlukan kandidat

solusi. Contoh masalah yang masuk dalam kelas

NP adalah TSP (travelling salesman problem)

(Cormen et al. 2001).

2

Kelas NPC atau NP-Complete (non

deterministic polynomial complete) adalah

persoalan NP yang paling sulit. Sebuah masalah

X dikatakan NP-Complete jika :

1 X termasuk ke dalam kelas NP.

2 Setiap persoalan di dalam NP dapat

ditransformasi dalam waktu polinomial

menjadi X.

Jika sebuah masalah X hanya memenuhi

kondisi nomor dua, maka masalah tersebut

dikatakan NP-hard. Jika salah satu masalah NP-

Complete bisa diselesaikan dengan waktu

polinomial, maka semua masalah NP-Complete

bisa diselesaikan dalam waktu polinomial.

Beberapa masalah NP-Complete yang terkenal

adalah Hamiltonian Cycle Problem dan Subset

Sum. Masalah NP-Complete pertama yang

berhasil dipecahkan adalah SATISFIABILITY

(SAT) oleh Stephen Cook yang disebut teorema

Cook (Garey et al 1979).

Semua persoalan P (polinomial) juga adalah

NP (non deterministic poyinomial), P adalah

himpunan bagian dari NP. Namun belum ada

yang bisa membuktikan apakah masalah

P ≠ NP atau P = NP sehingga P ∩ NPC = ∅ .

Gambar 1 adalah ilustrasi hubungan antara P,

NPC, dan NP.

Gambar 1 Hubungan antara P, NP, dan NPC

(Cormen et al 2001).

Logic Programming

Logic (declarative) programming muncul

sebagai paradigma berbeda pada tahun 1970-an,

karena logic programming mengharuskan

programmer untuk mendeklarasikan tujuan

(goal) dari komputasi. Goal diekspresikan

sebagai kumpulan dari aturan tentang hasil dan

constraint (pembatas) dari komputasi. Logic

programming disebut juga sebagai rule-based

programming (Tucker et al 2002).

Secara umum, logic programming

merepresentasikan masalah dalam bentuk aturan

dan fakta. Sebuah aturan ditulis sebagai :

h ← p1, p2, ..., pn.

Sebagai contoh, misalnya kita mendapatkan

fakta bahwa Allen dan Mary berbicara bahasa

Rusia, Bob berbicara bahasa Inggris. Sedangkan

aturannya adalah seseorang bisa berbicara

dengan orang lain yang bernilai benar ketika

mereka berbicara dalam bahasa yang sama.

Maka kita bisa menulisnya sebagai fakta dan

aturan berikut:

speaks(allen,russian).

speaks(bob,english).

speaks(mary,russian).

talkswith(P1, P2) :- speaks(P1,L),

speaks(P2,L), P1\=P2.

Contoh eksekusi program :

?- speaks(alen,russian).

true.

?- talkswith(X,allen).

returns X = mary.

Answer set programming

Answer set programming (ASP) adalah

sebuah bentuk pemrograman berorientasi

deklaratif untuk menyelesaikan masalah

pencarian solusi yang sulit terutama masalah

dengan kompleksitas tinggi (diatas ∑2𝑃) Answer

Set Programming adalah pengembangan dari

Logic Programming dan telah diaplikasikan di

banyak bidang ilmu pengetahuan.

Answer set semantics adalah salah satu

formalisme yang paling populer dan semantik

yang paling umum diterima dalam

pemrograman logika, semantik ini

mendefinisikan stable model yang

memperbolehkan negasi dan disjungsi dalam

aturan. Kelebihan ASP dibandingkan

pemrograman berbasis Prolog adalah semantik

yang jelas menjamin program bisa berhenti.

Pemrograman berbasis Prolog tidak murni

deklaratif karena semantik yang disediakan oleh

Prolog masih bergantung pada aspek prosedural

dari program, seperti urutan dari bagian body

pada aturan.

Penyempurnaan lain yang ditawarkan ASP

adalah semantik yang jelas untuk menangani

program tidak stratified yang tidak bisa

dilakukan oleh Prolog. Misalnya kita

mempunyai pernyataan : “jika seseorang bisa

diasumsikan bukan laki-laki maka orang

tersebut pasti seorang wanita”, dalam ASP

pernyataan tersebut ditulis sebagai berikut :

female(X) ← person(X), not male(X). male(X) ← person(X), not female(X).

Untuk setiap fakta dari person(a), answer set

semantics menghitung satu himpunan jawaban

(answer set) yang berisi female(a) dan satu

3

himpunan jawaban berisi male(a). Fitur

penting lain dari ASP adalah kemampuannya

untuk menggunakan ekspresi disjungsi (“V”)

pada head dari aturan. ASP menjadi sangat

deklaratif untuk berbagai masalah. Sebagai

contoh, program sebelumnya bisa ditulis

menggunakan satu aturan seperti berikut :

female(X) V male(X) ← person(X).

Penggunaan disjungsi pada head akan

meningkatkan kekuatan ekspresif dari ASP .

Syntax ASP

Pada Answer Set Programming terdefinisi

penggunaan tiga buah simbol yaitu, predikat

(p), konstanta (k), dan variabel (ν). Predikat

adalah simbol yang diawali dengan huruf kecil

sedangkan variabel adalah simbol yang diawali

dengan huruf besar. Sebuah simbol konstanta

bisa bernilai numerik. Sebuah term bisa berupa

konstanta atau variabel. Dalam sebuah simbol

predikat p, sebuah atom didefinisikan sebagai

𝑝 𝑡1, … , 𝑡𝑘 dimana untuk setiap 𝑡𝑖 , 1 ≤ 𝑖 ≤ 𝑘

adalah sebuah term yang bisa berupa konstanta

atau variabel, k disebut aritas dari p. Atom

dengan aritas () disebut atom proporsional.

Sebuah classical literal l bisa berupa sebuah

atom p (positif), atau sebuah negasi atom ¬p

(negatif).

Dua tipe negasi dalam ASP yaitu, default

negation dengan bentuk “not b” yang berarti

tidak ada bukti yang menunjukkan bahwa b

berniali benar maupun b bernilai salah. Explicit

negation dengan bentuk “¬b” yang berarti kita

mempunyai bukti bahwa b bernilai salah.

Sebuah rule (r) dalam ASP mempunyai

bentuk :

𝑎1 ∨ … ∨ 𝑎𝑘 ← 𝑏1, … , 𝑏𝑚 , 𝑛𝑜𝑡 𝑐𝑚+1, … , 𝑛𝑜𝑡 𝑐𝑛

Himpunan dari 𝑎1 ∨ … ∨ 𝑎𝑘 adalah head dari aturan r, dinotasikan dengan

𝐻(𝑟), sedangkan himpunan dari 𝑏1, … , 𝑏𝑚, 𝑛𝑜𝑡 𝑐𝑚+1, … , 𝑛𝑜𝑡 𝑐𝑛 adalah body

dari r dan dinotasikan dengan 𝐵 𝑟 . Ada dua

tipe body yaitu positive body literal yang

dinotasikan sebagai 𝐵+ 𝑟 dimana

𝐵+ 𝑟 = 𝑏1 , … , 𝑏𝑚 , dan negative body literal

𝐵− 𝑟 dimana 𝐵− 𝑟 = 𝑛𝑜𝑡 𝑐𝑚+1 , … , 𝑛𝑜𝑡 𝑐𝑛 sehingga 𝐵 𝑟 = 𝐵+ 𝑟 ∪ 𝐵− 𝑟 .

Sebuah rule r tanpa head 𝑘 = 0 disebut

sebagai hard constraint, sebuah rule dengan

tepat satu head 𝑘 = 1 disebut sebagai normal

rule, sedangkan sebuah rule dengan k > 1

disebut sebagai disjunctive rule. Jika body dari

rule kosong 𝑘 = 𝑚 = 0 maka rule tersebut

disebut sebagai fact atau dengan kata lain kita

tidak menggunakan tanda “←”. Sebuah rule

dikatakan positif jika n = m atau dengan kata

lain dalam bahasa matematika ∀ 𝑟 ∈ 𝑃 ∶ 𝐵− 𝑟 = ∅ , dan disebut juga sebagai horn

rule.

Answer Set Semantics

Semantics dari program P adalah program

yang bebas dari variabel, maka kita harus

mendefinisikan ground instantiation dari

program yang akan mensubstitusi semua

variabel dari program dengan konstanta.

Herbrand Universe dari P (Program) atau

kita sebut 𝐻𝑈𝑝 , adalah himpunan semua simbol

yang dibentuk dari konstanta dalam P.

Herbrand Literal Base berarti untuk setiap

program P, 𝐻𝐵𝑝 adalah himpunan dari semua

ground (classical) literal yang dibangun dari

simbol predikat yang muncul pada P dan

konstanta dari 𝐻𝑈𝑝 .

Ground Instantiation berarti untuk setiap

rule r, Ground(r) menotasikan himpunan rule

yang didapatkan dengan mengganti setiap

variabel yang muncul di r dengan simbol

konstanta dalam 𝐻𝑈𝑝 . Dinotasikan dengan

Ground(P) yaitu himpunan dari semua ground

instances dari rule pada P.

Semantics dari program P didefinisikan

dengan mencari positive ground program.

Sebuah interpretasi I adalah subset dari 𝐻𝐵𝑝 .

Sebuah himpunan dari literals S memenuhi

sebuah rule r jika dan hanya jika 𝐻 𝑟 𝑆 ≠∅ kapanpun 𝐵+ 𝑟 ⊆ 𝑆 dan 𝐵− 𝑟 ∩ 𝑆 = ∅ .

Himpunan dari literal S memenuhi sebuah

program P jika memenuhi seluruh rule pada P.

Sebuah model dari program P adalah sebuah

interpretasi 𝐼 ⊆ 𝐻𝐵𝑝 dimana I harus memenuhi

P. Sebuah answer set dari ground program yang

positif adalah model minimal dari P.

Hasil reduksi atau Gelfond-Lifschitz

transform (GL-transform) adalah program

ground positive yang didapatkan dari

Ground(P) dengan cara :

1 Menghapus semua rule r ∈ Ground(P) sehingga 𝐵− 𝑟 ∩ 𝐼 ≠ ∅.

2 Menghapus literal body negatif dari rule

yang tersisa.

Sebuah answer set dari sebuah program P

adalah sebuah interpretasi 𝐼 ⊆ 𝐻𝐵𝑝 sehingga I

adalah answer set dari P. Program P dikatakan

konsisten jika memiliki minimal satu buah

answer set (ANS(P) ≠ ∅). Sebuah ground

classical literal a dikatakan bravely true jika

4

ada minimal satu answer set A ∈ ANS(P), dimana 𝑎 ∈ 𝐴 . Sedangkan sebuah ground

classical literal a dikatakan cautiously true jika

setiap answer set A ∈ ANS(P), dimana 𝑎 ∈ 𝐴. Jika terjadi kasus spesial dimana program P

definite-horn, dalam kasus ini P memiliki tepat

satu answer set dan dinotasikan dengan Tp atau

immediate consequence (Gelfond et al 1991).

Berdasarkan answer set semantics , maka

terdefinisi reasoning task sebagai berikut :

1 Answer set existence, buktikan program P

memiliki paling sedikit satu buah answer set

(selain itu maka program dikatakan tidak

konsisten).

2 Brave reasoning, diberikan program P dan

sebuah atom a maka buktikan apakah a

benar pada minimal satu answer set P.

3 Cautious reasoning, diberikan program P

dan sebuah atom a maka buktikan apakah a

benar dalam semua answer set P.

4 Generate all answer sets, diberikan program

P maka hitung semua answer sets A ∈ ANS(P).

DLV (datalog with disjunction)

Untuk melakukan implementasi answer set

programming para peneliti membuat ASP

solver untuk mengevaluasi dan menampilkan

answer set, beberapa ASP solver yang terkenal

adalah DLV, clasp/claspD, SMODELS, dan

ASSAT. ASP solver yang digunakan untuk

menyelesaikan masalah slither link adalah DLV

(datalog with disjunction). DLV dikembangkan

oleh University of Calabria dan Vienna

Technical University. DLV adalah alat untuk

mengkomputasi answer set yang

mengimplemtasikan pemrograman logika

disjungsi dengan menggunakan semantik

answer set (Gelfond et al 1991).

Disjunctive datalog memperbolehkan

ekspresi logika OR (disjungsi) muncul didalam

aturan. Kelebihan dari DLV adalah

komputasinya sound and complete, sound

adalah solusi yang dihasikan merupakan

jawaban dari masalah dan complete adalah

semua solusi harus muncul. Struktur dari DLV

adalah :

Rule :

𝑎1 ∨ …∨ 𝑎𝑛 ∶ − 𝑏1 , … , 𝑏𝑘 , 𝑛𝑜𝑡 𝑏𝑘+1 , … , 𝑛𝑜𝑡 𝑏𝑚 .

Constraint :

: − 𝑏1, … , 𝑏𝑘 , 𝑛𝑜𝑡 𝑏𝑘+1, … , 𝑛𝑜𝑡 𝑏𝑚 .

Program :

Sebuah himpunan terbatas P yang terdiri

atas rules dan constraints.

Dengan mengikuti paradigma

Guess/Check/Optimize (GCO) masalah dengan

kompleksitas tinggi bisa diselesaikan. GCO

untuk program P akan terdiri atas tiga bagian

berikut :

1 Bagian Guessing.

Bagian guessing akan mendefinisikan

search space (ruang pencarian) yang

merepresentasikan kandidat solusi. Pada

bagian ini kita berusaha menebak semua

solusi yang mungkin muncul.

2 Bagian Checking.

Bagian ini bersifat opsional yang akan

memfilter kandidat solusi sedemikian rupa

sehingga answer sets dari P akan

merepresentasikan solusi yang bisa diterima

untuk instance masalah. Pada bagian ini kita

menuliskan constraint agar solusi yang

muncul hanya solusi yang diinginkan.

3 Bagian optimization.

Bagian ini memungkinkan untuk

mengekspresikan evaluasi bobot kuantitatif

dari solusi dengan menggunakan weak

constraint.

Misalnya kita akan memodelkan bahwa

setiap kali seseorang memberitahu kita sebuah

lelucon, maka kita tertawa. Hal ini bisa

dilakukan dengan cara berikut :

joke.

laugh :- joke.

Baris pertama adalah fakta dan

mengekspresikan bahwa joke adalah benar.

Baris kedua adalah aturan, ini dibaca sebagai

“ jika lelucon adalah benar, maka tertawa juga

harus benar”. (tanda “:-“ berarti sebuah panah

ke kiri, pemrograman logika mengartikannya

sebagai implikasi).

Salah satu masalah NP-Complete yang

terkenal adalah Graph 3-Colorability (Garey et

al 1979). Diberikan (undirected) graf G

={V,E}, putuskan bagaimana memberi warna

pada setiap node dalam graf dengan salah satu

dari tiga warna yang didefinisikan dimana tidak

boleh ada dua node yang bertetangga

mempunyai warna yang sama. Kasus graph

coloring dengan tujuh node dan 3 warna

ditunjukkan pada Gambar 2 :

5

Minnesota Iowa

Illinois

Michigan

Wisconsin indiana

Ohio

Gambar 2 Graf tujuh kota.

% aturan pewarnaan (guess)

col(Country, red) v col(Country,green) v

col(Country, blue) :- node(Country).

% periksa warna yg incident(check)

:- arc(Country1, Country2),

col(Country1, CommonColor),

col(Country2, CommonColor).

DLV akan menghasilkan enam solusi, dan

semua solusi memenuhi ketentuan graph

coloring (graf tiga warna). Berikut adalah salah

satu solusi yang dihasilkan :

{col(minnesota,green),

col(wisconsin,red), col(illinois,green),

col(iowa,blue), col(indiana,red),

col(michigan,blue), col(ohio,green) }

Slither link

Slither link ditemukan tahun 1989 oleh

perusahaan puzzle jepang Nikoli, slither link

juga dikenal sebagai Fences and Loop the Loop

dan Dotty Dilemma. Slither link dimainkan

dalam grid empat persegi panjang dengan

beberapa nomor terisi didalam grid (tidak

semua terisi). Masalah slither link telah terbukti

NP-Complete (Yato 2003) sehingga bisa

ditangani oleh answer set programming.

Tingkat kesulitan dari slither link

didefinisikan berdasarkan luas persegi atau

papan permainannya dan angka yang terisi di

dalam grid. Aturan dari slither link adalah

sebagai berikut :

1 Setiap masalah di representasikan dalam

grid empat persegi panjang. Panjang dari

persegi tersebut menunjukkan ukuran dari

masalah.

2 Sebuah 1 x1 persegi dikelilingi oleh empat

titik yang disebut cell. Sebuah cell bisa

mempunyai nomor antara null, 0, 1, 2, atau

3.

3 Tujuan dari permainan adalah membuat loop

yang tidak memotong atau bercabang

dengan menghubungkan titik-titik yang

bertetangga dengan garis, sehingga sebuah

nomor dalam cell nilainya sama dengan

jumlah garis yang mengelilingi cell tersebut.

Nomor didalam cell slither link yang belum

terselesaikan dipilih sedemikian sehingga

mempunyai solusi yang unik, Gambar 3 adalah

contoh masalah slither link dan

penyelesaiannya :

Gambar 3 Masalah slither link dan solusinya

(Yato 2003).

METODOLOGI

Formulasi aturan pembangkitan slither link

Aturan-aturan yang berlaku dalam

pembangkitan slither link dikumpulkan. Aturan-

aturan tersebut diformulasikan ke dalam bahasa

logika answer set programming. Untuk

pembangkitan slither link secara acak langkah-

langkah yang harus dilakukan adalah (Wan

2009) :

1 Mengisi grid dengan sembarang loop.

2 Secara acak hapus nomor di dalam cell satu

per satu.

3 Periksa apakah slither link masih bisa

menghasilkan solusi yang unik.

4 Hapus semua edge.

5 Tampilkan hasil pada pengguna.

Slither link yang dibangkitkan harus secara

acak. Ketika menghapus nomor di dalam cell,

algoritme pembangkitan harus memastikan

bahwa slither link yang dihasilkan bisa

diselesaikan menggunakan aturan logika. Proses

ini dikerjakan oleh modul back end dan

ditunjukkan pada Gambar 4.

Gambar 4 Formulasi pembangkitan.

6

Slither link yang ingin dibangkitkan adalah

slither link yang berada di tengah pada grafik

perbandingan antara tingkat kesulitan puzzle

dan jumlah constraint pada puzzle seperti

ditunjukkan pada Gambar 5 berikut :

Gambar 5 Grafik tingkat kesulitan puzzle

berbanding dengan constraint

puzzle.

Gambar 5 bermakna bahwa slither link yang

optimal adalah yang memiliki jumlah constraint

yang tidak terlalu sedikit dan tidak terlalu

banyak sehingga solusi yang dihasilkan unik

dan sulit ditemukan, tetapi jika constraint

sedikit maka solusi dari slither link

kemungkinan banyak, dan sebaliknya jika

constraint terlalu banyak maka kemungkinan

slither link tidak mempunyai solusi. Untuk

mendapatkan slither link dengan jumlah

constraint yang tepat sangat sulit.

Formulasi aturan penyelesaian

Solusi yang dihasilkan akan dimodelkan

sebagai graf yang mempunyai loop di dalam

grid yang memenuhi aturan slither link. Maksud

dari pernyataan tersebut adalah graf yang

dihasilkan adalah solusi dari slither link dimana

dalam setiap cell yang terdapat angka di

dalamnya maka jumlah edge yang mengelilingi

cell tersebut harus sesuai dengan angka di

dalam cell tersebut. Dengan paradigma Guess

and Check maka :

1 Guess

Akan ditebak semua kemungkinan graf

(kandidat solusi) yang akan muncul dalam

slither link, semua graf yang muncul adalah

graf yang mempunyai loop atau cycle.

2 Check

Kandidat solusi yang dibangkitkan oleh

prosedur guess diperiksa kembali dengan

constraint yang ditentukan sehingga

didapatkan solusi yang memenuhi aturan

slither link.

Gambar 6 Formulasi Penyelesaian.

Cara termudah untuk menyelesaikan slither

link adalah mengeliminasi garis dimana garis

tersebut tidak seharusnya berada, cara ini

dilakukan dengan memberikan nilai 0 untuk

garis tersebut. Misalnya sebuah cell dengan

nilai 0 tidak boleh mempunyai garis di

sekelilingnya, maka semua garis yang

mengelilingi cell tersebut harus dieliminasi.

Petunjuk-petunjuk tersebut direpresentasikan

dalam bentuk rule, dan berikut adalah petunjuk

atau teknik untuk membantu menyelesaikan

masalah slither link :

1 Tidak boleh ada garis di sekeliling cell

dengan nilai 0. Perhatikan angka 0 pada

contoh berikut, angka 0 berarti sebuah cell

tidak boleh dikelilingi oleh garis maka

berikan tanda X pada keempat sisinya untuk

menandakan bahwa tidak boleh ada garis

pada posisi tersebut.

Gambar 7 Cell dengan nilai 0 (Conceptis

puzzle 1997).

2 Cell dengan nilai 0 dan 3 yang bertetangga.

Contoh berikut menggambarkan cell dengan

angka 3 yang berada di bawah cell dengan

angka 0. Garis diatas cell yang bernilai 3

diberi tanda X maka hanya ada satu cara

untuk menyelesaikan garis di sekeliling cell

dengan nilai 3 yaitu pada kiri, bawah, dan

kanan cell tersebut.

Tin

gkat

ke

sulit

an

pu

zzle

Constraint puzzle

7

Gambar 8 Cell bernilai 0 dan 3 yang

bertetangga (Conceptis puzzle

1997).

3 Cell dengan nilai 0 dan 3 dengan posisi

diagonal. Pada Gambar 9 bagian kiri

diilustrasikan dua buah skenario jika terjadi

diagonal antara 0 dan 3 dengan garis

keabuan, berdasarkan fakta tersebut maka

gambar di sebelah kanan pada Gambar 9

menggambarkan petunjuk ketika terjadi

skenario ini.

Gambar 9 Cell bernilai 0 dan 3 diagonal

(Conceptis puzzle 1997).

4 Cell dengan nilai 3 yang bertetangga. Hanya

ada dua solusi yang mungkin untuk skenario

ini dan digambarkan pada Gambar 10 bagian

kiri dengan garis keabuan. Berdasarkan

fakta tersebut maka Gambar 10 bagian

kanan menggambarkan petunjuk yang harus

dilakukan jika skenario ini terjadi.

Gambar 10 Dua cell bernilai 3 yang

bertetangga (Conceptis puzzle

1997).

5 Cell dengan dua nilai 3 yang diagonal. Ada

dua kemungkinan solusi untuk menangani

skenario ini, salah satunya ditunjukkan pada

Gambar 11 bagian kiri. Berdasarkan fakta

tersebut maka ada empat garis yang pasti

ada jika skenario ini terjadi, dan

digambarkan pada Gambar 11 bagian kanan

dengan warna merah. Untuk mencegah

percabangan, berikan tanda X pada empat

sisi lain.

Gambar 11 Dua cell bernilai 3 dan diagonal

(Conceptis puzzle 1997).

6 Angka apapun pada pojok grid. Cell yang

terletak di pojok grid memiliki karakteristik

khusus untuk angka berapapun yang

dimilikinya. Angka 0 sudah dijelaskan pada

teknik pertama, angka 1 akan mengugurkan

dua sisi pada pojok cell karena tidak

mungkin sebuah garis akan terbentang pada

posisi tersebut, maka berikan tanda X pada

dua sisi tersebut. Angka 2 memiliki dua

solusi yang mungkin tetapi kedua solusi

tersebut pasti memiliki awal garis yang sama

dan digambarkan pada gambar di kanan.

Angka 3 pada pojok grid memiliki dua

solusi yang mungkin, dan garis merah

menggambarkan garis yang pasti terbentang

untuk angka 3 pada pojok grid.

Gambar 12 Angka apapun pada pojok cell

(Conceptis puzzle 1997).

Pembangunan front end

Modul front end akan dibangun

menggunakan PHP dan JavaScript yang

berfungsi sebagai GUI (graphical user

interface) dan memperlihatkan slither link yang

dibangkitkan serta solusinya.

8

Arsitektur sistem

Backend

Backend

Identifikasi aturan-

aturan

pembangkitan

slither link

Pembangkitan

slither link

Identifikasi aturan-

aturan

penyelesaian

slither link

Penyelesaian

Slither link

Front End

GUI

Parser

Gambar 13 Arsitektur sistem.

Arsitektur sistem ini terdiri atas tiga bagian

yaitu, modul back end, modul front end, dan

modul parser. Pada bagian back end akan di

kerjakan oleh DLV dan C++, bagian ini adalah

bagian utama yang menangani pembangkitan

dan penyelesaian slither link dengan answer set

programming maupun dengan procedural

programming. Kemudian bagian parser adalah

bagian penghubung yang bertugas sebagai

modul penerjemah. Gambar 14 menggambarkan

sebuah diagram alur tentang bagaimana sebuah

solver slither link bekerja menghasilkan solusi.

Gambar 14 Diagram alur proses solver slither

link.

HASIL DAN PEMBAHASAN

Masalah slitherlink diselesaikan dengan

metodologi pemrograman deklaratif dengan

terlebih dahulu mendeskripsikan masalah,

kemudian melakukan proses encoding kondisi

solusi yang diinginkan ke dalam bahasa logika

DLV menggunakan paradigma GCO (guess /

check / optimize) agar solver bisa

menyelesaikannya. Sebagai perbandingan

dibuat juga model penyelesaian slither link

dengan menggunakan procedural programming

dengan software C++, kedua metode ini akan

dibandingkan rata-rata waktu eksekusinya.

Domain masalah dalam DLV

Solusi untuk masalah slither link adalah

membuat loop sedemikian sehingga loop yang

dihasilkan memenuhi kondisi nilai yang

terdapat pada cell dalam grid, arti kata

memenuhi adalah garis jumlah garis yang

mengelilingi cell harus memiliki jumlah yang

sama dengan angka yang terdapat di dalam cell.

Sebuah cell dalam slither link

direpresentasikan dengan predikat C(X,Y,N)

yang memiliki tiga argumen yaitu, X dan Y

yang berarti koordinat cell dalam grid (X

koordinat vertikal dan Y koordinat horizontal)

, dan N yang berarti angka yang terdapat di

dalam cell. N bisa bernilai 0, 1, 2, 3, atau null.

Himpunan dari predikat C disebut sebagai fakta

atau deskripsi dari masalah slither link yang

akan diselesaikan, seperti pernyataan berikut

mengilustrasikan fakta untuk slither link

dengan ukuran 3x3.

C(1,1,null).

C(1,2,null).

C(1,3,2).

C(2,1,1).

C(2,2,0).

C(2,3,3).

C(3,1,2).

C(3,2,null).

C(3,3,null).

Fakta tersebut adalah representasi dari Gambar

15:

Gambar 15 Representasi dari fakta slither link.

Predikat arc(X,Y,A,B,C,D) memiliki

enam argumen didalamnya yang

merepresentasikan posisi cell dan status garis-

garis di sekeliling cell, dimana X dan Y

merepresentasikan posisi cell (X koordinat

vertikal dan Y koordinat horizontal), sedangkan

A, B, C, dan D merepresentasikan nilai atau

status dari garis di sekeliling cell. Jika bernilai 0

maka tidak ada garis terbentang pada posisi

9

tersebut, dan jika bernilai 1 maka ada garis

terbentang di posisi tersebut. A berposisi di atas

cell, B berposisi di sebelah kanan cell , C

berposisi di bagian bawah cell, dan D berposisi

di sebelah kiri cell seperti ditunjukkan pada

Gambar 16.

Gambar 16 Representasi status garis di

sekeliling cell arc(X,Y,0,0,0,1).

Encoding dengan DLV

Sebelumnya pada bagian metodologi telah

dijelaskan mengenai beberapa teknik atau

petunjuk cara menyelesaikan slither link, teknik

itulah yang akan diterjemahkan ke bahasa

logika secara deklaratif menggunakan

paradigma GC (guess, check).

Langkah pertama yang dilakukan adalah

mendefinisikan ruang pencarian yaitu bagian

guess pada program, pada bagian ini terdapat

empat aturan disjungsi yang mendefinisikan

ruang pencarian dari masalah yaitu cell dengan

nilai 0, 1, 2, 3, dan null dijelaskan pada

Lampiran 1. Misalnya untuk cell dengan nilai 1

maka cell tersebut mempunyai empat

kemungkinan solusi untuk dibangkitkan. Kode

program berikut menggambarkan bagaimana

sebuah cell bernilai 1 dibangkitkan

kemungkinan solusinya.

arc(X,Y,1,0,0,0) v arc(X,Y,0,1,0,0) v

arc(X,Y,0,0,1,0) v arc(X,Y,0,0,0,1) :-

C(X,Y,1).

Berikut adalah representasi bentuk cell dari

solusi yang telah dibangkitkan :

1 arc(X,Y,1,0,0,0)

Gambar 17 Cell dengan predikat arc(X,Y,1,0,0,0).

2 arc(X,Y,0,1,0,0)

Gambar 18 Cell dengan predikat arc(X,Y,1,0,0,0).

3 arc(X,Y,0,0,1,0)

Gambar 19 Cell dengan predikat arc(X,Y,0,0,1,0).

4 arc(X,Y,0,0,0,1)

Gambar 20 Cell dengan predikat arc(X,Y,0,0,0,1).

Kemudian langkah selanjutnya adalah

mendefinisikan constraint atau aturan yang

akan menghapus calon answer set yang tidak

memenuhi syarat, bagian ini masuk ke dalam

metode check. Constraint dari program adalah :

1 Cell dengan nilai 0 (lihat Lampiran 2).

Sebuah cell dengan nilai 0 tidak boleh

memiliki garis yang mengelilinginya, dan

hal tersebut berakibat juga pada cell

disebelah kiri atau kanan maupun pada atas

dan bawah cell dengan nilai 0 tersebut.

Dengan bahasa logika aturan ini

diterjemahkan menjadi :

:- arc(X,Y,0,0,0,0),

arc(A,Y,_,_,1,_), X=A+1.

Answer set yang tidak akan tereliminasi

adalah sebagai berikut :

Gambar 21 Cell dengan nilai 0.

2 Cell dengan nilai 1 (lihat Lampiran 2).

Sebuah cell dengan nilai 1 akan

mempengaruhi jumlah garis yang

mengelilingi tetangganya karena hanya

boleh ada satu sisi yang bernilai 1. Misalnya

cell yang bernilai 1 mempunyai garis pada

posisi B maka tetangganya di sebelah kanan

harus memiliki nilai 1 juga tetapi pada garis

10

di posisi D selain itu maka hapus kandidat

tersebut. Aturan ini diterjemahkan menjadi :

:- arc(X,Y,0,1,0,0),

arc(X,B,_,_,_,0), B=Y+1.

Tanda “_” adalah anonymous variable yang

bermakna bahwa argumen ini bisa

dihiraukan atau berapapun nilainya tidak

mempengaruhi rule. Answer set yang tidak

akan tereliminasi adalah sebagai berikut :

Gambar 22 Cell dengan nilai 1.

3 Cell dengan nilai 2 (lihat Lampiran 2).

Serupa dengan aturan sebelumnya dimana

aturan ini akan mempengaruhi jumlah garis

yang mengelilingi tetangganya, karena nilai

dari cell ini adalah 2 maka ada dua garis

yang harus bernilai 1 dan dua garis lainnya

bernilai 0, begitu juga pada dua buah cell

tetangga dari cell ini. Misalnya cell yang

bernilai 2 memiliki garis pada posisi A dan B

maka tetangga yang berada di atas harus

memiliki nilai 1 pada sisi di posisi C dan

tetangga di sebelah kanan harus memiliki

nilai 1 pada sisi di posisi D, jika menyalahi

aturan ini maka eliminasi answer set

tersebut. Aturan ini diterjemahkan menjadi .

:- arc(X,Y,1,1,0,0),

arc(X,B,_,_,_,0), B=Y+1.

:- arc(X,Y,1,1,0,0),

arc(A,Y,_,_,0,_), X=A+1.

Constraint pertama merepresentasikan cell

di sebelah kanan cell yang bernilai 2, dan

constraint kedua merepresentasikan cell di

atas cell bernilai 2. Answer set yang tidak

akan tereliminasi adalah sebagai berikut :

Gambar 23 Cell dengan nilai 2.

4 Cell dengan nilai 3 (lihat Lampiran 2). Cell

dengan tipe seperti ini adalah kebalikan dari

cell dengan nilai 1, jika pada cell dengan

nilai 1 memiliki tiga garis dengan nilai 0

maka cell dengan nilai 3 memiliki tiga garis

dengan nilai 1 dan satu garis lainnya bernilai

0. Cell dengan tipe ini mengharuskan tiga

tetangganya memiliki nilai 1 pada sis yang

bertetangga, dan satu tetangganya memiliki

nilai 0 pada sisi yang bertetangga. Misalnya

sebuah cell dengan nilai 3 memiliki garis

pada posisi A, B, dan C maka tetangga yang

berada di atas cell tersebut harus memiliki

nilai 1 pada sisi di posisi C, begitu juga

dengan tetangga yang berada di sebelah

kanan yang harus memiliki nilai 1 pada sisi

di posisi D, dan tetangga yang berada di

bawah harus memiliki nilai 1 pada sisi di

posisi A. Skenario tersebut digambarkan

oleh constraint berikut :

:- arc(X,Y,1,1,1,0),

arc(X,B,_,_,_,0), B=Y+1.

:- arc(X,Y,1,1,1,0),

arc(A,Y,_,_,0,_), X=A+1.

:- arc(X,Y,1,1,1,0),

arc(A,Y,0,_,_,_), A=X+1.

Answer set yang tidak akan tereliminasi

adalah sebagai berikut :

Gambar 24 Cell dengan nilai 3.

5 Mencegah local loop (lihat Lampiran 3).

Untuk mencegah local loop yaitu loop yang

terjadi pada satu buah cell atau dengan kata

lain cell tersebut mempunyai nilai 4 yang

tidak diperbolehkan dalam aturan slither link

maka eliminasi answer set dimana sebuah

cell yang sudah memiliki tiga sisi bernilai 1

dan sisi lainnya bernilai 0 tetapi sisi bernilai

0 tersebut ternyata bernilai 1 pada

tetangganya sehingga mengakibatkan local

loop. Local loop hanya mungkin terjadi pada

cell yang mempunyai tiga sisi yang bernilai

1, untuk mencegah hal ini maka definisikan

constraint berikut :

:- arc(X,Y,1,1,1,0),

arc(X,B,_,1,_,_), Y = B+1.

:- arc(X,Y,0,1,1,1),

arc(A,Y,_,_,1,_), X = A+1.

:- arc(X,Y,1,0,1,1),

arc(X,B,_,_,_,1), B = Y+1.

:- arc(X,Y,1,1,0,1),

arc(A,Y,1,_,_,_), A = X+1.

Gambar 25 mengilustrasikan salah satu

answer set yang akan dieliminasi oleh

constraint di atas.

Gambar 25 Local loop pada cell bernilai 3.

11

6 Constraint pada cell dengan posisi X = 1 dan

Y =1 (1,1). Constraint ini akan sangat

membantu menyelesaikan slither link,

karena kesalahan menempatkan garis pada

cell di posisi ini akan mengakibatkan jalan

buntu pada solusi dan akan langsung terlihat

tanpa perlu menunggu cell lain terbuka

garisnya (lihat Lampiran 4). Sebagai contoh

jika cell memiliki nilai 1 maka kandidat

solusi yang akan gugur adalah jika cell

tersebut memiliki sisi yang bernilai 1 pada

posisi A atau D karena hal tersebut akan

mengakibatkan jalan buntu atau garis

berhenti pada posisi itu, untuk mencegah hal

ini maka didefinisikan constraint berikut :

:- arc(1,1,1,0,0,0).

:- arc(1,1,0,0,0,1).

Constraint tersebut akan mengeliminasi

calon answer set berikut :

Gambar 26 Constraint pada posisi pojok kiri

atas.

7 Constraint pada cell dengan posisi (1,

#maxint), #maxint adalah ukuran dari

slither link sehingga cell tersebut terletak

pada pojok kanan atas (lihat Lampiran 4).

Sebagai ilustrasi jika cell pada posisi ini

memiliki nilai 1, maka kandidat solusi yang

akan gugur adalah jika cell tersebut

memiliki sisi di posisi A atau B yang bernilai

1. Hal tersebut akan mengakibatkan

terjadinya jalan buntu, atau garis tidak bisa

menyambung dengan garis selanjutnya. Hal

tersebut dicegah oleh constraint berikut :

:- arc(1,#maxint,1,0,0,0).

:- arc(1,#maxint,0,1,0,0).

Constraint tersebut akan mengeliminasi

calon answer set berikut :

Gambar 27 Constraint pada posisi pojok

kanan atas

8 Constraint pada cell dengan posisi

(#maxint ,1), #maxint adalah ukuran dari

slither link. Cell dengan posisi ini terletak

pada pojok kiri bawah dari grid (lihat

Lampiran 4). Sebagai ilustrasi jika cell ini

mempunyai nilai 1 maka kandidat solusi

yang akan gugur adalah yang mempunyai

sisi bernilai 1 pada posisi D atau C.

Constraint berikut mendefinisikan aturan

tersebut dalam bahasa logika.

:- arc(#maxint,1,0,0,0,1).

:- arc(#maxint,1,0,0,1,0).

Constraint tersebut akan mengeliminasi

calon answer set berikut :

Gambar 28 Constraint pada posisi pojok kiri

bawah.

9 Constraint pada cell dengan posisi

(#maxint, #maxint), #maxint adalah

ukuran dari slither link sehingga cell

tersebut terletak pada pojok kanan bawah

dari grid (lihat Lampiran 4). Sebagai

ilustrasi jika cell pada posisi ini memiliki

nilai 1, maka kandidat solusi yang akan

tereliminasi adalah jika cell tersebut

memiliki sisi yang berposisi di B atau C

yang bernilai 1. Untuk mengeliminasi

kondisi tersebut maka constraint berikut

harus didefinisikan :

:- arc(#maxint,#maxint,0,1,0,0).

:- arc(#maxint,#maxint,0,0,1,0).

Constraint tersebut akan mengeliminasi

calon answer set berikut :

Gambar 29 Constraint pada posisi pojok

kanan bawah.

10 Antisipasi cabang (lihat Lampiran 5).

Cabang akan mengacaukan loop yang

dihasilkan, solusi dari slither link adalah

sebuah loop maka solusi tersebut tidak boleh

mempunyai cabang. Constraint ini akan

mengeliminasi kandidat solusi yang

mengakibatkan cabang, seperti jika sebuah

cell mempunyai nilai 2 dan sisi yang bernilai

1 adalah A dan B maka cell di kanan atas

dari cell tersebut tidak boleh memiliki nilai

1 pada sisi yang berposisi di D atau nilai 1

pada sisi yang berposisi di C. Hal seperti ini

ditangani oleh constraint berikut :

:- arc(X,Y,1,1,_,_),

arc(A,B,_,_,1,_), X=A+1, B=Y+1.

12

:- arc(X,Y,1,1,_,_),

arc(A,B,_,_,_,1), X=A+1, B=Y+1.

Constraint tersebut akan mengeliminasi

calon answer set berikut :

Gambar 30 Antisipasi cabang.

11 Ketersambungan dari garis (lihat Lampiran

5). Himpunan garis penyusun loop tidak

boleh terputus, maka sangat penting untuk

memeriksa apakah antar himpunan garis

penyusun loop merupakan sebuah rangkaian

yang tersambung. Ilustrasi dari skenario ini

adalah jika sebuah cell di sembarang posisi

memiliki nilai 1 pada sisi di posisi A dan

nilai 0 pada posisi D tanpa memperhatikan

nilai dari posisi B dan C, maka ke arah kiri

satu-satunya cara agar garis tersambung

adalah dengan memperhatikan tetangga

sebelah kiri atas apakah cell tersebut

memiliki nilai 1 pada salah satu sisi dari B

atau C. Jika tidak memenuhi kondisi ini

maka eliminasi kandidat solusi tersebut,

skenario tersebut digambarkan dalam

constraint berikut :

:- arc(X,Y,1,_,_,0),

arc(A,B,_,M,N,_), M=N, X=A+1, Y=B+1.

Constraint tersebut akan mengeliminasi

calon answer set berikut :

Gambar 31 Ketersambungan dari garis.

12 Local loop dari cell dengan nilai 3 yang

bersebelahan (lihat Lampiran 3). Jika

terdapat dua buah cell dengan nilai 3 yang

bersebelahan baik di kiri dan kanan maupun

pada atas dan bawah, ada kemungkinan

konfigurasi keduanya membentuk local loop

sehingga menyalahi aturan dari slither link.

Yang dimaksud local loop pada skenario ini

adalah loop yang terjadi antara dua cell yang

memiliki nilai 3 tersebut, salah satu

constraint yang digunakan adalah sebagai

berikut :

:- arc(X,Y,1,1,0,1),

arc(A,Y,0,1,1,1), A=X+1.

Constraint tersebut akan mengeliminasi

calon answer set berikut :

Gambar 32 Local loop dengan 2 cell

bernilai 3.

13 Cell bernilai 2 yang bersebelahan dengan

cell bernilai 0 pada bagian atas, bawah, kiri,

serta kanan dari grid (lihat Lampiran 6).

Terdapat dua tipe kandidat solusi yang akan

gugur jika skenario ini terjadi yaitu cell yang

memiliki nilai 1 pada sisi A dan C serta cell

yang memiliki nilai 1 pada sisi B dan D

karena pada salah satu sisi akan terjadi jalan

buntu atau garis tidak bisa melanjutkan

sehingga loop tidak terjadi. salah satu

constraint yang digunakan adalah sebagai

berikut :

:- arc(#maxint,Y,1,0,1,0),

arc(#maxint,B,0,0,0,0), Y=B+1.

Constraint tersebut akan mengeliminasi

calon answer set berikut :

Gambar 33 Cell bernilai 2 yang bersebelah

dengan 0.

Bagian constraint yang telah dijelaskan

sebelumnya akan mengeliminasi kandidat solusi

yang tidak memenuhi aturan slither link

sehingga answer set yang didapatkan

merupakan solusi yang diharapkan.

Menjalankan model penyelesaian slither link

Fakta dari slither link yang telah

dibangkitkan disimpan dalam file bernama

soal.dat dan program DLV untuk

penyelesaian slither link disimpan dalam file

bernama slither.txt. Pemisahan file antara

fakta dan program disebabkan karena fakta

yang akan selalu berubah seiring dengan slither

link yang dibangkitkan. Berikut akan diberikan

ilustrasi bagaimana sebuah slither link diselesaikan menggunakan program DLV.

Misalnya telah dibangkitkan sebuah slither

link dengan ukuran 3x3 dan memiliki fakta

sebagai berikut :

13

Gambar 34 Slither link hasil pembangkitan.

C(1,1,null).

C(1,2,1).

C(1,3,null).

C(2,1,null).

C(2,2,null).

C(2,3,1).

C(3,1,1).

C(3,2,null).

C(3,3,2).

Kemudian fakta ini akan diproses bersama

dengan model penyelesaian slither link oleh

DLV, sehingga menghasilkan answer set yang

merupakan solusi.

D:\DLV>dlv.mingw.exe -nofacts -silent

soal.dat slither.txt -N=3

{arc(1,2,1,0,0,0), arc(2,3,0,1,0,0),

arc(3,1,0,1,0,0), arc(3,3,0,1,1,0),

arc(1,1

,1,0,1,1), arc(1,3,1,1,0,0),

arc(2,1,1,1,0,0), arc(2,2,0,0,0,1),

arc(3,2,0,0,1,1

)}

Solusi tersebut harus diterjemahkan kembali

menjadi sebuah slither link kembali, maka jika

answer set tersebut diterjemahkan menjadi

sebuah slither link seperti ditunjukkan Gambar

35.

Gambar 35 Solusi slither link.

Implementasi dengan Procedural

Programming

Pada bagian metodologi telah ditunjukkan

bahwa slither link mempunyai petunjuk-

petunjuk yang bisa digunakan untuk

menyelesaikan masalah. Petunjuk-petunjuk ini

yang akan digunakan dalam membuat program

ini. Program penyelesaian slither link

menggunakan C++ ini terdiri atas enam modul

dan satu fungsi.

Struktur data

Fakta tentang ukuran slither link dan nilai–

nilai dalam cell yang dibangkitkan disimpan

dalam file ukuran.dat dan data.dat dengan

format sebagai berikut :

/// ** data.dat **//

𝑁1

𝑁2

......

𝑁𝑘

Dimana 𝑁𝑖 adalah nilai di dalam cell, dan k

adalah jumlah cell dalam grid atau sebanyak

ukuran grid dikuadratkan. Kemudian fakta ini

akan dibaca oleh program sebagai array yang

berukuran k.Kemudian setiap sisi pada grid

diberi nilai default 3 yang berarti statusnya

belum diketahui (lihat Lampiran 7), jika bernilai

0 berarti tidak boleh ada garis pada sisi tersebut

dan jika bernilai 1 maka ada garis pada sisi

tersebut. Representasi posisi garis pada slither

link digambarkan pada Gambar 36 :

Gambar 36 Ilustrasi penomoran sisi pada grid.

Modul pertama bernama basic_rule,

modul ini akan mengaplikasian teknik-teknik

dasar penyelesaian slither link salah satunya

adalah jika terdapat cell dengan angka 0 maka

sisi-sisi yang yang dipengaruhi akan diberi nilai

0 dan beberapa teknik lain seperti telah

dijelaskan sebelumnya pada bagian metodologi.

Pseudo code modul dapat dilihat pada Lampiran

8.

Modul kedua bernama advance_rule,

modul ini akan mencari kemungkinan

terbukanya nilai dari sisi-sisi pada cell di posisi

samping kiri, kanan, atas, dan bawah dengan

melihat tetangganya. Misalnya pada cell

dengan posisi di atas (i ≤ ukuran) dan cell

tersebut bernilai 3 maka dengan melihat cell di

sebelah kirinya diketahui bahwa sisi atas dari

cell tersebut bernilai 0, kemudian program

langsung memberi nilai 1 pada sisi atas dan kiri

di cell yang bernilai 3. Pseudo code modul

dapat dilihat pada Lampiran 9.

Modul ketiga bernama cek_garis_cell,

modul ini akan memberikan nilai 1 atau 0 pada

sisi-sisi cell yang sudah dipastikan bahwa

pemberian nilai tersebut akan membuat jumlah

garis yang mengelilingi cell sesuai dengan nilai

di dalamnya. Pseudo code modul dapat dilihat

pada Lampiran 10.

14

Modul keempat bernama sambung_garis,

modul ini akan menyambungkan sisi dari cell

yang tidak mungkin bercabang lagi, dan tersisa

satu kemungkinan arah menuju garis

selanjutnya. Misalnya pada sisi atas cell ke arah

kanan mempunyai tiga kemungkinan cabang

yaitu ke atas, ke samping, dan ke bawah. Jika

dua dari cabang tersebut bernilai 0 maka bisa

dipastikan garis tersebut mengarah ke cabang

yg tidak bernilai 0. Pseudo code modul dapat

dilihat pada Lampiran 11.

Modul kelima bernama cek_cabang ,

modul ini akan memberi tanda berupa nilai 0

pada sisi yang berpotensi menjadi cabang, dan

mengembalikan status dari setiap sisi pada grid.

modul ini hanya mengubah nilai dari sisi yang

masih bernilai 3 dan berpotensi menjadi cabang.

Pseudo code modul dapat dilihat pada Lampiran

11.

Modul keenam bernama cek_logic, modul

ini akan memeriksa cell yang mempunyai nilai

null dan sudah bisa ditebak kemungkinan

solusinya dengan memeriksa tetangganya. Cell

yang diperiksa hanya yang berada pada posisi

tertentu yang bisa ditebak secara pasti

kemungkinan solusinya. Pseudo code modul

dapat dilihat pada Lampiran 12.

Program ini memiliki satu buah fungsi

dengan nama sambung. Fungsi ini akan

melakukan perjalanan dari sisi yang pertama

kali ditemui dan bernilai 1 dan kembali ke sisi

tersebut sehingga perjalanan tersebut berupa

sebuah loop yang memenuhi aturan slither link

yaitu jumlah garis yang mengelilingi sebuah

cell sesuai dengan nilai di dalam cell.

Perjalanan akan terhenti jika menemui jalan

buntu, kemudian cabang yang menyebabkan

jalan buntu tersebut akan ditandai untuk ditutup

kemudian fungsi akan mencoba cabang baru

(backtracking) sampai solusi ditemukan. Status

dari sisi yang bernilai 1 berguna sebagai

petunjuk, karena jika masih bernilai 3 maka

fungsi akan mendahului garis yang bernilai 1

dan kebalikannya jika sisi tersebut bernilai 0

maka fungsi tidak akan melaluinya. Pseudo

code modul dapat dilihat pada Lampiran 12.

Hasil Pengujian

Pengujian dilakukan dengan

membangkitkan 30 soal slither link secara acak

pada setiap ukuran puzzle, mulai dari ukuran

puzzle 3x3 sampai dengan 20x20 kemudian

dihitung waktu penyelesaian atau waktu

eksekusi sampai dengan sebuah solusi

didapatkan dari kedua metode yaitu answer set

programming (ASP) dan procedural

programming (PP). Waktu yang digunakan

sebagai perbandingan adalah rata-rata waktu

eksekusi dari tiap ukuran, sistem memberi batas

waktu (time out) yaitu 300 detik untuk

menyelesaikan slither link jika sistem

melewatinya maka ditandai. Waktu eksekusi

tersebut dituliskan pada Tabel 1.

Tabel 1. Waktu eksekusi (detik) dari teknik

Answer Set Programming (ASP) dan

procedural programming (PP) dan

waktu pembangkitan (detik).

Ukuran ASP PP

Pem

bangkit

an

Jumlah

Timeout

ASP PP

3 0,21 0,15 0,60

4 0,24 0,16 0,59

5 0,27 0,15 0,80

6 0,33 0,29 0,87

7 0,39 0,26 1,06

8 0,45 1,15 1,34

9 0,54 0,37 1,81

10 0,59 0,43 2,13

11 0,63 0,87 1,88

12 0,70 1,23 2,20

13 0,79 5,25 3,99 1

14 0,93 7,00 4,36

15 1,17 4,64 5,27

16 1,14 12,61 5,59

17 1,38 12,11 6,45 1

18 1,68 5,80 12,69 5

19 1,94 14,09 7,86 3

20 2,06 18,74 11,42 5

Kecepatan waktu eksekusi ASP tidak

mengalami kenaikan yang drastis ketika ukuran

slither link mengalami peningkatan, berbanding

terbalik dengan waktu eksekusi pada metode

procedural programming dimana waktunya

mengalami kenaikan pesat. Jika dibandingkan

hasil keduanya maka waktu eksekusi dengan

menggunakan metode answer set programming

lebih cepat dibandingkan procedural

programming. berikut adalah grafik waktu

pembangkitan dan waktu eksekusi dari kedua

metode.

15

Gambar 37 Grafik perbandingan waktu eksekusi

dan ukuran slither link.

KESIMPULAN DAN SARAN

Kesimpulan

Tujuan utama dari penelitian ini adalah

membuat model penyelesaian slither link

dengan menggunakan paradigma answer set

programming, paradigma ini akan

menyelesaikan slither link seperti cara berpikir

manusia dengan mengkodekan program ke

dalam bahasa logika, berbeda dengan

paradigma procedural programming dimana

programmer menuliskan urutan instruksi untuk

dikerjakan oleh komputer berupa operasi yang

akan dilakukan dan nilai yang akan disimpan

dalam variabel.

Paradigma answer set programming yang

diaplikasikan pada masalah slither link terbukti

efisien dan efektif dalam rata-rata waktu

eksekusi dibandingkan menggunakan

procedural programming dan dalam hal kualitas

kode program yang dihasilkan meskipun

procedural programming mendukung

penggunaan fungsi tetapi karena ukuran kode

program yang besar akan sulit ketika dilakukan

pengembangan atau perubahan sistem. Model

penyelesaian slither link telah sukses

diaplikasikan ke bentuk web based sehingga

berbentuk game interactive dengan

menggunakan antar muka sehingga pengguna

bisa memainkan slither link dan meminta

penyelesaiannya.

Saran

Penelitian selanjutnya diharapkan bisa

menerapkan answer set programming untuk

membangkitkan soal slither link yang dijamin

sulit, karena saat ini pembangkitnya

menggunakan procedural programming yang

tidak dijamin sulit solusinya. Memperbaiki

kinerja dari penyelesaian slither link yang

menggunakan procedural programming dengan

menggunakan teknik lain.

DAFTAR PUSTAKA

Cormen TH, Leiserson CE, Rivest RL, Stein C.

2001. Introduction to Algorithm. England :

McGraw-Hill.

Conceptis Puzzle. 1997. Slither link Technique.

[terhubung berkala].

http://www.conceptispuzzles.com/index.as

px?uri=puzzle/slitherlink/techniques [12

januari 2011].

Eiter T, Gottlob G. 1993. Complexity Results

for Disjunctive Logic Programming and

Application to Nonmonotonic Logics.

Technical University of Vienna.

http://www.kr.tuwien.ac.at/staff/eiter/et-

archive/ilps93.ps.gz .

Garey MR, Johnson DS. 1979. Computers and

Intractability : a guide to the theory of NP-

Completeness. United States of America :

Bell Telephone Laboratories.

Gelfond M, Lifschitz V. 1991. Classsical

Negation in Logic Programs and

Disjunctive Databases. University of

Texas.

http://citeseerx.ist.psu.edu/viewdoc/downl

oad?doi=10.1.1.49.9332&rep=rep1&type=

pdf .

Leone N et al. 2006. The DLV System for

Knowledge Representation and Reasoning.

ACM Trans. Comput. Log.

Lifschitz V. 2008. What is Answer Set

Programming. Department of Computer

Sciences – University of Texas at Austin.

http://userweb.cs.utexas.edu/users/vl/paper

s/wiasp.pdf

Tucker AB, Noonan R. 2002. Programming

Languanges : Principles and Paradigms.

England : McGraw-Hill.

Wan J. 2009. Logical Slither link. Computer

Science and Mathematics – School of

Computer Science.

http://intranet.cs.man.ac.uk/Intranet_subw

eb/library/3yrep/2009/7035254.pdf .

Yato T, Seta T. 2003. Complexity and

Completeness of Finding Solution and its

Application to Puzzles. Department of

Computer Science – The Unversity of

Tokyo. http://www-imai.is.s.u-

tokyo.ac.jp/~yato/data2/SIGAL87-2.pdf .

16

LAMPIRAN

17

Lampiran 1 Program DLV, modul pembangkitan.

1 arc(X,Y,1,0,0,0) v arc(X,Y,0,1,0,0) v arc(X,Y,0,0,1,0) v arc(X,Y,0,0,0,1) :-

C(X,Y,1).

2 arc(X,Y,1,1,0,0) v arc(X,Y,0,1,1,0) v arc(X,Y,0,0,1,1) v arc(X,Y,1,0,0,1) v

arc(X,Y,1,0,1,0) v arc(X,Y,0,1,0,1) :- C(X,Y,2).

3 arc(X,Y,1,1,1,0) v arc(X,Y,0,1,1,1) v arc(X,Y,1,0,1,1) v arc(X,Y,1,1,0,1) :-

C(X,Y,3).

4 arc(X,Y,0,0,0,0) :- C(X,Y,0).

5 arc(X,Y,1,0,0,0) v arc(X,Y,0,1,0,0) v arc(X,Y,0,0,1,0) v arc(X,Y,0,0,0,1) v

arc(X,Y,1,1,0,0) v arc(X,Y,0,1,1,0) v arc(X,Y,0,0,1,1) v arc(X,Y,1,0,0,1) v

arc(X,Y,1,0,1,0) v arc(X,Y,0,1,0,1) v arc(X,Y,1,1,1,0) v arc(X,Y,0,1,1,1) v

arc(X,Y,1,0,1,1) v arc(X,Y,1,1,0,1) v arc(X,Y,0,0,0,0) :- C(X,Y,null).

Modul ini akan membangkitkan kemungkinan solusi dengan melihat angka di dalam cell slither link,

baris pertama akan membangkitkan kandidat solusi untuk cell yang memiliki nilai 1 ditunjukkan oleh

predikat C(X,Y,1), baris kedua akan membangkitkan kandidat solusi untuk cell dengan nilai 2, baris

ketiga untuk cell dengan nilai 3, baris keempat untuk cell dengan nilai 0, dan baris kelima untuk cell

dengan nilai null.

18

Lampiran 2 Program DLV, constraint cell dengan nilai 0, 1, 2, dan 3.

1 :- arc(X,Y,1,0,0,0), arc(A,Y,_,_,0,_), X=A+1.

2 :- arc(X,Y,0,1,0,0), arc(X,B,_,_,_,0), B=Y+1.

3 :- arc(X,Y,0,0,1,0), arc(A,Y,0,_,_,_), A=X+1.

4 :- arc(X,Y,0,0,0,1), arc(X,B,_,0,_,_), Y=B+1.

5 :- arc(X,Y,1,1,0,0), arc(X,B,_,_,_,0), B=Y+1.

6 :- arc(X,Y,1,1,0,0), arc(A,Y,_,_,0,_), X=A+1.

7 :- arc(X,Y,0,1,1,0), arc(X,B,_,_,_,0), B=Y+1.

8 :- arc(X,Y,0,1,1,0), arc(A,Y,0,_,_,_), A=X+1.

9 :- arc(X,Y,0,0,1,1), arc(X,B,_,0,_,_), Y=B+1.

10 :- arc(X,Y,0,0,1,1), arc(A,Y,0,_,_,_), A=X+1. 11 :- arc(X,Y,1,0,0,1), arc(X,B,_,0,_,_), Y=B+1. 12 :- arc(X,Y,1,0,0,1), arc(A,Y,_,_,0,_), X=A+1. 13 :- arc(X,Y,1,0,1,0), arc(A,Y,_,_,0,_), X=A+1. 14 :- arc(X,Y,1,0,1,0), arc(A,Y,0,_,_,_), A=X+1. 15 :- arc(X,Y,0,1,0,1), arc(X,B,_,0,_,_), Y=B+1. 16 :- arc(X,Y,0,1,0,1), arc(X,B,_,_,_,0), B=Y+1.

17 :- arc(X,Y,1,1,1,0), arc(X,B,_,_,_,0), B=Y+1. 18 :- arc(X,Y,1,1,1,0), arc(A,Y,_,_,0,_), X=A+1. 19 :- arc(X,Y,1,1,1,0), arc(A,Y,0,_,_,_), A=X+1. 20 :- arc(X,Y,0,1,1,1), arc(X,B,_,_,_,0), B=Y+1. 21 :- arc(X,Y,0,1,1,1), arc(X,B,_,0,_,_), Y=B+1. 22 :- arc(X,Y,0,1,1,1), arc(A,Y,0,_,_,_), A=X+1. 23 :- arc(X,Y,1,0,1,1), arc(A,Y,_,_,0,_), X=A+1. 24 :- arc(X,Y,1,0,1,1), arc(A,Y,0,_,_,_), A=X+1. 25 :- arc(X,Y,1,0,1,1), arc(X,B,_,0,_,_), Y=B+1. 26 :- arc(X,Y,1,1,0,1), arc(X,B,_,0,_,_), Y=B+1. 27 :- arc(X,Y,1,1,0,1), arc(X,B,_,_,_,0), B=Y+1. 28 :- arc(X,Y,1,1,0,1), arc(A,Y,_,_,0,_), X=A+1.

29 :- arc(X,Y,0,0,0,0), arc(X,B,_,_,_,1), B=Y+1. 30 :- arc(X,Y,0,0,0,0), arc(X,B,_,1,_,_), Y=B+1. 31 :- arc(X,Y,0,0,0,0), arc(A,Y,_,_,1,_), X=A+1. 32 :- arc(X,Y,0,0,0,0), arc(A,Y,1,_,_,_), A=X+1.

Bagian B=Y+1 menandakan bahwa posisi B ada di bawah Y, dan bagian X=A+1 menandakan bahwa

posisi X ada di sebelah kanan A .Baris 1 sampai baris 4 pada lampiran ini menunjukkan constraint

untuk cell bernilai 1, baris 5 sampai baris 16 menunjukkan constraint untuk cell bernilai 2, dan pada

baris 17 sampai baris 28 constraint untuk cell bernilai 3. Baris 29 sampai baris 32 menunjukkan

constraint untuk cell bernilai 0.

19

Lampiran 3 Program DLV, constraint mencegah local loop.

1 :- arc(X,Y,1,1,0,1), arc(A,Y,0,1,1,1), A=X+1.

2 :- arc(X,Y,0,1,1,1), arc(A,Y,1,0,1,1), X=A+1.

3 :- arc(X,Y,1,1,1,0), arc(X,B,1,0,1,1), Y=B+1.

4 :- arc(X,Y,1,0,1,1), arc(X,A,1,1,1,0), A=Y+1.

5 :- arc(X,Y,1,1,1,0), arc(X,B,_,1,_,_), Y = B+1.

6 :- arc(X,Y,0,1,1,1), arc(A,Y,_,_,1,_), X = A+1.

7 :- arc(X,Y,1,0,1,1), arc(X,B,_,_,_,1), B = Y+1.

8 :- arc(X,Y,1,1,0,1), arc(A,Y,1,_,_,_), A = X+1.

Baris 1 sampai baris 4 menunjukkan constraint untuk mencegah sebuah cell memiliki nilai 4 atau cell

tersebut memilik 4 buah garis yang mengelilinginya, dan baris 5 sampai baris 8 menunjukkan

constraint untuk mencegah dua buah cell bernilai 3 yang bertetangga dan keduanya membentuk loop.

20

Lampiran 4 Program DLV, constraint pada cell dengan posisi di pojok grid.

1 :- arc(1,1,1,0,0,0).

2 :- arc(1,1,0,0,0,1).

3 :- arc(1,1,0,0,1,1).

4 :- arc(1,1,1,1,0,0).

5 :- arc(1,1,1,1,1,0).

6 :- arc(1,1,0,1,1,1).

7 :- arc(1,1,0,1,0,1).

8 :- arc(1,1,1,0,1,0).

9 :- arc(1,#maxint,1,0,0,0).

10 :- arc(1,#maxint,0,1,0,0). 11 :- arc(1,#maxint,1,0,0,1). 12 :- arc(1,#maxint,1,0,1,1). 13 :- arc(1,#maxint,0,1,1,1). 14 :- arc(1,#maxint,0,1,0,1). 15 :- arc(1,#maxint,1,0,1,0). 16 :- arc(1,#maxint,0,1,1,0).

17 :- arc(#maxint,1,0,0,0,1). 18 :- arc(#maxint,1,0,0,1,0). 19 :- arc(#maxint,1,0,1,1,0). 20 :- arc(#maxint,1,1,0,0,1). 21 :- arc(#maxint,1,1,1,1,0). 22 :- arc(#maxint,1,1,1,0,1). 23 :- arc(#maxint,1,0,1,0,1). 24 :- arc(#maxint,1,1,0,1,0).

25 :- arc(#maxint,#maxint,0,1,0,0). 26 :- arc(#maxint,#maxint,0,0,1,0). 27 :- arc(#maxint,#maxint,0,0,1,1). 28 :- arc(#maxint,#maxint,1,1,0,0). 29 :- arc(#maxint,#maxint,1,0,1,1). 30 :- arc(#maxint,#maxint,1,1,0,1). 31 :- arc(#maxint,#maxint,0,1,0,1). 32 :- arc(#maxint,#maxint,1,0,1,0).

Pada baris 1 sampai baris 8 menunjukkan constraint untuk cell dengan posisi di pojok kiri atas grid

(1,1), kemudian baris 9 sampai baris 16 adalah constraint untuk cell dengan posisi di pojok kanan atas

grid dimana #maxint adalah ukuran dari slither link, baris selanjutnya yaitu baris 17 sampai baris 24

adalah constraint untuk cell dengan posisi di pojok kiri bawah grid, dan baris 25 sampai baris 32 pada

lampiran menunjukkan constraint untuk cell dengan posisi di pojok kanan bawah grid.

21

Lampiran 5 Program DLV, constraint untuk mengantisipasi cabang dan ketersambungan garis.

1 :- arc(X,Y,1,1,_,_), arc(A,B,_,_,1,_), X=A+1, B=Y+1.

2 :- arc(X,Y,1,1,_,_), arc(A,B,_,_,_,1), X=A+1, B=Y+1.

3 :- arc(X,Y,1,1,_,_), arc(X,B,1,_,_,_), B=Y+1.

4 :- arc(X,#maxint,1,1,_,_), arc(A,#maxint,_,1,_,_), X=A+1.

5 :- arc(X,Y,_,1,1,_), arc(A,B,1,_,_,_), A=X+1, B=Y+1.

6 :- arc(X,Y,_,1,1,_), arc(A,B,_,_,_,1), A=X+1, B=Y+1.

7 :- arc(X,Y,_,1,1,_), arc(X,B,_,_,1,_), B=Y+1.

8 :- arc(X,#maxint,_,1,1,_), arc(A,#maxint,_,1,_,_), A=X+1.

9 :- arc(X,Y,_,_,1,1), arc(A,B,1,_,_,_), A=X+1, Y=B+1.

10 :- arc(X,1,_,_,1,1), arc(A,1,_,_,_,1), A=X+1. 11 :- arc(X,Y,_,_,1,1), arc(A,B,_,1,_,_), A=X+1, Y=B+1. 12 :- arc(X,Y,_,_,1,1), arc(X,B,_,_,1,_), Y=B+1. 13 :- arc(X,Y,1,_,_,1), arc(A,B,_,1,_,_), X=A+1, Y=B+1. 14 :- arc(X,Y,1,_,_,1), arc(A,B,_,_,1,_), X=A+1, Y=B+1. 15 :- arc(X,Y,1,_,_,1), arc(X,B,1,_,_,_), Y=B+1. 16 :- arc(X,1,1,_,_,1), arc(A,1,_,_,_,1), X=A+1.

17 :- arc(X,Y,1,_,_,0), arc(A,B,_,M,N,_), M=N, X=A+1, Y=B+1. %kiri atas 18 :- arc(X,Y,1,0,_,_), arc(A,B,_,_,M,N), M=N, X=A+1, B=Y+1. %kanan atas 19 :- arc(1,Y,1,0,_,_), arc(1,B,0,_,_,_), B=Y+1. %atas -- kanan 20 :- arc(1,Y,1,_,_,0), arc(1,B,0,_,_,_), Y=B+1. %atas -- kiri 21 :- arc(X,#maxint,1,0,_,_), arc(A,#maxint,_,0,_,_), X=A+1. %bagian kanan -- atas 22 :- arc(X,Y,0,1,_,_), arc(A,B,_,_,M,N), M=N, X=A+1, B=Y+1. %kanan atas 23 :- arc(X,#maxint,_,1,0,_), arc(A,#maxint,_,0,_,_), A=X+1. %bagian kanan -- bawah 24 :- arc(#maxint,Y,_,1,0,_), arc(#maxint,B,_,_,0,_), B=Y+1. %bagian bawah -- kanan 25 :- arc(X,#maxint,0,1,_,_), arc(A,#maxint,_,0,_,_), X=A+1. %bagian kanan -- atas 26 :- arc(1,Y,0,1,_,_), arc(1,B,0,_,_,_), B=Y+1. %bagian atas -- kiri 27 :- arc(X,Y,_,_,1,0), arc(A,B,M,N,_,_), M=N, A=X+1, Y=B+1. %kiri bawah 28 :- arc(X,Y,_,0,1,_), arc(A,B,M,_,_,N), M=N, A=X+1, B=Y+1. %kanan bawah 29 :- arc(#maxint,Y,_,0,1,_), arc(#maxint,B,_,_,0,_), B=Y+1. %bawah -- kanan 30 :- arc(#maxint,Y,_,_,1,0), arc(#maxint,B,_,_,0,_), Y=B+1. %bawah -- kiri 31 :- arc(X,Y,0,_,_,1), arc(A,B,_,M,N,_), M=N, X=A+1, Y=B+1. %atas -- kiri 32 :- arc(X,Y,_,_,0,1), arc(A,B,M,N,_,_), M=N, A=X+1, Y=B+1. %bawah -- kiri 33 :- arc(X,1,_,_,0,1), arc(A,1,_,_,_,0), A=X+1. %samping kiri -- bawah 34 :- arc(X,1,0,_,_,1), arc(A,1,_,_,_,0), X=A+1. %samping kiri - atas 35 :- arc(X,1,1,_,_,0), arc(A,1,_,_,_,0), X=A+1. %samping kiri -- atas 36 :- arc(X,1,_,_,1,0), arc(A,1,_,_,_,0), A=X+1. %samping kiri -- bawah 37 :- arc(X,#maxint,1,0,1,0), arc(A,#maxint,_,0,_,_), arc(C,#maxint,_,0,_,_), A=X+1,

X=C+1. %samping kanan -- bawah -- atas

38 :- arc(X,1,1,0,1,0), arc(A,1,_,_,_,0), arc(C,1,_,_,_,0), A=X+1, X=C+1. %samping kiri -- bawah -- atas

39 :- arc(#maxint,Y,0,1,0,1), arc(#maxint,B,_,_,0,_), B=Y+1. %bagian bawah -- kanan 40 :- arc(#maxint,Y,0,1,0,1), arc(#maxint,B,_,_,0,_), Y=B+1. %bagian bawah -- kiri 41 :- arc(1,Y,0,1,0,1), arc(1,B,0,_,_,_), B=Y+1. %bagian atas -- kanan 42 :- arc(1,Y,0,1,0,1), arc(1,B,0,_,_,_), Y=B+1. %bagian atas – kiri

Pada baris 1 sampai baris 16 menunjukkan constraint untuk mencegah terjadinya cabang pada solusi

slither link, dan pada baris 17 sampai baris 42 menunjukkan constraint untuk tetap menjaga agar

solusi slither link merupakan sebuah garis yang kontinyu (tidak terputus).

22

Lampiran 6 Program DLV, constraint dari cell bernilai 2 yang bersebelahan dengan cell bernilai 0.

1 :- arc(#maxint,Y,1,0,1,0), arc(#maxint,B,0,0,0,0), Y=B+1. %bagian bawah -- kiri

2 :- arc(#maxint,Y,1,0,1,0), arc(#maxint,B,0,0,0,0), B=Y+1. %bagian bawah -- kanan

3 :- arc(#maxint,Y,0,1,0,1), arc(#maxint,B,0,0,0,0), Y=B+1. %bagian bawah -- kiri

4 :- arc(#maxint,Y,0,1,0,1), arc(#maxint,B,0,0,0,0), B=Y+1. %bagian bawah -- kanan

5 :- arc(1,Y,1,0,1,0), arc(1,B,0,0,0,0), Y=B+1. %bagian atas -- kiri

6 :- arc(1,Y,1,0,1,0), arc(1,B,0,0,0,0), B=Y+1. %bagian atas -- kanan

7 :- arc(1,Y,0,1,0,1), arc(1,B,0,0,0,0), Y=B+1. %bagian atas -- kiri

8 :- arc(1,Y,0,1,0,1), arc(1,B,0,0,0,0), B=Y+1. %bagian atas – kanan

Baris 1 sampai baris 4 pada lampiran ini ditujukan untuk cell dengan posisi di bagian bawah slither

link, dan baris 5 sampai baris 8 adalah constraint untuk cell dengan posisi di bagian atas slither link.

23

Lampiran 7 Pseudo code program C++ untuk membaca fakta slither link.

1 Set count to 1

2 FOR each string on data.dat

3 Set titik[count] to string

4 Increment count

5 END FOR

6 Set k to 1

7 FOR each side on slither_link

8 Set line_value[k] to 3

9 END FOR

Baris 1 sampai baris 5 pada lampiran ini digunakan untuk membaca fakta yang telah disimpan dalam

file data.dat, dan pada bairs 6 sampai baris 9 digunakan untuk memberikan nilai default yaitu 3

pada setiap sisi pada cell.

24

Lampiran 8 Pseudo code program C++, modul basic_rule .

1 //basic rule

2 FOR each cell in slither_link

3 IF cell_value is 0 THEN

4 Set no_line on cell is TRUE

5 ELSE IF cell_value is 1 THEN

6 IF cell_position is 1

7 Set line_value on up to 0

8 Set line_value on left to 0

9 END IF

10 ...

11 ELSE IF cell_value is 2 THEN

12 IF cell_position is 1 THEN

13 IF line_value on up is 0

14 AND line_value on left is 0 THEN

15 Set line_value on right to 1

16 Set line_value on bottom to 1

17 END IF

18 END IF

19 ...

20 ELSE IF cell_value is 3 THEN

21 IF cell_position is 1

22 Set line_value on up to 1

23 Set line_value on left to 1

24 END IF

25 ...

26 END IF

27 END FOR

25

Lampiran 9 Pseudo code program C++, modul advance_rule .

1 //advance_rule

2 FOR each cell in slither_link

3 IF cell_value is 1 THEN

4 IF cell_position on up THEN

5 IF line_value on up_left is 0 THEN

6 Set line_value on up to 0

7 Set line_value on left to 0

8 END IF

9 END IF

10 ....

11 ELSE IF cell_value is 2 THEN

12 IF line_value on up is 1 AND line_value on bottom is 0 THEN

13 IF line_value on right is 0 THEN

14 Set line_value on left to 1

15 ELSE IF line_value on left is 0 THEN

16 Set line_value on right to 1

17 END IF

18 END IF

19 ...

20 ELSE IF cell_value is 3 THEN

21 IF cell_position on up THEN

22 IF line_value on up_left is 0

23 Set line_value on up to 1

24 Set line_value on left to 1

25 ELSE IF line_value on up_right is 0

26 Set line_value on up to 1

27 Set line_value on right to 1

28 END IF

29 END IF

30 ...

31 END IF

32 END FOR

26

Lampiran 10 Pseudo code program C++, modul cek_garis_cell .

1 //cek_garis_cell

2 FOR each cell in slither_link

3 IF cell_value is 1 THEN

4 IF line_value on up is 1

5 Set line_value on right, bottom, left to 0

6 END IF

7 ELSE IF cell_value is 2 THEN

8 IF line_value on up is 1 AND line_value on right is 1 THEN

9 Set line_value on bottom, left to 0

10 END IF

11 ELSE IF cell_value is 3 THEN

12 IF line_value on up is 0 THEN

13 Set line_value on right, bottom, left to 1

14 END IF

15 END IF

16 END FOR

27

Lampiran 11 Pseudo code program C++, modul sambung_garis dan modul cek_cabang.

1 //sambung_garis

2 Set k to 1

3 Set n to puzzle_size

4 FOR each side on slither_link

5 IF line_value is 1

6 IF line[k] is horizontal THEN

7 IF line_value[k-n] is 0 AND line_value[k+1] is 0 THEN set

line_value[k+n+1] to 1

8 ELSE IF line_value[k+n+1] is 0 AND line_value[k+1] is 0 THEN set

line_value[k-n] to 1

9 END IF

10 END IF

11 ...

12 END IF

13 END FOR

14 //cek_cabang 15 FOR each cell in slither_link 16 IF line_value[up] is 1 AND line_value[up_right] is 1 THEN

17 Set line_value that branch to 0

18 ELSE IF line_value[up] is 1 AND line_value[up_left] is 1 THEN

19 Set line_value that branch to 0

20 ....

21 END IF

22 END FOR

28

Lampiran 12 Pseudo code program C++, modul cek_logic dan fungsi sambung.

1 //cek_logic

2 FOR each cell in slither_link

3 IF cell_position is 1

4 IF line_value[up_right] is 1 AND Line_value[left_bottom] is 1 THEN

5 IF line_value[up] is 0 OR Line_value[left] is 0

6 Set line_value[bottom] to 1

7 Set line_value[right] to 1

8 ElSE IF line_value[right] is 0 OR Line_value[bottom] is 0

9 Set line_value[up] to 1

10 Set line_value[left] to 1

11 END IF

12 END IF

13 ELSE IF cell_position is puzzle_size

14 IF line_value[up_left] is 1 AND Line_value[right_bottom] is 1 THEN

15 IF line_value[up] is 0 OR line_value[right] is 0 THEN

16 Set line_value[bottom] to 1

17 Set line_value[left] to 1

18 ELSE IF line_value[left] is 0 OR line_value[bottom] is 0 THEN

19 Set line_value[up] to 1

20 Set line_value[right] to 1

21 END IF

22 END IF

23 ...

24 END IF

25 END FOR

26 //fungsi sambung 27 Function sambung(puzzle_data) 28 { 29 Set status to 0

30 While status is 0

31 Do traversal until find a loop

32 IF a loop satisfy the puzzle rule THEN

33 Set status to 1

34 END IF

35 END DO

36 END WHILE

37 }