問題一般來說:我們有8 * 8的地圖,我們必須用1到6的數字來填充空的方格。但是在每一列和原始數字中只能遇到1次。每一行和列都留空。來自兩側的數字,上下顯示我們的第一個數字,這應該出現(但它可以出現在兩個空方塊之後)。在gnu上的EndView遊戲Prolog
所以,現在我有了這個代碼,它最終在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).
但是,它不支持2個空的地方爲更大的區域,如8 * 8 puzzle.Any提示的問題?
仙兒,你應該期待您的問題將被downvoted和關閉。 StackOverflow的政策致力於'全球'的用處。你必須單獨解決你的詳細問題... – CapelliC
fd_all_different是* GNU Prolog *,在* SWI Prolog中使用all_different * – CapelliC
我得到了這個,我在GNU Prolog上編寫,但它仍然不起作用。我不能得到與兩個零又名空的空間的東西。在這種情況下,我們不能使用「假設的唯一性」 – Oona