Search code examples
prolog

A position is an edge either it's file or rank is an edge. Basics of prolog


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
%

Solution

  • 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.