一般的な問題:マップ8 * 8があり、空の正方形に1から6までの数字を入力する必要があります。ただし、各列と生の数字は1回だけ満たす必要があります。各行と列の2つの正方形は空のままです。上と下の両側の数字は、表示されるはずの最初の数字を示しています(ただし、2つの空の正方形の後に表示される場合があります)。
だから、今私はこのコードを持っています、それは最終的に4*4マップのswi-prologで動作します。
:- module(ab, [ab/0]).
:- [library(clpfd)].
gen_row(Ls):-length(Ls, 4), Ls ins 0..3.
transpose(Ms, Ts) :-
%must_be(list(list), Ms),
( Ms = [] -> Ts = []
; Ms = [F|_],
transpose(F, Ms, Ts)
).
transpose([], _, []).
transpose([_|Rs], Ms, [Ts|Tss]) :-
lists_firsts_rests(Ms, Ts, Ms1),
transpose(Rs, Ms1, Tss).
lists_firsts_rests([], [], []).
lists_firsts_rests([[F|Os]|Rest], [F|Fs], [Os|Oss]) :-
lists_firsts_rests(Rest, Fs, Oss).
ab :-
Rows = [R1,R2,R3,R4],
maplist(gen_row, Rows),
transpose(Rows, [C1,C2,C3,C4]),
maplist(all_distinct, [R1,R2,R3,R4]),
maplist(all_distinct, [C1,C2,C3,C4]),
start(R2, 3),
start(R3, 3),
finish(R3, 2),
start(C3, 1),
finish(C2, 2),
maplist(writeln, [R1,R2,R3,R4]).
finish(X, V) :-
reverse(X, Y),
start(Y, V).
start([0,Y|_], Y).
start([Y|_], Y).
しかし、8 * 8パズルのように、より大きな領域に2つの空の場所があるという問題はサポートされていません。ヒントはありますか?