Acciones

Masyu

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

%% Masyu.

%% Es un juego donde, en una cuadrícula con ciertos círculos negros y blancos,
%% tenemos que hacer un camino que pase por todos los círculos bajo una serie de reglas.

%% R1: El camino tiene que ser cerrado.
%% R2: Por los círculos blancos hay que pasar en linea recta, pero tiene que girar 90º
%%     en la casilla previa y/o posterior del camino.
%% R3: Por los círculos negros hay girar 90º, pero el camino tiene que ser recto en
%%     las casillas previa y posterior.

%% Estaticos.

col(1..n).
fila(1..m).
direccion(v;h).

bola(X,Y) :- negro(X,Y).
bola(X,Y) :- blanco(X,Y).

%% Generación. linea(S,X,Y) indica que de la casilla (X,Y) hay un
%% segmento del camino hasta la casilla (X+1,Y) si S==h y hay un
%% segmento hasta la casilla (X,Y+1) si S==v.

{linea(S,X,Y)} :- direccion(S), col(X), fila(Y).
:- linea(h,n,Y).
:- linea(v,X,m).

%% en(X,Y) significa que el camino pasa por la casilla (X,Y).

en(X,Y) :- linea(S,X,Y).
en(X+1,Y) :- linea(h,X,Y).
en(X,Y+1) :- linea(v,X,Y).
en(X,Y) :- bola(X,Y).

%% Restricciones.

%% R1: El camino tiene que ser CERRADO.
%  Cada casilla del camino tiene una salida y una entrada del comino.

:- 3{linea(h,X-1,Y);linea(h,X,Y);linea(v,X,Y);linea(v,X,Y-1)}, en(X,Y).
:- {linea(h,X-1,Y);linea(h,X,Y);linea(v,X,Y);linea(v,X,Y-1)}1, en(X,Y).

%  Además, como el camino tiene que ser unico una casilla en el camino tiene que ser alcanzable por otra de este.

adj(X,Y,X,Y+1) :- linea(v,X,Y).
adj(X,Y,X+1,Y) :- linea(h,X,Y).
adj(X,Y,U,V) :- adj(U,V,X,Y).

alcanzable(X,Y,X,Y) :- en(X,Y).
alcanzable(X,Y,Z,W) :- adj(X,Y,U,V), alcanzable(U,V,Z,W).

:- en(X,Y), en(Z,W), not alcanzable(X,Y,Z,W).

%% R2: Por los círculos blancos hay que pasar en linea recta, pero tiene que girar 90º
%%     en la casilla previa y/o posterior del camino.

% Pasar en linea recta.

:- 1{linea(v,X,Y);linea(v,X,Y-1)}, 1{linea(h,X,Y);linea(h,X-1,Y)},blanco(X,Y).

% girar 90º en la casilla previa y/o posterior.

:- blanco(X,Y), linea(h,X,Y), linea(h,X+1,Y), linea(h,X-1,Y), linea(h,X-2,Y).
:- blanco(X,Y), linea(v,X,Y), linea(v,X,Y+1), linea(v,X,Y-1), linea(v,X,Y-2).

%% R3: Por los círculos negros hay girar 90º, pero el camino tiene que ser recto en
%%     las casillas previa y posterior.

% Hay girar 90º.

:- negro(X,Y), linea(h,X,Y), linea(h,X-1,Y).
:- negro(X,Y), linea(v,X,Y), linea(v,X,Y-1).

% Recto en las casillas previa y posterior.

:- 1{linea(v,X+1,Y); linea(v,X+1,Y-1)}, negro(X,Y), linea(h,X,Y).
:- 1{linea(v,X-1,Y); linea(v,X-1,Y-1)}, negro(X,Y), linea(h,X-1,Y).

:- 1{linea(h,X,Y+1); linea(h,X-1,Y+1)}, negro(X,Y), linea(v,X,Y).
:- 1{linea(h,X,Y-1); linea(h,X-1,Y-1)}, negro(X,Y), linea(v,X,Y-1).

%Presentción.

#show linea/3.