%%%%%% Startup % grid(X,Y) :- col(X), row(Y). adjacent(X,Y,X,Y1) :- grid(X,Y), Y1 = Y + 1, row(Y1). adjacent(X,Y,X,Y1) :- grid(X,Y), Y1 = Y - 1, row(Y1). adjacent(X,Y,X1,Y) :- grid(X,Y), X1 = X + 1, col(X1). adjacent(X,Y,X1,Y) :- grid(X,Y), X1 = X - 1, col(X1). maxRow(MR) :- row(MR), not existRowGreaterThan(MR). existRowGreaterThan(R) :- row(R), row(RR), RR > R. maxCol(MC) :- col(MC), not existColGreaterThan(MC). existColGreaterThan(C) :- col(C), col(CC), CC > C. border(1,Y) :- row(Y). border(X,1) :- col(X). border(X,Y) :- row(Y), maxCol(X). border(X,Y) :- col(X), maxRow(Y). %%%%%% GUESS % wall(X,Y) v empty(X,Y) :- grid(X,Y), not border(X,Y), not entrance(X,Y), not exit(X,Y). empty(X,Y) :- entrance(X,Y). empty(X,Y) :- exit(X,Y). %%%%%Constraint 1 (always a path between the entrance and any empty cell % reach(X,Y) :- entrance(X,Y). reach(XX,YY) :- adjacent(X,Y,XX,YY), reach(X,Y), empty(XX,YY). :- empty(X,Y), not reach(X,Y). %%%%% Constraint 2 (wall on any border cell, apart from entrance and exit) % wall(X,Y) :- border(X,Y), not entrance(X,Y), not exit(X,Y). %%%%%Constraint 3 (no 4-blocks of walls or empty cells) % :- wall(X,Y), wall(X1,Y), wall(X,Y1), wall(X1,Y1), X1 = X + 1, Y1 = Y + 1. :- empty(X,Y), empty(X1,Y), empty(X,Y1), empty(X1,Y1), X1 = X + 1, Y1 = Y + 1. %%%%%Constraint 4 (no wall without adjacent walls) % :- wall(X,Y), not border(X,Y), not wallWithAdjacentWall(X,Y). wallWithAdjacentWall(X,Y) :- wall(X,Y), adjacent(X,Y,W,Z), wall(W,Z). %%%%%Constraint 5 (no diagonally adjacent walls with no common adjacent walls) % :- wall(X,Y), wall(Xp1,Yp1), empty(Xp1,Y), empty(X,Yp1), Xp1 = X + 1, Yp1 = Y + 1. :- wall(Xp1,Y), wall(X,Yp1), empty(X,Y), empty(Xp1,Yp1), Xp1 = X + 1, Yp1 = Y + 1.