-
Notifications
You must be signed in to change notification settings - Fork 0
/
asp2.dlv
48 lines (36 loc) · 1.43 KB
/
asp2.dlv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
%#show inMove/3.
col(0..7).
row(0..9).
color(0..4).
% 0 -> EMPTY
% 1 -> RED
% 2 -> GREEN
% 3 -> BLUE
% 4 -> YELLOW
pos(X,Y):- row(X), col(Y).
% block(X,Y,C):- pos(X,Y), color(C), C=0, X<7.
% riduco il campo di ammissibilità, considerando solo i blocchi colorati
canBeAssigned(X,Y,C):- block(X,Y,C), C!=0.
% Idea: Prendere un blocco e cercare di raggiungere gli altri blocchi dello stesso colore che sono vicini
% Questo crea una sorta di guess and check.
% Solo 1 blocco sarà preso come blocco iniziale "start" da quelli che possono essere assegnati
{start(X,Y,C) : canBeAssigned(X,Y,C)} = 1.
% Guess & Check Moves
% La mossa sono tutti i blocchi che verranno eliminati dal campo di gioco
inMove(X,Y,C) | outMove(X,Y,C) :- canBeAssigned(X,Y,C).
% related blocks
% Per prendere tutti i blocchi vicini, si parte da un blocco iniziale,
% spostandosi di 1 verso destra, sinistra, sopra o sotto
reached(X,Y,C) :- start(X,Y,C).
reached(X1,Y,C) :- inMove(X1,Y,C), reached(X,Y,C), X1 = X+1.
reached(X1,Y,C) :- inMove(X1,Y,C), reached(X,Y,C), X1 = X-1.
reached(X,Y1,C) :- inMove(X,Y1,C), reached(X,Y,C), Y1 = Y-1.
reached(X,Y1,C) :- inMove(X,Y1,C), reached(X,Y,C), Y1 = Y+1.
% all blocks must be reached
:- inMove(X,Y,C), not reached(X,Y,C).
% only the same color
:- inMove(_,_,C), inMove(_,_,C1), C!=C1.
% number of blocks must be higher than 3
:- #count{X,Y,C : inMove(X,Y,C)} < 3.
% Higher number of blocks
:~ block(X,Y,C), not inMove(X,Y,C). [10-X@1,X,Y,C]