このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1276873238/829
#  問題 
#  数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 
# 
# 

'数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :-
        '数独の解答が9行9列の文字列で与えられたとき'(_文字列,L),
        数独の回答が正しい(L).

'数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,L) :-
        atom_chars(_9行9列の文字列,Chars),
        改行を取り除きながら数字列を数値ならびに変換(Chars,L).

改行を取り除きながら数字列を数値ならびに変換([],[]).
改行を取り除きながら数字列を数値ならびに変換(['\n'|R1],R2) :-
        改行を取り除きながら数字列を数値ならびに変換(R1,R2).
改行を取り除きながら数字列を数値ならびに変換([A|R1],[N|R2]) :-
        atom_number(A,N),
        改行を取り除きながら数字列を数値ならびに変換(R1,R2).

数独の回答が正しい([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :-
        数独診断([[_1,_2,_3,_4,_5,_6,_7,_8,_9],
                  [_10,_11,_12,_13,_14,_15,_16,_17,_18],
                  [_19,_20,_21,_22,_23,_24,_25,_26,_27],
                  [_28,_29,_30,_31,_32,_33,_34,_35,_36],
                  [_37,_38,_39,_40,_41,_42,_43,_44,_45],
                  [_46,_47,_48,_49,_50,_51,_52,_53,_54],
                  [_55,_56,_57,_58,_59,_60,_61,_62,_63],
                  [_64,_65,_66,_67,_68,_69,_70,_71,_72],
                  [_73,_74,_75,_76,_77,_78,_79,_80,_81],
                  [_1,_10,_19,_28,_37,_46,_55,_64,_73],
                  [_2,_11,_20,_29,_38,_47,_56,_65,_74],
                  [_3,_12,_21,_30,_39,_48,_57,_66,_75],
                  [_4,_13,_22,_31,_40,_49,_58,_67,_76],
                  [_5,_14,_23,_32,_41,_50,_59,_68,_77],
                  [_6,_15,_24,_33,_42,_51,_60,_69,_78],
                  [_7,_16,_25,_34,_43,_52,_61,_70,_79],
                  [_8,_17,_26,_35,_44,_53,_62,_71,_80],
                  [_9,_18,_27,_36,_45,_54,_63,_72,_81],
                  [_1,_2,_3,_10,_11,_12,_19,_20,_21],
                  [_4,_5,_6,_13,_14,_15,_22,_23,_24],
                  [_7,_8,_9,_16,_17,_18,_25,_26,_27],
                  [_28,_29,_30,_37,_38,_39,_46,_47,_48],
                  [_31,_32,_33,_40,_41,_42,_49,_50,_51],
                  [_34,_35,_36,_43,_44,_45,_52,_53,_54],
                  [_55,_56,_57,_64,_65,_66,_73,_74,_75],
                  [_58,_59,_60,_67,_68,_69,_76,_77,_78],
                  [_61,_62,_63,_70,_71,_72,_79,_80,_81]]).

数独診断([]) :- !.
数独診断([L|R]) :-
        sort(L,L1),
        length(L1,9),
        数独診断(R).


数独([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :-
        数独生成([[_1,_2,_3,_4,_5,_6,_7,_8,_9],
                  [_10,_11,_12,_13,_14,_15,_16,_17,_18],
                  [_19,_20,_21,_22,_23,_24,_25,_26,_27],
                  [_28,_29,_30,_31,_32,_33,_34,_35,_36],
                  [_37,_38,_39,_40,_41,_42,_43,_44,_45],
                  [_46,_47,_48,_49,_50,_51,_52,_53,_54],
                  [_55,_56,_57,_58,_59,_60,_61,_62,_63],
                  [_64,_65,_66,_67,_68,_69,_70,_71,_72],
                  [_73,_74,_75,_76,_77,_78,_79,_80,_81],
                  [_1,_10,_19,_28,_37,_46,_55,_64,_73],
                  [_2,_11,_20,_29,_38,_47,_56,_65,_74],
                  [_3,_12,_21,_30,_39,_48,_57,_66,_75],
                  [_4,_13,_22,_31,_40,_49,_58,_67,_76],
                  [_5,_14,_23,_32,_41,_50,_59,_68,_77],
                  [_6,_15,_24,_33,_42,_51,_60,_69,_78],
                  [_7,_16,_25,_34,_43,_52,_61,_70,_79],
                  [_8,_17,_26,_35,_44,_53,_62,_71,_80],
                  [_9,_18,_27,_36,_45,_54,_63,_72,_81],
                  [_1,_2,_3,_10,_11,_12,_19,_20,_21],
                  [_4,_5,_6,_13,_14,_15,_22,_23,_24],
                  [_7,_8,_9,_16,_17,_18,_25,_26,_27],
                  [_28,_29,_30,_37,_38,_39,_46,_47,_48],
                  [_31,_32,_33,_40,_41,_42,_49,_50,_51],
                  [_34,_35,_36,_43,_44,_45,_52,_53,_54],
                  [_55,_56,_57,_64,_65,_66,_73,_74,_75],
                  [_58,_59,_60,_67,_68,_69,_76,_77,_78],
                  [_61,_62,_63,_70,_71,_72,_79,_80,_81]]).

数独生成([]) :- !.
数独生成([L|R]) :-
        変数に数値を埋める(L),
        数独生成(R).

変数に数値を埋める(L) :-
        既に使われている数値は候補から外す(L,[1,2,3,4,5,6,7,8,9],_数字候補),
        変数に数値を埋める(_数字候補,L).

既に使われている数値は候補から外す([],L,L).
既に使われている数値は候補から外す([V|R1],L1,L) :-
        var(V),
        既に使われている数値は候補から外す(R1,L1,L).
既に使われている数値は候補から外す([N|R1],L1,L) :-
        integer(N),
        select(N,L1,L2),
        既に使われている数値は候補から外す(R1,L2,L).

変数に数値を埋める([],[]).
変数に数値を埋める(_数字候補,[N|R]) :-
        integer(N),
        変数に数値を埋める(_数字候補,R).
変数に数値を埋める(_数字候補,[V|R]) :-
        var(V),
        select(V,_数字候補,_残り数字候補),
        変数に数値を埋める(_残り数字候補,R).