如何在数独游戏的序言列表中设置值
how to set values in a list in prolog for the sudoku game
我有这些代码:
:- use_rendering(sudoku).
:- use_module(library(clpfd)).
sudoku(Rows) :-
length(Rows, 9), maplist(same_length(Rows), Rows),
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns),
maplist(all_distinct, Columns),
Rows = [As,Bs,Cs,Ds,Es,Fs,Gs,Hs,Is],
blocks(As, Bs, Cs),
blocks(Ds, Es, Fs),
blocks(Gs, Hs, Is).
blocks([], [], []).
blocks([N1,N2,N3|Ns1], [N4,N5,N6|Ns2], [N7,N8,N9|Ns3]) :-
all_distinct([N1,N2,N3,N4,N5,N6,N7,N8,N9]),
blocks(Ns1, Ns2, Ns3).
problem(1, [[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,3,_,8,5],
[_,_,1,_,2,_,_,_,_],
[_,_,_,5,_,7,_,_,_],
[_,_,4,_,_,_,1,_,_],
[_,9,_,_,_,_,_,_,_],
[5,_,_,_,_,_,_,7,3],
[_,_,2,_,1,_,_,_,_],
[_,_,_,_,4,_,_,_,9]]).
%problem(1, Rows), sudoku(Rows), maplist(portray_clause, Rows).
我想创建一个新的主函数,以 [[3,7,2], [5,1,9] ...] 的形式接收三元组列表作为输入,这样
每个三元组对应于网格内已经包含一个值的框。例如,
对于前面的列表,[3,7,2] 表示第 3 行第 7 列的框包含
值为2,而[5,1,9]表示第5行第1列的方框包含9
的值
个人学习,谢谢
我认为您只需要这样的谓词:
board_value([R,C,V], Board) :-
nth1(R, Board, Row),
nth1(C, Row, V).
这样使用:
?- Board = [[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,3,_,8,5],
[_,_,1,_,2,_,_,_,_],
[_,_,_,5,_,7,_,_,_],
[_,_,4,_,_,_,1,_,_],
[_,9,_,_,_,_,_,_,_],
[5,_,_,_,_,_,_,7,3],
[_,_,2,_,1,_,_,_,_],
[_,_,_,_,4,_,_,_,9]],
board_value([5,2,1], Board),
write(Board).
[[_6,_8,_10,_12,_14,_16,_18,_20,_22],
[_24,_26,_28,_30,_32,3,_34,8,5],
[_36,_38,1,_40,2,_42,_44,_46,_48],
[_50,_52,_54,5,_56,7,_58,_60,_62],
[_64,1,4,_68,_70,_72,1,_74,_76],
[_78,9,_80,_82,_84,_86,_88,_90,_92],
[5,_94,_96,_98,_100,_102,_104,7,3],
[_106,_108,2,_110,1,_112,_114,_116,_118],
[_120,_122,_124,_126,4,_128,_130,_132,9]]
Board = [[_6, _8, _10, _12, _14, _16, _18, _20|...], [_24, _26, _28, _30, _32, 3, _34|...], [_36, _38, 1, _40, 2, _42|...], [_50, _52, _54, 5, _56|...], [_64, 1, 4, _68|...], [_78, 9, _80|...], [5, _94|...], [_106|...], [...|...]].
可能不是很明显,但是第 5 行的第 2 列现在是 1。希望这对您有所帮助!
我有这些代码:
:- use_rendering(sudoku).
:- use_module(library(clpfd)).
sudoku(Rows) :-
length(Rows, 9), maplist(same_length(Rows), Rows),
append(Rows, Vs), Vs ins 1..9,
maplist(all_distinct, Rows),
transpose(Rows, Columns),
maplist(all_distinct, Columns),
Rows = [As,Bs,Cs,Ds,Es,Fs,Gs,Hs,Is],
blocks(As, Bs, Cs),
blocks(Ds, Es, Fs),
blocks(Gs, Hs, Is).
blocks([], [], []).
blocks([N1,N2,N3|Ns1], [N4,N5,N6|Ns2], [N7,N8,N9|Ns3]) :-
all_distinct([N1,N2,N3,N4,N5,N6,N7,N8,N9]),
blocks(Ns1, Ns2, Ns3).
problem(1, [[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,3,_,8,5],
[_,_,1,_,2,_,_,_,_],
[_,_,_,5,_,7,_,_,_],
[_,_,4,_,_,_,1,_,_],
[_,9,_,_,_,_,_,_,_],
[5,_,_,_,_,_,_,7,3],
[_,_,2,_,1,_,_,_,_],
[_,_,_,_,4,_,_,_,9]]).
%problem(1, Rows), sudoku(Rows), maplist(portray_clause, Rows).
我想创建一个新的主函数,以 [[3,7,2], [5,1,9] ...] 的形式接收三元组列表作为输入,这样 每个三元组对应于网格内已经包含一个值的框。例如, 对于前面的列表,[3,7,2] 表示第 3 行第 7 列的框包含 值为2,而[5,1,9]表示第5行第1列的方框包含9
的值个人学习,谢谢
我认为您只需要这样的谓词:
board_value([R,C,V], Board) :-
nth1(R, Board, Row),
nth1(C, Row, V).
这样使用:
?- Board = [[_,_,_,_,_,_,_,_,_],
[_,_,_,_,_,3,_,8,5],
[_,_,1,_,2,_,_,_,_],
[_,_,_,5,_,7,_,_,_],
[_,_,4,_,_,_,1,_,_],
[_,9,_,_,_,_,_,_,_],
[5,_,_,_,_,_,_,7,3],
[_,_,2,_,1,_,_,_,_],
[_,_,_,_,4,_,_,_,9]],
board_value([5,2,1], Board),
write(Board).
[[_6,_8,_10,_12,_14,_16,_18,_20,_22],
[_24,_26,_28,_30,_32,3,_34,8,5],
[_36,_38,1,_40,2,_42,_44,_46,_48],
[_50,_52,_54,5,_56,7,_58,_60,_62],
[_64,1,4,_68,_70,_72,1,_74,_76],
[_78,9,_80,_82,_84,_86,_88,_90,_92],
[5,_94,_96,_98,_100,_102,_104,7,3],
[_106,_108,2,_110,1,_112,_114,_116,_118],
[_120,_122,_124,_126,4,_128,_130,_132,9]]
Board = [[_6, _8, _10, _12, _14, _16, _18, _20|...], [_24, _26, _28, _30, _32, 3, _34|...], [_36, _38, 1, _40, 2, _42|...], [_50, _52, _54, 5, _56|...], [_64, 1, 4, _68|...], [_78, 9, _80|...], [5, _94|...], [_106|...], [...|...]].
可能不是很明显,但是第 5 行的第 2 列现在是 1。希望这对您有所帮助!