I've been trying out prolog since yesterday, and trying to define chess rules. In particular, I want to define either a square is an edge or not.
Here are the rules I thought of:
A file is a thru h.
A rank is 1 thru 8.
A pos is a file and a rank.
h is an edge.
8 is an edge.
A position is an edge either it's file or rank is an edge.
I played around, but for example this goes stack overflow. how do I model this?
% Prolog %
file(b).
file(a).
file(h).
rank(8).
rank(4).
rank(5).
pos(F, R) :- file(F), rank(R).
edge(h).
edge(8).
edge(X) :- pos(X, Y),!,edge(X),edge(Y).
% I also tried this, but this bloats the space.
% edge(pos(F, R)) :- edge(F),edge(R).
corner(pos(edge, edge)).
% edge(h). % true
% edge(8). % true
% edge(4). % false
% edge(pos(h, 4)). % true
% edge(pos(b, 5)). % false
% edge(pos(b, 8)). % true
%
basic version:
file(a).
file(b).
file(c).
file(d).
file(e).
file(f).
file(g).
file(h).
rank(1).
rank(2).
rank(3).
rank(4).
rank(5).
rank(6).
rank(7).
rank(8).
position(F-R) :-
file(F),
rank(R).
edge(a-_).
edge(h-_).
edge(_-1).
edge(_-8).
corner(a-1).
corner(a-8).
corner(h-1).
corner(h-8).
then
?- corner(C).
C = a-1 ;
C = a-8 ;
C = h-1 ;
C = h-8
or positions which have rank > 3 and are edges and are not corners:
?- position(X), X=F-R, R > 3, edge(F-R), \+ corner(F-R).
X = a-4 ;
X = a-5 ;
X = a-6 ;
X = a-7 ;
X = b-8
and you can collapse down file()
and rank()
rules using member/2
and between/2
if desired.