Linux端末でswiplのhttps://swish.swi-prolog.org/example/clpfd_queens.plというコードをこのページで実行しようとしています。Prologコードを操作する
:- use_module(library(clpfd)).
n_queens(N, Qs) :-
length(Qs, N),
Qs ins 1..N,
safe_queens(Qs).
safe_queens([]).
safe_queens([Q|Qs]) :-
safe_queens(Qs, Q, 1),
safe_queens(Qs).
safe_queens([], _, _).
safe_queens([Q|Qs], Q0, D0) :-
Q0 #\= Q,
abs(Q0 - Q) #\= D0,
D1 #= D0 + 1,
safe_queens(Qs, Q0, D1).
次のコマンド作品:
?- n_queens(4, Qs), labeling([ff], Qs).
それだけではないn_queens(4, Qs)
:
?- n_queens(4, Qs).
Qs = [_G1470, _G1473, _G1476, _G1479],
_G1470 in 1..4,
abs(_G1470-_G1479)#\=3,
_G1470#\=_G1479,
abs(_G1470-_G1476)#\=2,
_G1470#\=_G1476,
abs(_G1470-_G1473)#\=1,
_G1470#\=_G1473,
_G1479 in 1..4,
abs(_G1476-_G1479)#\=1,
_G1476#\=_G1479,
abs(_G1473-_G1479)#\=2,
_G1473#\=_G1479,
_G1476 in 1..4,
abs(_G1473-_G1476)#\=1,
_G1473#\=_G1476,
_G1473 in 1..4.
はなぜlabeling
部分がここで必要ですか? labeling
の部分がなくても適切な出力が得られますか?より多くの場合
、1は、ソリューションの最初の部分のみを取得します。
?- n_queens(20, Qs), labeling([ff], Qs).
Qs = [1, 3, 5, 14, 17, 4, 16, 7, 12|...] ;
Qs = [1, 3, 5, 18, 16, 4, 10, 7, 14|...] ;
...
どのようにしてより多くの完全なリストの出力を得ることができますか?また、ソリューションごとにスペースバーを押さなくても、どのようにすべての数値を集めることができますか?ご協力いただきありがとうございます。 それは制約プログラミングの問題は構築:
いいえ、n_queens' 'のアイデアは*構造*制約プログラミングの問題です。 'labelling'は本当の緩和と分岐を行い、解決策を探します。 –