位置是边缘,它的文件或等级是边缘。序言基础
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/2
和 between/2
折叠 file()
和 rank()
规则。
我从昨天开始就开始尝试 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/2
和 between/2
折叠 file()
和 rank()
规则。