Программа Проку Судоку - PullRequest
       1

Программа Проку Судоку

0 голосов
/ 12 ноября 2018

У меня есть этот код, который отображает все возможные решения для доски судоку в выходном текстовом файле, но я также хотел бы отобразить первое возможное решение для консоли. Моя программа зависает и не завершается, поэтому я не могу ничего добавить в консоль. Любая помощь будет оценена.

Вот код для доски судоку.

:- use_module(library(clpfd)). 


sudoku(Rows) :- 
    length(Rows, 9), 
    maplist(length_list(9), Rows), 
    append(Rows, Vs), 
    Vs ins 1..9, maplist(all_distinct, Rows), 
    transpose(Rows, Columns), 
    maplist(all_distinct, Columns), 
    Rows = [A,B,C,D,E,F,G,H,I], 
    blocks(A, B, C), blocks(D, E, F), blocks(G, H, I).

length_list(L, Ls) :- length(Ls, L). 

blocks([], [], []). 
blocks([A,B,C|Bs1], [D,E,F|Bs2], [G,H,I|Bs3]) :- 
    all_distinct([A,B,C,D,E,F,G,H,I]), blocks(Bs1, Bs2, Bs3). 

random_list([X1,X2,X3,X4,X5,X6,X7,X8,X9]) :-
    random_between(1,9,X1),
    random_between(1,9,X2),
    random_between(1,9,X3),
    random_between(1,9,X4),
    random_between(1,9,X5),
    random_between(1,9,X6),
    random_between(1,9,X7),
    random_between(1,9,X8),
    random_between(1,9,X9).

random_list_norep(A) :-
    repeat,
    random_list(A),
    all_distinct(A).


sudokugen(A,B,C, D,E,F, G,H,I) :- 
    random_list_norep([R1,R2,R3,R4,R5,R6,R7,R8,R9]),
    sudoku([[R1|A], [R2|B], [R3|C],     
            [R4|D], [R5|E], [R6|F], 
            [R7|G], [R8|H], [R9|I]]),
    labeling([], A),
    labeling([], B),
    labeling([], C),
    labeling([], D),
    labeling([], E),
    labeling([], F),
    labeling([], G),
    labeling([], H),
    labeling([], I).

rand_list_print([X]) :-
    random_between(0,9,A),
    (   A == 0 ->  print(X), write("]") ; write("_]")).
rand_list_print([X|Xs]) :-
    random_between(0,3,A),
    (   A == 0 ->  print(X), write(", ") ; write("_, ")),
    rand_list_print(Xs).

rand_printall(A,B,C) :-
    write("["), rand_list_print(A), write(", "),
    write("["), rand_list_print(B), write(", "),
    write("["), rand_list_print(C), nl.


sudoku1() :-
    tell('sudoku-sol.txt'),
    (
        sudokugen(A,B,C,D,E,F,G,H,I),
        print(A), write(", "), print(B), write(", "), print(C), nl,
        print(D), write(", "), print(E), write(", "), print(F), nl,
        print(G), write(", "), print(H), write(", "), print(I), nl,
        nl,
        rand_printall(A,B,C),
        rand_printall(D,E,F),
        rand_printall(G,H,I),
        fail
    ;
        told
    ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...