位置是边缘,它的文件或等级是边缘。序言基础

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

我从昨天开始就开始尝试 prolog,并尝试定义国际象棋规则。特别是,我想定义正方形是否为边。

以下是我想到的规则:

 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.

我试了一下,但是例如这会导致堆栈溢出。我该如何建模?

% 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
%

这不是一个好的答案,但却是一个起点:

extreme_pos(1).
extreme_pos(8).

% Requires both Row and Col to be nonvar
pos_edge(row_col(Row, Col)) :-
    (   extreme_pos(Row) -> true
    ;   extreme_pos(Col)
    ).

基本版:

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

然后

?- corner(C).
C = a-1 ;
C = a-8 ;
C = h-1 ;
C = h-8

或等级 > 3 且是边而不是角的位置:

?- 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

如果需要,您可以使用 member/2between/2 折叠 file()rank() 规则。