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 Bada di bawah
Y, dan bagian
X=A+1menandakan bahwa
posisi
Xada di sebelah kanan
A .Baris 1 sampai baris 4 pada lampiran ini menunjukkanconstraint
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
#maxintadalah 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
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
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
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
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