Acciones

Heyawake (Alina Kasiuk y Xinyi Wu)

De Lógica computacional y teoría de modelos (2019-20)

#const n = 10.
#const m = 10.
#const r = 18.

% File: heyawake.lp
col(1..m). row(1..n). num(0..r-1). segment(h;v).
room_size(N,X1,Y1,X2,Y2) :- room(A,X1,Y1,X2,Y2), has(A,N).

% H3: In each room containing a cell numbered N (N>0),
% paint N cells black
N {black(C,R):col(C),row(R),C1<=C,C<=C2,R1<=R,R<=R2} N :- room_size(N,C1,R1,C2,R2), N>0.

% H4: Each room without numbered cell contains any number of
% black cells.
{black(C,R):col(C),row(R),C1<=C,C<=C2,R1<=R,R<=R2} :- room_size(-1,C1,R1,C2,R2).

% H1: No two black cells are orthogonally adjacent.
:- adj(C,R,C1,R), black(C,R), black(C1,R), C!=C1.
:- adj(C,R,C,R1), black(C,R), black(C,R1), R!=R1.

adj(C,R,C1,R1) :- col(C), col(C1), row(R), row(R1), |C-C1|+|R-R1|==1.

% H2: Nonadjacent white cells should be interconnected.
:- not connected(C,R,C1,R1), white(C,R), white(C1,R1),
   col(C),col(C1), row(R), row(R1), C!=C1, R!=R1.
white(C,R) :- not black(C,R), col(C), row(R).

% connectedness of two white cells (C,R) and (C1,R1)
connected(C,R,C1,R1) :- adj(C,R,C1,R1), white(C,R), white(C1,R1).
connected(C,R,X,Y) :- connected(C1,R1,X,Y), adj(C,R,C1,R1),white(C,R), col(X), row(Y).

% H5: A straight path connecting two white cells (C,R) and (X,Y)
% does not pass through three or more rooms.
:- path(S,C,R,X,Y,3), white(C,R), white(X,Y), col(C), col(X), row(R), row(Y),segment(S).

% horizontal (h) and vertical (v) straight paths of white cells
% whose lengths are at most 3

path(S,C,R,C,R,1) :- white(C,R), col(C), row(R), segment(S).

path(h,C,R,C1,R,N) :- path(h,C+1,R,C1,R,N), adj(C,R,C+1,R),white(C,R), inroom(C,R,A), inroom(C+1,R,A),col(C), col(C1), row(R), num(N), N<3.

path(h,C,R,C1,R,N+1) :- path(h,C+1,R,C1,R,N), adj(C,R,C+1,R), white(C,R), inroom(C,R,A), inroom(C+1,R,B), A!=B, col(C), col(C1), row(R), num(N), N<3.

path(v,C,R,C,R1,N) :- path(v,C,R+1,C,R1,N), adj(C,R,C,R+1),white(C,R), inroom(C,R,A), inroom(C,R+1,A),col(C), row(R), row(R1), num(N), N<3.

path(v,C,R,C,R1,N+1) :- path(v,C,R+1,C,R1,N), adj(C,R,C,R+1),white(C,R),inroom(C,R,A), inroom(C,R+1,B),A!=B, col(C), row(R),  row(R1), num(N), N<3.

%path(v,C,R,C,R1,N) :- path(v,C,R1,C,R,N).
%path(h,C,R,C1,R,N) :- path(h,C1,R,C,R,N).


% inroom(X,Y,A): grid cell (X,) is contained in Room A
inroom(X,Y,A) :- room(A,C,R,C1,R1), X<=C1, C<=X, Y<=R1, R<=Y,col(C), col(C1), col(X), row(Y), row(R1), row(R).

%The input file
room(0,1,1,2,2).room(1,1,3,2,5).room(2,1,6,2,8).room(3,1,9,2,10).
room(4,3,1,5,2).room(5,3,3,5,5).room(6,3,6,3,8).room(7,4,6,5,8).room(8,3,9,5,10).
room(9,6,1,8,2).room(10,6,3,7,5).room(11,8,3,8,5).room(12,6,6,8,8).room(13,6,9,8,10).
room(14,9,1,10,2).room(15,9,3,10,5).room(16,9,6,10,8).room(17,9,9,10,10).

has(0,-1).has(1,-1).has(2,-1).has(3,0).
has(4,-1).has(5,5).has(6,-1).has(7,0).has(8,1).
has(9,1).has(10,2).has(11,-1).has(12,2).has(13,-1).
has(14,0).has(15,-1).has(16,1).has(17,-1).


%room(0,1,1,2,2).room(1,1,3,2,5).room(2,6,1,8,2).room(3,3,4,5,5).
%room(4,3,1,5,2).room(5,3,3,5,3).room(6,6,3,8,5).room(7,3,6,5,8).
%room(8,6,6,8,7).room(9,1,6,2,8).room(10,6,8,8,8).room(13,9,6,10,8).
%room(11,9,1,10,2).room(12,9,3,10,5).room(14,9,9,10,10).
%room(17,1,9,2,10).room(16,3,9,5,10).room(15,6,9,8,10).
%has(0,0).has(1,1).has(2,1).has(3,2).has(4,-1).has(5,-1).has(6,2).
%has(7,5).has(8,0).has(9,-1).has(10,-1).has(11,-1).has(12,-1).
%has(13,1).has(14,0).has(15,-1).has(16,-1).has(17,-1).

#show black/2.