在Sterling&Shapiro 的序言艺术中,练习14.1(v)节:
queens(N,Qs) :-
length(Qs,N),
place_queens(N,Qs,_,_).
place_queens(0,_Qs,_Ups,_Downs).
place_queens(I,Qs,Ups,[_|Downs]) :-
I > 0, I1 is I-1,
place_queens(I1,Qs,[_|Ups] ,Downs),
place_queen(I,Qs,Ups,Downs).
place_queen(Q,[Q|_],[Q|_],[Q|_]).
place_queen(Q,[_|Qs],[_|Ups],[_|Downs] ):-
place_queen(Q,Qs,Ups,Downs).
Run Code Online (Sandbox Code Playgroud)
这是一个出色的程序,共有11行,可快速解决将皇后放在棋盘上的问题。这很神奇:只有计数器,递归和列表变得越来越长。我,即使在跟踪的帮助下,也不了解它。有人可以向我解释吗?您如何编写这样的程序?导致从(例如,另一个)(好的标准解决方案)派生该程序的逻辑/心理过程是什么?
queens(N,Qs) :-
numlist(1,N,Ns),
queens(Ns,[ ],Qs).
queens(UnplacedQs,SafeQs,Qs) :-
select(Q,UnplacedQs,UnplacedQs1),
\+ attack(Q,SafeQs),
queens(UnplacedQs1,[Q|SafeQs] ,Qs).
queens([ ],Qs,Qs).
attack(X,Xs) :-
attack(X,1,Xs).
attack(X,N,[Y|_]) :-
X is Y+N ; X is Y-N.
attack(X,N,[_|Ys]) :-
N1 is N+1,
attack(X,N1,Ys).
Run Code Online (Sandbox Code Playgroud) 我想编译这个列表理解:
>> lc [reduce [x y] | x in [1 2 3] y in [4 5 6]]
== [[1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6]]
Run Code Online (Sandbox Code Playgroud)
在:
collect [
foreach x [1 2 3] [
foreach y [4 5 6] [
keep/only reduce [x y]]]]
Run Code Online (Sandbox Code Playgroud)
或者:
>> lc [reduce [x y] | x in range [1 5] y in range reduce[1 x] if x + y > 4]
== [[3 …Run Code Online (Sandbox Code Playgroud)